Skip to content
Merged
Show file tree
Hide file tree
Changes from 40 commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
c5d925b
CCM-8579: Switch from util types to api client types
ClareJonesBJSS Mar 10, 2025
3cb995a
CCM-8579: Copy, tests, misc
ClareJonesBJSS Mar 10, 2025
f41f5f2
CCM-8679: hey-api generator
ClareJonesBJSS Mar 10, 2025
a122f99
CCM-8679: Update TemplateType
ClareJonesBJSS Mar 10, 2025
c50e542
CCM-8579: TemplateStatus switch
ClareJonesBJSS Mar 10, 2025
512e643
CCM-8579: language
ClareJonesBJSS Mar 10, 2025
a2f3737
CCM-8579: LetterType
ClareJonesBJSS Mar 10, 2025
d1e33ba
CCM-8579: Virus scan status
ClareJonesBJSS Mar 10, 2025
d932849
CCM-8579: Tidy gen
ClareJonesBJSS Mar 10, 2025
ad34151
CCM-8579: Casing etc
ClareJonesBJSS Mar 10, 2025
08a9ded
CCM-8579: Typecheck fixes
ClareJonesBJSS Mar 10, 2025
1f88f93
CCM-8579: Stray log
ClareJonesBJSS Mar 10, 2025
caa3608
CCM-8579: Misc
ClareJonesBJSS Mar 10, 2025
9d4a431
CCM-8579: Alternate gen of union lists
ClareJonesBJSS Mar 10, 2025
96e8485
CCM-8585: squashed
alexnuttall Mar 10, 2025
daa2bc1
CCM-8585: disable coverage
alexnuttall Mar 10, 2025
44ae17e
CCM-8585: adding letter upload repo tests
alexnuttall Mar 11, 2025
31c119e
CCM-8585: adding letter upload repo tests
alexnuttall Mar 11, 2025
d5bfd27
CCM-8585: api unit tests
alexnuttall Mar 11, 2025
f793aab
CCM-8585: api client tests
alexnuttall Mar 11, 2025
f14792f
CCM-8585: tf docs
alexnuttall Mar 11, 2025
43a7ffc
CCM-8585: rm files from createTemplate
alexnuttall Mar 11, 2025
fd8c291
CCM-8585: rm files from createTemplate
alexnuttall Mar 11, 2025
eaa7cca
CCM-8585: make files optional on letter props
alexnuttall Mar 11, 2025
c9f736e
CCM-8585: make files optional on letter props - fix tests
alexnuttall Mar 11, 2025
509e908
CCM-8585: convert helper arg to buffer
alexnuttall Mar 11, 2025
f1cd658
CCM-8585: api tests
alexnuttall Mar 12, 2025
5d18063
CCM-8585: cleanup
alexnuttall Mar 12, 2025
2516346
CCM-8585: fix unit test
alexnuttall Mar 12, 2025
3824d1a
CCM-8585: cut sandbox branch id to 14 chars
alexnuttall Mar 12, 2025
22a3b80
CCM-8585: block letters creation on create endpoint
alexnuttall Mar 12, 2025
f18b124
CCM-8585: block letters creation on create endpoint
alexnuttall Mar 12, 2025
278d88e
CCM-8585: feature flag on createLetter endpoint
alexnuttall Mar 12, 2025
8744ae0
CCM-8585: unit test fixes
alexnuttall Mar 12, 2025
04123b9
CCM-8585: unit test fixes
alexnuttall Mar 12, 2025
6c7231d
CCM-8585: unit test fixes
alexnuttall Mar 13, 2025
3e37b42
CCM-8585: add missing env vars
alexnuttall Mar 13, 2025
e8768bf
CCM-8585: make update private method in template client
alexnuttall Mar 13, 2025
3c83a31
CCM-8585: typecheck fix
alexnuttall Mar 13, 2025
d14f34f
CCM-8585: fix api tests
alexnuttall Mar 13, 2025
c2f969a
CCM-8585: use shared kms
alexnuttall Mar 13, 2025
74211cf
CCM-8585: correct description
alexnuttall Mar 13, 2025
aee1a8a
CCM-8585: fix line endings
alexnuttall Mar 13, 2025
8529660
CCM-8585: tf docs
alexnuttall Mar 13, 2025
95628d5
CCM-9037: add internal s3 bucket
harrim91 Mar 13, 2025
3ee78e5
CCM-9037: tf docs
harrim91 Mar 13, 2025
8ba6cf2
CCM-9037: add missing reference
harrim91 Mar 13, 2025
68de1f0
CCM-9037: normalized branxch name fix
harrim91 Mar 13, 2025
d72a14d
Merge branch 'main' into feature/CCM-9037_internal-bucket
harrim91 Mar 13, 2025
4d55ee6
CCM-8585: make test util exhaustive
alexnuttall Mar 13, 2025
943643e
CCM-8585: create non-letter validators
alexnuttall Mar 14, 2025
253e347
Merge branch 'main' into feature/CCM-8585-upload-pdf-backend-squash
alexnuttall Mar 14, 2025
2aaa1d0
CCM-8585: lockfile
alexnuttall Mar 14, 2025
e83b5b8
CCM-8585: unit test
alexnuttall Mar 14, 2025
df1808b
CCM-8585: tf cleanup
alexnuttall Mar 14, 2025
239f4c6
CCM-8585: rm unused kms key opt
alexnuttall Mar 14, 2025
0347b77
CCM-9037: add acct sandbox kms key, quarantine s3 bucket
harrim91 Mar 14, 2025
a482bc2
CCM-9037: use shared key in sandboxes for dynamodb
harrim91 Mar 14, 2025
4691686
CCM-9037: update missed refs
harrim91 Mar 14, 2025
b27b4b9
CCM-9037: fix existing typo
harrim91 Mar 14, 2025
915e36f
CCM-9037: fix key alias ref
harrim91 Mar 14, 2025
d78f8bc
CCM-9037: tf docs
harrim91 Mar 14, 2025
29575f5
CCM-9037: trim branchname a little more
harrim91 Mar 14, 2025
b1bb98a
Merge branch 'feature/CCM-9037_internal-bucket' into feature/CCM-8585…
alexnuttall Mar 14, 2025
7c99ee6
CCM-9047: tf docs
alexnuttall Mar 14, 2025
f8f766f
CCM-9047: stray tf files
alexnuttall Mar 14, 2025
c005f97
CCM-9047: fix broken kms ref
alexnuttall Mar 14, 2025
7f09c26
CCM-9047: remove ref to dynamo key
alexnuttall Mar 14, 2025
b0d8fb5
CCM-8585: restore lifecycle rule
alexnuttall Mar 17, 2025
7b418e2
Merge branch 'feature/CCM-9037_internal-bucket' into feature/CCM-8585…
alexnuttall Mar 17, 2025
e1ded2a
CCM-8585: use post in curl commands
alexnuttall Mar 17, 2025
1b302d3
Merge branch 'main' into feature/CCM-8585-upload-pdf-backend-squash
alexnuttall Mar 18, 2025
53791d0
Merge branch 'main' into feature/CCM-8585-upload-pdf-backend-squash
alexnuttall Mar 19, 2025
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
10 changes: 8 additions & 2 deletions .github/actions/normalize-branch-name/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,17 @@ name: "Normalize branch name"
description: "Normalize branch name"
outputs:
normalized_branch_name:
description: 14 character branch identifier (0000-thebranch)
value: ${{ steps.normalize_branch_name.outputs.normalized_branch_name }}
runs:
using: "composite"
steps:
- id: normalize_branch_name
shell: bash
run: echo "normalized_branch_name=$(sed -e 's/[^a-zA-Z0-9-]//g' <<< $(git rev-parse --abbrev-ref HEAD) | tr '[:upper:]' '[:lower:]' | head -c 25)" >> $GITHUB_OUTPUT

