Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions frontend/jest.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ const config: Config = {
},

setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],

maxWorkers: 3,
};

// createJestConfig is exported this way to ensure that next/jest can load the Next.js config which is async
Expand Down
4 changes: 2 additions & 2 deletions frontend/package.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"dependencies": {
"@aws-amplify/adapter-nextjs": "^1.7.1",
"@aws-amplify/ui-react": "^6.9.4",
"aws-amplify": "^6.13.6",
"@aws-amplify/ui-react": "^6.15.2",
"aws-amplify": "^6.16.3",
"classnames": "^2.5.1",
"clsx": "^2.1.1",
"date-fns": "^4.1.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { getTemplate } from '@utils/form-actions';
import { verifyFormCsrfToken } from '@utils/csrf-utils';
import { editTemplateCampaign } from '@app/edit-template-campaign/[templateId]/server-action';
import Page, { metadata } from '@app/edit-template-campaign/[templateId]/page';
import { PdfLetterTemplate } from 'nhs-notify-web-template-management-utils';

jest.mock('next/navigation');
jest.mock('@utils/server-features');
Expand Down Expand Up @@ -42,6 +43,27 @@ const mockTemplate: TemplateDto = {
},
};

const mockPdfTemplate: PdfLetterTemplate = {
id: 'template-123',
name: 'PDF Letter Template',
templateType: 'LETTER',
templateStatus: 'NOT_YET_SUBMITTED',
lockNumber: 5,
language: 'en',
letterType: 'x0',
letterVersion: 'PDF',
files: {
pdfTemplate: {
fileName: 'test.pdf',
currentVersion: 'v1',
virusScanStatus: 'PASSED',
},
},
createdAt: '2026-01-01T00:00:00.000Z',
updatedAt: '2026-01-01T00:00:00.000Z',
clientId: 'client-123',
};

beforeEach(() => {
jest.resetAllMocks();
jest.mocked(editTemplateCampaign).mockResolvedValue({});
Expand Down Expand Up @@ -104,26 +126,7 @@ describe('template is not a letter', () => {

describe('letter version is not AUTHORING', () => {
beforeEach(() => {
jest.mocked(getTemplate).mockResolvedValue({
id: 'template-123',
name: 'PDF Letter Template',
templateType: 'LETTER',
templateStatus: 'NOT_YET_SUBMITTED',
lockNumber: 5,
language: 'en',
letterType: 'x0',
letterVersion: 'PDF',
files: {
pdfTemplate: {
fileName: 'test.pdf',
currentVersion: 'v1',
virusScanStatus: 'PASSED',
},
},
createdAt: '2026-01-01T00:00:00.000Z',
updatedAt: '2026-01-01T00:00:00.000Z',
clientId: 'client-123',
});
jest.mocked(getTemplate).mockResolvedValue(mockPdfTemplate);
});

it('redirects to preview letter template page', async () => {
Expand Down Expand Up @@ -156,10 +159,10 @@ describe('client has letter authoring feature flag disabled', () => {
});
});

describe('template has been submitted', () => {
describe('template has been submitted - PDF', () => {
beforeEach(() => {
jest.mocked(getTemplate).mockResolvedValue({
...mockTemplate,
...mockPdfTemplate,
templateStatus: 'SUBMITTED',
});
});
Expand All @@ -174,6 +177,24 @@ describe('template has been submitted', () => {
});
});

describe('template has been submitted - authoring', () => {
beforeEach(() => {
jest.mocked(getTemplate).mockResolvedValue({
...mockTemplate,
templateStatus: 'SUBMITTED',
});
});

it('redirects to preview submitted letter template page', async () => {
await Page({ params: Promise.resolve({ templateId: 'template-123' }) });

expect(redirect).toHaveBeenCalledWith(
'/preview-approved-letter-template/template-123',
RedirectType.replace
);
});
});

describe('client only has one campaign', () => {
beforeEach(() => {
jest.mocked(fetchClient).mockResolvedValue({
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { redirect, RedirectType } from 'next/navigation';
import type { AuthoringLetterTemplate } from 'nhs-notify-web-template-management-utils';
import type {
AuthoringLetterTemplate,
PdfLetterTemplate,
} from 'nhs-notify-web-template-management-utils';
import { fetchClient } from '@utils/server-features';
import { getTemplate } from '@utils/form-actions';
import { verifyFormCsrfToken } from '@utils/csrf-utils';
Expand Down Expand Up @@ -42,6 +45,27 @@ const mockTemplate: AuthoringLetterTemplate = {
systemPersonalisation: [],
};

const mockPdfTemplate: PdfLetterTemplate = {
id: 'template-123',
name: 'PDF Letter Template',
templateType: 'LETTER',
templateStatus: 'NOT_YET_SUBMITTED',
lockNumber: 5,
language: 'en',
letterType: 'x0',
letterVersion: 'PDF',
files: {
pdfTemplate: {
fileName: 'test.pdf',
currentVersion: 'v1',
virusScanStatus: 'PASSED',
},
},
createdAt: '2026-01-01T00:00:00.000Z',
updatedAt: '2026-01-01T00:00:00.000Z',
clientId: 'client-123',
};

beforeEach(() => {
jest.resetAllMocks();
jest.mocked(editTemplateName).mockResolvedValue({});
Expand Down Expand Up @@ -104,26 +128,7 @@ describe('template is not a letter', () => {

describe('letter version is not AUTHORING', () => {
beforeEach(() => {
jest.mocked(getTemplate).mockResolvedValue({
id: 'template-123',
name: 'PDF Letter Template',
templateType: 'LETTER',
templateStatus: 'NOT_YET_SUBMITTED',
lockNumber: 5,
language: 'en',
letterType: 'x0',
letterVersion: 'PDF',
files: {
pdfTemplate: {
fileName: 'test.pdf',
currentVersion: 'v1',
virusScanStatus: 'PASSED',
},
},
createdAt: '2026-01-01T00:00:00.000Z',
updatedAt: '2026-01-01T00:00:00.000Z',
clientId: 'client-123',
});
jest.mocked(getTemplate).mockResolvedValue(mockPdfTemplate);
});

it('redirects to preview letter template page', async () => {
Expand Down Expand Up @@ -156,10 +161,10 @@ describe('client has letter authoring feature flag disabled', () => {
});
});

describe('template has been submitted', () => {
describe('template has been submitted - PDF', () => {
beforeEach(() => {
jest.mocked(getTemplate).mockResolvedValue({
...mockTemplate,
...mockPdfTemplate,
templateStatus: 'SUBMITTED',
});
});
Expand All @@ -174,6 +179,24 @@ describe('template has been submitted', () => {
});
});

describe('template has been submitted - authoring', () => {
beforeEach(() => {
jest.mocked(getTemplate).mockResolvedValue({
...mockTemplate,
templateStatus: 'SUBMITTED',
});
});

it('redirects to preview submitted letter template page', async () => {
await Page({ params: Promise.resolve({ templateId: 'template-123' }) });

expect(redirect).toHaveBeenCalledWith(
'/preview-approved-letter-template/template-123',
RedirectType.replace
);
});
});

describe('valid template', () => {
it('matches snapshot on initial render', async () => {
expect(
Expand Down
Loading
Loading