Skip to content

Commit 7586529

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

File tree

9 files changed

+87
-171
lines changed

9 files changed

+87
-171
lines changed
Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import React from 'react';
2-
import { shallow } from '@edx/react-unit-test-utils';
1+
import { render, screen } from '@testing-library/react';
2+
import { IntlProvider } from '@edx/frontend-platform/i18n';
3+
import { formatMessage } from 'testUtils';
34

45
import { reduxHooks } from 'hooks';
56
import EntitlementBanner from './EntitlementBanner';
7+
import messages from './messages';
68

7-
jest.mock('components/Banner', () => 'Banner');
89
jest.mock('hooks', () => ({
910
utilHooks: {
1011
useFormatDate: () => date => date,
@@ -18,9 +19,11 @@ jest.mock('hooks', () => ({
1819
},
1920
}));
2021

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

23-
let el;
26+
const cardId = 'test-card-id';
2427

2528
const entitlementData = {
2629
isEntitlement: true,
@@ -31,33 +34,43 @@ const entitlementData = {
3134
};
3235
const platformData = { supportEmail: 'test-support-email' };
3336

34-
const render = (overrides = {}) => {
37+
const renderComponent = (overrides = {}) => {
3538
const { entitlement = {} } = overrides;
3639
reduxHooks.useCardEntitlementData.mockReturnValueOnce({ ...entitlementData, ...entitlement });
3740
reduxHooks.usePlatformSettingsData.mockReturnValueOnce(platformData);
38-
el = shallow(<EntitlementBanner cardId={cardId} />);
41+
return render(<IntlProvider locale="en"><EntitlementBanner cardId={cardId} /></IntlProvider>);
3942
};
4043

4144
describe('EntitlementBanner', () => {
42-
test('initializes data with course number from entitlement', () => {
43-
render();
45+
it('initializes data with course number from entitlement', () => {
46+
renderComponent();
4447
expect(reduxHooks.useCardEntitlementData).toHaveBeenCalledWith(cardId);
4548
expect(reduxHooks.useUpdateSelectSessionModalCallback).toHaveBeenCalledWith(cardId);
4649
});
47-
test('no display if not an entitlement', () => {
48-
render({ entitlement: { isEntitlement: false } });
49-
expect(el.isEmptyRender()).toEqual(true);
50+
it('no display if not an entitlement', () => {
51+
renderComponent({ entitlement: { isEntitlement: false } });
52+
const banner = screen.queryByRole('alert');
53+
expect(banner).toBeNull();
5054
});
51-
test('snapshot: no sessions available', () => {
52-
render({ entitlement: { isFulfilled: false, hasSessions: false } });
53-
expect(el.snapshot).toMatchSnapshot();
55+
it('renders when no sessions available', () => {
56+
renderComponent({ entitlement: { isFulfilled: false, hasSessions: false } });
57+
const banner = screen.getByRole('alert');
58+
expect(banner).toBeInTheDocument();
59+
expect(banner).toHaveClass('alert-warning');
60+
expect(banner.innerHTML).toContain(platformData.supportEmail);
5461
});
55-
test('snapshot: expiration warning', () => {
56-
render({ entitlement: { showExpirationWarning: true } });
57-
expect(el.snapshot).toMatchSnapshot();
62+
it('renders when expiration warning', () => {
63+
renderComponent({ entitlement: { showExpirationWarning: true } });
64+
const banner = screen.getByRole('alert');
65+
expect(banner).toBeInTheDocument();
66+
expect(banner).toHaveClass('alert-info');
67+
const button = screen.getByRole('button', { name: formatMessage(messages.selectSession) });
68+
expect(button).toBeInTheDocument();
5869
});
59-
test('no display if sessions available and not displaying warning', () => {
60-
render();
61-
expect(el.isEmptyRender()).toEqual(true);
70+
it('renders expired banner', () => {
71+
renderComponent({ entitlement: { isExpired: true } });
72+
const banner = screen.getByRole('alert');
73+
expect(banner).toBeInTheDocument();
74+
expect(banner.innerHTML).toContain(formatMessage(messages.entitlementExpired));
6275
});
6376
});

src/containers/CourseCard/components/CourseCardBanners/__snapshots__/EntitlementBanner.test.jsx.snap

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

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

Lines changed: 0 additions & 41 deletions
This file was deleted.
Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,23 @@
1-
import { shallow } from '@edx/react-unit-test-utils';
1+
import { render, screen } from '@testing-library/react';
2+
import { IntlProvider } from '@edx/frontend-platform/i18n';
23

34
import { reduxHooks } from 'hooks';
45

56
import CourseCardBanners from '.';
67

7-
jest.mock('./CourseBanner', () => 'CourseBanner');
8-
jest.mock('./CertificateBanner', () => 'CertificateBanner');
9-
jest.mock('./CreditBanner', () => 'CreditBanner');
10-
jest.mock('./EntitlementBanner', () => 'EntitlementBanner');
11-
jest.mock('./RelatedProgramsBanner', () => 'RelatedProgramsBanner');
8+
jest.mock('./CourseBanner', () => jest.fn(() => <div>CourseBanner</div>));
9+
jest.mock('./CertificateBanner', () => jest.fn(() => <div>CertificateBanner</div>));
10+
jest.mock('./CreditBanner', () => jest.fn(() => <div>CreditBanner</div>));
11+
jest.mock('./EntitlementBanner', () => jest.fn(() => <div>EntitlementBanner</div>));
12+
jest.mock('./RelatedProgramsBanner', () => jest.fn(() => <div>RelatedProgramsBanner</div>));
13+
14+
const mockedComponents = [
15+
'CourseBanner',
16+
'CertificateBanner',
17+
'CreditBanner',
18+
'EntitlementBanner',
19+
'RelatedProgramsBanner',
20+
];
1221

1322
jest.mock('hooks', () => ({
1423
reduxHooks: {
@@ -20,13 +29,20 @@ describe('CourseCardBanners', () => {
2029
const props = {
2130
cardId: 'test-card-id',
2231
};
23-
test('renders default CourseCardBanners', () => {
24-
const wrapper = shallow(<CourseCardBanners {...props} />);
25-
expect(wrapper.snapshot).toMatchSnapshot();
32+
it('renders default CourseCardBanners', () => {
33+
render(<IntlProvider locale="en"><CourseCardBanners {...props} /></IntlProvider>);
34+
mockedComponents.map((componentName) => {
35+
const mockedComponent = screen.getByText(componentName);
36+
return expect(mockedComponent).toBeInTheDocument();
37+
});
2638
});
27-
test('render with isEnrolled false', () => {
39+
it('render with isEnrolled false', () => {
2840
reduxHooks.useCardEnrollmentData.mockReturnValueOnce({ isEnrolled: false });
29-
const wrapper = shallow(<CourseCardBanners {...props} />);
30-
expect(wrapper.snapshot).toMatchSnapshot();
41+
render(<IntlProvider locale="en"><CourseCardBanners {...props} /></IntlProvider>);
42+
const mockedComponentsIfNotEnrolled = mockedComponents.slice(-2);
43+
mockedComponentsIfNotEnrolled.map((componentName) => {
44+
const mockedComponent = screen.getByText(componentName);
45+
return expect(mockedComponent).toBeInTheDocument();
46+
});
3147
});
3248
});

src/containers/CourseCard/components/CourseCardMenu/SocialShareMenu.jsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import React from 'react';
22
import PropTypes from 'prop-types';
33
import * as ReactShare from 'react-share';
44

5-
import { StrictDict } from '@edx/react-unit-test-utils';
65
import { useIntl } from '@edx/frontend-platform/i18n';
76
import { Dropdown } from '@openedx/paragon';
87

@@ -11,9 +10,9 @@ import { reduxHooks } from 'hooks';
1110

1211
import messages from './messages';
1312

14-
export const testIds = StrictDict({
13+
export const testIds = {
1514
emailSettingsModalToggle: 'emailSettingsModalToggle',
16-
});
15+
};
1716

1817
export const SocialShareMenu = ({ cardId, emailSettings }) => {
1918
const { formatMessage } = useIntl();

src/containers/CourseCard/components/CourseCardMenu/hooks.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import { useKeyedState, StrictDict } from '@edx/react-unit-test-utils';
1+
import { useKeyedState } from '@edx/react-unit-test-utils';
22

33
import track from 'tracking';
44
import { reduxHooks } from 'hooks';
55

6-
export const stateKeys = StrictDict({
6+
export const stateKeys = {
77
isUnenrollConfirmVisible: 'isUnenrollConfirmVisible',
88
isEmailSettingsVisible: 'isEmailSettingsVisible',
9-
});
9+
};
1010

1111
export const useUnenrollData = () => {
1212
const [isVisible, setIsVisible] = useKeyedState(stateKeys.isUnenrollConfirmVisible, false);

src/containers/CourseCard/components/CourseCardMenu/index.jsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
import React from 'react';
21
import PropTypes from 'prop-types';
32

43
import { useIntl } from '@edx/frontend-platform/i18n';
54
import { Dropdown, Icon, IconButton } from '@openedx/paragon';
65
import { MoreVert } from '@openedx/paragon/icons';
7-
import { StrictDict } from '@edx/react-unit-test-utils';
86

97
import EmailSettingsModal from 'containers/EmailSettingsModal';
108
import UnenrollConfirmModal from 'containers/UnenrollConfirmModal';
@@ -19,9 +17,9 @@ import {
1917

2018
import messages from './messages';
2119

22-
export const testIds = StrictDict({
20+
export const testIds = {
2321
unenrollModalToggle: 'unenrollModalToggle',
24-
});
22+
};
2523

2624
export const CourseCardMenu = ({ cardId }) => {
2725
const { formatMessage } = useIntl();

src/containers/CourseCard/components/RelatedProgramsBadge/__snapshots__/index.test.jsx.snap

Lines changed: 0 additions & 25 deletions
This file was deleted.
Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
1-
import React from 'react';
2-
import { shallow } from '@edx/react-unit-test-utils';
1+
import { render, screen } from '@testing-library/react';
2+
import { IntlProvider } from '@edx/frontend-platform/i18n';
33

44
import useRelatedProgramsBadge from './hooks';
55
import RelatedProgramsBadge from '.';
66

77
jest.mock('containers/RelatedProgramsModal', () => 'RelatedProgramsModal');
88
jest.mock('./hooks', () => jest.fn());
99

10+
jest.unmock('@edx/frontend-platform/i18n');
11+
jest.unmock('@openedx/paragon');
12+
jest.unmock('react');
13+
1014
const hookProps = {
1115
isOpen: true,
1216
openModal: jest.fn().mockName('useRelatedProgramsBadge.openModal'),
@@ -15,16 +19,21 @@ const hookProps = {
1519
programsMessage: 'useRelatedProgramsBadge.programsMessage',
1620
};
1721

18-
const cardId = 'test-course-number';
22+
const cardId = 'test-card-id';
1923

2024
describe('RelatedProgramsBadge component', () => {
21-
test('empty render: no programs', () => {
25+
it('should not render if no programs', () => {
2226
useRelatedProgramsBadge.mockReturnValueOnce({ ...hookProps, numPrograms: 0 });
23-
const el = shallow(<RelatedProgramsBadge cardId={cardId} />);
24-
expect(el.isEmptyRender()).toEqual(true);
27+
render(<IntlProvider locale="en"><RelatedProgramsBadge cardId={cardId} /></IntlProvider>);
28+
const button = screen.queryByRole('button', { name: hookProps.programsMessage });
29+
expect(button).toBeNull();
30+
const dialog = screen.queryByRole('dialog');
31+
expect(dialog).toBeNull();
2532
});
26-
test('snapshot: 3 programs', () => {
27-
useRelatedProgramsBadge.mockReturnValueOnce(hookProps);
28-
expect(shallow(<RelatedProgramsBadge cardId={cardId} />).snapshot).toMatchSnapshot();
33+
it('3 programs closed', () => {
34+
useRelatedProgramsBadge.mockReturnValue({ ...hookProps, isOpen: false });
35+
render(<IntlProvider locale="en"><RelatedProgramsBadge cardId={cardId} /></IntlProvider>);
36+
const button = screen.getByRole('button', { name: hookProps.programsMessage });
37+
expect(button).toBeInTheDocument();
2938
});
3039
});

0 commit comments

Comments
 (0)