Skip to content

Commit 7b0da7f

Browse files
authored
Merge pull request #309 from NHSDigital/feature/CCM-8590-404
CCM-8590: public 404
2 parents afa52cc + b814b6d commit 7b0da7f

23 files changed

+132
-57
lines changed

frontend/src/__tests__/middleware.test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@ afterAll(() => {
2020
});
2121

2222
describe('middleware function', () => {
23+
it('If route is not registered in midleware, respond with 404', async () => {
24+
const url = new URL('https://url.com/manage-templates/does-not-exist');
25+
const request = new NextRequest(url);
26+
const response = await middleware(request);
27+
28+
expect(response.status).toBe(404);
29+
});
30+
2331
it('if request path is protected, and no access token is obtained, redirect to auth page', async () => {
2432
const url = new URL('https://url.com/manage-templates');
2533
const request = new NextRequest(url);

frontend/src/middleware.ts

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,39 @@ import { NextResponse, type NextRequest } from 'next/server';
22
import { getAccessTokenServer } from '@utils/amplify-utils';
33
import { getBasePath } from '@utils/get-base-path';
44

5+
const protectedPaths = [
6+
/^\/choose-a-template-type$/,
7+
/^\/copy-template\/[^/]+$/,
8+
/^\/create-email-template$/,
9+
/^\/create-nhs-app-template$/,
10+
/^\/create-text-message-template$/,
11+
/^\/delete-template\/[^/]+$/,
12+
/^\/edit-email-template\/[^/]+$/,
13+
/^\/edit-nhs-app-template/,
14+
/^\/edit-text-message-template\/[^/]+$/,
15+
/^\/email-template-submitted\/[^/]+$/,
16+
/^\/invalid-template$/,
17+
/^\/manage-templates$/,
18+
/^\/nhs-app-template-submitted\/[^/]+$/,
19+
/^\/preview-email-template\/[^/]+$/,
20+
/^\/preview-nhs-app-template\/[^/]+$/,
21+
/^\/preview-text-message-template\/[^/]+$/,
22+
/^\/submit-email-template\/[^/]+$/,
23+
/^\/submit-nhs-app-template\/[^/]+$/,
24+
/^\/submit-text-message-template\/[^/]+$/,
25+
/^\/text-message-template-submitted\/[^/]+$/,
26+
/^\/view-submitted-email-template\/[^/]+$/,
27+
/^\/view-submitted-nhs-app-template\/[^/]+$/,
28+
/^\/view-submitted-text-message-template\/[^/]+$/,
29+
];
30+
31+
const publicPaths = [
32+
/^\/create-and-submit-templates$/,
33+
/^\/auth$/,
34+
/^\/auth\/signin$/,
35+
/^\/auth\/signout$/,
36+
];
37+
538
function getContentSecurityPolicy(nonce: string) {
639
const contentSecurityPolicyDirective = {
740
'base-uri': [`'self'`],
@@ -28,21 +61,17 @@ function getContentSecurityPolicy(nonce: string) {
2861
.join('; ');
2962
}
3063

31-
function isPublicPath(path: string, publicPaths: string[]): boolean {
32-
return publicPaths.some((publicPath) => path.startsWith(publicPath));
33-
}
34-
3564
export async function middleware(request: NextRequest) {
65+
const { pathname } = request.nextUrl;
66+
3667
const nonce = Buffer.from(crypto.randomUUID()).toString('base64');
3768

3869
const csp = getContentSecurityPolicy(nonce);
3970

4071
const requestHeaders = new Headers(request.headers);
4172
requestHeaders.set('Content-Security-Policy', csp);
4273

43-
const publicPaths = ['/create-and-submit-templates', '/auth', '/lib'];
44-
45-
if (isPublicPath(request.nextUrl.pathname, publicPaths)) {
74+
if (publicPaths.some((p) => p.test(pathname))) {
4675
const publicPathResponse = NextResponse.next({
4776
request: {
4877
headers: requestHeaders,
@@ -54,6 +83,10 @@ export async function middleware(request: NextRequest) {
5483
return publicPathResponse;
5584
}
5685

86+
if (!protectedPaths.some((p) => p.test(pathname))) {
87+
return new NextResponse('Page not found', { status: 404 });
88+
}
89+
5790
const token = await getAccessTokenServer();
5891

5992
if (!token) {

tests/test-team/pages/email/template-mgmt-create-email-page.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { Locator, Page } from '@playwright/test';
2-
import { TemplateMgmtBasePage } from '../template-mgmt-base-page';
32
import { TemplateMgmtMessageFormatting } from '../template-mgmt-message-formatting';
3+
import { TemplateMgmtBasePageNonDynamic } from '../template-mgmt-base-page-non-dynamic';
44

5-
export class TemplateMgmtCreateEmailPage extends TemplateMgmtBasePage {
5+
export class TemplateMgmtCreateEmailPage extends TemplateMgmtBasePageNonDynamic {
66
static readonly pageUrlSegment = 'create-email-template';
77

88
public readonly nameInput: Locator;

tests/test-team/pages/email/template-mgmt-edit-email-page.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { Locator, Page } from '@playwright/test';
2-
import { TemplateMgmtBasePage } from '../template-mgmt-base-page';
32
import { TemplateMgmtMessageFormatting } from '../template-mgmt-message-formatting';
3+
import { TemplateMgmtBasePageDynamic } from '../template-mgmt-base-page-dynamic';
44

5-
export class TemplateMgmtEditEmailPage extends TemplateMgmtBasePage {
5+
export class TemplateMgmtEditEmailPage extends TemplateMgmtBasePageDynamic {
66
static readonly pageUrlSegment = 'edit-email-template';
77

88
public readonly nameInput: Locator;

tests/test-team/pages/nhs-app/template-mgmt-create-nhs-app-page.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { Locator, Page } from '@playwright/test';
2-
import { TemplateMgmtBasePage } from '../template-mgmt-base-page';
32
import { TemplateMgmtMessageFormatting } from '../template-mgmt-message-formatting';
3+
import { TemplateMgmtBasePageNonDynamic } from '../template-mgmt-base-page-non-dynamic';
44

5-
export class TemplateMgmtCreateNhsAppPage extends TemplateMgmtBasePage {
5+
export class TemplateMgmtCreateNhsAppPage extends TemplateMgmtBasePageNonDynamic {
66
static readonly pageUrlSegment = 'create-nhs-app-template';
77

88
public readonly nameInput: Locator;

tests/test-team/pages/nhs-app/template-mgmt-edit-nhs-app-page.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { Locator, Page } from '@playwright/test';
2-
import { TemplateMgmtBasePage } from '../template-mgmt-base-page';
32
import { TemplateMgmtMessageFormatting } from '../template-mgmt-message-formatting';
3+
import { TemplateMgmtBasePageDynamic } from '../template-mgmt-base-page-dynamic';
44

5-
export class TemplateMgmtEditNhsAppPage extends TemplateMgmtBasePage {
5+
export class TemplateMgmtEditNhsAppPage extends TemplateMgmtBasePageDynamic {
66
static readonly pageUrlSegment = 'edit-nhs-app-template';
77

88
public readonly nameInput: Locator;

tests/test-team/pages/sms/template-mgmt-create-sms-page.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { Locator, Page } from '@playwright/test';
2-
import { TemplateMgmtBasePage } from '../template-mgmt-base-page';
32
import { TemplateMgmtMessageFormatting } from '../template-mgmt-message-formatting';
3+
import { TemplateMgmtBasePageNonDynamic } from '../template-mgmt-base-page-non-dynamic';
44

5-
export class TemplateMgmtCreateSmsPage extends TemplateMgmtBasePage {
5+
export class TemplateMgmtCreateSmsPage extends TemplateMgmtBasePageNonDynamic {
66
static readonly pageUrlSegment = 'create-text-message-template';
77

88
public readonly nameInput: Locator;

tests/test-team/pages/sms/template-mgmt-edit-sms-page.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { Locator, Page } from '@playwright/test';
2-
import { TemplateMgmtBasePage } from '../template-mgmt-base-page';
32
import { TemplateMgmtMessageFormatting } from '../template-mgmt-message-formatting';
3+
import { TemplateMgmtBasePageDynamic } from '../template-mgmt-base-page-dynamic';
44

5-
export class TemplateMgmtEditSmsPage extends TemplateMgmtBasePage {
5+
export class TemplateMgmtEditSmsPage extends TemplateMgmtBasePageDynamic {
66
static readonly pageUrlSegment = 'edit-text-message-template';
77

88
public readonly nameInput: Locator;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { type Page } from '@playwright/test';
2+
import { TemplateMgmtBasePage } from './template-mgmt-base-page';
3+
4+
export abstract class TemplateMgmtBasePageDynamic extends TemplateMgmtBasePage {
5+
static readonly dynamicPage = true;
6+
7+
constructor(page: Page) {
8+
super(page);
9+
}
10+
11+
async loadPage(templateId: string) {
12+
const { appUrlSegment, pageUrlSegment } = this
13+
.constructor as typeof TemplateMgmtBasePageDynamic;
14+
15+
if (!pageUrlSegment) {
16+
throw new Error('pageUrlSegment is not defined');
17+
}
18+
19+
await this.navigateTo(`/${appUrlSegment}/${pageUrlSegment}/${templateId}`);
20+
}
21+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { type Page } from '@playwright/test';
2+
import { TemplateMgmtBasePage } from './template-mgmt-base-page';
3+
4+
export abstract class TemplateMgmtBasePageNonDynamic extends TemplateMgmtBasePage {
5+
static readonly dynamicPage = false;
6+
7+
constructor(page: Page) {
8+
super(page);
9+
}
10+
11+
async loadPage() {
12+
const { appUrlSegment, pageUrlSegment } = this
13+
.constructor as typeof TemplateMgmtBasePageNonDynamic;
14+
15+
if (!pageUrlSegment) {
16+
throw new Error('pageUrlSegment is not defined');
17+
}
18+
19+
await this.navigateTo(`/${appUrlSegment}/${pageUrlSegment}`);
20+
}
21+
}

0 commit comments

Comments
 (0)