Skip to content

Commit 57fe161

Browse files
test: Deprecate react-unit-test-utils 4/15 (#656)
1 parent 5c4dfd5 commit 57fe161

File tree

10 files changed

+345
-712
lines changed

10 files changed

+345
-712
lines changed

src/containers/CourseCard/components/CourseCardBanners/CertificateBanner.test.jsx

Lines changed: 208 additions & 188 deletions
Large diffs are not rendered by default.
Lines changed: 35 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
1-
import React from 'react';
2-
import { shallow } from '@edx/react-unit-test-utils';
3-
import { Hyperlink } from '@openedx/paragon';
1+
import { render, screen } from '@testing-library/react';
2+
import { IntlProvider } from '@edx/frontend-platform/i18n';
43

54
import { reduxHooks } from 'hooks';
65
import { formatMessage } from 'testUtils';
76
import { CourseBanner } from './CourseBanner';
87

98
import messages from './messages';
109

11-
jest.mock('components/Banner', () => 'Banner');
1210
jest.mock('hooks', () => ({
1311
utilHooks: {
1412
useFormatDate: () => date => date,
@@ -19,9 +17,11 @@ jest.mock('hooks', () => ({
1917
},
2018
}));
2119

22-
const cardId = 'my-test-course-number';
20+
jest.unmock('@openedx/paragon');
21+
jest.unmock('@edx/frontend-platform/i18n');
22+
jest.unmock('react');
2323

24-
let el;
24+
const cardId = 'test-card-id';
2525

2626
const enrollmentData = {
2727
isVerified: false,
@@ -38,7 +38,7 @@ const courseRunData = {
3838
marketingUrl: 'marketing-url',
3939
};
4040

41-
const render = (overrides = {}) => {
41+
const renderCourseBanner = (overrides = {}) => {
4242
const {
4343
courseRun = {},
4444
enrollment = {},
@@ -51,81 +51,58 @@ const render = (overrides = {}) => {
5151
...enrollmentData,
5252
...enrollment,
5353
});
54-
el = shallow(<CourseBanner cardId={cardId} />);
54+
return render(<IntlProvider locale="en"><CourseBanner cardId={cardId} /></IntlProvider>);
5555
};
5656

5757
describe('CourseBanner', () => {
58-
test('initializes data with course number from enrollment, course and course run data', () => {
59-
render();
58+
it('initializes data with course number from enrollment, course and course run data', () => {
59+
renderCourseBanner();
6060
expect(reduxHooks.useCardCourseRunData).toHaveBeenCalledWith(cardId);
6161
expect(reduxHooks.useCardEnrollmentData).toHaveBeenCalledWith(cardId);
6262
});
63-
test('no display if learner is verified', () => {
64-
render({ enrollment: { isVerified: true } });
65-
expect(el.isEmptyRender()).toEqual(true);
63+
it('no display if learner is verified', () => {
64+
renderCourseBanner({ enrollment: { isVerified: true } });
65+
expect(screen.queryByRole('alert')).toBeNull();
6666
});
6767
describe('audit access expired', () => {
68-
beforeEach(() => {
69-
render({ enrollment: { isAuditAccessExpired: true } });
70-
});
71-
test('snapshot: (auditAccessExpired, findAnotherCourse hyperlink)', () => {
72-
expect(el.snapshot).toMatchSnapshot();
73-
});
74-
test('messages: auditAccessExpired', () => {
75-
expect(el.instance.children[0].children[0].el).toContain(messages.auditAccessExpired.defaultMessage);
76-
expect(el.instance.findByType(Hyperlink)[0].children[0].el).toEqual(messages.findAnotherCourse.defaultMessage);
68+
it('should display correct message and link', () => {
69+
renderCourseBanner({ enrollment: { isAuditAccessExpired: true } });
70+
const auditAccessText = screen.getByText(formatMessage(messages.auditAccessExpired));
71+
expect(auditAccessText).toBeInTheDocument();
72+
const auditAccessLink = screen.getByText(formatMessage(messages.findAnotherCourse));
73+
expect(auditAccessLink).toBeInTheDocument();
7774
});
7875
});
7976
describe('unmet prerequisites', () => {
80-
beforeEach(() => {
81-
render({ enrollment: { coursewareAccess: { hasUnmetPrerequisites: true } } });
82-
});
83-
test('snapshot: unmetPrerequisites', () => {
84-
expect(el.snapshot).toMatchSnapshot();
85-
});
86-
test('messages: prerequisitesNotMet', () => {
87-
expect(el.instance.children[0].children[0].el).toContain(messages.prerequisitesNotMet.defaultMessage);
77+
it('should display correct message', () => {
78+
renderCourseBanner({ enrollment: { coursewareAccess: { hasUnmetPrerequisites: true } } });
79+
const preReqText = screen.getByText(formatMessage(messages.prerequisitesNotMet));
80+
expect(preReqText).toBeInTheDocument();
8881
});
8982
});
9083
describe('too early', () => {
9184
describe('no start date', () => {
92-
beforeEach(() => {
93-
render({ enrollment: { coursewareAccess: { isTooEarly: true } }, courseRun: { startDate: null } });
85+
it('should not display banner', () => {
86+
renderCourseBanner({ enrollment: { coursewareAccess: { isTooEarly: true } }, courseRun: { startDate: null } });
87+
const banner = screen.queryByRole('alert');
88+
expect(banner).toBeNull();
9489
});
95-
test('snapshot', () => expect(el.snapshot).toMatchSnapshot());
96-
test('messages', () => expect(el.instance.children).toEqual([]));
9790
});
9891
describe('has start date', () => {
99-
beforeEach(() => {
100-
render({ enrollment: { coursewareAccess: { isTooEarly: true } } });
101-
});
102-
test('snapshot', () => expect(el.snapshot).toMatchSnapshot());
103-
104-
test('messages: courseHasNotStarted', () => {
105-
expect(el.instance.children[0].children[0].el).toContain(
92+
it('should display messages courseHasNotStarted', () => {
93+
renderCourseBanner({ enrollment: { coursewareAccess: { isTooEarly: true } } });
94+
const earlyMsg = screen.getByText(
10695
formatMessage(messages.courseHasNotStarted, { startDate: courseRunData.startDate }),
10796
);
97+
expect(earlyMsg).toBeInTheDocument();
10898
});
10999
});
110100
});
111101
describe('staff', () => {
112-
beforeEach(() => {
113-
render({ enrollment: { coursewareAccess: { isStaff: true } } });
114-
});
115-
test('snapshot: isStaff', () => {
116-
expect(el.snapshot).toMatchSnapshot();
117-
});
118-
});
119-
test('snapshot: stacking banners', () => {
120-
render({
121-
enrollment: {
122-
coursewareAccess: {
123-
isStaff: true,
124-
isTooEarly: true,
125-
hasUnmetPrerequisites: true,
126-
},
127-
},
102+
it('should not display banner', () => {
103+
renderCourseBanner({ enrollment: { coursewareAccess: { isStaff: true } } });
104+
const banner = screen.queryByRole('alert');
105+
expect(banner).toBeNull();
128106
});
129-
expect(el.snapshot).toMatchSnapshot();
130107
});
131108
});

src/containers/CourseCard/components/CourseCardBanners/CreditBanner/__snapshots__/index.test.jsx.snap

Lines changed: 0 additions & 58 deletions
This file was deleted.
Lines changed: 53 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,95 +1,69 @@
1-
import React from 'react';
2-
import { shallow } from '@edx/react-unit-test-utils';
3-
4-
import { formatMessage } from 'testUtils';
5-
import { MailtoLink } from '@openedx/paragon';
6-
1+
import { screen, render } from '@testing-library/react';
2+
import { IntlProvider } from '@edx/frontend-platform/i18n';
73
import hooks from './hooks';
8-
import messages from './messages';
9-
import CreditBanner from '.';
10-
11-
jest.mock('components/Banner', () => 'Banner');
4+
import { CreditBanner } from '.';
125

136
jest.mock('./hooks', () => ({
147
useCreditBannerData: jest.fn(),
158
}));
169

17-
let el;
18-
const cardId = 'test-card-id';
10+
jest.unmock('@openedx/paragon');
11+
jest.unmock('@edx/frontend-platform/i18n');
12+
jest.unmock('react');
1913

20-
const ContentComponent = () => 'ContentComponent';
21-
const supportEmail = 'test-support-email';
14+
describe('CreditBanner', () => {
15+
const mockCardId = 'test-card-id';
16+
const mockContentComponent = () => <div data-testid="mock-content">Test Content</div>;
17+
const mockSupportEmail = '[email protected]';
2218

23-
describe('CreditBanner component', () => {
24-
describe('behavior', () => {
25-
beforeEach(() => {
26-
hooks.useCreditBannerData.mockReturnValue(null);
27-
el = shallow(<CreditBanner cardId={cardId} />);
28-
});
29-
it('initializes hooks with cardId', () => {
30-
expect(hooks.useCreditBannerData).toHaveBeenCalledWith(cardId);
31-
});
32-
it('returns null if hookData is null', () => {
33-
expect(el.isEmptyRender()).toEqual(true);
34-
});
19+
const renderCreditBanner = () => render(
20+
<IntlProvider locale="en">
21+
<CreditBanner cardId={mockCardId} />
22+
</IntlProvider>,
23+
);
24+
25+
beforeEach(() => {
26+
jest.clearAllMocks();
3527
});
36-
describe('render', () => {
37-
describe('with error state', () => {
38-
beforeEach(() => {
39-
hooks.useCreditBannerData.mockReturnValue({
40-
error: true,
41-
ContentComponent,
42-
supportEmail,
43-
});
44-
el = shallow(<CreditBanner cardId={cardId} />);
45-
});
46-
test('snapshot', () => {
47-
expect(el.snapshot).toMatchSnapshot();
48-
});
49-
it('passes danger variant to Banner parent', () => {
50-
expect(el.instance.findByType('Banner')[0].props.variant).toEqual('danger');
51-
});
52-
it('includes credit-error-msg with support email link', () => {
53-
expect(el.instance.findByTestId('credit-error-msg')[0].children[0].el).toEqual(shallow(formatMessage(messages.error, {
54-
supportEmailLink: (<MailtoLink to={supportEmail}>{supportEmail}</MailtoLink>),
55-
})));
56-
});
57-
it('loads ContentComponent with cardId', () => {
58-
expect(el.instance.findByType('ContentComponent')[0].props.cardId).toEqual(cardId);
59-
});
28+
29+
it('should return null if hook returns null', () => {
30+
hooks.useCreditBannerData.mockReturnValue(null);
31+
renderCreditBanner();
32+
const banner = screen.queryByRole('alert');
33+
expect(banner).toBeNull();
34+
});
35+
36+
it('should render content component without error', () => {
37+
hooks.useCreditBannerData.mockReturnValue({
38+
ContentComponent: mockContentComponent,
39+
error: false,
6040
});
41+
renderCreditBanner();
42+
43+
expect(screen.getByTestId('mock-content')).toBeInTheDocument();
44+
expect(screen.queryByTestId('credit-error-msg')).not.toBeInTheDocument();
45+
});
6146

62-
describe('with error state with no email', () => {
63-
beforeEach(() => {
64-
hooks.useCreditBannerData.mockReturnValue({
65-
error: true,
66-
ContentComponent,
67-
});
68-
el = shallow(<CreditBanner cardId={cardId} />);
69-
});
70-
test('snapshot', () => {
71-
expect(el.snapshot).toMatchSnapshot();
72-
});
73-
it('includes credit-error-msg without support email link', () => {
74-
expect(el.instance.findByTestId('credit-error-msg')[0].children[0].el).toEqual(formatMessage(messages.errorNoEmail));
75-
});
47+
it('should render error message with support email', () => {
48+
hooks.useCreditBannerData.mockReturnValue({
49+
ContentComponent: mockContentComponent,
50+
error: true,
51+
supportEmail: mockSupportEmail,
7652
});
53+
renderCreditBanner();
7754

78-
describe('with no error state', () => {
79-
beforeEach(() => {
80-
hooks.useCreditBannerData.mockReturnValue({
81-
error: false,
82-
ContentComponent,
83-
supportEmail,
84-
});
85-
el = shallow(<CreditBanner cardId={cardId} />);
86-
});
87-
test('snapshot', () => {
88-
expect(el.snapshot).toMatchSnapshot();
89-
});
90-
it('loads ContentComponent with cardId', () => {
91-
expect(el.instance.findByType('ContentComponent')[0].props.cardId).toEqual(cardId);
92-
});
55+
expect(screen.getByTestId('credit-error-msg')).toBeInTheDocument();
56+
expect(screen.getByText(mockSupportEmail)).toBeInTheDocument();
57+
});
58+
59+
it('should render error message without support email', () => {
60+
hooks.useCreditBannerData.mockReturnValue({
61+
ContentComponent: mockContentComponent,
62+
error: true,
9363
});
64+
renderCreditBanner();
65+
66+
expect(screen.getByTestId('credit-error-msg')).toBeInTheDocument();
67+
expect(screen.queryByText(mockSupportEmail)).not.toBeInTheDocument();
9468
});
9569
});
Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { shallow } from '@edx/react-unit-test-utils';
1+
import { render, screen } from '@testing-library/react';
22

33
import { ProgramsList } from './ProgramsList';
44

@@ -9,15 +9,23 @@ describe('ProgramsList', () => {
99
title: 'Example Program 1',
1010
},
1111
{
12-
programUrl: 'http://example.com',
12+
programUrl: 'http://example2.com',
1313
title: 'Example Program 2',
1414
},
1515
];
1616

1717
it('renders correctly', () => {
18-
const wrapper = shallow(<ProgramsList programs={programs} />);
19-
expect(wrapper.snapshot).toMatchSnapshot();
18+
render(<ProgramsList programs={programs} />);
19+
const list = screen.getByRole('list');
20+
expect(list).toBeInTheDocument();
21+
expect(list.children.length).toEqual(programs.length);
22+
});
2023

21-
expect(wrapper.instance.findByType('li').length).toEqual(programs.length);
24+
it('add the links correctly', () => {
25+
render(<ProgramsList programs={programs} />);
26+
programs.forEach(program => {
27+
const link = screen.getByRole('link', { name: program.title });
28+
expect(link).toHaveAttribute('href', program.url);
29+
});
2230
});
2331
});

0 commit comments

Comments
 (0)