Skip to content

Commit 5c4dfd5

Browse files
test: Deprecate react-unit-test-utils 3/15 (#655)
1 parent b0daefa commit 5c4dfd5

File tree

6 files changed

+182
-156
lines changed

6 files changed

+182
-156
lines changed

src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/EligibleContent.test.jsx

Lines changed: 35 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import React from 'react';
2-
import { shallow } from '@edx/react-unit-test-utils';
1+
import { render, screen } from '@testing-library/react';
2+
import userEvent from '@testing-library/user-event';
3+
import { IntlProvider } from '@edx/frontend-platform/i18n';
34

45
import { reduxHooks } from 'hooks';
5-
import { formatMessage } from 'testUtils';
66
import track from 'tracking';
77

88
import messages from './messages';
@@ -14,15 +14,16 @@ jest.mock('hooks', () => ({
1414
useCardCourseRunData: jest.fn(),
1515
},
1616
}));
17-
jest.mock('./components/CreditContent', () => 'CreditContent');
17+
1818
jest.mock('tracking', () => ({
1919
credit: {
20-
purchase: (...args) => ({ trackCredit: args }),
20+
purchase: jest.fn(),
2121
},
2222
}));
2323

24-
let el;
25-
let component;
24+
jest.unmock('@edx/frontend-platform/i18n');
25+
jest.unmock('@openedx/paragon');
26+
jest.unmock('react');
2627

