Skip to content

Commit 7684efb

Browse files
authored
test: deprecate react-unit-test-utils 2/14 (#338)
1 parent e13f0d2 commit 7684efb

File tree

10 files changed

+228
-126
lines changed

10 files changed

+228
-126
lines changed
Lines changed: 69 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,92 @@
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 userEvent from '@testing-library/user-event';
4+
import { IntlProvider } from '@edx/frontend-platform/i18n';
25

36
import ErrorBanner from './ErrorBanner';
47

8+
jest.unmock('@openedx/paragon');
9+
jest.unmock('react');
10+
jest.unmock('@edx/frontend-platform/i18n');
11+
512
describe('<ErrorBanner />', () => {
613
const props = {
714
headerMessage: {
815
id: 'headerMessageId',
9-
defaultMessage: 'headerMessage',
16+
defaultMessage: 'Test Error Header',
1017
},
1118
actions: [
1219
{
1320
id: 'actionId',
1421
onClick: jest.fn().mockName('onClick'),
1522
message: {
1623
id: 'actionMessageId',
17-
defaultMessage: 'actionMessage',
24+
defaultMessage: 'Retry Action',
1825
},
1926
},
2027
],
2128
};
2229

23-
it('renders correctly', () => {
24-
const wrapper = shallow(<ErrorBanner {...props}>children</ErrorBanner>);
25-
expect(wrapper.snapshot).toMatchSnapshot();
30+
const renderWithIntl = (component) => render(<IntlProvider locale="en">{component}</IntlProvider>);
31+
32+
it('renders error banner with header message and children', () => {
33+
renderWithIntl(
34+
<ErrorBanner {...props}>
35+
<div>Error details content</div>
36+
</ErrorBanner>,
37+
);
38+
39+
expect(screen.getByRole('alert')).toBeInTheDocument();
40+
expect(screen.getByRole('alert')).toHaveClass('alert-danger');
41+
expect(screen.getByText('Test Error Header')).toBeInTheDocument();
42+
expect(screen.getByText('Error details content')).toBeInTheDocument();
43+
});
44+
45+
it('renders action buttons when actions are provided', () => {
46+
renderWithIntl(
47+
<ErrorBanner {...props}>
48+
<div>Error content</div>
49+
</ErrorBanner>,
50+
);
51+
52+
const actionButton = screen.getByRole('button', { name: 'Retry Action' });
53+
expect(actionButton).toBeInTheDocument();
54+
expect(actionButton).toHaveClass('btn-outline-primary');
55+
});
56+
57+
it('calls action onClick when button is clicked', async () => {
58+
const user = userEvent.setup();
59+
renderWithIntl(
60+
<ErrorBanner {...props}>
61+
<div>Error content</div>
62+
</ErrorBanner>,
63+
);
64+
65+
const actionButton = screen.getByRole('button', { name: 'Retry Action' });
66+
await user.click(actionButton);
67+
68+
expect(props.actions[0].onClick).toHaveBeenCalledTimes(1);
2669
});
2770

28-
it('renders without actions', () => {
29-
const wrapper = shallow(<ErrorBanner headerMessage={props.headerMessage}>children</ErrorBanner>);
30-
expect(wrapper.snapshot).toMatchSnapshot();
71+
it('renders without action buttons when no actions provided', () => {
72+
renderWithIntl(
73+
<ErrorBanner headerMessage={props.headerMessage}>
74+
<div>Error content without actions</div>
75+
</ErrorBanner>,
76+
);
77+
78+
expect(screen.getByRole('alert')).toBeInTheDocument();
79+
expect(screen.getByText('Test Error Header')).toBeInTheDocument();
80+
expect(
81+
screen.getByText('Error content without actions'),
82+
).toBeInTheDocument();
83+
expect(screen.queryByRole('button')).not.toBeInTheDocument();
84+
});
85+
86+
it('renders without children when not provided', () => {
87+
renderWithIntl(<ErrorBanner headerMessage={props.headerMessage} />);
88+
89+
expect(screen.getByRole('alert')).toBeInTheDocument();
90+
expect(screen.getByText('Test Error Header')).toBeInTheDocument();
3191
});
3292
});
Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,26 @@
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 LoadingBanner from './LoadingBanner';
45

6+
jest.unmock('@openedx/paragon');
7+
jest.unmock('react');
8+
jest.unmock('@edx/frontend-platform/i18n');
9+
510
describe('<LoadingBanner />', () => {
6-
it('renders correctly', () => {
7-
const wrapper = shallow(<LoadingBanner />);
8-
expect(wrapper.snapshot).toMatchSnapshot();
11+
it('renders an info alert with spinner', () => {
12+
const { container } = render(<LoadingBanner />);
13+
14+
// Check for alert with info variant
15+
const alert = screen.getByRole('alert');
16+
expect(alert).toBeInTheDocument();
17+
expect(alert).toHaveClass('alert-info');
18+
19+
// Check for spinner by class name
20+
const spinner = container.querySelector('.spinner-border');
21+
expect(spinner).toBeInTheDocument();
22+
expect(spinner).toHaveClass('pgn__spinner');
23+
expect(spinner).toHaveClass('d-flex');
24+
expect(spinner).toHaveClass('m-auto');
925
});
1026
});

src/components/FilePreview/components/FileRenderer/Banners/__snapshots__/ErrorBanner.test.jsx.snap

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

src/components/FilePreview/components/FileRenderer/Banners/__snapshots__/LoadingBanner.test.jsx.snap

Lines changed: 0 additions & 12 deletions
This file was deleted.
Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,58 @@
1-
import { shallow } from '@edx/react-unit-test-utils';
1+
import { render, screen, fireEvent } from '@testing-library/react';
2+
import '@testing-library/jest-dom';
23

34
import ImageRenderer from './ImageRenderer';
45

6+
jest.unmock('@openedx/paragon');
7+
jest.unmock('react');
8+
jest.unmock('@edx/frontend-platform/i18n');
9+
510
describe('<ImageRenderer />', () => {
611
const props = {
7-
fileName: 'fileName',
8-
url: 'url',
12+
fileName: 'test-image.jpg',
13+
url: 'https://example.com/test-image.jpg',
914
onError: jest.fn().mockName('onError'),
1015
onSuccess: jest.fn().mockName('onSuccess'),
1116
};
1217

13-
it('renders default', () => {
14-
const wrapper = shallow(<ImageRenderer {...props} />);
15-
expect(wrapper.snapshot).toMatchSnapshot();
18+
beforeEach(() => {
19+
jest.clearAllMocks();
20+
});
21+
22+
it('renders image with correct attributes', () => {
23+
render(<ImageRenderer {...props} />);
24+
25+
const image = screen.getByRole('img');
26+
expect(image).toBeInTheDocument();
27+
expect(image).toHaveAttribute('src', props.url);
28+
expect(image).toHaveAttribute('alt', props.fileName);
29+
expect(image).toHaveClass('image-renderer');
30+
});
31+
32+
it('calls onError when image fails to load', () => {
33+
render(<ImageRenderer {...props} />);
34+
35+
const image = screen.getByRole('img');
36+
fireEvent.error(image);
37+
38+
expect(props.onError).toHaveBeenCalledTimes(1);
39+
});
40+
41+
it('calls onSuccess when image loads successfully', () => {
42+
render(<ImageRenderer {...props} />);
43+
44+
const image = screen.getByRole('img');
45+
fireEvent.load(image);
46+
47+
expect(props.onSuccess).toHaveBeenCalledTimes(1);
48+
});
49+
50+
it('uses empty string as alt text when fileName is not provided', () => {
51+
const propsWithoutFileName = { ...props, fileName: undefined };
52+
const { container } = render(<ImageRenderer {...propsWithoutFileName} />);
53+
54+
const image = container.querySelector('img');
55+
expect(image).toBeInTheDocument();
56+
expect(image).toHaveAttribute('alt', '');
1657
});
1758
});
Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,42 @@
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 TXTRenderer from './TXTRenderer';
5+
import { useTextRendererData } from './textHooks';
6+
7+
jest.unmock('@openedx/paragon');
8+
jest.unmock('react');
9+
jest.unmock('@edx/frontend-platform/i18n');
410

511
jest.mock('./textHooks', () => ({
6-
useTextRendererData: jest.fn().mockReturnValue({ content: 'content' }),
12+
useTextRendererData: jest
13+
.fn()
14+
.mockReturnValue({ content: 'Sample text content' }),
715
}));
816

917
describe('<TXTRenderer />', () => {
1018
const props = {
11-
url: 'url',
19+
url: 'https://example.com/sample.txt',
1220
onError: jest.fn().mockName('onError'),
1321
onSuccess: jest.fn().mockName('onSuccess'),
1422
};
1523

16-
it('renders default', () => {
17-
const wrapper = shallow(<TXTRenderer {...props} />);
18-
expect(wrapper.snapshot).toMatchSnapshot();
24+
it('renders text content in a pre element', () => {
25+
render(<TXTRenderer {...props} />);
26+
27+
const preElement = screen.getByText('Sample text content');
28+
expect(preElement).toBeInTheDocument();
29+
expect(preElement).toHaveClass('txt-renderer');
30+
expect(preElement.tagName).toBe('PRE');
31+
});
32+
33+
it('calls useTextRendererData hook with correct props', () => {
34+
render(<TXTRenderer {...props} />);
35+
36+
expect(useTextRendererData).toHaveBeenCalledWith({
37+
url: props.url,
38+
onError: props.onError,
39+
onSuccess: props.onSuccess,
40+
});
1941
});
2042
});

src/components/FilePreview/components/FileRenderer/BaseRenderers/__snapshots__/ImageRenderer.test.jsx.snap

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

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

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

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

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

0 commit comments

Comments
 (0)