Skip to content

Commit 8d26ef2

Browse files
feat: better tests for <SettingsComponent>
1 parent 6d0481c commit 8d26ef2

File tree

4 files changed

+72
-18
lines changed

4 files changed

+72
-18
lines changed
Lines changed: 69 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,83 @@
11
import React, { Suspense } from 'react';
2-
import { BrowserRouter } from 'react-router-dom';
3-
import { render } from '@testing-library/react';
2+
import { useParams } from 'react-router-dom';
3+
import { render, screen, waitFor } from '@testing-library/react';
4+
import { IntlProvider } from '@edx/frontend-platform/i18n';
5+
import { AppProvider } from '@edx/frontend-platform/react';
6+
import { initializeMockApp } from '@edx/frontend-platform/testing';
47

8+
import PagesAndResourcesProvider from 'CourseAuthoring/pages-and-resources/PagesAndResourcesProvider';
9+
import initializeStore from 'CourseAuthoring/store';
10+
import { RequestStatus } from 'CourseAuthoring/data/constants';
511
import SettingsComponent from './SettingsComponent';
612

713
jest.mock('react-router-dom', () => ({
814
...jest.requireActual('react-router-dom'),
9-
useParams: () => ({
10-
appId: 'wiki',
11-
}),
15+
useParams: jest.fn(),
1216
}));
1317

18+
jest.mock('CourseAuthoring/utils', () => ({
19+
useAppSetting: () => [false, () => undefined],
20+
useIsMobile: () => false,
21+
}));
22+
23+
let store;
24+
25+
// eslint-disable-next-line react/prop-types
26+
const RequiredProviders = ({ children }) => (
27+
<IntlProvider locale="en" messages={{}}>
28+
<AppProvider store={store}>
29+
<PagesAndResourcesProvider courseId="course-v1:foo+bar+baz">
30+
{children}
31+
</PagesAndResourcesProvider>
32+
</AppProvider>
33+
</IntlProvider>
34+
);
35+
1436
describe('SettingsComponent', () => {
37+
beforeEach(async () => {
38+
initializeMockApp();
39+
store = initializeStore({
40+
models: {
41+
courseApps: {
42+
wiki: {},
43+
},
44+
},
45+
pagesAndResources: {
46+
loadingStatus: RequestStatus.SUCCESSFUL,
47+
},
48+
});
49+
});
50+
1551
test('renders LazyLoadedComponent when provided with props', async () => {
16-
const { asFragment } = render(
17-
<BrowserRouter>
18-
<Suspense fallback="...">
19-
<SettingsComponent url="/some-url" />
20-
</Suspense>
21-
</BrowserRouter>,
52+
useParams.mockImplementation(() => ({ appId: 'wiki' }));
53+
54+
const rendered = render(
55+
<Suspense fallback="...">
56+
<SettingsComponent url="/some-url" />
57+
</Suspense>,
58+
{ wrapper: RequiredProviders },
59+
);
60+
61+
await waitFor(() => expect(rendered.getByText('Configure wiki')).toBeInTheDocument());
62+
63+
const modalComponent = screen.getByRole('dialog');
64+
expect(modalComponent.querySelector('#enable-wiki-toggleHelpText')).toContainHTML('The course wiki can be set up');
65+
});
66+
67+
test('renders error message when plugin is unavilable when provided with props', async () => {
68+
// Silence noisy error about the plugin failing to load, when we do that deliberately.
69+
jest.spyOn(console, 'trace').mockImplementation(() => {});
70+
// Specify an invalid course app, with no matching plugin:
71+
useParams.mockImplementation(() => ({ appId: 'invalid-plugin' }));
72+
73+
const rendered = render(
74+
<Suspense fallback="...">
75+
<SettingsComponent url="/some-url" />
76+
</Suspense>,
77+
{ wrapper: RequiredProviders },
2278
);
2379

24-
expect(asFragment).toMatchSnapshot();
80+
const errorMessage = 'An error occurred when loading the configuration UI';
81+
await waitFor(() => expect(rendered.container).toHaveTextContent(errorMessage));
2582
});
2683
});

src/pages-and-resources/__snapshots__/SettingsComponent.test.jsx.snap

Lines changed: 0 additions & 3 deletions
This file was deleted.

src/pages-and-resources/discussions/app-config-form/apps/openedx/OpenedXConfigForm.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import React, { useState } from 'react';
66

77
import { useSelector } from 'react-redux';
88
import * as Yup from 'yup';
9-
import { useModel, useModels } from '../../../../../generic/model-store';
10-
import { setupYupExtensions } from '../../../../../utils';
9+
import { useModel, useModels } from 'CourseAuthoring/generic/model-store';
10+
import { setupYupExtensions } from 'CourseAuthoring/utils';
1111
import messages from '../../messages';
1212
import { checkFieldErrors } from '../../utils';
1313
import AnonymousPostingFields from '../shared/AnonymousPostingFields';

src/store.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { reducer as liveReducer } from '@openedx-plugins/course-app-live/data/sl
66

77
import { reducer as modelsReducer } from './generic/model-store';
88
import { reducer as courseDetailReducer } from './data/slice';
9-
import { reducer as discussionsReducer } from './pages-and-resources/discussions';
9+
import { reducer as discussionsReducer } from './pages-and-resources/discussions/data/slice';
1010
import { reducer as pagesAndResourcesReducer } from './pages-and-resources/data/slice';
1111
import { reducer as customPagesReducer } from './custom-pages/data/slice';
1212
import { reducer as advancedSettingsReducer } from './advanced-settings/data/slice';

0 commit comments

Comments
 (0)