run: |
branch=$(git rev-parse --abbrev-ref HEAD)
stripped=$(echo $branch | sed -e 's/[^a-zA-Z0-9-]//g' | tr '[:upper:]' '[:lower:]')
starting_from_jira_ref=$(echo $stripped | sed -n 's/.*\([0-9]\{4,\}.*\)/\1/p')
with_fallback=${starting_from_jira_ref:-$stripped}
chopped=$(echo $with_fallback | head -c 14)
echo "normalized_branch_name=$chopped" >> $GITHUB_OUTPUT
1 change: 1 addition & 0 deletions .tool-versions
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ terraform-docs 0.19.0
vale 3.6.0
tfsec 1.28.10
nodejs 20.18.2
jq 1.6

# ==============================================================================
# The section below is reserved for Docker image versions.
Expand Down
32 changes: 12 additions & 20 deletions frontend/src/__tests__/app/copy-template/page.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,10 @@
*/
import CopyTemplatePage from '@app/copy-template/[templateId]/page';
import { CopyTemplate } from '@forms/CopyTemplate/CopyTemplate';
import {
TemplateType,
TemplateStatus,
} from 'nhs-notify-web-template-management-utils';
import { redirect } from 'next/navigation';
import { getTemplate } from '@utils/form-actions';
import {
Language,
LetterType,
TemplateDTO,
VirusScanStatus,
} from 'nhs-notify-backend-client';
import { TemplateDto } from 'nhs-notify-backend-client';
import { LetterTemplate } from 'nhs-notify-web-template-management-utils';

