Skip to content

Commit 8e5a16e

Browse files
Replace ScrollToTop with useScrollToTop (#3041)
* Improve test for previous PR * Functionalize ModulePageContent * Functionalize SettingsContainer * Fix broken enzyme test by migrating to RTL * Format code * Remove ScrollToTop * Minor stylistic change * Some changes * Make requested changes for ModulePageContent * Make requested changes for SettingsContainer * Make requested changes to ModulePageContent test * Fix formatting * Fix typechecking issue * Use Set instead of Array for checking membership Co-authored-by: Zhang Yi Jiang <[email protected]>
1 parent 5cb569f commit 8e5a16e

File tree

7 files changed

+483
-505
lines changed

7 files changed

+483
-505
lines changed

website/src/test-utils/renderWithRouterMatch.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export default function renderWithRouterMatch(
1313
children: ReactNode,
1414
{
1515
path = '/',
16-
location,
16+
location = '/',
1717
}: {
1818
path?: string;
1919
location?: Parameters<typeof createHistory>[0];

website/src/views/components/ScrollToTop.tsx

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

website/src/views/hooks/useMediaQuery.test.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ import type { MediaQuery } from 'types/views';
33
import { act, render } from '@testing-library/react';
44
import { breakpointUp } from 'utils/css';
55
import { mockDom, mockDomReset, mockWindowMatchMedia } from 'test-utils/mockDom';
6-
import json2mq from 'json2mq';
7-
import useMediaQuery from './useMediaQuery';
6+
import useMediaQuery, { getMedia } from './useMediaQuery';
87

98
type Props = {
109
mediaQuery: MediaQuery;
@@ -59,11 +58,11 @@ describe(useMediaQuery, () => {
5958

6059
const jsonMediaQuery = breakpointUp('md');
6160
make(jsonMediaQuery);
62-
expect(matchMediaSpy).toHaveBeenLastCalledWith(json2mq(jsonMediaQuery));
61+
expect(matchMediaSpy).toHaveBeenLastCalledWith(getMedia(jsonMediaQuery));
6362

6463
const stringMediaQuery = '(min-width: 100px)';
6564
make(stringMediaQuery);
66-
expect(matchMediaSpy).toHaveBeenLastCalledWith(stringMediaQuery);
65+
expect(matchMediaSpy).toHaveBeenLastCalledWith(getMedia(stringMediaQuery));
6766

6867
matchMediaSpy.mockRestore();
6968
});

website/src/views/hooks/useMediaQuery.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@ import { useMemo } from 'react';
33
import { Subscription, useSubscription } from 'use-subscription';
44
import json2mq from 'json2mq';
55

6+
export function getMedia(mediaQuery: MediaQuery): string {
7+
return typeof mediaQuery === 'string' ? mediaQuery : json2mq(mediaQuery);
8+
}
9+
610
/**
711
* To be used together with utilities in css.ts.
812
* @returns Whether `mediaQuery` is/are matched.
913
*/
1014
export default function useMediaQuery(mediaQuery: MediaQuery) {
11-
const media = useMemo(() => (typeof mediaQuery === 'string' ? mediaQuery : json2mq(mediaQuery)), [
12-
mediaQuery,
13-
]);
15+
const media = useMemo(() => getMedia(mediaQuery), [mediaQuery]);
1416

1517
const subscription = useMemo<Subscription<boolean>>(
1618
() => ({
Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,46 @@
1-
import ScrollSpy from 'react-scrollspy';
2-
import { shallow } from 'enzyme';
3-
41
import { Module } from 'types/modules';
2+
import { screen } from '@testing-library/react';
3+
import { Provider } from 'react-redux';
4+
55
/** @var {Module} */
66
import { CS1010S } from '__mocks__/modules';
7-
7+
import { initAction } from 'test-utils/redux';
8+
import { mockDom, mockDomReset } from 'test-utils/mockDom';
9+
import reducers from 'reducers';
10+
import configureStore from 'bootstrapping/configure-store';
11+
import renderWithRouterMatch from 'test-utils/renderWithRouterMatch';
812
import ModulePageContent from './ModulePageContent';
913

10-
describe(ModulePageContent, () => {
14+
describe('ModulePageContent', () => {
1115
function make(module: Module = CS1010S) {
12-
return shallow(<ModulePageContent module={module} />);
16+
const initialState = reducers(undefined, initAction());
17+
const { store } = configureStore(initialState);
18+
return renderWithRouterMatch(
19+
<Provider store={store}>
20+
<ModulePageContent module={module} />
21+
</Provider>,
22+
{},
23+
);
1324
}
1425

26+
beforeEach(() => {
27+
mockDom();
28+
});
29+
30+
afterEach(() => {
31+
mockDomReset();
32+
});
33+
1534
test('side menu items should appear in the same order in the document', () => {
16-
const component = make();
17-
expect(component.find('[id]').map((ele) => ele.prop('id'))).toEqual(
18-
component.find(ScrollSpy).prop('items'),
19-
);
35+
const { view } = make();
36+
const { container } = view;
37+
const sideMenuItems = screen
38+
.getAllByRole('link')
39+
.map((elem) => elem.textContent?.toLowerCase());
40+
const sideMenuSet = new Set(sideMenuItems);
41+
const documentIds = Array.from(container.querySelectorAll('[id]'))
42+
.map((ele) => ele.id)
43+
.filter((ele) => sideMenuSet.has(ele));
44+
expect(sideMenuItems).toEqual(documentIds);
2045
});
2146
});

0 commit comments

Comments
 (0)