Skip to content

Commit 2cceeb6

Browse files
ClareJonesBJSSchris-elliott-nhsdalexnuttall
authored
CCM-15042: letter render error handling (#901)
Co-authored-by: Chris Elliott <chris.elliott17@nhs.net> Co-authored-by: Alex Nuttall <alex.nuttall1@nhs.net>
1 parent 9f5dcd4 commit 2cceeb6

50 files changed

Lines changed: 2100 additions & 358 deletions

File tree

Some content is hidden

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

frontend/src/__tests__/app/edit-template-name/[templateId]/__snapshots__/page.test.tsx.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ exports[`valid template renders errors when blank form is submitted and error st
266266
Enter a template name
267267
</span>
268268
<input
269-
class="nhsuk-input nhsuk-u-margin-bottom-2"
269+
class="nhsuk-input nhsuk-input--error nhsuk-u-margin-bottom-2"
270270
id="name"
271271
name="name"
272272
type="text"

frontend/src/__tests__/app/preview-approved-letter-template/__snapshots__/page.test.tsx.snap

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@ exports[`valid authoring letter template matches snapshot 1`] = `
272272
class="nhsuk-tabs__panel"
273273
id="tab-short"
274274
role="tabpanel"
275+
tabindex="-1"
275276
>
276277
<div
277278
class="nhsuk-grid-row tabRow"
@@ -314,6 +315,7 @@ exports[`valid authoring letter template matches snapshot 1`] = `
314315
class="nhsuk-tabs__panel nhsuk-tabs__panel--hidden"
315316
id="tab-long"
316317
role="tabpanel"
318+
tabindex="-1"
317319
>
318320
<div
319321
class="nhsuk-grid-row tabRow"

frontend/src/__tests__/app/preview-letter-template/__snapshots__/page.test.tsx.snap

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5060,6 +5060,7 @@ exports[`valid authoring letter template displays the template saved banner when
50605060
class="nhsuk-tabs__panel"
50615061
id="tab-short"
50625062
role="tabpanel"
5063+
tabindex="-1"
50635064
>
50645065
<div
50655066
class="nhsuk-grid-row tabRow"
@@ -5209,6 +5210,7 @@ exports[`valid authoring letter template displays the template saved banner when
52095210
class="nhsuk-tabs__panel nhsuk-tabs__panel--hidden"
52105211
id="tab-long"
52115212
role="tabpanel"
5213+
tabindex="-1"
52125214
>
52135215
<div
52145216
class="nhsuk-grid-row tabRow"
@@ -5383,6 +5385,16 @@ exports[`valid authoring letter template displays the template saved banner when
53835385
type="hidden"
53845386
value="1"
53855387
/>
5388+
<input
5389+
name="shortFormRenderStatus"
5390+
type="hidden"
5391+
value=""
5392+
/>
5393+
<input
5394+
name="longFormRenderStatus"
5395+
type="hidden"
5396+
value=""
5397+
/>
53865398
<button
53875399
aria-disabled="false"
53885400
class="nhsuk-button"
@@ -5727,6 +5739,7 @@ exports[`valid authoring letter template matches snapshot 1`] = `
57275739
class="nhsuk-tabs__panel"
57285740
id="tab-short"
57295741
role="tabpanel"
5742+
tabindex="-1"
57305743
>
57315744
<div
57325745
class="nhsuk-grid-row tabRow"
@@ -5876,6 +5889,7 @@ exports[`valid authoring letter template matches snapshot 1`] = `
58765889
class="nhsuk-tabs__panel nhsuk-tabs__panel--hidden"
58775890
id="tab-long"
58785891
role="tabpanel"
5892+
tabindex="-1"
58795893
>
58805894
<div
58815895
class="nhsuk-grid-row tabRow"
@@ -6050,6 +6064,16 @@ exports[`valid authoring letter template matches snapshot 1`] = `
60506064
type="hidden"
60516065
value="1"
60526066
/>
6067+
<input
6068+
name="shortFormRenderStatus"
6069+
type="hidden"
6070+
value=""
6071+
/>
6072+
<input
6073+
name="longFormRenderStatus"
6074+
type="hidden"
6075+
value=""
6076+
/>
60536077
<button
60546078
aria-disabled="false"
60556079
class="nhsuk-button"

frontend/src/__tests__/app/preview-letter-template/server-action.test.ts

Lines changed: 90 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,31 @@
33
*/
44
import { submitAuthoringLetterAction } from '@app/preview-letter-template/[templateId]/server-action';
55
import { redirect } from 'next/navigation';
6+
import { AUTHORING_LETTER_TEMPLATE } from '@testhelpers/helpers';
7+
import content from '@content/content';
68

79
jest.mock('next/navigation');
810

911
const redirectMock = jest.mocked(redirect);
1012

13+
const { approveErrors } = content.pages.previewLetterTemplate;
14+
1115
describe('submitAuthoringLetterAction', () => {
1216
beforeEach(() => {
1317
jest.resetAllMocks();
1418
});
1519

1620
it('should redirect to get-ready-to-approve-letter-template page with valid form data', async () => {
1721
const formData = new FormData();
18-
formData.append('templateId', 'template-123');
22+
formData.append('templateId', AUTHORING_LETTER_TEMPLATE.id);
1923
formData.append('lockNumber', '1');
24+
formData.append('shortFormRenderStatus', 'RENDERED');
25+
formData.append('longFormRenderStatus', 'RENDERED');
2026

2127
await submitAuthoringLetterAction({}, formData);
2228

2329
expect(redirectMock).toHaveBeenCalledWith(
24-
'/get-ready-to-approve-letter-template/template-123?lockNumber=1'
30+
`/get-ready-to-approve-letter-template/${AUTHORING_LETTER_TEMPLATE.id}?lockNumber=1`
2531
);
2632
});
2733

@@ -37,7 +43,7 @@ describe('submitAuthoringLetterAction', () => {
3743

3844
it('should return error state when lockNumber is missing', async () => {
3945
const formData = new FormData();
40-
formData.append('templateId', 'template-123');
46+
formData.append('templateId', AUTHORING_LETTER_TEMPLATE.id);
4147

4248
const result = await submitAuthoringLetterAction({}, formData);
4349

@@ -47,7 +53,7 @@ describe('submitAuthoringLetterAction', () => {
4753

4854
it('should return error state when lockNumber is invalid', async () => {
4955
const formData = new FormData();
50-
formData.append('templateId', 'template-123');
56+
formData.append('templateId', AUTHORING_LETTER_TEMPLATE.id);
5157
formData.append('lockNumber', 'not-a-number');
5258

5359
const result = await submitAuthoringLetterAction({}, formData);
@@ -66,4 +72,84 @@ describe('submitAuthoringLetterAction', () => {
6672
expect(result).toHaveProperty('errorState');
6773
expect(redirectMock).not.toHaveBeenCalled();
6874
});
75+
76+
it('should return error when short example has not been generated', async () => {
77+
const formData = new FormData();
78+
formData.append('templateId', AUTHORING_LETTER_TEMPLATE.id);
79+
formData.append('lockNumber', '1');
80+
formData.append('shortFormRenderStatus', '');
81+
formData.append('longFormRenderStatus', 'RENDERED');
82+
83+
const result = await submitAuthoringLetterAction({}, formData);
84+
85+
expect(result.errorState?.fieldErrors?.['tab-short']).toContain(
86+
approveErrors.shortExampleRequired
87+
);
88+
expect(result.errorState?.fieldErrors?.['tab-long']).toBeUndefined();
89+
expect(redirectMock).not.toHaveBeenCalled();
90+
});
91+
92+
it('should return error when long example has not been generated', async () => {
93+
const formData = new FormData();
94+
formData.append('templateId', AUTHORING_LETTER_TEMPLATE.id);
95+
formData.append('lockNumber', '1');
96+
formData.append('shortFormRenderStatus', 'RENDERED');
97+
formData.append('longFormRenderStatus', '');
98+
99+
const result = await submitAuthoringLetterAction({}, formData);
100+
101+
expect(result.errorState?.fieldErrors?.['tab-long']).toContain(
102+
approveErrors.longExampleRequired
103+
);
104+
expect(result.errorState?.fieldErrors?.['tab-short']).toBeUndefined();
105+
expect(redirectMock).not.toHaveBeenCalled();
106+
});
107+
108+
it('should return errors for both missing examples', async () => {
109+
const formData = new FormData();
110+
formData.append('templateId', AUTHORING_LETTER_TEMPLATE.id);
111+
formData.append('lockNumber', '1');
112+
formData.append('shortFormRenderStatus', '');
113+
formData.append('longFormRenderStatus', '');
114+
115+
const result = await submitAuthoringLetterAction({}, formData);
116+
117+
expect(result.errorState?.fieldErrors?.['tab-short']).toContain(
118+
approveErrors.shortExampleRequired
119+
);
120+
expect(result.errorState?.fieldErrors?.['tab-long']).toContain(
121+
approveErrors.longExampleRequired
122+
);
123+
expect(redirectMock).not.toHaveBeenCalled();
124+
});
125+
126+
it('should return error when short render exists but is not RENDERED status', async () => {
127+
const formData = new FormData();
128+
formData.append('templateId', AUTHORING_LETTER_TEMPLATE.id);
129+
formData.append('lockNumber', '1');
130+
formData.append('shortFormRenderStatus', 'FAILED');
131+
formData.append('longFormRenderStatus', 'RENDERED');
132+
133+
const result = await submitAuthoringLetterAction({}, formData);
134+
135+
expect(result.errorState?.fieldErrors?.['tab-short']).toContain(
136+
approveErrors.shortExampleRequired
137+
);
138+
expect(redirectMock).not.toHaveBeenCalled();
139+
});
140+
141+
it('should return error when long render exists but is not RENDERED status', async () => {
142+
const formData = new FormData();
143+
formData.append('templateId', AUTHORING_LETTER_TEMPLATE.id);
144+
formData.append('lockNumber', '1');
145+
formData.append('shortFormRenderStatus', 'RENDERED');
146+
formData.append('longFormRenderStatus', 'FAILED');
147+
148+
const result = await submitAuthoringLetterAction({}, formData);
149+
150+
expect(result.errorState?.fieldErrors?.['tab-long']).toContain(
151+
approveErrors.longExampleRequired
152+
);
153+
expect(redirectMock).not.toHaveBeenCalled();
154+
});
69155
});

frontend/src/__tests__/app/upload-british-sign-language-letter-template/__snapshots__/page.test.tsx.snap

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ exports[`client has multiple campaign ids renders errors when blank form is subm
391391
Enter a template name
392392
</span>
393393
<input
394-
class="nhsuk-input nhsuk-u-margin-bottom-2"
394+
class="nhsuk-input nhsuk-input--error nhsuk-u-margin-bottom-2"
395395
id="name"
396396
name="name"
397397
type="text"
@@ -467,7 +467,7 @@ exports[`client has multiple campaign ids renders errors when blank form is subm
467467
</span>
468468
<input
469469
accept="application/vnd.openxmlformats-officedocument.wordprocessingml.document"
470-
class="file-upload nhsuk-input"
470+
class="file-upload nhsuk-input nhsuk-input--error"
471471
id="file"
472472
name="file"
473473
type="file"
@@ -925,7 +925,7 @@ exports[`client has one campaign id renders errors when blank form is submitted
925925
Enter a template name
926926
</span>
927927
<input
928-
class="nhsuk-input nhsuk-u-margin-bottom-2"
928+
class="nhsuk-input nhsuk-input--error nhsuk-u-margin-bottom-2"
929929
id="name"
930930
name="name"
931931
type="text"
@@ -985,7 +985,7 @@ exports[`client has one campaign id renders errors when blank form is submitted
985985
</span>
986986
<input
987987
accept="application/vnd.openxmlformats-officedocument.wordprocessingml.document"
988-
class="file-upload nhsuk-input"
988+
class="file-upload nhsuk-input nhsuk-input--error"
989989
id="file"
990990
name="file"
991991
type="file"

frontend/src/__tests__/app/upload-large-print-letter-template/__snapshots__/page.test.tsx.snap

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ exports[`client has multiple campaign ids renders errors when blank form is subm
391391
Enter a template name
392392
</span>
393393
<input
394-
class="nhsuk-input nhsuk-u-margin-bottom-2"
394+
class="nhsuk-input nhsuk-input--error nhsuk-u-margin-bottom-2"
395395
id="name"
396396
name="name"
397397
type="text"
@@ -467,7 +467,7 @@ exports[`client has multiple campaign ids renders errors when blank form is subm
467467
</span>
468468
<input
469469
accept="application/vnd.openxmlformats-officedocument.wordprocessingml.document"
470-
class="file-upload nhsuk-input"
470+
class="file-upload nhsuk-input nhsuk-input--error"
471471
id="file"
472472
name="file"
473473
type="file"
@@ -925,7 +925,7 @@ exports[`client has one campaign id renders errors when blank form is submitted
925925
Enter a template name
926926
</span>
927927
<input
928-
class="nhsuk-input nhsuk-u-margin-bottom-2"
928+
class="nhsuk-input nhsuk-input--error nhsuk-u-margin-bottom-2"
929929
id="name"
930930
name="name"
931931
type="text"
@@ -985,7 +985,7 @@ exports[`client has one campaign id renders errors when blank form is submitted
985985
</span>
986986
<input
987987
accept="application/vnd.openxmlformats-officedocument.wordprocessingml.document"
988-
class="file-upload nhsuk-input"
988+
class="file-upload nhsuk-input nhsuk-input--error"
989989
id="file"
990990
name="file"
991991
type="file"

frontend/src/__tests__/app/upload-letter-template/__snapshots__/page.test.tsx.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
exports[`UploadLetterTemplatePage should render UploadLetterTemplatePage when one campaignId is available 1`] = `
44
<NHSNotifyContainer>
5-
<LetterTemplateForm
5+
<PdfLetterTemplateForm
66
campaignIds={
77
[
88
"campaign-id",
@@ -24,7 +24,7 @@ exports[`UploadLetterTemplatePage should render UploadLetterTemplatePage when on
2424

2525
exports[`UploadLetterTemplatePage should render UploadLetterTemplatePage with multiple campaignIds available 1`] = `
2626
<NHSNotifyContainer>
27-
<LetterTemplateForm
27+
<PdfLetterTemplateForm
2828
campaignIds={
2929
[
3030
"campaign-id",

frontend/src/__tests__/app/upload-other-language-letter-template/__snapshots__/page.test.tsx.snap

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,7 @@ exports[`client has multiple campaign ids renders errors when blank form is subm
562562
Enter a template name
563563
</span>
564564
<input
565-
class="nhsuk-input nhsuk-u-margin-bottom-2"
565+
class="nhsuk-input nhsuk-input--error nhsuk-u-margin-bottom-2"
566566
id="name"
567567
name="name"
568568
type="text"
@@ -812,7 +812,7 @@ exports[`client has multiple campaign ids renders errors when blank form is subm
812812
</span>
813813
<input
814814
accept="application/vnd.openxmlformats-officedocument.wordprocessingml.document"
815-
class="file-upload nhsuk-input"
815+
class="file-upload nhsuk-input nhsuk-input--error"
816816
id="file"
817817
name="file"
818818
type="file"
@@ -1441,7 +1441,7 @@ exports[`client has one campaign id renders errors when blank form is submitted
14411441
Enter a template name
14421442
</span>
14431443
<input
1444-
class="nhsuk-input nhsuk-u-margin-bottom-2"
1444+
class="nhsuk-input nhsuk-input--error nhsuk-u-margin-bottom-2"
14451445
id="name"
14461446
name="name"
14471447
type="text"
@@ -1675,7 +1675,7 @@ exports[`client has one campaign id renders errors when blank form is submitted
16751675
</span>
16761676
<input
16771677
accept="application/vnd.openxmlformats-officedocument.wordprocessingml.document"
1678-
class="file-upload nhsuk-input"
1678+
class="file-upload nhsuk-input nhsuk-input--error"
16791679
id="file"
16801680
name="file"
16811681
type="file"

frontend/src/__tests__/app/upload-standard-english-letter-template/__snapshots__/page.test.tsx.snap

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ exports[`client has multiple campaign ids renders errors when blank form is subm
391391
Enter a template name
392392
</span>
393393
<input
394-
class="nhsuk-input nhsuk-u-margin-bottom-2"
394+
class="nhsuk-input nhsuk-input--error nhsuk-u-margin-bottom-2"
395395
id="name"
396396
name="name"
397397
type="text"
@@ -467,7 +467,7 @@ exports[`client has multiple campaign ids renders errors when blank form is subm
467467
</span>
468468
<input
469469
accept="application/vnd.openxmlformats-officedocument.wordprocessingml.document"
470-
class="file-upload nhsuk-input"
470+
class="file-upload nhsuk-input nhsuk-input--error"
471471
id="file"
472472
name="file"
473473
type="file"
@@ -925,7 +925,7 @@ exports[`client has one campaign id renders errors when blank form is submitted
925925
Enter a template name
926926
</span>
927927
<input
928-
class="nhsuk-input nhsuk-u-margin-bottom-2"
928+
class="nhsuk-input nhsuk-input--error nhsuk-u-margin-bottom-2"
929929
id="name"
930930
name="name"
931931
type="text"
@@ -985,7 +985,7 @@ exports[`client has one campaign id renders errors when blank form is submitted
985985
</span>
986986
<input
987987
accept="application/vnd.openxmlformats-officedocument.wordprocessingml.document"
988-
class="file-upload nhsuk-input"
988+
class="file-upload nhsuk-input nhsuk-input--error"
989989
id="file"
990990
name="file"
991991
type="file"

0 commit comments

Comments
 (0)