jest.mock('@utils/form-actions');
jest.mock('next/navigation');
Expand All @@ -28,34 +20,34 @@ describe('CopyTemplatePage', () => {

const template = {
id: 'template-id',
templateType: TemplateType.EMAIL,
templateStatus: TemplateStatus.NOT_YET_SUBMITTED,
templateType: 'EMAIL',
templateStatus: 'NOT_YET_SUBMITTED',
name: 'template-name',
subject: 'template-subject-line',
message: 'template-message',
createdAt: '2025-01-13T10:19:25.579Z',
updatedAt: '2025-01-13T10:19:25.579Z',
} satisfies TemplateDTO;
} satisfies TemplateDto;

const letterTemplate: TemplateDTO = {
const letterTemplate: LetterTemplate = {
id: 'template-id',
templateType: TemplateType.LETTER,
templateStatus: TemplateStatus.NOT_YET_SUBMITTED,
templateType: 'LETTER',
templateStatus: 'NOT_YET_SUBMITTED',
name: 'template-name',
createdAt: '2025-01-13T10:19:25.579Z',
updatedAt: '2025-01-13T10:19:25.579Z',
letterType: LetterType.Q4,
language: Language.FR,
letterType: 'q4',
language: 'fr',
files: {
pdfTemplate: {
fileName: 'file.pdf',
currentVersion: '61C1267A-0F37-4E1D-831E-494DE2BECC8C',
virusScanStatus: VirusScanStatus.PASSED,
virusScanStatus: 'PASSED',
},
testDataCsv: {
fileName: 'file.csv',
currentVersion: 'A8A76934-70F4-4735-8314-51CE097130DB',
virusScanStatus: VirusScanStatus.PASSED,
virusScanStatus: 'PASSED',
},
},
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ exports[`CreateEmailTemplatePage should render CreateEmailTemplatePage 1`] = `
"message": "",
"name": "",
"subject": "",
"templateStatus": "NOT_YET_SUBMITTED",
"templateType": "EMAIL",
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,17 @@
*/
import CreateLetterTemplatePage from '@app/create-letter-template/page';

const OLD_ENV = { ...process.env };

describe('CreateLetterTemplatePage', () => {
beforeEach(jest.resetAllMocks);
beforeEach(() => {
jest.resetAllMocks();
process.env.NEXT_PUBLIC_ENABLE_LETTERS = 'true';
});

afterAll(() => {
process.env = OLD_ENV;
});

it('should render CreateLetterTemplatePage', async () => {
const page = await CreateLetterTemplatePage();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ exports[`CreateNHSAppTemplatePage should render CreateNHSAppTemplatePage 1`] = `
{
"message": "",
"name": "",
"templateStatus": "NOT_YET_SUBMITTED",
"templateType": "NHS_APP",
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ exports[`CreateSMSTemplatePage should render CreateSMSTemplatePage 1`] = `
{
"message": "",
"name": "",
"templateStatus": "NOT_YET_SUBMITTED",
"templateType": "SMS",
}
}
Expand Down
27 changes: 11 additions & 16 deletions frontend/src/__tests__/app/delete-template/page.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,9 @@
*/
import DeleteTemplatePage from '@app/delete-template/[templateId]/page';
import { DeleteTemplate } from '@forms/DeleteTemplate/DeleteTemplate';
import {
EmailTemplate,
TemplateType,
TemplateStatus,
} from 'nhs-notify-web-template-management-utils';
import { redirect } from 'next/navigation';
import { getTemplate } from '@utils/form-actions';
import { TemplateDTO } from 'nhs-notify-backend-client';
import { TemplateDto } from 'nhs-notify-backend-client';

jest.mock('@utils/form-actions');
jest.mock('next/navigation');
Expand All @@ -25,20 +20,20 @@ describe('PreviewEmailTemplatePage', () => {
it('should load page', async () => {
const templateDTO = {
id: 'template-id',
templateType: TemplateType.EMAIL,
templateStatus: TemplateStatus.NOT_YET_SUBMITTED,
templateType: 'EMAIL',
templateStatus: 'NOT_YET_SUBMITTED',
name: 'template-name',
subject: 'template-subject-line',
message: 'template-message',
createdAt: '2025-01-13T10:19:25.579Z',
updatedAt: '2025-01-13T10:19:25.579Z',
} satisfies TemplateDTO;
} satisfies TemplateDto;

const emailTemplate: EmailTemplate = {
const emailTemplate: TemplateDto = {
...templateDTO,
subject: 'template-subject-line',
templateType: TemplateType.EMAIL,
templateStatus: TemplateStatus.NOT_YET_SUBMITTED,
templateType: 'EMAIL',
templateStatus: 'NOT_YET_SUBMITTED',
};

getTemplateMock.mockResolvedValueOnce(templateDTO);
Expand All @@ -65,8 +60,8 @@ describe('PreviewEmailTemplatePage', () => {
test('should redirect to invalid-template when template is already submitted', async () => {
getTemplateMock.mockResolvedValueOnce({
id: 'template-id',
templateStatus: TemplateStatus.SUBMITTED,
templateType: TemplateType.NHS_APP,
templateStatus: 'SUBMITTED',
templateType: 'NHS_APP',
name: 'template-name',
message: 'template-message',
createdAt: 'today',
Expand All @@ -85,8 +80,8 @@ describe('PreviewEmailTemplatePage', () => {
test('should redirect to manage-templates when template is already deleted', async () => {
getTemplateMock.mockResolvedValueOnce({
id: 'template-id',
templateStatus: TemplateStatus.DELETED,
templateType: TemplateType.NHS_APP,
templateStatus: 'DELETED',
templateType: 'NHS_APP',
name: 'template-name',
message: 'template-message',
createdAt: 'today',
Expand Down
27 changes: 11 additions & 16 deletions frontend/src/__tests__/app/edit-email-template/page.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,9 @@
*/
import EditEmailTemplatePage from '@app/edit-email-template/[templateId]/page';
import { getTemplate } from '@utils/form-actions';
import {
EmailTemplate,
TemplateStatus,
TemplateType,
} from 'nhs-notify-web-template-management-utils';
import { redirect } from 'next/navigation';
import { EmailTemplateForm } from '@forms/EmailTemplateForm/EmailTemplateForm';
import { TemplateDTO } from 'nhs-notify-backend-client';
import { EmailTemplate } from 'nhs-notify-web-template-management-utils';

jest.mock('@utils/form-actions');
jest.mock('next/navigation');
Expand All @@ -19,16 +14,16 @@ jest.mock('@forms/EmailTemplateForm/EmailTemplateForm');
const getTemplateMock = jest.mocked(getTemplate);
const redirectMock = jest.mocked(redirect);

const templateDTO = {
const template: EmailTemplate = {
id: 'template-id',
templateType: TemplateType.EMAIL,
templateStatus: TemplateStatus.NOT_YET_SUBMITTED,
templateType: 'EMAIL',
templateStatus: 'NOT_YET_SUBMITTED',
name: 'name',
subject: 'subject',
message: 'message',
createdAt: '2025-01-13T10:19:25.579Z',
updatedAt: '2025-01-13T10:19:25.579Z',
} satisfies TemplateDTO;
};

describe('EditEmailTemplatePage', () => {
beforeEach(jest.resetAllMocks);
Expand All @@ -49,8 +44,8 @@ describe('EditEmailTemplatePage', () => {

it('should redirect to invalid-template when template type is not EMAIL', async () => {
getTemplateMock.mockResolvedValueOnce({
...templateDTO,
templateType: TemplateType.NHS_APP,
...template,
templateType: 'NHS_APP',
});

await EditEmailTemplatePage({
Expand All @@ -65,13 +60,13 @@ describe('EditEmailTemplatePage', () => {
});

it('should render CreateEmailTemplatePage component when template is found', async () => {
getTemplateMock.mockResolvedValueOnce(templateDTO);
getTemplateMock.mockResolvedValueOnce(template);

const emailTemplate: EmailTemplate = {
...templateDTO,
...template,
subject: 'subject',
templateType: TemplateType.EMAIL,
templateStatus: TemplateStatus.NOT_YET_SUBMITTED,
templateType: 'EMAIL' as const,
templateStatus: 'NOT_YET_SUBMITTED',
};

const page = await EditEmailTemplatePage({
Expand Down
46 changes: 15 additions & 31 deletions frontend/src/__tests__/app/edit-nhs-app-template/page.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,12 @@
* @jest-environment node
*/
import { redirect } from 'next/navigation';
import {
TemplateType,
TemplateStatus,
NHSAppTemplate,
} from 'nhs-notify-web-template-management-utils';
import { NHSAppTemplate } from 'nhs-notify-web-template-management-utils';
import { getTemplate } from '@utils/form-actions';
import { NhsAppTemplateForm } from '@forms/NhsAppTemplateForm/NhsAppTemplateForm';
import EditNhsAppTemplatePage from '@app/edit-nhs-app-template/[templateId]/page';
import { TemplateDTO } from 'nhs-notify-backend-client';
import { TemplateDto } from 'nhs-notify-backend-client';
import { EMAIL_TEMPLATE, LETTER_TEMPLATE, SMS_TEMPLATE } from '../../helpers';

jest.mock('@forms/NhsAppTemplateForm/NhsAppTemplateForm');
jest.mock('@utils/form-actions');
Expand All @@ -23,23 +20,23 @@ describe('EditNhsAppTemplatePage', () => {
beforeEach(jest.resetAllMocks);

test('page loads', async () => {
const templateDTO = {
const template = {
id: 'template-id',
templateType: TemplateType.NHS_APP,
templateStatus: TemplateStatus.NOT_YET_SUBMITTED,
templateType: 'NHS_APP',
templateStatus: 'NOT_YET_SUBMITTED',
name: 'name',
message: 'message',
createdAt: '2025-01-13T10:19:25.579Z',
updatedAt: '2025-01-13T10:19:25.579Z',
} satisfies TemplateDTO;
} satisfies TemplateDto;

const nhsAppTemplate: NHSAppTemplate = {
...templateDTO,
templateType: TemplateType.NHS_APP,
templateStatus: TemplateStatus.NOT_YET_SUBMITTED,
...template,
templateType: 'NHS_APP',
templateStatus: 'NOT_YET_SUBMITTED',
};

getTemplateMock.mockResolvedValueOnce(templateDTO);
getTemplateMock.mockResolvedValueOnce(template);

const page = await EditNhsAppTemplatePage({
params: Promise.resolve({
Expand All @@ -62,23 +59,10 @@ describe('EditNhsAppTemplatePage', () => {
expect(redirectMock).toHaveBeenCalledWith('/invalid-template', 'replace');
});

const invalidTemplateTypes: TemplateType[] = [
TemplateType.EMAIL,
TemplateType.SMS,
];

test.each(invalidTemplateTypes)(
'should render invalid template, when template type is %p',
async (templateType) => {
getTemplateMock.mockResolvedValueOnce({
id: 'template-id',
templateType,
templateStatus: TemplateStatus.NOT_YET_SUBMITTED,
name: 'name',
message: 'message',
createdAt: 'today',
updatedAt: 'today',
});
test.each([EMAIL_TEMPLATE, SMS_TEMPLATE, LETTER_TEMPLATE])(
'should render invalid template, when template type is $templateType',
async (template) => {
getTemplateMock.mockResolvedValueOnce(template);

await EditNhsAppTemplatePage({
params: Promise.resolve({
Expand Down
Loading
Loading