Skip to content

Commit 157f195

Browse files
committed
test: deprecate react-unit-test-utils 7/14
1 parent baaf4e6 commit 157f195

File tree

11 files changed

+370
-479
lines changed

11 files changed

+370
-479
lines changed

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

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

src/components/FilePreview/components/FileRenderer/__snapshots__/index.test.jsx.snap

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

src/components/FilePreview/components/FileRenderer/hooks.test.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { mockUseKeyedState } from '@edx/react-unit-test-utils';
22

33
import { useRenderData, stateKeys } from './hooks';
4+
import { errorStatuses, errorMessages } from '../constants';
45

56
const state = mockUseKeyedState(stateKeys);
67

@@ -43,4 +44,27 @@ describe('useRenderData', () => {
4344
state.expectSetStateCalledWith(stateKeys.errorStatus, null);
4445
state.expectSetStateCalledWith(stateKeys.isLoading, true);
4546
});
47+
48+
it('returns correct error message for different error statuses', () => {
49+
// Test notFound error message
50+
state.mockVal(stateKeys.errorStatus, errorStatuses.notFound);
51+
let out = useRenderData(props);
52+
expect(out.error.headerMessage).toBe(errorMessages[errorStatuses.notFound]);
53+
54+
// Test fallback to serverError message for unknown error status
55+
state.mockVal(stateKeys.errorStatus, errorStatuses.badRequest);
56+
out = useRenderData(props);
57+
expect(out.error.headerMessage).toBe(
58+
errorMessages[errorStatuses.serverError],
59+
);
60+
});
61+
62+
it('handles unknown file types', () => {
63+
const propsWithUnknownFile = {
64+
...props,
65+
file: { fileName: 'file.unknown', fileUrl: 'http://example.com' },
66+
};
67+
const out = useRenderData(propsWithUnknownFile);
68+
expect(out.Renderer).toBeUndefined();
69+
});
4670
});
Lines changed: 62 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,39 @@
1-
import { shallow } from '@edx/react-unit-test-utils';
1+
import { render, screen } from '@testing-library/react';
2+
import '@testing-library/jest-dom';
3+
import { IntlProvider } from '@edx/frontend-platform/i18n';
24

35
import { useRenderData } from './hooks';
46
import { FileRenderer } from './index';
57

6-
jest.mock('./Banners', () => ({
7-
ErrorBanner: () => 'ErrorBanner',
8-
LoadingBanner: () => 'LoadingBanner',
9-
}));
8+
jest.unmock('@openedx/paragon');
9+
jest.unmock('react');
10+
jest.unmock('@edx/frontend-platform/i18n');
1011

12+
// Mock the hooks and components that have complex dependencies
1113
jest.mock('./hooks', () => ({
1214
useRenderData: jest.fn(),
1315
}));
1416

