Skip to content

Commit 715433b

Browse files
authored
Merge pull request #20009 from mozilla/fix-settings-tests-output
fix(fxa-settings): clean up noisy test output across test suite in fxa-settings
2 parents 61a5970 + bbe63ce commit 715433b

18 files changed

Lines changed: 148 additions & 74 deletions

File tree

packages/fxa-settings/src/components/FormPhoneNumber/index.test.tsx

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,23 @@ describe('FormPhoneNumber', () => {
2121
});
2222
}
2323

24-
function renderWithInfoBannerProps() {
25-
renderWithLocalizationProvider(
26-
<FormPhoneNumber
27-
localizedCTAText="Send code"
28-
submitPhoneNumber={mockSubmit}
29-
infoBannerContent={{
30-
localizedDescription: 'This is a banner description',
31-
localizedHeading: 'This is a banner heading',
32-
}}
33-
infoBannerLink={{
34-
localizedText: 'This is a banner link',
35-
path: '#',
36-
}}
37-
/>
38-
);
24+
async function renderWithInfoBannerProps() {
25+
await act(async () => {
26+
renderWithLocalizationProvider(
27+
<FormPhoneNumber
28+
localizedCTAText="Send code"
29+
submitPhoneNumber={mockSubmit}
30+
infoBannerContent={{
31+
localizedDescription: 'This is a banner description',
32+
localizedHeading: 'This is a banner heading',
33+
}}
34+
infoBannerLink={{
35+
localizedText: 'This is a banner link',
36+
path: '#',
37+
}}
38+
/>
39+
);
40+
});
3941
}
4042

4143
function getPhoneInput() {
@@ -59,7 +61,7 @@ describe('FormPhoneNumber', () => {
5961
});
6062

6163
it('renders the component with info banner', async () => {
62-
renderWithInfoBannerProps();
64+
await renderWithInfoBannerProps();
6365
await waitFor(() => {
6466
expect(screen.getByRole('combobox')).toBeInTheDocument();
6567
});

packages/fxa-settings/src/components/RecoveryKeySetupDownload/index.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ describe('RecoveryKeySetupDownload', () => {
3030
const b = screen.getByRole('button', { name: 'Download and continue' });
3131
expect(b).toBeInTheDocument();
3232
},
33-
{ timeout: 2000 }
33+
{ timeout: 5000 }
3434
);
3535

3636
screen.getByRole('button', {

packages/fxa-settings/src/components/Settings/FlowSetupRecoveryPhoneSubmitNumber/index.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ describe('FlowSetupRecoveryPhoneSubmitNumber', () => {
4141
* @param props
4242
*/
4343
async function renderWith(props = defaultProps) {
44-
await act(() => {
44+
await act(async () => {
4545
renderWithLocalizationProvider(
4646
<FlowSetupRecoveryPhoneSubmitNumber {...props} />
4747
);
@@ -85,7 +85,7 @@ describe('FlowSetupRecoveryPhoneSubmitNumber', () => {
8585
'1231231234'
8686
)
8787
);
88-
user.click(screen.getByRole('button', { name: /Send code/i }));
88+
await user.click(screen.getByRole('button', { name: /Send code/i }));
8989

9090
await waitFor(() => expect(mockVerifyPhoneNumber).toHaveBeenCalledTimes(1));
9191
expect(mockNavigateForward).toHaveBeenCalledTimes(1);

packages/fxa-settings/src/components/Settings/MfaGuard/index.test.tsx

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
44

55
import React from 'react';
6-
import { act, screen, waitFor } from '@testing-library/react';
6+
import { screen, waitFor } from '@testing-library/react';
77
import userEvent from '@testing-library/user-event';
88
import { mockAppContext, renderWithRouter } from '../../../models/mocks';
99
import { MfaGuard } from './index';
@@ -303,6 +303,10 @@ describe('MfaGuard', () => {
303303
});
304304

305305
it('debounces OTP resend requests', async () => {
306+
// Use a deterministic clock so debounce logic is not affected by system load.
307+
let now = Date.now();
308+
const dateNowSpy = jest.spyOn(Date, 'now').mockImplementation(() => now);
309+
306310
renderWithRouter(
307311
<AppContext.Provider value={mockAppContext()}>
308312
<MfaGuard
@@ -319,9 +323,8 @@ describe('MfaGuard', () => {
319323
await userEvent.click(
320324
screen.getByRole('button', { name: 'Email new code.' })
321325
);
322-
await act(async () => {
323-
await new Promise((r) => setTimeout(r, 101));
324-
});
326+
327+
now += 101;
325328

326329
await userEvent.click(
327330
screen.getByRole('button', { name: 'Email new code.' })
@@ -331,13 +334,15 @@ describe('MfaGuard', () => {
331334
screen.getByRole('button', { name: 'Email new code.' })
332335
);
333336

334-
await act(async () => {
335-
await new Promise((r) => setTimeout(r, 101));
336-
});
337+
// Advance past the debounce window again
338+
now += 101;
339+
337340
await userEvent.click(
338341
screen.getByRole('button', { name: 'Email new code.' })
339342
);
340343

341344
expect(mockAuthClient.mfaRequestOtp).toHaveBeenCalledTimes(3);
345+
346+
dateNowSpy.mockRestore();
342347
});
343348
});

packages/fxa-settings/src/components/Settings/ModalMfaProtected/index.test.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,13 @@ const defaultProps = {
2424
};
2525

2626
describe('ModalMfaProtected', () => {
27-
it('renders correctly', () => {
27+
it('renders correctly', async () => {
2828
renderWithRouter(<ModalMfaProtected {...defaultProps} />);
2929

30-
expect(screen.getByText('Enter confirmation code')).toBeInTheDocument();
30+
// Await to let react-hook-form's internal state updates settle.
31+
expect(
32+
await screen.findByText('Enter confirmation code')
33+
).toBeInTheDocument();
3134
expect(
3235
screen.getByText('Help us make sure it’s you changing your account info')
3336
).toBeInTheDocument();
@@ -119,22 +122,22 @@ describe('ModalMfaProtected', () => {
119122
expect(onDismiss).toHaveBeenCalled();
120123
});
121124

122-
it('displays error banner', () => {
125+
it('displays error banner', async () => {
123126
renderWithRouter(
124127
<ModalMfaProtected
125128
{...defaultProps}
126129
localizedErrorBannerMessage="error banner"
127130
/>
128131
);
129-
expect(screen.getByText('error banner')).toBeInTheDocument();
132+
expect(await screen.findByText('error banner')).toBeInTheDocument();
130133
});
131134

132-
it('shows code resend success banner', () => {
135+
it('shows code resend success banner', async () => {
133136
renderWithRouter(
134137
<ModalMfaProtected {...defaultProps} showResendSuccessBanner={true} />
135138
);
136139
expect(
137-
screen.getByText('A new code was sent to your email.')
140+
await screen.findByText('A new code was sent to your email.')
138141
).toBeInTheDocument();
139142
expect(
140143
screen.getByText(

packages/fxa-settings/src/components/Settings/PageRecentActivity/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ export const PageRecentActivity = (_: RouteComponentProps) => {
3333
{!!securityEvents &&
3434
securityEvents.map((securityEvent) => (
3535
<SecurityEventSection
36+
key={securityEvent.name + securityEvent.createdAt}
3637
{...{
37-
key: securityEvent.name + securityEvent.createdAt,
3838
name: securityEvent.name,
3939
createdAt: securityEvent.createdAt,
4040
}}

packages/fxa-settings/src/components/ThirdPartyAuth/index.test.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,7 @@ function renderWith(props?: any) {
5757
}
5858

5959
const mockFormSubmit = jest.fn();
60-
// This prevents console errors when the deepLink logic is tested.
61-
// However, for some reason we cannot mock `requestSubmit` and we'll
62-
// still see errors logged for that.
60+
// jsdom does not implement HTMLFormElement.prototype.submit.
6361
HTMLFormElement.prototype.submit = mockFormSubmit;
6462

6563
describe('ThirdPartyAuthComponent', () => {

packages/fxa-settings/src/lib/hooks/useFxAStatus/index.test.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,10 @@ describe('useFxAStatus', () => {
140140
isSync: () => true,
141141
isFirefoxNonSync: () => false,
142142
};
143-
const { result } = renderHook(() => useFxAStatus(integration));
143+
const { result, waitForNextUpdate } = renderHook(() =>
144+
useFxAStatus(integration)
145+
);
146+
await waitForNextUpdate();
144147
expect(result.current.supportsKeysOptionalLogin).toBe(false);
145148
});
146149
});

packages/fxa-settings/src/lib/hooks/useOAuthFlowRecovery/index.test.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ describe('useOAuthFlowRecovery', () => {
142142
});
143143

144144
it('sets recoveryFailed when fxaOAuthFlowBegin throws', async () => {
145+
jest.spyOn(console, 'error').mockImplementation(() => {});
145146
(firefox.fxaOAuthFlowBegin as jest.Mock).mockRejectedValue(
146147
new Error('WebChannel error')
147148
);

packages/fxa-settings/src/models/contexts/NimbusContext.test.tsx

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -221,11 +221,13 @@ describe('NimbusContext', () => {
221221

222222
renderWithProviders(previewConfig);
223223

224-
expect(mockInitializeNimbus).toHaveBeenCalledWith(
225-
'test-user-id',
226-
true,
227-
{ language: 'en', region: 'us' }
228-
);
224+
await waitFor(() => {
225+
expect(mockInitializeNimbus).toHaveBeenCalledWith(
226+
'test-user-id',
227+
true,
228+
{ language: 'en', region: 'us' }
229+
);
230+
});
229231
});
230232

231233
it('handles preview mode from URL params', async () => {
@@ -236,11 +238,13 @@ describe('NimbusContext', () => {
236238

237239
renderWithProviders();
238240

239-
expect(mockInitializeNimbus).toHaveBeenCalledWith(
240-
'test-user-id',
241-
true,
242-
{ language: 'en', region: 'us' }
243-
);
241+
await waitFor(() => {
242+
expect(mockInitializeNimbus).toHaveBeenCalledWith(
243+
'test-user-id',
244+
true,
245+
{ language: 'en', region: 'us' }
246+
);
247+
});
244248
});
245249

246250
it('cleans up on unmount', async () => {

0 commit comments

Comments
 (0)