Skip to content

Commit d3ab8f8

Browse files
committed
CCM-11148 Fix unit tests
1 parent bd8db67 commit d3ab8f8

File tree

2 files changed

+64
-48
lines changed

2 files changed

+64
-48
lines changed

frontend/src/__tests__/app/internal/features/route.test.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { GET as getFeatures } from '@app/internal/features/route';
22
import { getSessionServer } from '@utils/amplify-utils';
33
import { fetchClient } from '@utils/server-features';
44
import { FEATURES, initialFeatureFlags } from '@utils/features';
5-
import { NextRequest } from 'next/server';
5+
import { NextRequest, NextResponse } from 'next/server';
66
import { ErrorCase } from 'nhs-notify-backend-client';
77

88
jest.mock('@utils/amplify-utils');
@@ -24,7 +24,17 @@ const createRequest = (internalHeader = true): NextRequest =>
2424
describe('features route', () => {
2525
beforeEach(() => {
2626
jest.resetAllMocks();
27+
2728
mockGetSessionServer.mockResolvedValueOnce({ accessToken: 'token' });
29+
30+
jest.spyOn(NextResponse, 'json').mockImplementation(
31+
(data) =>
32+
({
33+
status: 200,
34+
ok: true,
35+
json: () => Promise.resolve(data),
36+
}) as NextResponse
37+
);
2838
});
2939

3040
it('returns 403 status if x-internal-request header is missing', async () => {
@@ -39,8 +49,9 @@ describe('features route', () => {
3949

4050
const req = createRequest();
4151
const res = await getFeatures(req);
52+
const json = await res.json();
4253

43-
expect(res.json()).toEqual(initialFeatureFlags);
54+
expect(json).toEqual(initialFeatureFlags);
4455
});
4556

4657
it('returns initialFeatureFlags on a fetchClient error', async () => {
@@ -50,8 +61,9 @@ describe('features route', () => {
5061

5162
const req = createRequest();
5263
const res = await getFeatures(req);
64+
const json = await res.json();
5365

54-
expect(res.json()).toEqual(initialFeatureFlags);
66+
expect(json).toEqual(initialFeatureFlags);
5567
});
5668

5769
it('returns expected feature flags', async () => {
@@ -65,7 +77,8 @@ describe('features route', () => {
6577

6678
const req = createRequest();
6779
const res = await getFeatures(req);
80+
const json = await res.json();
6881

69-
expect(res.json()).toEqual(allFeaturesEnabled);
82+
expect(json).toEqual(allFeaturesEnabled);
7083
});
7184
});
Lines changed: 47 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,86 +1,89 @@
1-
import { render, waitFor } from '@testing-library/react';
1+
import { render, waitFor, screen } from '@testing-library/react';
22
import {
33
FeatureFlagProvider,
44
useFeatureFlags,
55
} from '@providers/features-provider';
66
import { Authenticator } from '@aws-amplify/ui-react';
7+
import * as useAuthStatusHook from '@hooks/use-auth-status';
78

8-
const TestConsumer = () => {
9-
const { featureFlags, loaded } = useFeatureFlags();
10-
return (
11-
<div>
12-
<p data-testid='loaded'> {loaded ? 'true' : 'false'}</p>
13-
<p data-testid='proofing'>{featureFlags.proofing ? 'true' : 'false'}</p>
14-
<p data-testid='routing'>{featureFlags.routing ? 'true' : 'false'}</p>
15-
</div>
16-
);
17-
};
18-
19-
const renderProvider = () => {
20-
return render(
21-
<Authenticator.Provider>
22-
<FeatureFlagProvider>
23-
<TestConsumer />
24-
</FeatureFlagProvider>
25-
</Authenticator.Provider>
26-
);
27-
};
9+
jest.mock('@hooks/use-auth-status');
10+
11+
global.fetch = jest.fn();
12+
13+
const mockUseAuthStatus = useAuthStatusHook.useAuthStatus as jest.Mock;
2814

2915
describe('FeatureFlagProvider', () => {
16+
const TestComponent = () => {
17+
const { featureFlags, loaded } = useFeatureFlags();
18+
19+
return (
20+
<div>
21+
<p data-testid='loaded'> {loaded ? 'true' : 'false'}</p>
22+
<p data-testid='proofing'>{featureFlags.proofing ? 'true' : 'false'}</p>
23+
<p data-testid='routing'>{featureFlags.routing ? 'true' : 'false'}</p>
24+
</div>
25+
);
26+
};
27+
28+
const renderWithProvider = () =>
29+
render(
30+
<Authenticator.Provider>
31+
<FeatureFlagProvider>
32+
<TestComponent />
33+
</FeatureFlagProvider>
34+
</Authenticator.Provider>
35+
);
36+
3037
beforeEach(() => {
3138
jest.resetAllMocks();
3239
});
3340

3441
describe('when unauthenticated', () => {
3542
beforeEach(() => {
36-
jest.mock('@hooks/use-auth-status', () => ({
37-
useAuthStatus: () => 'unauthenticated',
38-
}));
43+
mockUseAuthStatus.mockReturnValue('unauthenticated');
3944
});
4045

4146
it('should provide all feature flags as false when unauthenticated', async () => {
42-
const container = renderProvider();
47+
renderWithProvider();
4348

4449
await waitFor(() => {
45-
expect(container.getByTestId('loaded')).toHaveTextContent('false');
46-
expect(container.getByTestId('proofing')).toHaveTextContent('false');
47-
expect(container.getByTestId('routing')).toHaveTextContent('false');
50+
expect(screen.getByTestId('loaded')).toHaveTextContent('false'); // loading should remain false
51+
expect(screen.getByTestId('proofing')).toHaveTextContent('false');
52+
expect(screen.getByTestId('routing')).toHaveTextContent('false');
4853
});
4954
});
5055
});
5156

5257
describe('when authenticated', () => {
5358
beforeEach(() => {
54-
jest.mock('@hooks/use-auth-status', () => ({
55-
useAuthStatus: () => 'authenticated',
56-
}));
59+
mockUseAuthStatus.mockReturnValue('authenticated');
5760
});
5861

5962
it('should provide feature flags when authenticated', async () => {
60-
global.fetch = jest.fn().mockResolvedValue({
63+
(global.fetch as jest.Mock).mockResolvedValue({
6164
ok: true,
6265
json: async () => ({ proofing: true, routing: true }),
6366
});
6467

65-
const container = renderProvider();
68+
renderWithProvider();
6669

6770
await waitFor(() => {
68-
expect(container.getByTestId('loaded')).toHaveTextContent('true');
69-
expect(container.getByTestId('proofing')).toHaveTextContent('true');
70-
expect(container.getByTestId('routing')).toHaveTextContent('true');
71+
expect(screen.getByTestId('loaded')).toHaveTextContent('true');
72+
expect(screen.getByTestId('proofing')).toHaveTextContent('true');
73+
expect(screen.getByTestId('routing')).toHaveTextContent('true');
7174
});
7275
});
73-
});
7476

75-
it('should fall back to default flags on fetch error', async () => {
76-
global.fetch = jest.fn().mockRejectedValue(new Error('Failed'));
77+
it('should fall back to default flags on fetch error', async () => {
78+
(global.fetch as jest.Mock).mockRejectedValue(new Error('Fetch failed'));
7779

78-
const container = renderProvider();
80+
renderWithProvider();
7981

80-
await waitFor(() => {
81-
expect(container.getByTestId('loaded')).toHaveTextContent('true');
82-
expect(container.getByTestId('proofing')).toHaveTextContent('false');
83-
expect(container.getByTestId('routing')).toHaveTextContent('false');
82+
await waitFor(() => {
83+
expect(screen.getByTestId('loaded')).toHaveTextContent('true');
84+
expect(screen.getByTestId('proofing')).toHaveTextContent('false');
85+
expect(screen.getByTestId('routing')).toHaveTextContent('false');
86+
});
8487
});
8588
});
8689
});

0 commit comments

Comments
 (0)