Skip to content

Commit 312ad72

Browse files
committed
CCM-11148 Refactor
1 parent 96ae793 commit 312ad72

File tree

12 files changed

+379
-564
lines changed

12 files changed

+379
-564
lines changed

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616
- Then you need to install the following plugins:
1717

1818
```shell
19-
asdf plugin-add nodejs
20-
asdf plugin-add direnv
21-
asdf plugin-add terraform
22-
asdf plugin-add gitleaks
23-
asdf plugin-add pre-commit
19+
asdf plugin add nodejs
20+
asdf plugin add direnv
21+
asdf plugin add terraform
22+
asdf plugin add gitleaks
23+
asdf plugin add pre-commit
2424
```
2525

2626
- Now you can install the tools, and they will be runnable from within the `nhs-notify-web-template-management` directory:

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

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

frontend/src/__tests__/components/molecules/Header.test.tsx

Lines changed: 10 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ beforeEach(() => {
2828
mockUseAuthStatus.mockImplementation((status) => status ?? 'configuring');
2929
mockServerIsFeatureEnabled.mockResolvedValue(false); // default for most tests
3030
mockUseFeatureFlags.mockReturnValue({
31-
featureFlags: { proofing: false, routing: false },
32-
loaded: true,
31+
proofing: false,
32+
routing: false,
3333
});
3434
});
3535

@@ -39,8 +39,8 @@ describe('NhsNotifyHeader', () => {
3939
mockGetSessionServer.mockResolvedValue({});
4040
mockGetIdTokenClaims.mockReturnValue({});
4141
mockUseFeatureFlags.mockReturnValue({
42-
featureFlags: { proofing: false, routing: false },
43-
loaded: true,
42+
proofing: false,
43+
routing: false,
4444
});
4545
});
4646

@@ -110,8 +110,8 @@ describe('NhsNotifyHeader', () => {
110110
});
111111

112112
mockUseFeatureFlags.mockReturnValue({
113-
featureFlags: { proofing: false, routing: false },
114-
loaded: true,
113+
proofing: false,
114+
routing: false,
115115
});
116116
});
117117

@@ -183,8 +183,8 @@ describe('NhsNotifyHeader', () => {
183183
describe(`with 'routing' flag enabled`, () => {
184184
beforeEach(() => {
185185
mockUseFeatureFlags.mockReturnValue({
186-
featureFlags: { proofing: false, routing: true },
187-
loaded: true,
186+
proofing: false,
187+
routing: true,
188188
});
189189
});
190190

@@ -207,31 +207,13 @@ describe('NhsNotifyHeader', () => {
207207
'/templates-and-message-plans/message-plans'
208208
);
209209
});
210-
211-
it('does not render navigation links when feature flags are not yet loaded', async () => {
212-
mockUseFeatureFlags.mockReturnValue({
213-
featureFlags: {
214-
proofing: true,
215-
routing: true,
216-
},
217-
loaded: false,
218-
});
219-
220-
const header = await NhsNotifyHeader();
221-
222-
render(header);
223-
224-
expect(
225-
screen.queryByTestId('navigation-links')
226-
).not.toBeInTheDocument();
227-
});
228210
});
229211

230212
describe(`with 'routing' flag disabled`, () => {
231213
beforeEach(() => {
232214
mockUseFeatureFlags.mockReturnValue({
233-
featureFlags: { proofing: false, routing: false },
234-
loaded: true,
215+
proofing: false,
216+
routing: false,
235217
});
236218
});
237219

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import { getSessionServer } from '@utils/amplify-utils';
2+
import { fetchClient } from '@utils/server-features';
3+
import { initialFeatureFlags } from '@utils/features';
4+
import FeatureFlagProviderServer from '@providers/features-provider-server';
5+
6+
jest.mock('@utils/amplify-utils');
7+
jest.mock('@utils/server-features');
8+
9+
const mockGetSessionServer = jest.mocked(getSessionServer);
10+
const mockFetchClient = jest.mocked(fetchClient);
11+
12+
describe('FeatureFlagProviderServer', () => {
13+
describe('when unauthenticated', () => {
14+
beforeEach(() => {
15+
mockGetSessionServer.mockResolvedValueOnce({});
16+
});
17+
18+
it('returns initial flags when unauthenticated', async () => {
19+
const child = await FeatureFlagProviderServer({ children: <div /> });
20+
21+
expect(child.props.featureFlags).toEqual(initialFeatureFlags);
22+
});
23+
24+
it('should not fetch client', async () => {
25+
await FeatureFlagProviderServer({ children: <div /> });
26+
27+
expect(mockFetchClient).not.toHaveBeenCalled();
28+
});
29+
});
30+
31+
describe('when authenticated', () => {
32+
beforeEach(() => {
33+
mockGetSessionServer.mockResolvedValueOnce({ accessToken: 'mocktoken' });
34+
});
35+
36+
it('returns flags when authenticated', async () => {
37+
mockFetchClient.mockResolvedValueOnce({
38+
data: { features: { proofing: true, routing: true } },
39+
});
40+
41+
const child = await FeatureFlagProviderServer({ children: <div /> });
42+
43+
expect(child.props.featureFlags).toEqual({
44+
proofing: true,
45+
routing: true,
46+
});
47+
});
48+
49+
it('should fall back to default flags on fetch error', async () => {
50+
mockFetchClient.mockRejectedValueOnce({});
51+
52+
const child = await FeatureFlagProviderServer({ children: <div /> });
53+
54+
expect(child.props.featureFlags).toEqual(initialFeatureFlags);
55+
});
56+
57+
it('should fall back to default flag when feature flag is missing', async () => {
58+
mockFetchClient.mockResolvedValue({
59+
data: {
60+
features: {
61+
proofing: true,
62+
},
63+
},
64+
});
65+
const child = await FeatureFlagProviderServer({ children: <div /> });
66+
67+
expect(child.props.featureFlags).toEqual({
68+
proofing: true,
69+
routing: false,
70+
});
71+
});
72+
});
73+
});

0 commit comments

Comments
 (0)