Skip to content

Commit a50852e

Browse files
committed
CCM-8620: merge
2 parents 267a882 + a584e7f commit a50852e

File tree

158 files changed

+4111
-1128
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

158 files changed

+4111
-1128
lines changed

frontend/src/__tests__/app/copy-template/page.test.tsx

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@ import {
99
} from 'nhs-notify-web-template-management-utils';
1010
import { redirect } from 'next/navigation';
1111
import { getTemplate } from '@utils/form-actions';
12-
import { TemplateDTO } from 'nhs-notify-backend-client';
12+
import {
13+
Language,
14+
LetterType,
15+
TemplateDTO,
16+
VirusScanStatus,
17+
} from 'nhs-notify-backend-client';
1318

1419
jest.mock('@utils/form-actions');
1520
jest.mock('next/navigation');
@@ -21,7 +26,7 @@ const getTemplateMock = jest.mocked(getTemplate);
2126
describe('CopyTemplatePage', () => {
2227
beforeEach(jest.resetAllMocks);
2328

24-
const template: TemplateDTO = {
29+
const template = {
2530
id: 'template-id',
2631
templateType: TemplateType.EMAIL,
2732
templateStatus: TemplateStatus.NOT_YET_SUBMITTED,
@@ -30,6 +35,29 @@ describe('CopyTemplatePage', () => {
3035
message: 'template-message',
3136
createdAt: '2025-01-13T10:19:25.579Z',
3237
updatedAt: '2025-01-13T10:19:25.579Z',
38+
} satisfies TemplateDTO;
39+
40+
const letterTemplate: TemplateDTO = {
41+
id: 'template-id',
42+
templateType: TemplateType.LETTER,
43+
templateStatus: TemplateStatus.NOT_YET_SUBMITTED,
44+
name: 'template-name',
45+
createdAt: '2025-01-13T10:19:25.579Z',
46+
updatedAt: '2025-01-13T10:19:25.579Z',
47+
letterType: LetterType.Q4,
48+
language: Language.FR,
49+
files: {
50+
pdfTemplate: {
51+
fileName: 'file.pdf',
52+
currentVersion: '61C1267A-0F37-4E1D-831E-494DE2BECC8C',
53+
virusScanStatus: VirusScanStatus.PASSED,
54+
},
55+
testDataCsv: {
56+
fileName: 'file.csv',
57+
currentVersion: 'A8A76934-70F4-4735-8314-51CE097130DB',
58+
virusScanStatus: VirusScanStatus.PASSED,
59+
},
60+
},
3361
};
3462

3563
it('should load page', async () => {
@@ -53,4 +81,16 @@ describe('CopyTemplatePage', () => {
5381

5482
expect(redirectMock).toHaveBeenCalledWith('/invalid-template', 'replace');
5583
});
84+
85+
it('should redirect to invalid-template when the template is a letter', async () => {
86+
getTemplateMock.mockResolvedValueOnce(letterTemplate);
87+
88+
await CopyTemplatePage({
89+
params: Promise.resolve({
90+
templateId: 'template-id',
91+
}),
92+
});
93+
94+
expect(redirectMock).toHaveBeenCalledWith('/invalid-template', 'replace');
95+
});
5696
});

frontend/src/__tests__/app/delete-template/page.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ describe('PreviewEmailTemplatePage', () => {
2323
beforeEach(jest.resetAllMocks);
2424

2525
it('should load page', async () => {
26-
const templateDTO: TemplateDTO = {
26+
const templateDTO = {
2727
id: 'template-id',
2828
templateType: TemplateType.EMAIL,
2929
templateStatus: TemplateStatus.NOT_YET_SUBMITTED,
@@ -32,7 +32,7 @@ describe('PreviewEmailTemplatePage', () => {
3232
message: 'template-message',
3333
createdAt: '2025-01-13T10:19:25.579Z',
3434
updatedAt: '2025-01-13T10:19:25.579Z',
35-
};
35+
} satisfies TemplateDTO;
3636

3737
const emailTemplate: EmailTemplate = {
3838
...templateDTO,

frontend/src/__tests__/app/edit-email-template/page.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jest.mock('@forms/EmailTemplateForm/EmailTemplateForm');
1919
const getTemplateMock = jest.mocked(getTemplate);
2020
const redirectMock = jest.mocked(redirect);
2121

22-
const templateDTO: TemplateDTO = {
22+
const templateDTO = {
2323
id: 'template-id',
2424
templateType: TemplateType.EMAIL,
2525
templateStatus: TemplateStatus.NOT_YET_SUBMITTED,
@@ -28,7 +28,7 @@ const templateDTO: TemplateDTO = {
2828
message: 'message',
2929
createdAt: '2025-01-13T10:19:25.579Z',
3030
updatedAt: '2025-01-13T10:19:25.579Z',
31-
};
31+
} satisfies TemplateDTO;
3232

3333
describe('EditEmailTemplatePage', () => {
3434
beforeEach(jest.resetAllMocks);

frontend/src/__tests__/app/edit-nhs-app-template/page.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,15 @@ describe('EditNhsAppTemplatePage', () => {
2323
beforeEach(jest.resetAllMocks);
2424

2525
test('page loads', async () => {
26-
const templateDTO: TemplateDTO = {
26+
const templateDTO = {
2727
id: 'template-id',
2828
templateType: TemplateType.NHS_APP,
2929
templateStatus: TemplateStatus.NOT_YET_SUBMITTED,
3030
name: 'name',
3131
message: 'message',
3232
createdAt: '2025-01-13T10:19:25.579Z',
3333
updatedAt: '2025-01-13T10:19:25.579Z',
34-
};
34+
} satisfies TemplateDTO;
3535

3636
const nhsAppTemplate: NHSAppTemplate = {
3737
...templateDTO,

frontend/src/__tests__/app/edit-text-message-template/page.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@ jest.mock('@forms/SmsTemplateForm/SmsTemplateForm');
1919
const getTemplateMock = jest.mocked(getTemplate);
2020
const redirectMock = jest.mocked(redirect);
2121

22-
const templateDTO: TemplateDTO = {
22+
const templateDTO = {
2323
id: 'template-id',
2424
templateType: TemplateType.SMS,
2525
templateStatus: TemplateStatus.NOT_YET_SUBMITTED,
2626
name: 'name',
2727
message: 'message',
2828
createdAt: '2025-01-13T10:19:25.579Z',
2929
updatedAt: '2025-01-13T10:19:25.579Z',
30-
};
30+
} satisfies TemplateDTO;
3131

3232
describe('EditSmsTemplatePage', () => {
3333
beforeEach(jest.resetAllMocks);

frontend/src/__tests__/app/manage-templates/page.test.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ describe('ManageTemplatesPage', () => {
4646

4747
expect(screen.getByTestId('no-templates-available')).toBeInTheDocument();
4848
});
49+
4950
test('renders the page with templates', async () => {
5051
jest.mocked(getTemplates).mockResolvedValue(mockTemplates);
5152
render(await ManageTemplatesPage());

frontend/src/__tests__/app/preview-email-template/page.test.tsx

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@
22
* @jest-environment node
33
*/
44
import PreviewEmailTemplatePage from '@app/preview-email-template/[templateId]/page';
5-
import { ReviewEmailTemplate } from '@forms/ReviewEmailTemplate';
5+
import { PreviewEmailTemplate } from '@forms/PreviewEmailTemplate';
66
import {
77
EmailTemplate,
88
TemplateType,
99
TemplateStatus,
1010
} from 'nhs-notify-web-template-management-utils';
1111
import { redirect } from 'next/navigation';
1212
import { getTemplate } from '@utils/form-actions';
13-
import { TemplateDTO } from 'nhs-notify-backend-client';
13+
import { Language, LetterType, TemplateDTO } from 'nhs-notify-backend-client';
1414

1515
jest.mock('@utils/form-actions');
1616
jest.mock('next/navigation');
17-
jest.mock('@forms/ReviewEmailTemplate');
17+
jest.mock('@forms/PreviewEmailTemplate');
1818

1919
const redirectMock = jest.mocked(redirect);
2020
const getTemplateMock = jest.mocked(getTemplate);
@@ -23,7 +23,7 @@ describe('PreviewEmailTemplatePage', () => {
2323
beforeEach(jest.resetAllMocks);
2424

2525
it('should load page', async () => {
26-
const templateDTO: TemplateDTO = {
26+
const templateDTO = {
2727
id: 'template-id',
2828
templateType: TemplateType.EMAIL,
2929
templateStatus: TemplateStatus.NOT_YET_SUBMITTED,
@@ -32,7 +32,7 @@ describe('PreviewEmailTemplatePage', () => {
3232
message: 'template-message',
3333
createdAt: '2025-01-13T10:19:25.579Z',
3434
updatedAt: '2025-01-13T10:19:25.579Z',
35-
};
35+
} satisfies TemplateDTO;
3636

3737
const emailTemplate: EmailTemplate = {
3838
...templateDTO,
@@ -49,7 +49,7 @@ describe('PreviewEmailTemplatePage', () => {
4949
}),
5050
});
5151

52-
expect(page).toEqual(<ReviewEmailTemplate initialState={emailTemplate} />);
52+
expect(page).toEqual(<PreviewEmailTemplate initialState={emailTemplate} />);
5353
});
5454

5555
it('should redirect to invalid-template when no templateId is found', async () => {
@@ -75,6 +75,12 @@ describe('PreviewEmailTemplatePage', () => {
7575
subject: 'template-subject-line',
7676
message: 'template-message',
7777
},
78+
{
79+
templateType: TemplateType.LETTER,
80+
name: 'template-name',
81+
letterType: LetterType.X0,
82+
language: Language.EN,
83+
},
7884
{
7985
templateType: TemplateType.EMAIL,
8086
name: undefined as unknown as string,
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
/**
2+
* @jest-environment node
3+
*/
4+
import PreviewLetterTemplatePage from '@app/preview-letter-template/[templateId]/page';
5+
import { PreviewLetterTemplate } from '@forms/PreviewLetterTemplate/PreviewLetterTemplate';
6+
import {
7+
type LetterTemplate,
8+
TemplateType,
9+
TemplateStatus,
10+
} from 'nhs-notify-web-template-management-utils';
11+
import { redirect } from 'next/navigation';
12+
import { getTemplate } from '@utils/form-actions';
13+
import {
14+
Language,
15+
LetterType,
16+
TemplateDTO,
17+
VirusScanStatus,
18+
} from 'nhs-notify-backend-client';
19+
20+
jest.mock('@utils/form-actions');
21+
jest.mock('next/navigation');
22+
jest.mock('@forms/PreviewLetterTemplate/PreviewLetterTemplate');
23+
24+
const redirectMock = jest.mocked(redirect);
25+
const getTemplateMock = jest.mocked(getTemplate);
26+
27+
const templateDTO = {
28+
id: 'template-id',
29+
templateType: TemplateType.LETTER,
30+
templateStatus: TemplateStatus.NOT_YET_SUBMITTED,
31+
name: 'template-name',
32+
createdAt: '2025-01-13T10:19:25.579Z',
33+
updatedAt: '2025-01-13T10:19:25.579Z',
34+
letterType: LetterType.X0,
35+
language: Language.EN,
36+
files: {
37+
pdfTemplate: {
38+
fileName: 'template.pdf',
39+
currentVersion: 'saoj867b789',
40+
virusScanStatus: VirusScanStatus.PASSED,
41+
},
42+
testDataCsv: {
43+
fileName: 'test-data.csv',
44+
currentVersion: '897asiahv87',
45+
virusScanStatus: VirusScanStatus.FAILED,
46+
},
47+
},
48+
} satisfies TemplateDTO;
49+
50+
const letterTemplate: LetterTemplate = {
51+
...templateDTO,
52+
templateType: TemplateType.LETTER,
53+
templateStatus: TemplateStatus.NOT_YET_SUBMITTED,
54+
};
55+
56+
describe('PreviewLetterTemplatePage', () => {
57+
beforeEach(() => {
58+
jest.resetAllMocks();
59+
});
60+
61+
it('should load page', async () => {
62+
getTemplateMock.mockResolvedValueOnce(templateDTO);
63+
64+
const page = await PreviewLetterTemplatePage({
65+
params: Promise.resolve({
66+
templateId: 'template-id',
67+
}),
68+
});
69+
70+
expect(page).toEqual(
71+
<PreviewLetterTemplate initialState={letterTemplate} />
72+
);
73+
});
74+
75+
it('should redirect to invalid-template when no template is found', async () => {
76+
await PreviewLetterTemplatePage({
77+
params: Promise.resolve({
78+
templateId: 'template-id',
79+
}),
80+
});
81+
82+
expect(redirectMock).toHaveBeenCalledWith('/invalid-template', 'replace');
83+
});
84+
85+
test.each([
86+
{
87+
description: 'an email',
88+
templateType: TemplateType.EMAIL,
89+
name: 'template-name',
90+
message: 'template-message',
91+
},
92+
{
93+
description: 'an SMS',
94+
templateType: TemplateType.SMS,
95+
name: 'template-name',
96+
message: 'template-message',
97+
},
98+
{
99+
description: 'an app message',
100+
templateType: TemplateType.NHS_APP,
101+
name: 'template-name',
102+
message: 'template-message',
103+
},
104+
{
105+
description: 'a letter lacking language',
106+
language: undefined as unknown as Language,
107+
},
108+
{
109+
description: 'a letter lacking a name',
110+
name: undefined as unknown as string,
111+
},
112+
{
113+
description: 'a letter lacking letterType',
114+
letterType: undefined as unknown as LetterType,
115+
},
116+
{
117+
description: 'a letter lacking pdfTemplate fileName',
118+
files: {
119+
pdfTemplate: {
120+
fileName: undefined as unknown as string,
121+
currentVersion: 'uuid',
122+
virusScanStatus: VirusScanStatus.FAILED,
123+
},
124+
},
125+
},
126+
{
127+
description: 'a letter where files is the wrong data type',
128+
files: [] as unknown as LetterTemplate['files'],
129+
},
130+
])(
131+
'should redirect to invalid-template when template is $description',
132+
async ({ description: _, ...value }) => {
133+
getTemplateMock.mockResolvedValueOnce({
134+
...templateDTO,
135+
...value,
136+
});
137+
138+
await PreviewLetterTemplatePage({
139+
params: Promise.resolve({
140+
templateId: 'template-id',
141+
}),
142+
});
143+
144+
expect(redirectMock).toHaveBeenCalledWith('/invalid-template', 'replace');
145+
}
146+
);
147+
});

0 commit comments

Comments
 (0)