From d542fb84b6ae975912e354417ca58080c09a5880 Mon Sep 17 00:00:00 2001 From: diana-villalvazo-wgu Date: Mon, 30 Jun 2025 16:15:52 -0600 Subject: [PATCH] test: remove paragon, react and i18n mocks and added when needed --- src/App.test.jsx | 7 +- src/components/NoticesWrapper/hooks.js | 2 +- src/components/NoticesWrapper/hooks.test.js | 28 ++- .../ActionButton/hooks.test.js | 27 +++ .../BeginCourseButton.test.jsx | 24 +- .../CourseCardActions/ResumeButton.test.jsx | 11 +- .../SelectSessionButton.test.jsx | 8 +- .../ViewCourseButton.test.jsx | 8 +- .../CreditRequestForm/hooks.test.js | 6 + .../CourseCardDetails/hooks.test.js | 10 + .../RelatedProgramsBadge/hooks.test.js | 10 + src/containers/CourseCard/hooks.test.js | 10 + .../CourseFilterControls/hooks.test.js | 9 + src/containers/Dashboard/hooks.test.js | 16 ++ .../LearnerDashboardHeader/hooks.test.js | 10 + src/containers/MasqueradeBar/hooks.test.js | 10 + .../SelectSessionModal/hooks.test.js | 10 + src/hooks/api.test.js | 4 + src/hooks/utils.test.js | 4 + src/setupTest.jsx | 207 ------------------ 20 files changed, 177 insertions(+), 244 deletions(-) diff --git a/src/App.test.jsx b/src/App.test.jsx index 9362c1a..7383cf5 100644 --- a/src/App.test.jsx +++ b/src/App.test.jsx @@ -32,9 +32,10 @@ jest.mock('@edx/frontend-platform', () => ({ getConfig: jest.fn(() => ({})), })); -jest.unmock('@openedx/paragon'); -jest.unmock('@edx/frontend-platform/i18n'); -jest.unmock('react'); +jest.mock('@edx/frontend-platform/react', () => ({ + ...jest.requireActual('@edx/frontend-platform/react'), + ErrorPage: () => 'ErrorPage', +})); const loadData = jest.fn(); reduxHooks.useLoadData.mockReturnValue(loadData); diff --git a/src/components/NoticesWrapper/hooks.js b/src/components/NoticesWrapper/hooks.js index 3c398ae..f16f8fb 100644 --- a/src/components/NoticesWrapper/hooks.js +++ b/src/components/NoticesWrapper/hooks.js @@ -1,6 +1,6 @@ import React from 'react'; import { getConfig } from '@edx/frontend-platform'; -import { useIntl } from 'react-intl'; +import { useIntl } from '@edx/frontend-platform/i18n'; import { StrictDict } from 'utils'; import { getNotices } from './api'; diff --git a/src/components/NoticesWrapper/hooks.test.js b/src/components/NoticesWrapper/hooks.test.js index d08f54f..6e308c8 100644 --- a/src/components/NoticesWrapper/hooks.test.js +++ b/src/components/NoticesWrapper/hooks.test.js @@ -1,6 +1,6 @@ import React from 'react'; -import { MockUseState } from 'testUtils'; +import { MockUseState, formatMessage } from 'testUtils'; import { getConfig } from '@edx/frontend-platform'; import { getNotices } from './api'; @@ -8,13 +8,23 @@ import * as hooks from './hooks'; jest.mock('@edx/frontend-platform', () => ({ getConfig: jest.fn() })); jest.mock('./api', () => ({ getNotices: jest.fn() })); -const mockFormatMessage = jest.fn(message => message.defaultMessage || 'translated-string'); -jest.mock('react-intl', () => ({ - useIntl: () => ({ - formatMessage: mockFormatMessage, - }), + +jest.mock('react', () => ({ + ...jest.requireActual('react'), + useEffect: jest.fn((cb, prereqs) => ({ useEffect: { cb, prereqs } })), + useContext: jest.fn(context => context), })); +jest.mock('@edx/frontend-platform/i18n', () => { + const { formatMessage: fn } = jest.requireActual('testUtils'); + return { + ...jest.requireActual('@edx/frontend-platform/i18n'), + useIntl: () => ({ + formatMessage: fn, + }), + }; +}); + getConfig.mockReturnValue({ ENABLE_NOTICES: true }); const state = new MockUseState(hooks); @@ -40,7 +50,7 @@ describe('NoticesWrapper hooks', () => { getConfig.mockReturnValueOnce({ ENABLE_NOTICES: false }); hooks.useNoticesWrapperData(); const [cb, prereqs] = React.useEffect.mock.calls[0]; - expect(prereqs).toEqual([state.setState.isRedirected, mockFormatMessage]); + expect(prereqs).toEqual([state.setState.isRedirected, formatMessage]); cb(); expect(getNotices).not.toHaveBeenCalled(); }); @@ -49,7 +59,7 @@ describe('NoticesWrapper hooks', () => { hooks.useNoticesWrapperData(); expect(React.useEffect).toHaveBeenCalled(); const [cb, prereqs] = React.useEffect.mock.calls[0]; - expect(prereqs).toEqual([state.setState.isRedirected, mockFormatMessage]); + expect(prereqs).toEqual([state.setState.isRedirected, formatMessage]); cb(); expect(getNotices).toHaveBeenCalled(); const { onLoad } = getNotices.mock.calls[0][0]; @@ -65,7 +75,7 @@ describe('NoticesWrapper hooks', () => { window.location = { replace: jest.fn(), href: 'test-old-href' }; hooks.useNoticesWrapperData(); const [cb, prereqs] = React.useEffect.mock.calls[0]; - expect(prereqs).toEqual([state.setState.isRedirected, mockFormatMessage]); + expect(prereqs).toEqual([state.setState.isRedirected, formatMessage]); cb(); expect(getNotices).toHaveBeenCalled(); const { onLoad } = getNotices.mock.calls[0][0]; diff --git a/src/containers/CourseCard/components/CourseCardActions/ActionButton/hooks.test.js b/src/containers/CourseCard/components/CourseCardActions/ActionButton/hooks.test.js index aa733b2..e1545fe 100644 --- a/src/containers/CourseCard/components/CourseCardActions/ActionButton/hooks.test.js +++ b/src/containers/CourseCard/components/CourseCardActions/ActionButton/hooks.test.js @@ -1,6 +1,33 @@ import { useWindowSize, breakpoints } from '@openedx/paragon'; import useIsCollapsed from './hooks'; +jest.mock('@openedx/paragon', () => ({ + ...jest.requireActual('@openedx/paragon'), + useWindowSize: jest.fn(), + breakpoints: { + extraSmall: { + minWidth: 0, + maxWidth: 575, + }, + small: { + minWidth: 576, + maxWidth: 767, + }, + medium: { + minWidth: 768, + maxWidth: 991, + }, + large: { + minWidth: 992, + maxWidth: 1199, + }, + extraLarge: { + minWidth: 1200, + maxWidth: 100000, + }, + }, +})); + describe('useIsCollapsed', () => { it('returns true only when it is between medium and small', () => { // make sure all three breakpoints gap is large enough for test diff --git a/src/containers/CourseCard/components/CourseCardActions/BeginCourseButton.test.jsx b/src/containers/CourseCard/components/CourseCardActions/BeginCourseButton.test.jsx index befeae5..8b5ea02 100644 --- a/src/containers/CourseCard/components/CourseCardActions/BeginCourseButton.test.jsx +++ b/src/containers/CourseCard/components/CourseCardActions/BeginCourseButton.test.jsx @@ -1,12 +1,11 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import { IntlProvider } from '@edx/frontend-platform/i18n'; import { reduxHooks } from 'hooks'; import track from 'tracking'; import useActionDisabledState from '../hooks'; import BeginCourseButton from './BeginCourseButton'; -jest.unmock('@openedx/paragon'); - jest.mock('tracking', () => ({ course: { enterCourseClicked: jest.fn().mockName('segment.enterCourseClicked'), @@ -33,24 +32,27 @@ reduxHooks.useTrackCourseEvent.mockImplementation( (eventName, cardId, url) => ({ trackCourseEvent: { eventName, cardId, url } }), ); +const props = { + cardId: 'cardId', +}; + +const renderComponent = () => render(); + describe('BeginCourseButton', () => { - const props = { - cardId: 'cardId', - }; beforeEach(() => { jest.clearAllMocks(); }); describe('initiliaze hooks', () => { it('initializes course run data with cardId', () => { - render(); + renderComponent(); expect(reduxHooks.useCardCourseRunData).toHaveBeenCalledWith(props.cardId); }); it('loads exec education path param', () => { - render(); + renderComponent(); expect(reduxHooks.useCardExecEdTrackingParam).toHaveBeenCalledWith(props.cardId); }); it('loads disabled states for begin action from action hooks', () => { - render(); + renderComponent(); expect(useActionDisabledState).toHaveBeenCalledWith(props.cardId); }); }); @@ -58,7 +60,7 @@ describe('BeginCourseButton', () => { describe('disabled', () => { it('should be disabled', () => { useActionDisabledState.mockReturnValueOnce({ disableBeginCourse: true }); - render(); + renderComponent(); const button = screen.getByRole('button', { name: 'Begin Course' }); expect(button).toHaveClass('disabled'); expect(button).toHaveAttribute('aria-disabled', 'true'); @@ -66,13 +68,13 @@ describe('BeginCourseButton', () => { }); describe('enabled', () => { it('should be enabled', () => { - render(); + renderComponent(); const button = screen.getByRole('button', { name: 'Begin Course' }); expect(button).not.toHaveClass('disabled'); expect(button).not.toHaveAttribute('aria-disabled', 'true'); }); it('should track enter course clicked event on click, with exec ed param', async () => { - render(); + renderComponent(); const user = userEvent.setup(); const button = screen.getByRole('button', { name: 'Begin Course' }); user.click(button); diff --git a/src/containers/CourseCard/components/CourseCardActions/ResumeButton.test.jsx b/src/containers/CourseCard/components/CourseCardActions/ResumeButton.test.jsx index daf553d..5728b2f 100644 --- a/src/containers/CourseCard/components/CourseCardActions/ResumeButton.test.jsx +++ b/src/containers/CourseCard/components/CourseCardActions/ResumeButton.test.jsx @@ -1,5 +1,6 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import { IntlProvider } from '@edx/frontend-platform/i18n'; import { reduxHooks } from 'hooks'; import track from 'tracking'; @@ -20,7 +21,7 @@ jest.mock('hooks', () => ({ }, })); jest.mock('../hooks', () => jest.fn(() => ({ disableResumeCourse: false }))); -jest.unmock('@openedx/paragon'); + jest.mock('./ActionButton/hooks', () => jest.fn(() => false)); const resumeUrl = 'resume-url'; @@ -36,7 +37,7 @@ describe('ResumeButton', () => { cardId: 'cardId', }; describe('initialize hooks', () => { - beforeEach(() => render()); + beforeEach(() => render()); it('initializes course run data with cardId', () => { expect(reduxHooks.useCardCourseRunData).toHaveBeenCalledWith(props.cardId); }); @@ -53,7 +54,7 @@ describe('ResumeButton', () => { useActionDisabledState.mockReturnValueOnce({ disableResumeCourse: true }); }); it('should be disabled', () => { - render(); + render(); const button = screen.getByRole('button', { name: 'Resume' }); expect(button).toHaveClass('disabled'); expect(button).toHaveAttribute('aria-disabled', 'true'); @@ -61,14 +62,14 @@ describe('ResumeButton', () => { }); describe('enabled', () => { it('should be enabled', () => { - render(); + render(); const button = screen.getByRole('button', { name: 'Resume' }); expect(button).toBeInTheDocument(); expect(button).not.toHaveClass('disabled'); expect(button).not.toHaveAttribute('aria-disabled', 'true'); }); it('should track enter course clicked event on click, with exec ed param', async () => { - render(); + render(); const user = userEvent.setup(); const button = screen.getByRole('button', { name: 'Resume' }); user.click(button); diff --git a/src/containers/CourseCard/components/CourseCardActions/SelectSessionButton.test.jsx b/src/containers/CourseCard/components/CourseCardActions/SelectSessionButton.test.jsx index 50d6d89..ba9e21c 100644 --- a/src/containers/CourseCard/components/CourseCardActions/SelectSessionButton.test.jsx +++ b/src/containers/CourseCard/components/CourseCardActions/SelectSessionButton.test.jsx @@ -1,5 +1,6 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import { IntlProvider } from '@edx/frontend-platform/i18n'; import { reduxHooks } from 'hooks'; import useActionDisabledState from '../hooks'; @@ -13,27 +14,26 @@ jest.mock('hooks', () => ({ })); jest.mock('../hooks', () => jest.fn(() => ({ disableSelectSession: false }))); -jest.unmock('@openedx/paragon'); jest.mock('./ActionButton/hooks', () => jest.fn(() => false)); describe('SelectSessionButton', () => { const props = { cardId: 'cardId' }; it('default render', () => { - render(); + render(); const button = screen.getByRole('button', { name: 'Select Session' }); expect(button).toBeInTheDocument(); }); describe('if useActionDisabledState is false', () => { it('should disabled Select Session', () => { useActionDisabledState.mockReturnValueOnce({ disableSelectSession: true }); - render(); + render(); const button = screen.getByRole('button', { name: 'Select Session' }); expect(button).toBeDisabled(); }); }); describe('on click', () => { it('should call openSessionModal', async () => { - render(); + render(); const user = userEvent.setup(); const button = screen.getByRole('button', { name: 'Select Session' }); await user.click(button); diff --git a/src/containers/CourseCard/components/CourseCardActions/ViewCourseButton.test.jsx b/src/containers/CourseCard/components/CourseCardActions/ViewCourseButton.test.jsx index 3fa2475..a9b2f65 100644 --- a/src/containers/CourseCard/components/CourseCardActions/ViewCourseButton.test.jsx +++ b/src/containers/CourseCard/components/CourseCardActions/ViewCourseButton.test.jsx @@ -1,5 +1,6 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import { IntlProvider } from '@edx/frontend-platform/i18n'; import track from 'tracking'; import { reduxHooks } from 'hooks'; @@ -20,7 +21,6 @@ jest.mock('hooks', () => ({ })); jest.mock('../hooks', () => jest.fn(() => ({ disableViewCourse: false }))); -jest.unmock('@openedx/paragon'); jest.mock('./ActionButton/hooks', () => jest.fn(() => false)); const defaultProps = { cardId: 'cardId' }; @@ -28,14 +28,14 @@ const homeUrl = 'homeUrl'; describe('ViewCourseButton', () => { it('learner can view course', async () => { - render(); + render(); const button = screen.getByRole('button', { name: 'View Course' }); expect(button).toBeInTheDocument(); expect(button).not.toHaveClass('disabled'); expect(button).not.toHaveAttribute('aria-disabled', 'true'); }); it('calls trackCourseEvent on click', async () => { - render(); + render(); const user = userEvent.setup(); const button = screen.getByRole('button', { name: 'View Course' }); await user.click(button); @@ -47,7 +47,7 @@ describe('ViewCourseButton', () => { }); it('learner cannot view course', () => { useActionDisabledState.mockReturnValueOnce({ disableViewCourse: true }); - render(); + render(); const button = screen.getByRole('button', { name: 'View Course' }); expect(button).toHaveClass('disabled'); expect(button).toHaveAttribute('aria-disabled', 'true'); diff --git a/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/components/CreditRequestForm/hooks.test.js b/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/components/CreditRequestForm/hooks.test.js index 1b24782..bfe0cbf 100644 --- a/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/components/CreditRequestForm/hooks.test.js +++ b/src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/components/CreditRequestForm/hooks.test.js @@ -4,6 +4,12 @@ import useCreditRequestFormData from './hooks'; const requestData = 'test-request-data'; +jest.mock('react', () => ({ + ...jest.requireActual('react'), + useRef: jest.fn((val) => ({ current: val, useRef: true })), + useEffect: jest.fn((cb, prereqs) => ({ useEffect: { cb, prereqs } })), +})); + let out; const ref = { current: { click: jest.fn() }, diff --git a/src/containers/CourseCard/components/CourseCardDetails/hooks.test.js b/src/containers/CourseCard/components/CourseCardDetails/hooks.test.js index 633696f..7d66991 100644 --- a/src/containers/CourseCard/components/CourseCardDetails/hooks.test.js +++ b/src/containers/CourseCard/components/CourseCardDetails/hooks.test.js @@ -20,6 +20,16 @@ jest.mock('hooks', () => ({ }, })); +jest.mock('@edx/frontend-platform/i18n', () => { + const { formatMessage } = jest.requireActual('testUtils'); + return { + ...jest.requireActual('@edx/frontend-platform/i18n'), + useIntl: () => ({ + formatMessage, + }), + }; +}); + const cardId = 'my-test-card-id'; const courseNumber = 'test-course-number'; const useAccessMessage = 'test-access-message'; diff --git a/src/containers/CourseCard/components/RelatedProgramsBadge/hooks.test.js b/src/containers/CourseCard/components/RelatedProgramsBadge/hooks.test.js index 2926da1..eaa8d6b 100644 --- a/src/containers/CourseCard/components/RelatedProgramsBadge/hooks.test.js +++ b/src/containers/CourseCard/components/RelatedProgramsBadge/hooks.test.js @@ -12,6 +12,16 @@ jest.mock('hooks', () => ({ }, })); +jest.mock('@edx/frontend-platform/i18n', () => { + const { formatMessage } = jest.requireActual('testUtils'); + return { + ...jest.requireActual('@edx/frontend-platform/i18n'), + useIntl: () => ({ + formatMessage, + }), + }; +}); + const cardId = 'test-card-id'; const state = new MockUseState(hooks); diff --git a/src/containers/CourseCard/hooks.test.js b/src/containers/CourseCard/hooks.test.js index ece458f..86f89b6 100644 --- a/src/containers/CourseCard/hooks.test.js +++ b/src/containers/CourseCard/hooks.test.js @@ -11,6 +11,16 @@ jest.mock('hooks', () => ({ }, })); +jest.mock('@edx/frontend-platform/i18n', () => { + const { formatMessage } = jest.requireActual('testUtils'); + return { + ...jest.requireActual('@edx/frontend-platform/i18n'), + useIntl: () => ({ + formatMessage, + }), + }; +}); + const cardId = 'my-test-course-number'; describe('CourseCard hooks', () => { diff --git a/src/containers/CourseFilterControls/hooks.test.js b/src/containers/CourseFilterControls/hooks.test.js index eaff385..639f2b2 100644 --- a/src/containers/CourseFilterControls/hooks.test.js +++ b/src/containers/CourseFilterControls/hooks.test.js @@ -7,6 +7,15 @@ import track from 'tracking'; import * as hooks from './hooks'; +jest.mock('@openedx/paragon', () => ({ + ...jest.requireActual('@openedx/paragon'), + useToggle: jest.fn().mockImplementation((val) => [ + val, + jest.fn().mockName('useToggle.setTrue'), + jest.fn().mockName('useToggle.setFalse'), + ]), +})); + jest.mock('tracking', () => ({ filter: { filterClicked: jest.fn(), diff --git a/src/containers/Dashboard/hooks.test.js b/src/containers/Dashboard/hooks.test.js index cce1b6a..1af97a2 100644 --- a/src/containers/Dashboard/hooks.test.js +++ b/src/containers/Dashboard/hooks.test.js @@ -10,16 +10,32 @@ import appMessages from 'messages'; import * as hooks from './hooks'; jest.mock('@openedx/paragon', () => ({ + ...jest.requireActual('@openedx/paragon'), useWindowSize: jest.fn(), breakpoints: {}, })); +jest.mock('@edx/frontend-platform/i18n', () => { + const { formatMessage } = jest.requireActual('testUtils'); + return { + ...jest.requireActual('@edx/frontend-platform/i18n'), + useIntl: () => ({ + formatMessage, + }), + }; +}); + jest.mock('hooks', () => ({ apiHooks: { useInitializeApp: jest.fn(), }, })); +jest.mock('react', () => ({ + ...jest.requireActual('react'), + useEffect: jest.fn((cb, prereqs) => ({ useEffect: { cb, prereqs } })), +})); + const state = new MockUseState(hooks); const initializeApp = jest.fn(); diff --git a/src/containers/LearnerDashboardHeader/hooks.test.js b/src/containers/LearnerDashboardHeader/hooks.test.js index a07a8ef..3341e4e 100644 --- a/src/containers/LearnerDashboardHeader/hooks.test.js +++ b/src/containers/LearnerDashboardHeader/hooks.test.js @@ -18,6 +18,16 @@ jest.mock('tracking', () => ({ }, })); +jest.mock('@edx/frontend-platform/i18n', () => { + const { formatMessage } = jest.requireActual('testUtils'); + return { + ...jest.requireActual('@edx/frontend-platform/i18n'), + useIntl: () => ({ + formatMessage, + }), + }; +}); + const url = 'http://example.com'; describe('LearnerDashboardHeader hooks', () => { diff --git a/src/containers/MasqueradeBar/hooks.test.js b/src/containers/MasqueradeBar/hooks.test.js index e1c35f1..d826f77 100644 --- a/src/containers/MasqueradeBar/hooks.test.js +++ b/src/containers/MasqueradeBar/hooks.test.js @@ -4,6 +4,16 @@ import { apiHooks, reduxHooks } from 'hooks'; import * as hooks from './hooks'; import messages from './messages'; +jest.mock('@edx/frontend-platform/i18n', () => { + const { formatMessage } = jest.requireActual('testUtils'); + return { + ...jest.requireActual('@edx/frontend-platform/i18n'), + useIntl: () => ({ + formatMessage, + }), + }; +}); + jest.mock('hooks', () => ({ apiHooks: { useMasqueradeAs: jest.fn(), diff --git a/src/containers/SelectSessionModal/hooks.test.js b/src/containers/SelectSessionModal/hooks.test.js index e7e271b..b463ee9 100644 --- a/src/containers/SelectSessionModal/hooks.test.js +++ b/src/containers/SelectSessionModal/hooks.test.js @@ -8,6 +8,16 @@ import { LEAVE_OPTION } from './constants'; import messages from './messages'; import * as hooks from './hooks'; +jest.mock('@edx/frontend-platform/i18n', () => { + const { formatMessage } = jest.requireActual('testUtils'); + return { + ...jest.requireActual('@edx/frontend-platform/i18n'), + useIntl: () => ({ + formatMessage, + }), + }; +}); + jest.mock('tracking', () => ({ entitlements: { newSession: jest.fn(), diff --git a/src/hooks/api.test.js b/src/hooks/api.test.js index cd1a5b6..ebe7c5e 100644 --- a/src/hooks/api.test.js +++ b/src/hooks/api.test.js @@ -30,6 +30,10 @@ jest.mock('data/redux/hooks', () => ({ useClearRequest: jest.fn(), useEmailConfirmationData: jest.fn(), })); +jest.mock('react', () => ({ + ...jest.requireActual('react'), + useContext: jest.fn(context => context), +})); const moduleKeys = keyStore(apiHooks); const testString = 'TEST-string'; diff --git a/src/hooks/utils.test.js b/src/hooks/utils.test.js index e5420ad..e8d9227 100644 --- a/src/hooks/utils.test.js +++ b/src/hooks/utils.test.js @@ -1,6 +1,10 @@ import * as utils from './utils'; jest.unmock('./utils'); +jest.mock('react', () => ({ + ...jest.requireActual('react'), + useCallback: jest.fn((cb, prereqs) => ({ useCallback: { cb, prereqs } })), +})); describe('app-level hooks', () => { describe('useValuecallback', () => { diff --git a/src/setupTest.jsx b/src/setupTest.jsx index b4a1363..259e57a 100755 --- a/src/setupTest.jsx +++ b/src/setupTest.jsx @@ -1,16 +1,6 @@ /* eslint-disable import/no-extraneous-dependencies */ import '@testing-library/jest-dom'; -jest.mock('react', () => ({ - ...jest.requireActual('react'), - useRef: jest.fn((val) => ({ current: val, useRef: true })), - useCallback: jest.fn((cb, prereqs) => ({ useCallback: { cb, prereqs } })), - useEffect: jest.fn((cb, prereqs) => ({ useEffect: { cb, prereqs } })), - useMemo: jest.fn((cb, prereqs) => cb(prereqs)), - useContext: jest.fn(context => context), - useState: jest.fn(), -})); - jest.mock('reselect', () => ({ createSelector: jest.fn((preSelectors, cb) => ({ preSelectors, cb })), })); @@ -29,200 +19,3 @@ jest.mock('react-redux', () => { useSelector: jest.fn((selector) => ({ useSelector: selector })), }; }); - -jest.mock('moment', () => ({ - __esModule: true, - default: (date) => ({ - toDate: jest.fn().mockReturnValue(date), - }), -})); - -jest.mock('@edx/frontend-platform/react', () => ({ - ...jest.requireActual('@edx/frontend-platform/react'), - ErrorPage: () => 'ErrorPage', -})); - -jest.mock('@edx/frontend-platform/i18n', () => { - const i18n = jest.requireActual('@edx/frontend-platform/i18n'); - const PropTypes = jest.requireActual('prop-types'); - const { formatMessage } = jest.requireActual('./testUtils'); - const formatDate = jest.fn(date => new Date(date).toLocaleDateString()).mockName('useIntl.formatDate'); - return { - ...i18n, - intlShape: PropTypes.shape({ - formatMessage: PropTypes.func, - }), - useIntl: () => ({ - formatMessage, - formatDate, - }), - defineMessages: m => m, - FormattedMessage: () => 'FormattedMessage', - }; -}); - -jest.mock('@openedx/paragon', () => jest.requireActual('testUtils').mockNestedComponents({ - Alert: { - Heading: 'Alert.Heading', - }, - AlertModal: 'AlertModal', - MarketingModal: 'MarketingModal', - ActionRow: 'ActionRow', - Badge: 'Badge', - Button: 'Button', - Card: { - Body: 'Card.Body', - Footer: 'Card.Footer', - Header: 'Card.Header', - ImageCap: 'Card.ImageCap', - Section: 'Card.Section', - }, - CardGrid: 'CardGrid', - Chip: 'Chip', - Col: 'Col', - Collapsible: { - Advanced: 'Collapsible.Advanced', - Body: 'Collapsible.Body', - Trigger: 'Collapsible.Trigger', - Visible: 'Collapsible.Visible', - }, - Container: 'Container', - DataTable: { - EmptyTable: 'DataTable.EmptyTable', - Table: 'DataTable.Table', - TableControlBar: 'DataTable.TableControlBar', - TableController: 'DataTable.TableController', - TableFooter: 'DataTable.TableFooter', - }, - Dropdown: { - Item: 'Dropdown.Item', - Menu: 'Dropdown.Menu', - Toggle: 'Dropdown.Toggle', - Header: 'Dropdown.Header', - Divider: 'Dropdown.Divider', - }, - Form: { - Checkbox: 'Form.Checkbox', - CheckboxSet: 'Form.CheckboxSet', - Control: { - Feedback: 'Form.Control.Feedback', - }, - Group: 'Form.Group', - Label: 'Form.Label', - Radio: 'Form.Radio', - RadioSet: 'Form.RadioSet', - Switch: 'Form.Switch', - }, - FormControl: 'FormControl', - FormControlFeedback: 'FormControlFeedback', - FormGroup: 'FormGroup', - FormLabel: 'FormLabel', - FullscreenModal: 'FullscreenModal', - Hyperlink: 'Hyperlink', - Icon: 'Icon', - IconButton: 'IconButton', - Image: 'Image', - MailtoLink: 'MailtoLink', - ModalDialog: { - Header: 'ModalDialog.Header', - Body: 'ModalDialog.Body', - Hero: 'ModalDialog.Hero', - }, - ModalPopup: 'ModalPopup', - ModalCloseButton: 'ModalCloseButton', - MultiSelectDropdownFilter: 'MultiSelectDropdownFilter', - OverlayTrigger: 'OverlayTrigger', - Popover: { - Content: 'Popover.Content', - }, - Row: 'Row', - Sheet: 'Sheet', - StatefulButton: 'StatefulButton', - TextFilter: 'TextFilter', - Truncate: 'Truncate', - Skeleton: 'Skeleton', - Spinner: 'Spinner', - PageBanner: 'PageBanner', - Pagination: 'Pagination', - - useWindowSize: () => jest.fn(), - useToggle: () => jest.fn().mockImplementation((val) => [ - val, - jest.fn().mockName('useToggle.setTrue'), - jest.fn().mockName('useToggle.setFalse'), - ]), - useCheckboxSetValues: () => jest.fn().mockImplementation((values) => ([values, { - add: jest.fn().mockName('useCheckboxSetValues.add'), - remove: jest.fn().mockName('useCheckboxSetValues.remove'), - }])), - breakpoints: () => ({ - extraSmall: { - minWidth: 0, - maxWidth: 575, - }, - small: { - minWidth: 576, - maxWidth: 767, - }, - medium: { - minWidth: 768, - maxWidth: 991, - }, - large: { - minWidth: 992, - maxWidth: 1199, - }, - extraLarge: { - minWidth: 1200, - maxWidth: 100000, - }, - }), -})); - -jest.mock('@fortawesome/react-fontawesome', () => ({ - FontAwesomeIcon: 'FontAwesomeIcon', -})); -jest.mock('@fortawesome/free-solid-svg-icons', () => ({ - faUserCircle: jest.fn().mockName('fa-user-circle-icon'), -})); - -jest.mock('@openedx/paragon/icons', () => ({ - ArrowBack: jest.fn().mockName('icons.ArrowBack'), - ArrowDropDown: jest.fn().mockName('icons.ArrowDropDown'), - ArrowDropUp: jest.fn().mockName('icons.ArrowDropUp'), - Book: jest.fn().mockName('icons.Book'), - Cancel: jest.fn().mockName('icons.Cancel'), - Close: jest.fn().mockName('icons.Close'), - CheckCircle: jest.fn().mockName('icons.CheckCircle'), - ChevronLeft: jest.fn().mockName('icons.ChevronLeft'), - ChevronRight: jest.fn().mockName('icons.ChevronRight'), - Highlight: jest.fn().mockName('icons.Highlight'), - Info: jest.fn().mockName('icons.Info'), - InfoOutline: jest.fn().mockName('icons.InfoOutline'), - Launch: jest.fn().mockName('icons.Launch'), - Locked: jest.fn().mockName('icons.Locked'), - MoreVert: jest.fn().mockName('icons.MoreVert'), - Tune: jest.fn().mockName('icons.Tune'), - PersonSearch: jest.fn().mockName('icons.PersonSearch'), - Program: jest.fn().mockName('icons.Program'), - Search: jest.fn().mockName('icons.Search'), -})); - -jest.mock('data/constants/app', () => ({ - ...jest.requireActual('data/constants/app'), - locationId: 'fake-location-id', -})); - -jest.mock('utils', () => ({ - ...jest.requireActual('utils'), - nullMethod: jest.fn().mockName('utils.nullMethod'), -})); - -jest.mock('utils/hooks', () => { - const formatDate = jest.fn(date => new Date(date).toLocaleDateString()) - .mockName('utils.formatDate'); - return { - formatDate, - useFormatDate: () => formatDate, - }; -});