Skip to content

Commit 79599de

Browse files
CCM-14323: Store failure reason and code (#207)
* CCM-14323: Added failure code and reason --------- Co-authored-by: Gareth Allan <157592212+gareth-allan@users.noreply.github.com>
1 parent c0fb69a commit 79599de

3 files changed

Lines changed: 124 additions & 1 deletion

File tree

lambdas/print-status-handler/src/__tests__/apis/sqs-handler.test.ts

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@ import { mock } from 'jest-mock-extended';
22
import { randomUUID } from 'node:crypto';
33
import { createHandler } from 'apis/sqs-handler';
44
import { EventPublisher, Logger } from 'utils';
5-
import { acceptedLetterEvent, recordEvent } from '__tests__/test-data';
5+
import {
6+
acceptedLetterEvent,
7+
failedLetterEvent,
8+
recordEvent,
9+
} from '__tests__/test-data';
610

711
const logger = mock<Logger>();
812
const eventPublisher = mock<EventPublisher>();
@@ -63,6 +67,85 @@ describe('SQS Handler', () => {
6367
);
6468
expect(response).toEqual({ batchItemFailures: [] });
6569
});
70+
71+
it('should include reasonCode and reasonText when provided in letter.FAILED event', async () => {
72+
const response = await handler(recordEvent([failedLetterEvent]));
73+
74+
expect(eventPublisher.sendEvents).toHaveBeenCalledWith(
75+
[
76+
{
77+
...failedLetterEvent,
78+
id: '550e8400-e29b-41d4-a716-446655440001',
79+
time: '2023-06-20T12:00:00.250Z',
80+
recordedtime: '2023-06-20T12:00:00.250Z',
81+
dataschema:
82+
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-print-letter-transitioned-data.schema.json',
83+
type: 'uk.nhs.notify.digital.letters.print.letter.transitioned.v1',
84+
source:
85+
'/nhs/england/notify/production/primary/data-plane/digitalletters/print',
86+
data: {
87+
senderId: failedLetterEvent.data.origin.subject.split('/')[1],
88+
messageReference:
89+
failedLetterEvent.data.origin.subject.split('/')[3],
90+
specificationId: failedLetterEvent.data.specificationId,
91+
status: failedLetterEvent.data.status,
92+
supplierId: failedLetterEvent.data.supplierId,
93+
time: failedLetterEvent.time,
94+
reasonCode: 'FAILURE001',
95+
reasonText: 'Letter has too many pages',
96+
},
97+
},
98+
],
99+
expect.any(Function),
100+
);
101+
expect(logger.info).toHaveBeenCalledWith(
102+
'Received SQS Event of 1 record(s)',
103+
);
104+
expect(logger.info).toHaveBeenCalledWith(
105+
'1 of 1 records processed successfully',
106+
);
107+
expect(response).toEqual({ batchItemFailures: [] });
108+
});
109+
110+
it('should not include reasonCode when only reasonText is provided', async () => {
111+
const eventWithReasonTextOnly = {
112+
...failedLetterEvent,
113+
data: {
114+
...failedLetterEvent.data,
115+
reasonCode: undefined,
116+
reasonText: 'Letter has too many pages',
117+
},
118+
};
119+
120+
const response = await handler(recordEvent([eventWithReasonTextOnly]));
121+
122+
const publishedEvent = (eventPublisher.sendEvents as jest.Mock).mock
123+
.calls[0][0][0];
124+
125+
expect(publishedEvent.data).not.toHaveProperty('reasonCode');
126+
expect(publishedEvent.data.reasonText).toBe('Letter has too many pages');
127+
expect(response).toEqual({ batchItemFailures: [] });
128+
});
129+
130+
it('should not include reasonText when only reasonCode is provided', async () => {
131+
const eventWithReasonCodeOnly = {
132+
...failedLetterEvent,
133+
data: {
134+
...failedLetterEvent.data,
135+
reasonCode: 'FAILURE001',
136+
reasonText: undefined,
137+
},
138+
};
139+
140+
const response = await handler(recordEvent([eventWithReasonCodeOnly]));
141+
142+
const publishedEvent = (eventPublisher.sendEvents as jest.Mock).mock
143+
.calls[0][0][0];
144+
145+
expect(publishedEvent.data.reasonCode).toBe('FAILURE001');
146+
expect(publishedEvent.data).not.toHaveProperty('reasonText');
147+
expect(response).toEqual({ batchItemFailures: [] });
148+
});
66149
});
67150

68151
describe('errors', () => {

lambdas/print-status-handler/src/__tests__/test-data.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,42 @@ export const acceptedLetterEvent = {
3535
},
3636
} as LetterEvent;
3737

38+
export const failedLetterEvent = {
39+
id: '550e8400-e29b-41d4-a716-446655440002',
40+
specversion: '1.0',
41+
source: '/data-plane/supplier-api/prod/update-status',
42+
subject:
43+
'letter-origin/digital-letters/letter/f47ac10b-58cc-4372-a567-0e02b2c3d480',
44+
type: 'uk.nhs.notify.supplier-api.letter.FAILED.v1',
45+
dataschema:
46+
'https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.FAILED.1.0.0.schema.json',
47+
dataschemaversion: '1.0.0',
48+
time: '2023-06-20T13:00:00Z',
49+
recordedtime: '2023-06-20T13:00:00.250Z',
50+
severitynumber: 3,
51+
traceparent: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203332-01',
52+
datacontenttype: 'application/json',
53+
severitytext: 'WARN',
54+
plane: 'data',
55+
data: {
56+
domainId: 'f47ac10b-58cc-4372-a567-0e02b2c3d480',
57+
groupId: 'client_template',
58+
origin: {
59+
domain: 'letter-rendering',
60+
event: 'f47ac10b-58cc-4372-a567-0e02b2c3d480',
61+
source: '/data-plane/letter-rendering/prod/render-pdf',
62+
subject:
63+
'client/00f3b388-bbe9-41c9-9e76-052d37ee8988/digital-letters/c8d1d8g9-9305-511e-9459-8f8eeg886ebf',
64+
},
65+
specificationId: '1y3q9v1zzzz',
66+
supplierId: 'supplier-1',
67+
status: 'FAILED',
68+
billingRef: '1y3q9v1zzzz',
69+
reasonCode: 'FAILURE001',
70+
reasonText: 'Letter has too many pages',
71+
},
72+
} as LetterEvent;
73+
3874
const busEvent = {
3975
version: '0',
4076
id: 'ab07d406-0797-e919-ff9b-3ad9c5498114',

lambdas/print-status-handler/src/apis/sqs-handler.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ function generateUpdatedEvent(event: LetterEvent): PrintLetterTransitioned {
8383
const {
8484
data: {
8585
origin: { subject },
86+
reasonCode,
87+
reasonText,
8688
specificationId,
8789
status,
8890
supplierId,
@@ -111,6 +113,8 @@ function generateUpdatedEvent(event: LetterEvent): PrintLetterTransitioned {
111113
status,
112114
supplierId,
113115
time,
116+
...(reasonCode && { reasonCode }),
117+
...(reasonText && { reasonText }),
114118
},
115119
};
116120
}

0 commit comments

Comments
 (0)