2728
const cardId = 'test-card-id';
2829
const courseId = 'test-course-id';
@@ -32,50 +33,45 @@ const credit = {
3233
reduxHooks.useCardCreditData.mockReturnValue(credit);
3334
reduxHooks.useCardCourseRunData.mockReturnValue({ courseId });
3435

35-
const render = () => {
36-
el = shallow(<EligibleContent cardId={cardId} />);
37-
};
38-
const loadComponent = () => {
39-
component = el.instance.findByType('CreditContent');
40-
};
36+
const renderEligibleContent = () => render(<IntlProvider locale="en" messages={{}}><EligibleContent cardId={cardId} /></IntlProvider>);
37+
4138
describe('EligibleContent component', () => {
42-
beforeEach(() => {
43-
render();
44-
});
45-
describe('behavior', () => {
39+
describe('hooks', () => {
4640
it('initializes credit data with cardId', () => {
41+
renderEligibleContent();
4742
expect(reduxHooks.useCardCreditData).toHaveBeenCalledWith(cardId);
4843
});
4944
it('initializes course run data with cardId', () => {
45+
renderEligibleContent();
5046
expect(reduxHooks.useCardCourseRunData).toHaveBeenCalledWith(cardId);
5147
});
5248
});
53-
describe('render', () => {
49+
describe('behavior', () => {
5450
describe('rendered CreditContent component', () => {
55-
beforeEach(() => {
56-
loadComponent();
57-
});
58-
test('action.onClick sends credit purchase track event', () => {
59-
expect(component[0].props.action.onClick).toEqual(
60-
track.credit.purchase(courseId),
61-
);
51+
it('action message is formatted getCredit message', () => {
52+
renderEligibleContent();
53+
const button = screen.getByRole('button', { name: messages.getCredit.defaultMessage });
54+
expect(button).toBeInTheDocument();
6255
});
63-
test('action.message is formatted getCredit message', () => {
64-
expect(component[0].props.action.message).toEqual(formatMessage(messages.getCredit));
56+
it('onClick sends credit purchase track event', async () => {
57+
const user = userEvent.setup();
58+
renderEligibleContent();
59+
const button = screen.getByRole('button', { name: messages.getCredit.defaultMessage });
60+
await user.click(button);
61+
expect(track.credit.purchase).toHaveBeenCalledWith(courseId);
6562
});
66-
test('message is formatted eligible message if no provider', () => {
67-
reduxHooks.useCardCreditData.mockReturnValueOnce({});
68-
render();
69-
loadComponent();
70-
expect(component[0].props.message).toEqual(formatMessage(
71-
messages.eligible,
72-
{ getCredit: (<b>{formatMessage(messages.getCredit)}</b>) },
73-
));
63+
it('message is formatted eligible message if provider', () => {
64+
renderEligibleContent();
65+
const eligibleMessage = screen.getByTestId('credit-msg');
66+
expect(eligibleMessage).toBeInTheDocument();
67+
expect(eligibleMessage).toHaveTextContent(credit.providerName);
7468
});
75-
test('message is formatted eligible message if provider', () => {
76-
expect(component[0].props.message).toEqual(
77-
formatMessage(messages.eligibleFromProvider, { providerName: credit.providerName }),
78-
);
69+
it('message is formatted eligible message if no provider', () => {
70+
reduxHooks.useCardCreditData.mockReturnValue({});
71+
renderEligibleContent();
72+
const eligibleMessage = screen.getByTestId('credit-msg');
73+
expect(eligibleMessage).toBeInTheDocument();
74+
expect(eligibleMessage).toHaveTextContent(messages.getCredit.defaultMessage);
7975
});
8076
});
8177
});

src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/MustRequestContent.test.jsx

Lines changed: 75 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,107 @@
1-
import React from 'react';
2-
import { shallow } from '@edx/react-unit-test-utils';
3-
4-
import { formatMessage } from 'testUtils';
1+
import { render, screen } from '@testing-library/react';
2+
import { IntlProvider } from '@edx/frontend-platform/i18n';
3+
import userEvent from '@testing-library/user-event';
54

65
import { reduxHooks } from 'hooks';
76
import messages from './messages';
87
import hooks from './hooks';
9-
import ProviderLink from './components/ProviderLink';
108
import MustRequestContent from './MustRequestContent';
119

1210
jest.mock('./hooks', () => ({
1311
useCreditRequestData: jest.fn(),
1412
}));
13+
1514
jest.mock('hooks', () => ({
16-
reduxHooks: { useMasqueradeData: jest.fn() },
15+
reduxHooks: {
16+
useMasqueradeData: jest.fn(),
17+
useCardCreditData: jest.fn(),
18+
},
1719
}));
18-
jest.mock('./components/CreditContent', () => 'CreditContent');
19-
jest.mock('./components/ProviderLink', () => 'ProviderLink');
2020

21-
let el;
22-
let component;
21+
jest.unmock('@openedx/paragon');
22+
jest.unmock('@edx/frontend-platform/i18n');
23+
jest.unmock('react');
2324

2425
const cardId = 'test-card-id';
25-
const requestData = { test: 'requestData' };
26+
const requestData = {
27+
url: 'test-request-data-url',
28+
parameters: {
29+
key1: 'val1',
30+
key2: 'val2',
31+
key3: 'val3',
32+
},
33+
};
34+
const providerName = 'test-credit-provider-name';
35+
const providerStatusUrl = 'test-credit-provider-status-url';
2636
const createCreditRequest = jest.fn().mockName('createCreditRequest');
27-
hooks.useCreditRequestData.mockReturnValue({
28-
requestData,
29-
createCreditRequest,
30-
});
31-
reduxHooks.useMasqueradeData.mockReturnValue({ isMasquerading: false });
3237

33-
const render = () => {
34-
el = shallow(<MustRequestContent cardId={cardId} />);
35-
};
38+
const renderMustRequestContent = () => render(
39+
<IntlProvider locale="en" messages={messages}>
40+
<MustRequestContent cardId={cardId} />
41+
</IntlProvider>,
42+
);
43+
3644
describe('MustRequestContent component', () => {
3745
beforeEach(() => {
38-
render();
46+
jest.clearAllMocks();
47+
hooks.useCreditRequestData.mockReturnValue({
48+
requestData,
49+
createCreditRequest,
50+
});
51+
reduxHooks.useMasqueradeData.mockReturnValue({ isMasquerading: false });
52+
reduxHooks.useCardCreditData.mockReturnValue({
53+
providerName,
54+
providerStatusUrl,
55+
});
3956
});
40-
describe('behavior', () => {
57+
58+
describe('hooks', () => {
4159
it('initializes credit request data with cardId', () => {
60+
renderMustRequestContent();
4261
expect(hooks.useCreditRequestData).toHaveBeenCalledWith(cardId);
4362
});
4463
});
45-
describe('render', () => {
46-
describe('rendered CreditContent component', () => {
64+
65+
describe('behavior', () => {
66+
describe('rendered content', () => {
4767
beforeEach(() => {
48-
component = el.instance.findByType('CreditContent');
68+
renderMustRequestContent();
4969
});
50-
test('action.onClick calls createCreditRequest from useCreditRequestData hook', () => {
51-
expect(component[0].props.action.onClick).toEqual(createCreditRequest);
70+
71+
it('calls createCreditRequest when request credit button is clicked', async () => {
72+
const user = userEvent.setup();
73+
const button = screen.getByRole('button', { name: /request credit/i });
74+
await user.click(button);
75+
expect(createCreditRequest).toHaveBeenCalled();
5276
});
53-
test('action.message is formatted requestCredit message', () => {
54-
expect(component[0].props.action.message).toEqual(
55-
formatMessage(messages.requestCredit),
56-
);
77+
78+
it('shows request credit button that is enabled', () => {
79+
const button = screen.getByRole('button', { name: /request credit/i });
80+
expect(button).toBeEnabled();
81+
});
82+
83+
it('displays must request message with provider link', () => {
84+
expect(screen.getByTestId('credit-msg')).toHaveTextContent(/request credit/i);
5785
});
58-
test('action.disabled is false', () => {
59-
expect(component[0].props.action.disabled).toEqual(false);
86+
87+
it('renders credit request form with correct data', () => {
88+
const { container } = renderMustRequestContent();
89+
const form = container.querySelector('form');
90+
expect(form).toBeInTheDocument();
91+
expect(form).toHaveAttribute('action', requestData.url);
6092
});
61-
test('message is formatted mustRequest message', () => {
62-
expect(component[0].props.message).toEqual(
63-
formatMessage(messages.mustRequest, {
64-
linkToProviderSite: <ProviderLink cardId={cardId} />,
65-
requestCredit: <b>{formatMessage(messages.requestCredit)}</b>,
66-
}),
67-
);
93+
});
94+
95+
describe('when masquerading', () => {
96+
beforeEach(() => {
97+
reduxHooks.useMasqueradeData.mockReturnValue({ isMasquerading: true });
98+
renderMustRequestContent();
6899
});
69-
test('requestData drawn from useCreditRequestData hook', () => {
70-
expect(component[0].props.requestData).toEqual(requestData);
100+
101+
it('disables the request credit button', () => {
102+
const button = screen.getByRole('button', { name: /request credit/i });
103+
expect(button).toHaveClass('disabled');
104+
expect(button).toHaveAttribute('aria-disabled', 'true');
71105
});
72106
});
73107
});

src/containers/CourseCard/components/CourseCardBanners/CreditBanner/views/PendingContent.test.jsx

Lines changed: 37 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
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

4-
import { formatMessage } from 'testUtils';
54
import { reduxHooks } from 'hooks';
65

76
import messages from './messages';
@@ -10,11 +9,10 @@ import PendingContent from './PendingContent';
109
jest.mock('hooks', () => ({
1110
reduxHooks: { useCardCreditData: jest.fn(), useMasqueradeData: jest.fn() },
1211
}));
13-
jest.mock('./components/CreditContent', () => 'CreditContent');
14-
jest.mock('./components/ProviderLink', () => 'ProviderLink');
1512

16-
let el;
17-
let component;
13+
jest.unmock('@edx/frontend-platform/i18n');
14+
jest.unmock('@openedx/paragon');
15+
jest.unmock('react');
1816

1917
const cardId = 'test-card-id';
2018
const providerName = 'test-credit-provider-name';
@@ -25,38 +23,48 @@ reduxHooks.useCardCreditData.mockReturnValue({
2523
});
2624
reduxHooks.useMasqueradeData.mockReturnValue({ isMasquerading: false });
2725

28-
const render = () => {
29-
el = shallow(<PendingContent cardId={cardId} />);
30-
};
26+
const renderPendingContent = () => render(
27+
<IntlProvider messages={{}} locale="en">
28+
<PendingContent cardId={cardId} />
29+
</IntlProvider>,
30+
);
3131
describe('PendingContent component', () => {
32-
beforeEach(() => {
33-
render();
34-
});
35-
describe('behavior', () => {
32+
describe('hooks', () => {
3633
it('initializes card credit data with cardId', () => {
34+
renderPendingContent();
3735
expect(reduxHooks.useCardCreditData).toHaveBeenCalledWith(cardId);
3836
});
3937
});
40-
describe('render', () => {
38+
describe('behavior', () => {
4139
describe('rendered CreditContent component', () => {
42-
beforeEach(() => {
43-
component = el.instance.findByType('CreditContent');
40+
it('action message is formatted requestCredit message', () => {
41+
renderPendingContent();
42+
const button = screen.getByRole('link', { name: messages.viewDetails.defaultMessage });
43+
expect(button).toBeInTheDocument();
4444
});
45-
test('action.href will go to provider status site', () => {
46-
expect(component[0].props.action.href).toEqual(providerStatusUrl);
45+
it('action href will go to provider status site', () => {
46+
renderPendingContent();
47+
const button = screen.getByRole('link', { name: messages.viewDetails.defaultMessage });
48+
expect(button).toHaveAttribute('href', providerStatusUrl);
4749
});
48-
test('action.message is formatted requestCredit message', () => {
49-
expect(component[0].props.action.message).toEqual(
50-
formatMessage(messages.viewDetails),
51-
);
50+
it('action.disabled is false', () => {
51+
renderPendingContent();
52+
const button = screen.getByRole('link', { name: messages.viewDetails.defaultMessage });
53+
expect(button).not.toHaveClass('disabled');
5254
});
53-
test('action.disabled is false', () => {
54-
expect(component[0].props.action.disabled).toEqual(false);
55+
it('message is formatted pending message with provider name', () => {
56+
renderPendingContent();
57+
const component = screen.getByTestId('credit-msg');
58+
expect(component).toBeInTheDocument();
59+
expect(component).toHaveTextContent(`${providerName} has received`);
5560
});
56-
test('message is formatted pending message', () => {
57-
expect(component[0].props.message).toEqual(
58-
formatMessage(messages.received, { providerName }),
59-
);
61+
describe('when masqueradeData is true', () => {
62+
it('disables the view details button', () => {
63+
reduxHooks.useMasqueradeData.mockReturnValue({ isMasquerading: true });
64+
renderPendingContent();
65+
const button = screen.getByRole('link', { name: messages.viewDetails.defaultMessage });
66+
expect(button).toHaveClass('disabled');
67+
});
6068
});
6169
});
6270
});

0 commit comments

Comments
 (0)