11import { expect , test } from '@playwright/test' ;
22import {
3- ENV ,
43 MESH_DOWNLOAD_DLQ_NAME ,
54 MESH_DOWNLOAD_LAMBDA_LOG_GROUP_NAME ,
65 MESH_POLL_LAMBDA_NAME ,
76 NON_PII_S3_BUCKET_NAME ,
87 PII_S3_BUCKET_NAME ,
8+ EVENT_BUS_LOG_GROUP_NAME ,
99} from 'constants/backend-constants' ;
1010import { getLogsFromCloudwatch } from 'helpers/cloudwatch-helpers' ;
1111import eventPublisher from 'helpers/event-bus-helpers' ;
1212import expectToPassEventually from 'helpers/expectations' ;
1313import { invokeLambda } from 'helpers/lambda-helpers' ;
1414import { downloadFromS3 , uploadToS3 } from 'helpers/s3-helpers' ;
15- import { expectMessageContainingString } from 'helpers/sqs-helpers' ;
15+ import { expectMessageContainingString , purgeQueue } from 'helpers/sqs-helpers' ;
16+ import { expectEventOnTestObserverQueue } from 'helpers/test-observer-helpers' ;
1617import { v4 as uuidv4 } from 'uuid' ;
1718import { SENDER_ID_SKIPS_NOTIFY } from 'constants/tests-constants' ;
1819import { validateMESHInboxMessageReceived } from 'digital-letters-events' ;
@@ -72,6 +73,10 @@ test.describe('Digital Letters - MESH Poll and Download', () => {
7273 const sendersMeshMailboxId = 'test-mesh-sender-1' ;
7374 const meshMailboxId = 'mock-mailbox' ;
7475
76+ test . beforeAll ( async ( ) => {
77+ await purgeQueue ( MESH_DOWNLOAD_DLQ_NAME ) ;
78+ } ) ;
79+
7580 async function uploadMeshMessage (
7681 meshMessageId : string ,
7782 messageReference : string ,
@@ -93,58 +98,67 @@ test.describe('Digital Letters - MESH Poll and Download', () => {
9398 async function expectMeshInboxMessageReceivedEvent (
9499 meshMessageId : string ,
95100 ) : Promise < void > {
96- await expectToPassEventually ( async ( ) => {
97- const eventLogEntry = await getLogsFromCloudwatch (
98- `/aws/vendedlogs/events/event-bus/nhs-${ ENV } -dl` ,
99- [
100- '$.message_type = "EVENT_RECEIPT"' ,
101- '$.details.detail_type = "uk.nhs.notify.digital.letters.mesh.inbox.message.received.v1"' ,
102- `$.details.event_detail = "*\\"meshMessageId\\":\\"${ meshMessageId } \\"*"` ,
103- `$.details.event_detail = "*\\"senderId\\":\\"${ senderId } \\"*"` ,
104- ] ,
105- ) ;
106-
107- expect ( eventLogEntry . length ) . toBeGreaterThanOrEqual ( 1 ) ;
108- } , 120_000 ) ;
101+ await expectEventOnTestObserverQueue (
102+ 'uk.nhs.notify.digital.letters.mesh.inbox.message.received.v1' ,
103+ ( detail ) => {
104+ const data = (
105+ detail as { data ?: { meshMessageId ?: string ; senderId ?: string } }
106+ ) . data ;
107+ return (
108+ data ?. meshMessageId === meshMessageId && data ?. senderId === senderId
109+ ) ;
110+ } ,
111+ 60_000 ,
112+ ) ;
109113 }
110114
111115 async function expectMeshInboxMessageDownloadedEvent (
112116 messageReference : string ,
113117 ) : Promise < void > {
114- await expectToPassEventually ( async ( ) => {
115- const eventLogEntry = await getLogsFromCloudwatch (
116- `/aws/vendedlogs/events/event-bus/nhs-${ ENV } -dl` ,
117- [
118- '$.message_type = "EVENT_RECEIPT"' ,
119- '$.details.detail_type = "uk.nhs.notify.digital.letters.mesh.inbox.message.downloaded.v1"' ,
120- `$.details.event_detail = "*\\"messageReference\\":\\"${ messageReference } \\"*"` ,
121- `$.details.event_detail = "*\\"senderId\\":\\"${ senderId } \\"*"` ,
122- ] ,
123- ) ;
124-
125- expect ( eventLogEntry . length ) . toBeGreaterThanOrEqual ( 1 ) ;
126- } , 180_000 ) ;
118+ await expectEventOnTestObserverQueue (
119+ 'uk.nhs.notify.digital.letters.mesh.inbox.message.downloaded.v1' ,
120+ ( detail ) => {
121+ const data = (
122+ detail as {
123+ data ?: { messageReference ?: string ; senderId ?: string } ;
124+ }
125+ ) . data ;
126+ return (
127+ data ?. messageReference === messageReference &&
128+ data ?. senderId === senderId
129+ ) ;
130+ } ,
131+ 60_000 ,
132+ ) ;
127133 }
128134
129135 async function expectMeshInboxMessageInvalidEvent (
130136 meshMessageId : string ,
131137 messageReference : string ,
138+ failureCode = 'DL_CLIV_005' ,
132139 ) : Promise < void > {
133- await expectToPassEventually ( async ( ) => {
134- const eventLogEntry = await getLogsFromCloudwatch (
135- `/aws/vendedlogs/events/event-bus/nhs-${ ENV } -dl` ,
136- [
137- '$.message_type = "EVENT_RECEIPT"' ,
138- '$.details.detail_type = "uk.nhs.notify.digital.letters.mesh.inbox.message.invalid.v1"' ,
139- `$.details.event_detail = "*\\"messageReference\\":\\"${ messageReference } \\"*"` ,
140- `$.details.event_detail = "*\\"senderId\\":\\"${ senderId } \\"*"` ,
141- `$.details.event_detail = "*\\"meshMessageId\\":\\"${ meshMessageId } \\"*"` ,
142- `$.details.event_detail = "*\\"failureCode\\":\\"DL_CLIV_005\\"*"` ,
143- ] ,
144- ) ;
145-
146- expect ( eventLogEntry . length ) . toBeGreaterThanOrEqual ( 1 ) ;
147- } , 180_000 ) ;
140+ await expectEventOnTestObserverQueue (
141+ 'uk.nhs.notify.digital.letters.mesh.inbox.message.invalid.v1' ,
142+ ( detail ) => {
143+ const data = (
144+ detail as {
145+ data ?: {
146+ meshMessageId ?: string ;
147+ messageReference ?: string ;
148+ senderId ?: string ;
149+ failureCode ?: string ;
150+ } ;
151+ }
152+ ) . data ;
153+ return (
154+ data ?. meshMessageId === meshMessageId &&
155+ data ?. messageReference === messageReference &&
156+ data ?. senderId === senderId &&
157+ data ?. failureCode === failureCode
158+ ) ;
159+ } ,
160+ 60_000 ,
161+ ) ;
148162 }
149163
150164 test ( 'should poll message from MESH inbox, publish received event, download message, and publish downloaded event' , async ( ) => {
@@ -287,6 +301,8 @@ test.describe('Digital Letters - MESH Poll and Download', () => {
287301 } ) ;
288302
289303 test ( 'should publish MESHInboxMessageInvalid event when local_id is missing' , async ( ) => {
304+ test . setTimeout ( 200_000 ) ;
305+
290306 const meshMessageId = `${ Date . now ( ) } _INVALID_${ uuidv4 ( ) . slice ( 0 , 8 ) } ` ;
291307 const messageContent = JSON . stringify ( {
292308 senderId,
@@ -300,20 +316,7 @@ test.describe('Digital Letters - MESH Poll and Download', () => {
300316
301317 await invokeLambda ( MESH_POLL_LAMBDA_NAME ) ;
302318
303- await expectToPassEventually ( async ( ) => {
304- const eventLogEntry = await getLogsFromCloudwatch (
305- `/aws/vendedlogs/events/event-bus/nhs-${ ENV } -dl` ,
306- [
307- '$.message_type = "EVENT_RECEIPT"' ,
308- '$.details.detail_type = "uk.nhs.notify.digital.letters.mesh.inbox.message.invalid.v1"' ,
309- String . raw `$.details.event_detail = "*\"meshMessageId\":\"${ meshMessageId } \"*"` ,
310- String . raw `$.details.event_detail = "*\"senderId\":\"${ senderId } \"*"` ,
311- String . raw `$.details.event_detail = "*\"failureCode\":\"DL_CLIV_006\"*"` ,
312- ] ,
313- ) ;
314-
315- expect ( eventLogEntry . length ) . toBeGreaterThanOrEqual ( 1 ) ;
316- } , 120_000 ) ;
319+ await expectMeshInboxMessageInvalidEvent ( meshMessageId , '' , 'DL_CLIV_006' ) ;
317320
318321 await expectToPassEventually ( async ( ) => {
319322 await expect ( async ( ) => {
@@ -323,18 +326,6 @@ test.describe('Digital Letters - MESH Poll and Download', () => {
323326 ) ;
324327 } ) . rejects . toThrow ( 'No objects found' ) ;
325328 } , 60_000 ) ;
326-
327- await expectToPassEventually ( async ( ) => {
328- const receivedEvents = await getLogsFromCloudwatch (
329- `/aws/vendedlogs/events/event-bus/nhs-${ ENV } -dl` ,
330- [
331- '$.message_type = "EVENT_RECEIPT"' ,
332- '$.details.detail_type = "uk.nhs.notify.digital.letters.mesh.inbox.message.received.v1"' ,
333- `$.details.event_detail = "*\\"meshMessageId\\":\\"${ meshMessageId } \\"*"` ,
334- ] ,
335- ) ;
336- expect ( receivedEvents . length ) . toBe ( 0 ) ;
337- } , 15_000 ) ;
338329 } ) ;
339330
340331 test ( 'should skip publishing downloaded event and acknowledge message when document already exists in S3' , async ( ) => {
@@ -395,7 +386,7 @@ test.describe('Digital Letters - MESH Poll and Download', () => {
395386 // Assert that no MESHInboxMessageDownloaded event was published
396387 await expectToPassEventually ( async ( ) => {
397388 const downloadedEvents = await getLogsFromCloudwatch (
398- `/aws/vendedlogs/events/event-bus/nhs- ${ ENV } -dl` ,
389+ EVENT_BUS_LOG_GROUP_NAME ,
399390 [
400391 '$.message_type = "EVENT_RECEIPT"' ,
401392 '$.details.detail_type = "uk.nhs.notify.digital.letters.mesh.inbox.message.downloaded.v1"' ,
0 commit comments