Skip to content

Commit 48dfcc4

Browse files
authored
Merge branch 'main' into feature/CCM-9648-sandbox-resource-naming-use-module
2 parents 318ccc1 + 1950556 commit 48dfcc4

File tree

68 files changed

+3897
-640
lines changed

Some content is hidden

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

68 files changed

+3897
-640
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ reports
6161
tests/screenshots/*
6262
plugin-cache/
6363

64+
# terraform
6465
*.terraform*
6566
terraform.tfstate
6667
terraform.tfstate.backup
@@ -84,3 +85,6 @@ tests/test-team/playwright-report/
8485
tests/test-team/blob-report/
8586
tests/test-team/playwright/.cache/
8687
lambdas/backend-api/src/email/email-template.json
88+
89+
# vscode
90+
.vscode/settings.local.json

.vscode/settings.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
{
22
"markdownlint.config": {
33
"MD013": false,
4-
"MD024": { "siblings_only": true },
4+
"MD024": {
5+
"siblings_only": true
6+
},
57
"MD033": false
68
},
79
"editor.codeActionsOnSave": {
810
"source.fixAll.eslint": "explicit"
911
},
10-
"eslint.codeActionsOnSave.mode": "problems"
12+
"eslint.codeActionsOnSave.mode": "problems",
1113
}

frontend/src/__tests__/components/forms/DeleteTemplate/server-action.test.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
deleteTemplateNoAction,
55
} from '@forms/DeleteTemplate/server-action';
66
import { NHSAppTemplate } from 'nhs-notify-web-template-management-utils';
7-
import { saveTemplate } from '@utils/form-actions';
7+
import { setTemplateToDeleted } from '@utils/form-actions';
88

99
jest.mock('next/navigation');
1010
jest.mock('@utils/form-actions');
@@ -27,7 +27,7 @@ test('redirects', async () => {
2727

2828
test('calls form action and redirects', async () => {
2929
const mockRedirect = jest.mocked(redirect);
30-
const mockSaveTemplate = jest.mocked(saveTemplate);
30+
const mockSetTemplateToDeleted = jest.mocked(setTemplateToDeleted);
3131

3232
const mockTemplate: NHSAppTemplate = {
3333
id: 'template-id',
@@ -41,10 +41,7 @@ test('calls form action and redirects', async () => {
4141

4242
await deleteTemplateYesAction(mockTemplate);
4343

44-
expect(mockSaveTemplate).toHaveBeenCalledWith({
45-
...mockTemplate,
46-
templateStatus: 'DELETED',
47-
});
44+
expect(mockSetTemplateToDeleted).toHaveBeenCalledWith('template-id');
4845

4946
expect(mockRedirect).toHaveBeenCalledWith(
5047
'/message-templates',

frontend/src/__tests__/components/forms/LetterTemplateForm.test.tsx/server-action.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { getMockFormData } from '@testhelpers';
22
import { createLetterTemplate } from '@utils/form-actions';
33
import { redirect } from 'next/navigation';
44
import { processFormActions } from '@forms/LetterTemplateForm/server-action';
5-
import { CreateLetterTemplate } from 'nhs-notify-web-template-management-utils';
5+
import { CreateUpdateLetterTemplate } from 'nhs-notify-web-template-management-utils';
66

77
jest.mock('@utils/amplify-utils');
88
jest.mock('@utils/form-actions');
@@ -11,7 +11,7 @@ jest.mock('next/navigation');
1111
const createLetterTemplateMock = jest.mocked(createLetterTemplate);
1212
const redirectMock = jest.mocked(redirect);
1313

14-
const initialState: CreateLetterTemplate = {
14+
const initialState: CreateUpdateLetterTemplate = {
1515
templateType: 'LETTER',
1616
name: 'name',
1717
letterType: 'x0',

frontend/src/__tests__/components/forms/NhsAppTemplateForm/server-action.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { getMockFormData } from '@testhelpers';
22
import { saveTemplate, createTemplate } from '@utils/form-actions';
33
import {
44
NHSAppTemplate,
5-
CreateNHSAppTemplate,
5+
CreateUpdateNHSAppTemplate,
66
} from 'nhs-notify-web-template-management-utils';
77
import { redirect } from 'next/navigation';
88
import { processFormActions } from '@forms/NhsAppTemplateForm/server-action';
@@ -15,7 +15,7 @@ const saveTemplateMock = jest.mocked(saveTemplate);
1515
const createTemplateMock = jest.mocked(createTemplate);
1616
const redirectMock = jest.mocked(redirect);
1717

18-
const initialState: CreateNHSAppTemplate = {
18+
const initialState: CreateUpdateNHSAppTemplate = {
1919
templateType: 'NHS_APP',
2020
name: 'name',
2121
message: 'message',

frontend/src/__tests__/components/forms/SmsTemplateForm/SmsTemplateForm.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { mockDeep } from 'jest-mock-extended';
44
import {
55
TemplateFormState,
66
SMSTemplate,
7-
CreateSMSTemplate,
7+
CreateUpdateSMSTemplate,
88
} from 'nhs-notify-web-template-management-utils';
99
import { SmsTemplateForm } from '@forms/SmsTemplateForm/SmsTemplateForm';
1010

@@ -29,7 +29,7 @@ describe('CreateSmsTemplate component', () => {
2929
test('renders page with back link if initial state has no id - edit mode', async () => {
3030
const container = render(
3131
<SmsTemplateForm
32-
initialState={mockDeep<TemplateFormState<CreateSMSTemplate>>({
32+
initialState={mockDeep<TemplateFormState<CreateUpdateSMSTemplate>>({
3333
validationError: undefined,
3434
name: 'template-name',
3535
message: 'template-message',

frontend/src/__tests__/components/forms/SubmitTemplate/server-action.test.ts

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import { submitTemplate } from '@forms/SubmitTemplate/server-action';
55
import { getMockFormData } from '@testhelpers';
66
import { redirect } from 'next/navigation';
7-
import { getTemplate, saveTemplate } from '@utils/form-actions';
7+
import { getTemplate, setTemplateToSubmitted } from '@utils/form-actions';
88
import { TemplateDto } from 'nhs-notify-backend-client';
99

1010
jest.mock('next/navigation');
@@ -13,7 +13,7 @@ jest.mock('@utils/amplify-utils');
1313

1414
const redirectMock = jest.mocked(redirect);
1515
const getTemplateMock = jest.mocked(getTemplate);
16-
const saveTemplateMock = jest.mocked(saveTemplate);
16+
const setTemplateToSubmittedMock = jest.mocked(setTemplateToSubmitted);
1717

1818
const mockNhsAppTemplate = {
1919
templateType: 'NHS_APP',
@@ -63,7 +63,7 @@ describe('submitTemplate', () => {
6363
it('should handle error when failing to save template', async () => {
6464
getTemplateMock.mockResolvedValueOnce(mockNhsAppTemplate);
6565

66-
saveTemplateMock.mockImplementationOnce(() => {
66+
setTemplateToSubmittedMock.mockImplementationOnce(() => {
6767
throw new Error('failed to save template');
6868
});
6969

@@ -85,17 +85,8 @@ describe('submitTemplate', () => {
8585

8686
await submitTemplate('submit-route', formData);
8787

88-
expect(saveTemplateMock).toHaveBeenCalledWith(
89-
expect.objectContaining({
90-
createdAt: '2025-01-13T10:19:25.579Z',
91-
id: '1',
92-
message: 'body',
93-
name: 'name',
94-
templateStatus: 'SUBMITTED',
95-
templateType: 'NHS_APP',
96-
updatedAt: '2025-01-13T10:19:25.579Z',
97-
})
98-
);
88+
expect(setTemplateToSubmittedMock).toHaveBeenCalledWith('1');
89+
9990
expect(redirectMock).toHaveBeenCalledWith('/submit-route/1', 'push');
10091
});
10192
});

frontend/src/__tests__/utils/form-actions.test.ts

Lines changed: 112 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
* @jest-environment node
33
*/
44
import {
5-
CreateLetterTemplate,
6-
CreateNHSAppTemplate,
5+
CreateUpdateLetterTemplate,
6+
CreateUpdateNHSAppTemplate,
77
NHSAppTemplate,
88
} from 'nhs-notify-web-template-management-utils';
99
import {
@@ -12,6 +12,8 @@ import {
1212
getTemplate,
1313
getTemplates,
1414
createLetterTemplate,
15+
setTemplateToDeleted,
16+
setTemplateToSubmitted,
1517
} from '@utils/form-actions';
1618
import { getAccessTokenServer } from '@utils/amplify-utils';
1719
import { TemplateDto } from 'nhs-notify-backend-client';
@@ -44,7 +46,7 @@ describe('form-actions', () => {
4446
data: responseData,
4547
});
4648

47-
const createTemplateInput: CreateNHSAppTemplate = {
49+
const createTemplateInput: CreateUpdateNHSAppTemplate = {
4850
templateType: 'NHS_APP',
4951
name: 'name',
5052
message: 'message',
@@ -68,7 +70,7 @@ describe('form-actions', () => {
6870
},
6971
});
7072

71-
const createTemplateInput: CreateNHSAppTemplate = {
73+
const createTemplateInput: CreateUpdateNHSAppTemplate = {
7274
templateType: 'NHS_APP',
7375
name: 'name',
7476
message: 'message',
@@ -88,7 +90,7 @@ describe('form-actions', () => {
8890
authIdTokenServerMock.mockReset();
8991
authIdTokenServerMock.mockResolvedValueOnce(undefined);
9092

91-
const createTemplateInput: CreateNHSAppTemplate = {
93+
const createTemplateInput: CreateUpdateNHSAppTemplate = {
9294
templateType: 'NHS_APP',
9395
name: 'name',
9496
message: 'message',
@@ -127,7 +129,7 @@ describe('form-actions', () => {
127129
data: responseData,
128130
});
129131

130-
const createLetterTemplateInput: CreateLetterTemplate = {
132+
const createLetterTemplateInput: CreateUpdateLetterTemplate = {
131133
templateType: 'LETTER',
132134
name: 'name',
133135
letterType: 'x0',
@@ -180,7 +182,7 @@ describe('form-actions', () => {
180182
data: responseData,
181183
});
182184

183-
const createLetterTemplateInput: CreateLetterTemplate = {
185+
const createLetterTemplateInput: CreateUpdateLetterTemplate = {
184186
templateType: 'LETTER',
185187
name: 'name',
186188
letterType: 'x0',
@@ -218,7 +220,7 @@ describe('form-actions', () => {
218220
},
219221
});
220222

221-
const createLetterTemplateInput: CreateLetterTemplate = {
223+
const createLetterTemplateInput: CreateUpdateLetterTemplate = {
222224
templateType: 'LETTER',
223225
name: 'name',
224226
letterType: 'x0',
@@ -248,7 +250,7 @@ describe('form-actions', () => {
248250
authIdTokenServerMock.mockReset();
249251
authIdTokenServerMock.mockResolvedValueOnce(undefined);
250252

251-
const createLetterTemplateInput: CreateLetterTemplate = {
253+
const createLetterTemplateInput: CreateUpdateLetterTemplate = {
252254
templateType: 'LETTER',
253255
name: 'name',
254256
letterType: 'x0',
@@ -283,7 +285,7 @@ describe('form-actions', () => {
283285
});
284286

285287
const updateTemplateInput: NHSAppTemplate = {
286-
id: 'pickle',
288+
id: 'id',
287289
templateType: 'NHS_APP',
288290
templateStatus: 'NOT_YET_SUBMITTED',
289291
name: 'name',
@@ -312,7 +314,7 @@ describe('form-actions', () => {
312314
});
313315

314316
const updateTemplateInput: NHSAppTemplate = {
315-
id: 'pickle',
317+
id: 'id',
316318
templateType: 'NHS_APP',
317319
templateStatus: 'NOT_YET_SUBMITTED',
318320
name: 'name',
@@ -337,7 +339,7 @@ describe('form-actions', () => {
337339
authIdTokenServerMock.mockResolvedValueOnce(undefined);
338340

339341
const updateTemplateInput: NHSAppTemplate = {
340-
id: 'pickle',
342+
id: 'id',
341343
templateType: 'NHS_APP',
342344
templateStatus: 'NOT_YET_SUBMITTED',
343345
name: 'name',
@@ -483,4 +485,102 @@ describe('form-actions', () => {
483485

484486
expect(actualOrder).toEqual(expectedOrder);
485487
});
488+
489+
describe('setTemplateToSubmitted', () => {
490+
test('submitTemplate successfully', async () => {
491+
const responseData = {
492+
id: 'id',
493+
templateType: 'NHS_APP',
494+
templateStatus: 'SUBMITTED',
495+
name: 'name',
496+
message: 'message',
497+
createdAt: '2025-01-13T10:19:25.579Z',
498+
updatedAt: '2025-01-13T10:19:25.579Z',
499+
} satisfies TemplateDto;
500+
501+
mockedTemplateClient.submitTemplate.mockResolvedValueOnce({
502+
data: responseData,
503+
});
504+
505+
const response = await setTemplateToSubmitted('id');
506+
507+
expect(mockedTemplateClient.submitTemplate).toHaveBeenCalledWith(
508+
'id',
509+
'token'
510+
);
511+
512+
expect(response).toEqual(responseData);
513+
});
514+
515+
test('submitTemplate - should thrown error when saving unexpectedly fails', async () => {
516+
mockedTemplateClient.submitTemplate.mockResolvedValueOnce({
517+
error: {
518+
code: 400,
519+
message: 'Bad request',
520+
},
521+
});
522+
523+
await expect(setTemplateToSubmitted('id')).rejects.toThrow(
524+
'Failed to save template data'
525+
);
526+
527+
expect(mockedTemplateClient.submitTemplate).toHaveBeenCalledWith(
528+
'id',
529+
'token'
530+
);
531+
});
532+
533+
test('submitTemplate - should thrown error when no token', async () => {
534+
authIdTokenServerMock.mockReset();
535+
authIdTokenServerMock.mockResolvedValueOnce(undefined);
536+
537+
await expect(setTemplateToSubmitted('id')).rejects.toThrow(
538+
'Failed to get access token'
539+
);
540+
});
541+
});
542+
543+
describe('setTemplateToDeleted', () => {
544+
test('deleteTemplate successfully', async () => {
545+
mockedTemplateClient.deleteTemplate.mockResolvedValueOnce({
546+
data: undefined,
547+
});
548+
549+
const response = await setTemplateToDeleted('id');
550+
551+
expect(mockedTemplateClient.deleteTemplate).toHaveBeenCalledWith(
552+
'id',
553+
'token'
554+
);
555+
556+
expect(response).toEqual(undefined);
557+
});
558+
559+
test('deleteTemplate - should thrown error when saving unexpectedly fails', async () => {
560+
mockedTemplateClient.deleteTemplate.mockResolvedValueOnce({
561+
error: {
562+
code: 400,
563+
message: 'Bad request',
564+
},
565+
});
566+
567+
await expect(setTemplateToDeleted('id')).rejects.toThrow(
568+
'Failed to save template data'
569+
);
570+
571+
expect(mockedTemplateClient.deleteTemplate).toHaveBeenCalledWith(
572+
'id',
573+
'token'
574+
);
575+
});
576+
577+
test('deleteTemplate - should thrown error when no token', async () => {
578+
authIdTokenServerMock.mockReset();
579+
authIdTokenServerMock.mockResolvedValueOnce(undefined);
580+
581+
await expect(setTemplateToDeleted('id')).rejects.toThrow(
582+
'Failed to get access token'
583+
);
584+
});
585+
});
486586
});

frontend/src/app/create-email-template/page.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Metadata } from 'next';
22
import { EmailTemplateForm } from '@forms/EmailTemplateForm/EmailTemplateForm';
3-
import { CreateEmailTemplate } from 'nhs-notify-web-template-management-utils';
3+
import { CreateUpdateEmailTemplate } from 'nhs-notify-web-template-management-utils';
44
import content from '@content/content';
55

66
const { pageTitle } = content.components.templateFormEmail;
@@ -12,7 +12,7 @@ export async function generateMetadata(): Promise<Metadata> {
1212
}
1313

1414
const CreateEmailTemplatePage = async () => {
15-
const initialState: CreateEmailTemplate = {
15+
const initialState: CreateUpdateEmailTemplate = {
1616
templateType: 'EMAIL',
1717
name: '',
1818
subject: '',

0 commit comments

Comments
 (0)