Skip to content

Commit 592febf

Browse files
committed
CCM-11148 Move feature flag check to header instead of layout
1 parent fbc5d6a commit 592febf

File tree

3 files changed

+33
-26
lines changed

3 files changed

+33
-26
lines changed

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

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { render, screen, within } from '@testing-library/react';
22
import { useAuthStatus } from '@hooks/use-auth-status';
33
import { getSessionServer } from '@utils/amplify-utils';
44
import { getIdTokenClaims } from '@utils/token-utils';
5+
import { serverIsFeatureEnabled } from '@utils/server-features';
56
import { NhsNotifyHeader } from '@molecules/Header/Header';
67

78
jest.mock('@hooks/use-auth-status');
@@ -13,11 +14,15 @@ const mockGetIdTokenClaims = jest.mocked(getIdTokenClaims);
1314
jest.mock('@utils/amplify-utils');
1415
const mockGetSessionServer = jest.mocked(getSessionServer);
1516

17+
jest.mock('@utils/server-features');
18+
const mockServerIsFeatureEnabled = jest.mocked(serverIsFeatureEnabled);
19+
1620
jest.mock('nhs-notify-web-template-management-utils/logger');
1721

1822
beforeEach(() => {
1923
jest.resetAllMocks();
2024
mockUseAuthStatus.mockImplementation((status) => status ?? 'configuring');
25+
mockServerIsFeatureEnabled.mockResolvedValue(false); // default for most tests
2126
});
2227

