Skip to content

Commit ec3c25f

Browse files
authored
test: deprecate react-unit-test-utils part-3 (#430)
1 parent b54e8ff commit ec3c25f

17 files changed

+321
-881
lines changed

src/components/ConfirmModal.test.jsx

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { render } from '@testing-library/react';
1+
import { render, screen, fireEvent } from '@testing-library/react';
22
import { ConfirmModal } from './ConfirmModal';
33

44
jest.unmock('@openedx/paragon');
@@ -14,12 +14,30 @@ describe('ConfirmModal', () => {
1414
onCancel: jest.fn().mockName('this.props.onCancel'),
1515
onConfirm: jest.fn().mockName('this.props.onConfirm'),
1616
};
17+
18+
beforeEach(() => {
19+
jest.clearAllMocks();
20+
});
21+
1722
it('should not render content when modal is closed', () => {
1823
const { queryByText } = render(<ConfirmModal {...props} />);
1924
expect(queryByText(props.content)).toBeNull();
2025
});
26+
2127
it('should display content when modal is open', () => {
2228
const { getByText } = render(<ConfirmModal {...props} isOpen />);
2329
expect(getByText(props.content)).toBeInTheDocument();
2430
});
31+
32+
it('should call onCancel when cancel button is clicked', () => {
33+
render(<ConfirmModal {...props} isOpen />);
34+
fireEvent.click(screen.getByText(props.cancelText));
35+
expect(props.onCancel).toHaveBeenCalledTimes(1);
36+
});
37+
38+
it('should call onConfirm when confirm button is clicked', () => {
39+
render(<ConfirmModal {...props} isOpen />);
40+
fireEvent.click(screen.getByText(props.confirmText));
41+
expect(props.onConfirm).toHaveBeenCalledTimes(1);
42+
});
2543
});
Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,29 @@
1-
import React from 'react';
2-
import { shallow } from '@edx/react-unit-test-utils';
3-
1+
import { Document, Page } from 'react-pdf';
2+
import { render } from '@testing-library/react';
3+
import PropTypes from 'prop-types';
44
import PDFRenderer from './PDFRenderer';
5-
65
import * as hooks from './pdfHooks';
76

87
jest.mock('react-pdf', () => ({
98
pdfjs: { GlobalWorkerOptions: {} },
10-
Document: () => 'Document',
11-
Page: () => 'Page',
9+
Document: jest.fn(),
10+
Page: jest.fn(),
1211
}));
1312

13+
Document.mockImplementation((props) => <div data-testid="pdf-document">{props.children}</div>);
14+
Document.propTypes = {
15+
children: PropTypes.node,
16+
};
17+
18+
Page.mockImplementation(() => <div data-testid="pdf-page">Page Content</div>);
19+
1420
jest.mock('./pdfHooks', () => ({
1521
rendererHooks: jest.fn(),
1622
}));
1723