17+
jest.mock('./Banners', () => ({
18+
// eslint-disable-next-line react/prop-types
19+
ErrorBanner: ({ message }) => <div data-testid="error-banner">{message}</div>,
20+
LoadingBanner: () => <div data-testid="loading-banner">Loading...</div>,
21+
}));
22+
23+
// eslint-disable-next-line react/prop-types
24+
jest.mock('./FileCard', () => ({ children, file, defaultOpen }) => (
25+
<div data-testid="file-card">
26+
<div>
27+
{/* eslint-disable-next-line react/prop-types */}
28+
{file.fileName} - {defaultOpen ? 'open' : 'closed'}
29+
</div>
30+
{children}
31+
</div>
32+
));
33+
1534
describe('FileRenderer Component', () => {
35+
const renderWithIntl = (component) => render(<IntlProvider locale="en">{component}</IntlProvider>);
36+
1637
const props = {
1738
file: {
1839
fileName: 'some_file',
@@ -22,7 +43,7 @@ describe('FileRenderer Component', () => {
2243
};
2344

2445
const defaultRenderData = {
25-
Renderer: () => 'Renderer',
46+
Renderer: () => <div data-testid="renderer">Renderer content</div>,
2647
isLoading: false,
2748
errorStatus: false,
2849
error: null,
@@ -31,32 +52,49 @@ describe('FileRenderer Component', () => {
3152
},
3253
};
3354

34-
it('render default', () => {
55+
beforeEach(() => {
56+
jest.clearAllMocks();
57+
});
58+
59+
it('renders default renderer', () => {
3560
useRenderData.mockReturnValue(defaultRenderData);
36-
const wrapper = shallow(<FileRenderer {...props} />);
37-
expect(wrapper.snapshot).toMatchSnapshot();
61+
renderWithIntl(<FileRenderer {...props} />);
3862

39-
expect(wrapper.instance.findByType('Renderer')).toHaveLength(1);
40-
expect(wrapper.instance.findByType('LoadingBanner')).toHaveLength(0);
41-
expect(wrapper.instance.findByType('ErrorBanner')).toHaveLength(0);
63+
expect(screen.getByTestId('file-card')).toBeInTheDocument();
64+
expect(screen.getByText('some_file - open')).toBeInTheDocument();
65+
expect(screen.getByTestId('renderer')).toBeInTheDocument();
66+
expect(screen.getByText('Renderer content')).toBeInTheDocument();
67+
expect(screen.queryByTestId('loading-banner')).not.toBeInTheDocument();
68+
expect(screen.queryByTestId('error-banner')).not.toBeInTheDocument();
4269
});
4370

44-
it('render loading banner', () => {
71+
it('renders loading banner', () => {
4572
useRenderData.mockReturnValue({ ...defaultRenderData, isLoading: true });
46-
const wrapper = shallow(<FileRenderer {...props} />);
47-
expect(wrapper.snapshot).toMatchSnapshot();
73+
renderWithIntl(<FileRenderer {...props} />);
74+
75+
expect(screen.getByTestId('loading-banner')).toBeInTheDocument();
76+
expect(screen.getByText('Loading...')).toBeInTheDocument();
77+
expect(screen.queryByTestId('error-banner')).not.toBeInTheDocument();
78+
expect(screen.queryByTestId('renderer')).not.toBeInTheDocument();
79+
});
80+
81+
it('renders error banner', () => {
82+
useRenderData.mockReturnValue({
83+
errorStatus: true,
84+
error: { message: 'some_error' },
85+
});
86+
renderWithIntl(<FileRenderer {...props} />);
4887

49-
expect(wrapper.instance.findByType('LoadingBanner')).toHaveLength(1);
50-
expect(wrapper.instance.findByType('ErrorBanner')).toHaveLength(0);
51-
expect(wrapper.instance.findByType('Renderer')).toHaveLength(0);
88+
expect(screen.getByTestId('error-banner')).toBeInTheDocument();
89+
expect(screen.getByText('some_error')).toBeInTheDocument();
90+
expect(screen.queryByTestId('loading-banner')).not.toBeInTheDocument();
91+
expect(screen.queryByTestId('renderer')).not.toBeInTheDocument();
5292
});
5393

54-
it('render error banner', () => {
55-
useRenderData.mockReturnValue({ errorStatus: true, error: { message: 'some_error' } });
56-
const wrapper = shallow(<FileRenderer {...props} />);
57-
expect(wrapper.snapshot).toMatchSnapshot();
94+
it('passes defaultOpen prop correctly', () => {
95+
useRenderData.mockReturnValue(defaultRenderData);
96+
renderWithIntl(<FileRenderer {...props} defaultOpen={false} />);
5897

59-
expect(wrapper.instance.findByType('ErrorBanner')).toHaveLength(1);
60-
expect(wrapper.instance.findByType('LoadingBanner')).toHaveLength(0);
98+
expect(screen.getByText('some_file - closed')).toBeInTheDocument();
6199
});
62100
});
Lines changed: 46 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,86 @@
1-
import { shallow } from '@edx/react-unit-test-utils';
1+
import { render, screen } from '@testing-library/react';
2+
import '@testing-library/jest-dom';
23

34
import { useResponse } from 'hooks/app';
45
import { isSupported } from './components';
56

67
import FilePreview from './index';
78

9+
jest.unmock('@openedx/paragon');
10+
jest.unmock('react');
11+
jest.unmock('@edx/frontend-platform/i18n');
12+
813
jest.mock('hooks/app', () => ({
914
useResponse: jest.fn(),
1015
}));
1116

1217
jest.mock('./components', () => ({
13-
FileRenderer: () => 'FileRenderer',
18+
// eslint-disable-next-line react/prop-types
19+
FileRenderer: ({ file, defaultOpen }) => (
20+
<div data-testid="file-renderer">
21+
{/* eslint-disable-next-line react/prop-types */}
22+
{file.fileName} - {defaultOpen ? 'open' : 'closed'}
23+
</div>
24+
),
1425
isSupported: jest.fn(),
1526
}));
1627

1728
describe('<FilePreview />', () => {
1829
const props = {
1930
defaultCollapsePreview: false,
2031
};
32+
33+
beforeEach(() => {
34+
jest.clearAllMocks();
35+
});
36+
2137
it('renders nothing when no files are uploaded', () => {
22-
useResponse.mockReturnValueOnce({ uploadedFiles: null });
23-
const wrapper = shallow(<FilePreview {...props} />);
24-
expect(wrapper.snapshot).toMatchSnapshot();
25-
expect(wrapper.isEmptyRender()).toBe(true);
38+
useResponse.mockReturnValue({ uploadedFiles: null });
39+
const { container } = render(<FilePreview {...props} />);
40+
expect(container.firstChild).toBeNull();
2641
});
2742

28-
it('renders only div when no supported files are uploaded', () => {
29-
useResponse.mockReturnValueOnce({
43+
it('renders empty div when no supported files are uploaded', () => {
44+
useResponse.mockReturnValue({
3045
uploadedFiles: [{ fileName: 'file1.txt' }],
3146
});
32-
isSupported.mockReturnValueOnce(false);
33-
const wrapper = shallow(<FilePreview {...props} />);
34-
expect(wrapper.snapshot).toMatchSnapshot();
47+
isSupported.mockReturnValue(false);
48+
const { container } = render(<FilePreview {...props} />);
3549

36-
expect(wrapper.instance.findByType('FileRenderer')).toHaveLength(0);
50+
expect(container.firstChild).toBeInTheDocument();
51+
expect(container.firstChild.tagName).toBe('DIV');
52+
expect(screen.queryByTestId('file-renderer')).not.toBeInTheDocument();
3753
});
3854

39-
it('render only supported files', () => {
55+
it('renders only supported files', () => {
4056
isSupported
4157
.mockReturnValueOnce(false)
4258
.mockReturnValueOnce(true)
4359
.mockReturnValueOnce(true);
4460

45-
useResponse.mockReturnValueOnce({
61+
useResponse.mockReturnValue({
4662
uploadedFiles: [
4763
{ fileName: 'file1.txt' },
4864
{ fileName: 'file2.pdf' },
4965
{ fileName: 'file3.jpg' },
5066
],
5167
});
52-
const wrapper = shallow(<FilePreview {...props} />);
53-
expect(wrapper.snapshot).toMatchSnapshot();
68+
render(<FilePreview {...props} />);
69+
70+
const fileRenderers = screen.getAllByTestId('file-renderer');
71+
expect(fileRenderers).toHaveLength(2);
72+
expect(screen.getByText('file2.pdf - open')).toBeInTheDocument();
73+
expect(screen.getByText('file3.jpg - open')).toBeInTheDocument();
74+
expect(screen.queryByText('file1.txt - open')).not.toBeInTheDocument();
75+
});
76+
77+
it('passes defaultCollapsePreview prop correctly', () => {
78+
isSupported.mockReturnValue(true);
79+
useResponse.mockReturnValue({
80+
uploadedFiles: [{ fileName: 'file1.pdf' }],
81+
});
82+
render(<FilePreview defaultCollapsePreview />);
5483

55-
expect(wrapper.instance.findByType('FileRenderer')).toHaveLength(2);
84+
expect(screen.getByText('file1.pdf - closed')).toBeInTheDocument();
5685
});
5786
});

0 commit comments

Comments
 (0)