|
1 |
| -import { shallow } from '@edx/react-unit-test-utils'; |
2 |
| - |
| 1 | +import { render, screen } from '@testing-library/react'; |
| 2 | +import { formatMessage } from 'testUtils'; |
3 | 3 | import { breakpoints, useWindowSize } from '@openedx/paragon';
|
4 |
| - |
5 | 4 | import { reduxHooks } from 'hooks';
|
| 5 | +import { IntlProvider } from '@edx/frontend-platform/i18n'; |
| 6 | +import { FilterKeys, SortKeys } from 'data/constants/app'; |
6 | 7 |
|
| 8 | +import messages from './messages'; |
7 | 9 | import CourseFilterControls from './CourseFilterControls';
|
8 | 10 | import useCourseFilterControlsData from './hooks';
|
9 | 11 |
|
10 | 12 | jest.mock('hooks', () => ({
|
11 | 13 | reduxHooks: { useHasCourses: jest.fn() },
|
12 | 14 | }));
|
13 | 15 |
|
14 |
| -jest.mock('./hooks', () => jest.fn().mockName('useCourseFilterControlsData')); |
| 16 | +jest.mock('./hooks', () => jest.fn()); |
15 | 17 |
|
16 |
| -jest.mock('./components/FilterForm', () => 'FilterForm'); |
17 |
| -jest.mock('./components/SortForm', () => 'SortForm'); |
| 18 | +jest.unmock('@edx/frontend-platform/i18n'); |
| 19 | +jest.unmock('@openedx/paragon'); |
| 20 | +jest.unmock('react'); |
| 21 | + |
| 22 | +jest.mock('@openedx/paragon', () => ({ |
| 23 | + ...jest.requireActual('@openedx/paragon'), |
| 24 | + useWindowSize: jest.fn(), |
| 25 | +})); |
18 | 26 |
|
19 |
| -reduxHooks.useHasCourses.mockReturnValue(true); |
| 27 | +const filters = Object.values(FilterKeys); |
| 28 | + |
| 29 | +const mockControlsData = { |
| 30 | + isOpen: false, |
| 31 | + open: jest.fn().mockName('open'), |
| 32 | + close: jest.fn().mockName('close'), |
| 33 | + target: 'target-test', |
| 34 | + setTarget: jest.fn(), |
| 35 | + handleFilterChange: jest.fn().mockName('handleFilterChange'), |
| 36 | + handleSortChange: jest.fn().mockName('handleSortChange'), |
| 37 | +}; |
20 | 38 |
|
21 | 39 | describe('CourseFilterControls', () => {
|
22 | 40 | const props = {
|
23 |
| - sortBy: 'test-sort-by', |
| 41 | + sortBy: SortKeys.enrolled, |
24 | 42 | setSortBy: jest.fn().mockName('setSortBy'),
|
25 |
| - filters: ['test-filter'], |
| 43 | + filters, |
26 | 44 | };
|
27 | 45 |
|
28 |
| - useCourseFilterControlsData.mockReturnValue({ |
29 |
| - isOpen: false, |
30 |
| - open: jest.fn().mockName('open'), |
31 |
| - close: jest.fn().mockName('close'), |
32 |
| - target: 'test-target', |
33 |
| - setTarget: jest.fn().mockName('setTarget'), |
34 |
| - handleFilterChange: jest.fn().mockName('handleFilterChange'), |
35 |
| - handleSortChange: jest.fn().mockName('handleSortChange'), |
36 |
| - }); |
37 |
| - |
38 |
| - describe('no courses', () => { |
39 |
| - test('snapshot', () => { |
40 |
| - reduxHooks.useHasCourses.mockReturnValueOnce(false); |
41 |
| - useWindowSize.mockReturnValueOnce({ width: breakpoints.small.minWidth }); |
42 |
| - const wrapper = shallow(<CourseFilterControls {...props} />); |
43 |
| - expect(wrapper.snapshot).toMatchSnapshot(); |
44 |
| - }); |
45 |
| - }); |
46 |
| - describe('mobile', () => { |
47 |
| - test('snapshot', () => { |
| 46 | + describe('mobile and open', () => { |
| 47 | + it('should render sheet', () => { |
| 48 | + reduxHooks.useHasCourses.mockReturnValue(true); |
| 49 | + useCourseFilterControlsData.mockReturnValue({ ...mockControlsData, isOpen: true }); |
48 | 50 | useWindowSize.mockReturnValueOnce({ width: breakpoints.small.minWidth - 1 });
|
49 |
| - const wrapper = shallow(<CourseFilterControls {...props} />); |
50 |
| - expect(wrapper.snapshot).toMatchSnapshot(); |
| 51 | + render(<IntlProvider locale="en"><CourseFilterControls {...props} /></IntlProvider>); |
| 52 | + const sheet = screen.getByRole('presentation', { hidden: true }); |
| 53 | + expect(sheet).toBeInTheDocument(); |
| 54 | + expect(sheet.parentElement).toHaveClass('sheet-container'); |
51 | 55 | });
|
52 | 56 | });
|
53 | 57 | describe('is not mobile', () => {
|
54 |
| - test('snapshot', () => { |
| 58 | + it('should have button disabled', () => { |
| 59 | + reduxHooks.useHasCourses.mockReturnValue(true); |
| 60 | + useCourseFilterControlsData.mockReturnValue({ ...mockControlsData, isOpen: true }); |
55 | 61 | useWindowSize.mockReturnValueOnce({ width: breakpoints.small.minWidth });
|
56 |
| - const wrapper = shallow(<CourseFilterControls {...props} />); |
57 |
| - expect(wrapper.snapshot).toMatchSnapshot(); |
| 62 | + render(<IntlProvider locale="en"><CourseFilterControls {...props} /></IntlProvider>); |
| 63 | + const filterForm = screen.getByText(messages.courseStatus.defaultMessage); |
| 64 | + const modal = filterForm.closest('div.pgn__modal-popup__tooltip'); |
| 65 | + expect(modal).toBeInTheDocument(); |
| 66 | + }); |
| 67 | + }); |
| 68 | + describe('no courses', () => { |
| 69 | + it('should have button disabled', () => { |
| 70 | + reduxHooks.useHasCourses.mockReturnValue(false); |
| 71 | + useCourseFilterControlsData.mockReturnValue(mockControlsData); |
| 72 | + useWindowSize.mockReturnValue({ width: breakpoints.small.minWidth }); |
| 73 | + render(<IntlProvider locale="en"><CourseFilterControls {...props} /></IntlProvider>); |
| 74 | + const button = screen.getByRole('button', { name: formatMessage(messages.refine) }); |
| 75 | + expect(button).toBeInTheDocument(); |
| 76 | + expect(button).toBeDisabled(); |
58 | 77 | });
|
59 | 78 | });
|
60 | 79 | });
|
0 commit comments