24+
jest.unmock('@openedx/paragon');
25+
jest.unmock('react');
26+
1827
describe('PDF Renderer Component', () => {
1928
const props = {
2029
url: 'some_url.pdf',
@@ -33,25 +42,45 @@ describe('PDF Renderer Component', () => {
3342
onNextPageButtonClick: jest.fn().mockName('hooks.onNextPageButtonClick'),
3443
onPrevPageButtonClick: jest.fn().mockName('hooks.onPrevPageButtonClick'),
3544
hasNext: true,
36-
hasPref: false,
45+
hasPrev: false,
3746
};
3847

3948
beforeEach(() => {
4049
jest.clearAllMocks();
4150
});
42-
describe('snapshots', () => {
43-
test('first page, prev is disabled', () => {
51+
52+
describe('rendering', () => {
53+
it('should render the PDF document with navigation controls', () => {
4454
hooks.rendererHooks.mockReturnValue(hookProps);
45-
expect(shallow(<PDFRenderer {...props} />).snapshot).toMatchSnapshot();
55+
const { getByTestId, getAllByText, container } = render(<PDFRenderer {...props} />);
56+
expect(getByTestId('pdf-document')).toBeInTheDocument();
57+
expect(getByTestId('pdf-page')).toBeInTheDocument();
58+
expect(container.querySelector('input[type="number"]')).toBeInTheDocument();
59+
expect(getAllByText(/Page/).length).toBeGreaterThan(0);
60+
expect(getAllByText(`of ${hookProps.numPages}`).length).toBeGreaterThan(0);
61+
});
62+
63+
it('should have disabled previous button when on the first page', () => {
64+
hooks.rendererHooks.mockReturnValue({
65+
...hookProps,
66+
hasPrev: false,
67+
});
68+
69+
const { container } = render(<PDFRenderer {...props} />);
70+
const prevButton = container.querySelector('button[aria-label="previous pdf page"]');
71+
expect(prevButton).toBeDisabled();
4672
});
47-
test('on last page, next is disabled', () => {
73+
74+
it('should have disabled next button when on the last page', () => {
4875
hooks.rendererHooks.mockReturnValue({
4976
...hookProps,
50-
pageNumber: hookProps.numPages,
5177
hasNext: false,
5278
hasPrev: true,
5379
});
54-
expect(shallow(<PDFRenderer {...props} />).snapshot).toMatchSnapshot();
80+
81+
const { container } = render(<PDFRenderer {...props} />);
82+
const nextButton = container.querySelector('button[aria-label="next pdf page"]');
83+
expect(nextButton).toBeDisabled();
5584
});
5685
});
5786
});
Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,41 @@
1-
import React from 'react';
2-
import { shallow } from '@edx/react-unit-test-utils';
3-
1+
import { render } from '@testing-library/react';
42
import TXTRenderer from './TXTRenderer';
53

64
jest.mock('./textHooks', () => {
7-
const content = 'test-content';
5+
const mockRendererHooks = jest.fn().mockReturnValue({ content: 'test-content' });
86
return {
9-
content,
10-
rendererHooks: (args) => ({ content, rendererHooks: args }),
7+
rendererHooks: mockRendererHooks,
118
};
129
});
1310

11+
jest.unmock('@openedx/paragon');
12+
jest.unmock('react');
13+
14+
const textHooks = require('./textHooks');
15+
1416
describe('TXT Renderer Component', () => {
1517
const props = {
1618
url: 'some_url.txt',
1719
onError: jest.fn().mockName('this.props.onError'),
1820
onSuccess: jest.fn().mockName('this.props.onSuccess'),
1921
};
20-
test('snapshot', () => {
21-
expect(shallow(<TXTRenderer {...props} />).snapshot).toMatchSnapshot();
22+
23+
beforeEach(() => {
24+
textHooks.rendererHooks.mockClear();
25+
});
26+
27+
it('renders the text content in a pre element', () => {
28+
const { getByText, container } = render(<TXTRenderer {...props} />);
29+
expect(getByText('test-content')).toBeInTheDocument();
30+
expect(container.querySelector('pre')).toHaveClass('txt-renderer');
31+
});
32+
33+
it('passes the correct props to rendererHooks', () => {
34+
render(<TXTRenderer {...props} />);
35+
expect(textHooks.rendererHooks).toHaveBeenCalledWith({
36+
url: props.url,
37+
onError: props.onError,
38+
onSuccess: props.onSuccess,
39+
});
2240
});
2341
});

src/components/FilePreview/BaseRenderers/__snapshots__/PDFRenderer.test.jsx.snap

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

src/components/FilePreview/BaseRenderers/__snapshots__/TXTRenderer.test.jsx.snap

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

src/components/Head/__snapshots__/index.test.jsx.snap

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

src/components/Head/index.test.jsx

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,48 @@
1-
import React from 'react';
2-
import { getConfig } from '@edx/frontend-platform';
3-
import { shallow } from '@edx/react-unit-test-utils';
1+
import { render } from '@testing-library/react';
2+
import { Helmet } from 'react-helmet';
43
import Head from '.';
54

5+
jest.mock('@edx/frontend-platform/i18n', () => ({
6+
useIntl: () => ({
7+
formatMessage: (message, values) => {
8+
if (message.defaultMessage && values) {
9+
return message.defaultMessage.replace('{siteName}', values.siteName);
10+
}
11+
return message.defaultMessage || message.id;
12+
},
13+
}),
14+
defineMessages: (messages) => messages,
15+
}));
16+
617
jest.mock('react-helmet', () => ({
7-
Helmet: 'Helmet',
18+
Helmet: jest.fn(),
819
}));
920

21+
Helmet.mockImplementation(({ children }) => <div data-testid="helmet-mock">{children}</div>);
22+
1023
jest.mock('@edx/frontend-platform', () => ({
11-
getConfig: () => ({
24+
getConfig: jest.fn().mockReturnValue({
1225
SITE_NAME: 'site-name',
1326
FAVICON_URL: 'favicon-url',
1427
}),
1528
}));
1629

30+
jest.unmock('@openedx/paragon');
31+
jest.unmock('react');
32+
1733
describe('Head', () => {
18-
it('snapshot', () => {
19-
const el = shallow(<Head />);
20-
expect(el.snapshot).toMatchSnapshot();
34+
it('should render page title with site name from config', () => {
35+
const { container } = render(<Head />);
36+
const titleElement = container.querySelector('title');
37+
expect(titleElement).toBeInTheDocument();
38+
expect(titleElement.textContent).toContain('ORA staff grading | site-name');
39+
});
2140

22-
expect(el.instance.findByType('title')[0].el.children[0]).toContain(getConfig().SITE_NAME);
23-
expect(el.instance.findByType('link')[0].props.href).toEqual(getConfig().FAVICON_URL);
41+
it('should render favicon link with URL from config', () => {
42+
const { container } = render(<Head />);
43+
const faviconLink = container.querySelector('link[rel="shortcut icon"]');
44+
expect(faviconLink).toBeInTheDocument();
45+
expect(faviconLink.getAttribute('href')).toEqual('favicon-url');
46+
expect(faviconLink.getAttribute('type')).toEqual('image/x-icon');
2447
});
2548
});

0 commit comments

Comments
 (0)