2328
describe('NhsNotifyHeader', () => {
@@ -28,7 +33,7 @@ describe('NhsNotifyHeader', () => {
2833
});
2934

3035
it('initializes the authStatus as unauthenticated', async () => {
31-
const header = await NhsNotifyHeader({});
36+
const header = await NhsNotifyHeader();
3237

3338
render(header);
3439

@@ -40,7 +45,7 @@ describe('NhsNotifyHeader', () => {
4045
});
4146

4247
it('renders the logo and service name with the correct url', async () => {
43-
const header = await NhsNotifyHeader({});
48+
const header = await NhsNotifyHeader();
4449

4550
render(header);
4651

@@ -54,15 +59,15 @@ describe('NhsNotifyHeader', () => {
5459
});
5560

5661
it(`renders the authentication link as 'sign in'`, async () => {
57-
const header = await NhsNotifyHeader({});
62+
const header = await NhsNotifyHeader();
5863

5964
render(header);
6065

6166
expect(screen.getByTestId('sign-in-link')).toHaveTextContent('Sign in');
6267
});
6368

6469
it('does not show the navigation links', async () => {
65-
const header = await NhsNotifyHeader({});
70+
const header = await NhsNotifyHeader();
6671

6772
render(header);
6873

@@ -72,7 +77,7 @@ describe('NhsNotifyHeader', () => {
7277
});
7378

7479
it('matches snapshot (unauthenticated)', async () => {
75-
const header = await NhsNotifyHeader({});
80+
const header = await NhsNotifyHeader();
7681

7782
const container = render(header);
7883

@@ -94,11 +99,9 @@ describe('NhsNotifyHeader', () => {
9499
});
95100

96101
it('initializes the authStatus as authenticated', async () => {
97-
const header = await NhsNotifyHeader({});
98-
102+
const header = await NhsNotifyHeader();
99103
render(header);
100104

101-
// hook used in AuthLink, HeaderNavigation, HeaderAccountDetails
102105
expect(mockUseAuthStatus).toHaveBeenCalledTimes(3);
103106

104107
for (const call of mockUseAuthStatus.mock.calls) {
@@ -107,7 +110,7 @@ describe('NhsNotifyHeader', () => {
107110
});
108111

109112
it('renders the users display name', async () => {
110-
const header = await NhsNotifyHeader({});
113+
const header = await NhsNotifyHeader();
111114

112115
render(header);
113116

@@ -117,7 +120,7 @@ describe('NhsNotifyHeader', () => {
117120
});
118121

119122
it('renders the client name', async () => {
120-
const header = await NhsNotifyHeader({});
123+
const header = await NhsNotifyHeader();
121124

122125
render(header);
123126

@@ -127,7 +130,7 @@ describe('NhsNotifyHeader', () => {
127130
});
128131

129132
it(`renders auth link as 'Sign out'`, async () => {
130-
const header = await NhsNotifyHeader({});
133+
const header = await NhsNotifyHeader();
131134

132135
render(header);
133136
expect(screen.getByTestId('sign-out-link')).toHaveTextContent('Sign out');
@@ -139,7 +142,7 @@ describe('NhsNotifyHeader', () => {
139142
});
140143
mockGetIdTokenClaims.mockReturnValueOnce({});
141144

142-
const header = await NhsNotifyHeader({});
145+
const header = await NhsNotifyHeader();
143146

144147
render(header);
145148

@@ -161,8 +164,12 @@ describe('NhsNotifyHeader', () => {
161164
});
162165

163166
describe(`with 'routing' flag enabled`, () => {
167+
beforeEach(() => {
168+
mockServerIsFeatureEnabled.mockResolvedValue(true);
169+
});
170+
164171
it('renders both the navigation links with correct hrefs', async () => {
165-
const header = await NhsNotifyHeader({ routingEnabled: true });
172+
const header = await NhsNotifyHeader();
166173

167174
render(header);
168175

@@ -183,8 +190,12 @@ describe('NhsNotifyHeader', () => {
183190
});
184191

185192
describe(`with 'routing' flag disabled`, () => {
193+
beforeEach(() => {
194+
mockServerIsFeatureEnabled.mockResolvedValue(false);
195+
});
196+
186197
it('renders the templates link with correct href', async () => {
187-
const header = await NhsNotifyHeader({ routingEnabled: false });
198+
const header = await NhsNotifyHeader();
188199

189200
render(header);
190201

@@ -197,7 +208,7 @@ describe('NhsNotifyHeader', () => {
197208
});
198209

199210
it('should not render the message plans link', async () => {
200-
const header = await NhsNotifyHeader({ routingEnabled: false });
211+
const header = await NhsNotifyHeader();
201212

202213
render(header);
203214

frontend/src/app/layout.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import { NhsNotifyHeader } from '@molecules/Header/Header';
99
import { NHSNotifyContainer } from '@layouts/container/container';
1010
import { NHSNotifyFooter } from '@molecules/Footer/Footer';
1111
import { LogoutWarningModal } from '@molecules/LogoutWarningModal/LogoutWarningModal';
12-
import { serverIsFeatureEnabled } from '@utils/server-features';
1312

1413
// https://nextjs.org/docs/app/api-reference/functions/generate-metadata#metadata-object
1514
export const metadata: Metadata = {
@@ -54,8 +53,6 @@ export default async function RootLayout({
5453
}: {
5554
children: React.ReactNode;
5655
}) {
57-
const routingEnabled = await serverIsFeatureEnabled('routing');
58-
5956
return (
6057
<html lang='en'>
6158
<head>
@@ -71,7 +68,7 @@ export default async function RootLayout({
7168
<CookiesProvider>
7269
<AuthProvider>
7370
<NHSNotifySkipLink />
74-
<NhsNotifyHeader routingEnabled={routingEnabled} />
71+
<NhsNotifyHeader />
7572
<NHSNotifyContainer>{children}</NHSNotifyContainer>
7673
<NHSNotifyFooter />
7774
<LogoutWarningModal

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,21 @@ import { getSessionServer } from '@utils/amplify-utils';
66
import { getIdTokenClaims } from '@utils/token-utils';
77
import { HeaderAccountDetails } from './HeaderAccountDetails';
88
import { HeaderNavigation } from './HeaderNavigation';
9-
10-
interface NhsNotifyHeaderProps {
11-
routingEnabled?: boolean;
12-
}
9+
import { serverIsFeatureEnabled } from '@utils/server-features';
1310

1411
const headerContent = content.components.header;
1512

16-
export async function NhsNotifyHeader({
17-
routingEnabled = false,
18-
}: NhsNotifyHeaderProps) {
13+
export async function NhsNotifyHeader() {
1914
const session = await getSessionServer();
2015

2116
const authStatus: AuthStatus = session?.accessToken
2217
? 'authenticated'
2318
: 'unauthenticated';
2419

20+
const routingEnabled = session?.accessToken
21+
? await serverIsFeatureEnabled('routing')
22+
: false;
23+
2524
return (
2625
<header
2726
className='nhsuk-header'

0 commit comments

Comments
 (0)