Skip to content

Commit 06d79ce

Browse files
fix: prevent error when there are no results for a given filter (openedx#1257)
1 parent b3a06fd commit 06d79ce

File tree

3 files changed

+30
-5
lines changed

3 files changed

+30
-5
lines changed

src/course-home/courseware-search/CoursewareResultsFilter.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export const CoursewareSearchResultsFilter = ({ intl }) => {
2323
const lastSearch = useModel('contentSearchResults', courseId);
2424
const { filter: filterKeyword, setFilter } = useCoursewareSearchParams();
2525

26-
if (!lastSearch || !lastSearch?.results?.length) { return null; }
26+
if (!lastSearch) { return null; }
2727

2828
const { results: data = [] } = lastSearch;
2929

@@ -40,7 +40,7 @@ export const CoursewareSearchResultsFilter = ({ intl }) => {
4040
const filters = useMemo(() => Object.keys(allowedFilterKeys).map((key) => ({
4141
key,
4242
label: intl.formatMessage(messages[`filter:${key}`]),
43-
count: results[key].length,
43+
count: results[key]?.length || 0,
4444
})), [results]);
4545

4646
const activeKey = allowedFilterKeys[filterKeyword] ? filterKeyword : allFilterKey;

src/course-home/courseware-search/CoursewareResultsFilter.test.jsx

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,14 @@ describe('CoursewareSearchResultsFilter', () => {
5454

5555
describe('</CoursewareSearchResultsFilter />', () => {
5656
beforeEach(() => {
57+
useCoursewareSearchParams.mockReturnValue(coursewareSearch);
58+
});
59+
60+
afterEach(() => {
5761
jest.clearAllMocks();
5862
});
5963

60-
it('should render', async () => {
61-
useCoursewareSearchParams.mockReturnValue(coursewareSearch);
64+
it('should render without errors', async () => {
6265
useModel.mockReturnValue(searchResultsFactory());
6366

6467
await renderComponent();
@@ -71,5 +74,27 @@ describe('CoursewareSearchResultsFilter', () => {
7174
expect(screen.queryByTestId('courseware-search-results-tabs-other')).toBeInTheDocument();
7275
});
7376
});
77+
78+
describe('when there are not results', () => {
79+
it('should render without errors', async () => {
80+
useModel.mockReturnValue(searchResultsFactory('blah', {
81+
results: [],
82+
filters: [],
83+
total: 0,
84+
maxScore: null,
85+
ms: 5,
86+
}));
87+
88+
await renderComponent();
89+
90+
await waitFor(() => {
91+
expect(screen.queryByTestId('courseware-search-results-tabs-all')).toBeInTheDocument();
92+
expect(screen.queryByTestId('courseware-search-results-tabs-text')).toBeInTheDocument();
93+
expect(screen.queryByTestId('courseware-search-results-tabs-video')).toBeInTheDocument();
94+
expect(screen.queryByTestId('courseware-search-results-tabs-sequence')).toBeInTheDocument();
95+
expect(screen.queryByTestId('courseware-search-results-tabs-other')).toBeInTheDocument();
96+
});
97+
});
98+
});
7499
});
75100
});

src/course-home/courseware-search/CoursewareSearchResults.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const iconTypeMapping = {
1515

1616
const defaultIcon = Article;
1717

18-
const CoursewareSearchResults = ({ results }) => {
18+
const CoursewareSearchResults = ({ results = [] }) => {
1919
if (!results?.length) {
2020
return <CoursewareSearchEmpty />;
2121
}

0 commit comments

Comments
 (0)