Skip to content

Commit 44ee10c

Browse files
committed
CCM-12614: add component test and some clean up
1 parent 55410d9 commit 44ee10c

File tree

6 files changed

+104
-22
lines changed

6 files changed

+104
-22
lines changed

lambdas/pdm-poll-lambda/src/__tests__/apis/sqs-handler.test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,14 @@ describe('SQS Handler', () => {
4747
id: '550e8400-e29b-41d4-a716-446655440001',
4848
time: '2023-06-20T12:00:00.250Z',
4949
recordedtime: '2023-06-20T12:00:00.250Z',
50+
dataschema:
51+
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-pdm-resource-available-data.schema.json',
5052
type: 'uk.nhs.notify.digital.letters.pdm.resource.available.v1',
53+
data: {
54+
...pdmResourceSubmittedEvent.data,
55+
nhsNumber: '9999999999',
56+
odsCode: 'AB1234',
57+
},
5158
},
5259
],
5360
expect.any(Function),
@@ -73,6 +80,8 @@ describe('SQS Handler', () => {
7380
id: '550e8400-e29b-41d4-a716-446655440001',
7481
time: '2023-06-20T12:00:00.250Z',
7582
recordedtime: '2023-06-20T12:00:00.250Z',
83+
dataschema:
84+
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-pdm-resource-unavailable-data.schema.json',
7685
type: 'uk.nhs.notify.digital.letters.pdm.resource.unavailable.v1',
7786
data: {
7887
...pdmResourceSubmittedEvent.data,
@@ -107,7 +116,14 @@ describe('SQS Handler', () => {
107116
id: '550e8400-e29b-41d4-a716-446655440001',
108117
time: '2023-06-20T12:00:00.250Z',
109118
recordedtime: '2023-06-20T12:00:00.250Z',
119+
dataschema:
120+
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-pdm-resource-available-data.schema.json',
110121
type: 'uk.nhs.notify.digital.letters.pdm.resource.available.v1',
122+
data: {
123+
...pdmResourceUnavailableEvent.data,
124+
nhsNumber: '9999999999',
125+
odsCode: 'AB1234',
126+
},
111127
},
112128
],
113129
expect.any(Function),

lambdas/pdm-poll-lambda/src/apis/sqs-handler.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ export const createHandler = ({
116116
id: randomUUID(),
117117
time: eventTime,
118118
recordedtime: eventTime,
119+
dataschema:
120+
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-pdm-resource-unavailable-data.schema.json',
119121
type: eventType,
120122
data: {
121123
...event.data,
@@ -133,9 +135,13 @@ export const createHandler = ({
133135
id: randomUUID(),
134136
time: eventTime,
135137
recordedtime: eventTime,
138+
dataschema:
139+
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-pdm-resource-available-data.schema.json',
136140
type: 'uk.nhs.notify.digital.letters.pdm.resource.available.v1',
137141
data: {
138142
...event.data,
143+
nhsNumber: '9999999999',
144+
odsCode: 'AB1234',
139145
},
140146
},
141147
],
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import { expect, test } from '@playwright/test';
2+
import { EVENT_BUS_LOG_GROUP_NAME } from 'constants/backend-constants';
3+
import pdmResourceSubmittedValidator from 'digital-letters-events/PDMResourceSubmitted.js';
4+
import { getLogsFromCloudwatch } from 'helpers/cloudwatch-helpers';
5+
import eventPublisher from 'helpers/event-bus-helpers';
6+
import expectToPassEventually from 'helpers/expectations';
7+
import { v4 as uuidv4 } from 'uuid';
8+
9+
const baseEvent = {
10+
profileversion: '1.0.0',
11+
profilepublished: '2025-10',
12+
specversion: '1.0',
13+
source:
14+
'/nhs/england/notify/production/primary/data-plane/digitalletters/pdm',
15+
subject:
16+
'customer/920fca11-596a-4eca-9c47-99f624614658/recipient/769acdd4-6a47-496f-999f-76a6fd2c3959',
17+
type: 'uk.nhs.notify.digital.letters.pdm.resource.submitted.v1',
18+
time: '2023-06-20T12:00:00Z',
19+
recordedtime: '2023-06-20T12:00:00.250Z',
20+
severitynumber: 2,
21+
traceparent: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01',
22+
datacontenttype: 'application/json',
23+
dataschema:
24+
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-pdm-resource-submitted-data.schema.json',
25+
dataschemaversion: '1.0',
26+
severitytext: 'INFO',
27+
};
28+
29+
test.describe('PDM Poll', () => {
30+
test.beforeAll(async () => {
31+
test.setTimeout(250_000);
32+
});
33+
34+
test('should send a pdm.resource.available event when available in PDM', async () => {
35+
const eventId = uuidv4();
36+
const documentResourceId = 'fc450f3d-e6fe-3436-9e06-4c83cc38b707';
37+
const messageReference = uuidv4();
38+
const senderId = uuidv4();
39+
40+
await eventPublisher.sendEvents(
41+
[
42+
{
43+
...baseEvent,
44+
id: eventId,
45+
data: {
46+
resourceId: documentResourceId,
47+
messageReference,
48+
senderId,
49+
},
50+
},
51+
],
52+
pdmResourceSubmittedValidator,
53+
);
54+
55+
await expectToPassEventually(async () => {
56+
const eventLogEntry = await getLogsFromCloudwatch(
57+
EVENT_BUS_LOG_GROUP_NAME,
58+
[
59+
'$.message_type = "EVENT_RECEIPT"',
60+
'$.details.detail_type = "uk.nhs.notify.digital.letters.pdm.resource.available.v1"',
61+
`$.details.event_detail = "*\\"messageReference\\":\\"${messageReference}\\"*"`,
62+
],
63+
);
64+
65+
expect(eventLogEntry.length).toEqual(1);
66+
}, 120);
67+
});
68+
});

tests/playwright/digital-letters-component-tests/pdm-uploader.component.spec.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@ const pdmRequest = {
3434
};
3535

3636
const baseEvent = {
37-
profileversion: '1.0.0',
38-
profilepublished: '2025-10',
3937
specversion: '1.0',
4038
source:
4139
'/nhs/england/notify/production/primary/data-plane/digitalletters/mesh',
@@ -49,7 +47,6 @@ const baseEvent = {
4947
datacontenttype: 'application/json',
5048
dataschema:
5149
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-mesh-inbox-message-downloaded-data.schema.json',
52-
dataschemaversion: '1.0',
5350
severitytext: 'INFO',
5451
};
5552

utils/utils/src/__tests__/pdm-client/pdm-client.test.ts

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ describe('PdmClient', () => {
1616
head: jest.Mock;
1717
post: jest.Mock;
1818
};
19+
const mockDocumentResourceId = 'doc-123';
20+
const mockResponse = { data: { id: mockDocumentResourceId } };
21+
const mockRequestId = 'req-123';
1922

2023
beforeEach(() => {
2124
jest.clearAllMocks();
@@ -61,10 +64,8 @@ describe('PdmClient', () => {
6164
const mockFhirRequest = JSON.stringify({
6265
resourceType: 'DocumentReference',
6366
});
64-
const mockRequestId = 'req-123';
6567

6668
it('should successfully create document reference', async () => {
67-
const mockResponse = { data: { id: 'doc-123' } };
6869
mockAxiosInstance.post.mockResolvedValue(mockResponse);
6970

7071
const result = await pdmClient.createDocumentReference(
@@ -94,7 +95,6 @@ describe('PdmClient', () => {
9495

9596
it('should omit Authorization header when access token is empty', async () => {
9697
mockAccessTokenRepository.getAccessToken.mockResolvedValue('');
97-
const mockResponse = { data: { id: 'doc-123' } };
9898
mockAxiosInstance.post.mockResolvedValue(mockResponse);
9999

100100
await pdmClient.createDocumentReference(mockFhirRequest, mockRequestId);
@@ -116,7 +116,6 @@ describe('PdmClient', () => {
116116
isAxiosError: true,
117117
response: { status: HTTP2_CONSTANTS.HTTP_STATUS_TOO_MANY_REQUESTS },
118118
};
119-
const mockResponse = { data: { id: 'doc-123' } };
120119

121120
mockAxiosInstance.post
122121
.mockRejectedValueOnce(mockError)
@@ -205,22 +204,18 @@ describe('PdmClient', () => {
205204
});
206205

207206
describe('getDocumentReference', () => {
208-
const mockDocumentReferenceId = 'doc-123';
209-
const mockResponse = { data: { id: mockDocumentReferenceId } };
210-
const mockRequestId = 'req-123';
211-
212207
it('should successfully fetch document reference', async () => {
213208
mockAxiosInstance.get.mockResolvedValue(mockResponse);
214209

215210
const result = await pdmClient.getDocumentReference(
216-
mockDocumentReferenceId,
211+
mockDocumentResourceId,
217212
mockRequestId,
218213
);
219214

220215
expect(result).toEqual(mockResponse.data);
221216
expect(mockAccessTokenRepository.getAccessToken).toHaveBeenCalledTimes(1);
222217
expect(mockAxiosInstance.get).toHaveBeenCalledWith(
223-
`/patient-data-manager/FHIR/R4/DocumentReference/${mockDocumentReferenceId}`,
218+
`/patient-data-manager/FHIR/R4/DocumentReference/${mockDocumentResourceId}`,
224219
{
225220
headers: {
226221
'X-Request-ID': mockRequestId,
@@ -240,12 +235,12 @@ describe('PdmClient', () => {
240235
mockAxiosInstance.get.mockResolvedValue(mockResponse);
241236

242237
await pdmClient.getDocumentReference(
243-
mockDocumentReferenceId,
238+
mockDocumentResourceId,
244239
mockRequestId,
245240
);
246241

247242
expect(mockAxiosInstance.get).toHaveBeenCalledWith(
248-
`/patient-data-manager/FHIR/R4/DocumentReference/${mockDocumentReferenceId}`,
243+
`/patient-data-manager/FHIR/R4/DocumentReference/${mockDocumentResourceId}`,
249244
{
250245
headers: {
251246
'X-Request-ID': mockRequestId,
@@ -266,7 +261,7 @@ describe('PdmClient', () => {
266261
.mockResolvedValueOnce(mockResponse);
267262

268263
const result = await pdmClient.getDocumentReference(
269-
mockDocumentReferenceId,
264+
mockDocumentResourceId,
270265
mockRequestId,
271266
);
272267

@@ -293,7 +288,7 @@ describe('PdmClient', () => {
293288
mockAxiosInstance.get.mockRejectedValue(mockError);
294289

295290
await expect(
296-
pdmClient.getDocumentReference(mockDocumentReferenceId, mockRequestId),
291+
pdmClient.getDocumentReference(mockDocumentResourceId, mockRequestId),
297292
).rejects.toEqual(mockError);
298293

299294
expect(mockAxiosInstance.get).toHaveBeenCalledTimes(1);
@@ -309,7 +304,7 @@ describe('PdmClient', () => {
309304
mockAxiosInstance.get.mockRejectedValue(mockError);
310305

311306
await expect(
312-
pdmClient.getDocumentReference(mockDocumentReferenceId, mockRequestId),
307+
pdmClient.getDocumentReference(mockDocumentResourceId, mockRequestId),
313308
).rejects.toThrow('Network error');
314309

315310
expect(mockAxiosInstance.get).toHaveBeenCalledTimes(1);
@@ -336,7 +331,7 @@ describe('PdmClient', () => {
336331

337332
await expect(
338333
pdmClientWithCustomRetry.getDocumentReference(
339-
mockDocumentReferenceId,
334+
mockDocumentResourceId,
340335
mockRequestId,
341336
),
342337
).rejects.toEqual(mockError);

utils/utils/src/pdm-client/pdm-client.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export interface IPdmClient {
1414
requestId: string,
1515
): Promise<PdmResponse>;
1616
getDocumentReference(
17-
documentReferenceId: string,
17+
documentResourceId: string,
1818
requestId: string,
1919
): Promise<PdmResponse>;
2020
}
@@ -90,7 +90,7 @@ export class PdmClient implements IPdmClient {
9090
}
9191

9292
public async getDocumentReference(
93-
documentReferenceId: string,
93+
documentResourceId: string,
9494
requestId: string,
9595
): Promise<PdmResponse> {
9696
try {
@@ -113,7 +113,7 @@ export class PdmClient implements IPdmClient {
113113
}),
114114
};
115115
const response = await this.client.get(
116-
`/patient-data-manager/FHIR/R4/DocumentReference/${documentReferenceId}`,
116+
`/patient-data-manager/FHIR/R4/DocumentReference/${documentResourceId}`,
117117
{ headers },
118118
);
119119

0 commit comments

Comments
 (0)