11import { VERSION } from '@nhsdigital/nhs-notify-event-schemas-template-management' ;
22import { createMockLogger } from 'nhs-notify-web-template-management-test-helper-utils/mock-logger' ;
33import { EventBuilder } from '../../domain/event-builder' ;
4- import { PublishableEventRecord } from '../../domain/input-schemas' ;
4+ import type { PublishableEventRecord } from '../../domain/input-schemas' ;
55import { shouldPublish } from '../../domain/should-publish' ;
66
77jest . mock ( '../../domain/should-publish' ) ;
@@ -20,9 +20,21 @@ const shouldPublishMock = jest.mocked(shouldPublish);
2020
2121const { logger : mockLogger } = createMockLogger ( ) ;
2222
23- const eventBuilder = new EventBuilder ( 'table-name' , 'event-source' , mockLogger ) ;
23+ const tables = {
24+ templates : 'templates-table' ,
25+ routing : 'routing-config-table' ,
26+ } ;
2427
25- const publishableEventRecord = ( newStatus : string ) : PublishableEventRecord => ( {
28+ const eventBuilder = new EventBuilder (
29+ tables . templates ,
30+ tables . routing ,
31+ 'event-source' ,
32+ mockLogger
33+ ) ;
34+
35+ const publishableTemplateEventRecord = (
36+ newStatus : string
37+ ) : PublishableEventRecord => ( {
2638 dynamodb : {
2739 SequenceNumber : '4' ,
2840 NewImage : {
@@ -191,7 +203,7 @@ const publishableEventRecord = (newStatus: string): PublishableEventRecord => ({
191203 } ,
192204 } ,
193205 eventID : '7f2ae4b0-82c2-4911-9b84-8997d7f3f40d' ,
194- tableName : 'table-name' ,
206+ tableName : tables . templates ,
195207} ) ;
196208
197209const expectedEvent = ( status : string , type : string , dataschema : string ) => ( {
@@ -229,130 +241,154 @@ const expectedEvent = (status: string, type: string, dataschema: string) => ({
229241 } ,
230242} ) ;
231243
232- test ( 'errors on unrecognised event type ' , ( ) => {
233- const invalidPublishableEventRecord = {
234- ...publishableEventRecord ( 'SUBMITTED' ) ,
235- tableName : 'not -table-name' ,
244+ test ( 'errors on unrecognised event table source ' , ( ) => {
245+ const invalidpublishableTemplateEventRecord = {
246+ ...publishableTemplateEventRecord ( 'SUBMITTED' ) ,
247+ tableName : 'unknown -table-name' ,
236248 } ;
237249
238- expect ( ( ) => eventBuilder . buildEvent ( invalidPublishableEventRecord ) ) . toThrow (
239- 'Unrecognised event type'
240- ) ;
250+ expect ( ( ) =>
251+ eventBuilder . buildEvent ( invalidpublishableTemplateEventRecord )
252+ ) . toThrow ( 'Unrecognised event type' ) ;
241253} ) ;
242254
243- test ( 'errors on output schema validation failure' , ( ) => {
244- const valid = publishableEventRecord ( 'SUBMITTED' ) ;
255+ describe ( 'template events' , ( ) => {
256+ test ( 'errors on output schema validation failure' , ( ) => {
257+ const valid = publishableTemplateEventRecord ( 'SUBMITTED' ) ;
245258
246- const invalidDomainEventRecord = {
247- ...valid ,
248- dynamodb : {
249- ...valid . dynamodb ,
250- NewImage : {
251- ...valid . dynamodb . NewImage ,
252- language : { N : 0 } ,
259+ const invalidDomainEventRecord = {
260+ ...valid ,
261+ dynamodb : {
262+ ...valid . dynamodb ,
263+ NewImage : {
264+ ...valid . dynamodb . NewImage ,
265+ language : { N : 0 } ,
266+ } ,
253267 } ,
254- } ,
255- } ;
268+ } ;
256269
257- expect ( ( ) =>
258- eventBuilder . buildEvent (
259- invalidDomainEventRecord as unknown as PublishableEventRecord
260- )
261- ) . toThrow (
262- expect . objectContaining ( {
263- name : 'ZodError' ,
264- issues : [
265- expect . objectContaining ( {
266- code : 'invalid_value' ,
267- path : [ 'data' , 'language' ] ,
268- } ) ,
269- ] ,
270- } )
271- ) ;
272- } ) ;
270+ expect ( ( ) =>
271+ eventBuilder . buildEvent (
272+ invalidDomainEventRecord as unknown as PublishableEventRecord
273+ )
274+ ) . toThrow (
275+ expect . objectContaining ( {
276+ name : 'ZodError' ,
277+ issues : [
278+ expect . objectContaining ( {
279+ code : 'invalid_value' ,
280+ path : [ 'data' , 'language' ] ,
281+ } ) ,
282+ ] ,
283+ } )
284+ ) ;
285+ } ) ;
273286
274- test ( 'builds template completed event' , ( ) => {
275- const event = eventBuilder . buildEvent ( publishableEventRecord ( 'SUBMITTED' ) ) ;
287+ test ( 'builds template completed event' , ( ) => {
288+ const event = eventBuilder . buildEvent (
289+ publishableTemplateEventRecord ( 'SUBMITTED' )
290+ ) ;
276291
277- expect ( event ) . toEqual (
278- expectedEvent (
279- 'SUBMITTED' ,
280- 'uk.nhs.notify.template-management.TemplateCompleted.v1' ,
281- 'https://notify.nhs.uk/events/schemas/TemplateCompleted/v1.json'
282- )
283- ) ;
284- } ) ;
292+ expect ( event ) . toEqual (
293+ expectedEvent (
294+ 'SUBMITTED' ,
295+ 'uk.nhs.notify.template-management.TemplateCompleted.v1' ,
296+ 'https://notify.nhs.uk/events/schemas/TemplateCompleted/v1.json'
297+ )
298+ ) ;
299+ } ) ;
285300
286- test ( 'builds template drafted event' , ( ) => {
287- const event = eventBuilder . buildEvent (
288- publishableEventRecord ( 'PROOF_AVAILABLE' )
289- ) ;
290-
291- expect ( event ) . toEqual (
292- expectedEvent (
293- 'PROOF_AVAILABLE' ,
294- 'uk.nhs.notify.template-management.TemplateDrafted.v1' ,
295- 'https://notify.nhs.uk/events/schemas/TemplateDrafted/v1.json'
296- )
297- ) ;
298- } ) ;
301+ test ( 'builds template drafted event' , ( ) => {
302+ const event = eventBuilder . buildEvent (
303+ publishableTemplateEventRecord ( 'PROOF_AVAILABLE' )
304+ ) ;
299305
300- test ( 'builds event when no old image is available' , ( ) => {
301- // although not required by this lambda, an old image would be expected here in real usage
302- const mockEvent = publishableEventRecord ( 'SUBMITTED' ) ;
306+ expect ( event ) . toEqual (
307+ expectedEvent (
308+ 'PROOF_AVAILABLE' ,
309+ 'uk.nhs.notify.template-management.TemplateDrafted.v1' ,
310+ 'https://notify.nhs.uk/events/schemas/TemplateDrafted/v1.json'
311+ )
312+ ) ;
313+ } ) ;
303314
304- const noOldImage = {
305- ...mockEvent ,
306- dynamodb : {
307- SequenceNumber : mockEvent . dynamodb . SequenceNumber ,
308- NewImage : mockEvent . dynamodb . NewImage ,
309- } ,
310- } ;
315+ test ( 'builds event when no old image is available' , ( ) => {
316+ // although not required by this lambda, an old image would be expected here in real usage
317+ const mockEvent = publishableTemplateEventRecord ( 'SUBMITTED' ) ;
311318
312- const event = eventBuilder . buildEvent ( noOldImage ) ;
319+ const noOldImage = {
320+ ...mockEvent ,
321+ dynamodb : {
322+ SequenceNumber : mockEvent . dynamodb . SequenceNumber ,
323+ NewImage : mockEvent . dynamodb . NewImage ,
324+ } ,
325+ } ;
313326
314- expect ( event ) . toEqual (
315- expectedEvent (
316- 'SUBMITTED' ,
317- 'uk.nhs.notify.template-management.TemplateCompleted.v1' ,
318- 'https://notify.nhs.uk/events/schemas/TemplateCompleted/v1.json'
319- )
320- ) ;
321- } ) ;
327+ const event = eventBuilder . buildEvent ( noOldImage ) ;
322328
323- test ( 'builds template deleted event' , ( ) => {
324- const event = eventBuilder . buildEvent ( publishableEventRecord ( 'DELETED' ) ) ;
329+ expect ( event ) . toEqual (
330+ expectedEvent (
331+ 'SUBMITTED' ,
332+ 'uk.nhs.notify.template-management.TemplateCompleted.v1' ,
333+ 'https://notify.nhs.uk/events/schemas/TemplateCompleted/v1.json'
334+ )
335+ ) ;
336+ } ) ;
325337
326- expect ( event ) . toEqual (
327- expectedEvent (
328- 'DELETED' ,
329- 'uk.nhs.notify.template-management.TemplateDeleted.v1' ,
330- 'https://notify.nhs.uk/events/schemas/TemplateDeleted/v1.json'
331- )
332- ) ;
333- } ) ;
338+ test ( 'builds template deleted event' , ( ) => {
339+ const event = eventBuilder . buildEvent (
340+ publishableTemplateEventRecord ( 'DELETED' )
341+ ) ;
334342
335- test ( 'should return undefined when not a publishable event' , ( ) => {
336- shouldPublishMock . mockReset ( ) ;
337- shouldPublishMock . mockReturnValueOnce ( false ) ;
343+ expect ( event ) . toEqual (
344+ expectedEvent (
345+ 'DELETED' ,
346+ 'uk.nhs.notify.template-management.TemplateDeleted.v1' ,
347+ 'https://notify.nhs.uk/events/schemas/TemplateDeleted/v1.json'
348+ )
349+ ) ;
350+ } ) ;
338351
339- const event = eventBuilder . buildEvent (
340- publishableEventRecord ( 'PROOF_AVAILABLE' )
341- ) ;
352+ test ( 'should return undefined when not a publishable event' , ( ) => {
353+ shouldPublishMock . mockReset ( ) ;
354+ shouldPublishMock . mockReturnValueOnce ( false ) ;
342355
343- expect ( event ) . toEqual ( undefined ) ;
344- } ) ;
356+ const event = eventBuilder . buildEvent (
357+ publishableTemplateEventRecord ( 'PROOF_AVAILABLE' )
358+ ) ;
345359
346- test ( 'does not build template event on hard delete' , ( ) => {
347- const hardDeletePublishableEventRecord = {
348- ...publishableEventRecord ( 'SUBMITTED' ) ,
349- dynamodb : {
350- SequenceNumber : '4' ,
351- NewImage : undefined ,
352- } ,
353- } ;
360+ expect ( event ) . toEqual ( undefined ) ;
361+ } ) ;
362+
363+ test ( 'does not build template event on hard delete' , ( ) => {
364+ const hardDeletepublishableTemplateEventRecord = {
365+ ...publishableTemplateEventRecord ( 'SUBMITTED' ) ,
366+ dynamodb : {
367+ SequenceNumber : '4' ,
368+ NewImage : undefined ,
369+ } ,
370+ } ;
371+
372+ const event = eventBuilder . buildEvent (
373+ hardDeletepublishableTemplateEventRecord
374+ ) ;
375+
376+ expect ( event ) . toEqual ( undefined ) ;
377+ } ) ;
378+ } ) ;
354379
355- const event = eventBuilder . buildEvent ( hardDeletePublishableEventRecord ) ;
380+ describe ( 'routing config events' , ( ) => {
381+ test ( 'should return undefined when table source is routing config table' , ( ) => {
382+ const event = eventBuilder . buildEvent ( {
383+ dynamodb : {
384+ SequenceNumber : '1' ,
385+ NewImage : { } ,
386+ OldImage : { } ,
387+ } ,
388+ eventID : 'cf1344e0-fd57-426a-860a-3efc9d2b1977' ,
389+ tableName : tables . routing ,
390+ } ) ;
356391
357- expect ( event ) . toEqual ( undefined ) ;
392+ expect ( event ) . toEqual ( undefined ) ;
393+ } ) ;
358394} ) ;
0 commit comments