Skip to content

Commit dadc278

Browse files
committed
event publisher no-op
1 parent 2e07cc9 commit dadc278

File tree

6 files changed

+232
-125
lines changed

6 files changed

+232
-125
lines changed

lambdas/event-publisher/src/__tests__/domain/event-builder.test.ts

Lines changed: 144 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { VERSION } from '@nhsdigital/nhs-notify-event-schemas-template-management';
22
import { createMockLogger } from 'nhs-notify-web-template-management-test-helper-utils/mock-logger';
33
import { EventBuilder } from '../../domain/event-builder';
4-
import { PublishableEventRecord } from '../../domain/input-schemas';
4+
import type { PublishableEventRecord } from '../../domain/input-schemas';
55
import { shouldPublish } from '../../domain/should-publish';
66

77
jest.mock('../../domain/should-publish');
@@ -20,9 +20,21 @@ const shouldPublishMock = jest.mocked(shouldPublish);
2020

2121
const { 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

197209
const 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
});

lambdas/event-publisher/src/config.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { z } from 'zod';
22

33
const $Config = z.object({
4-
TEMPLATES_TABLE_NAME: z.string(),
5-
SNS_TOPIC_ARN: z.string(),
64
EVENT_SOURCE: z.string(),
5+
ROUTING_CONFIG_TABLE_NAME: z.string(),
6+
SNS_TOPIC_ARN: z.string(),
7+
TEMPLATES_TABLE_NAME: z.string(),
78
});
89

910
export const loadConfig = () => {

lambdas/event-publisher/src/container.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,20 @@ import { EventBuilder } from './domain/event-builder';
66
import { SNSRepository } from './infra/sns-repository';
77

88
export const createContainer = () => {
9-
const { EVENT_SOURCE, SNS_TOPIC_ARN, TEMPLATES_TABLE_NAME } = loadConfig();
9+
const {
10+
EVENT_SOURCE,
11+
ROUTING_CONFIG_TABLE_NAME,
12+
SNS_TOPIC_ARN,
13+
TEMPLATES_TABLE_NAME,
14+
} = loadConfig();
1015

1116
const snsClient = new SNSClient({ region: 'eu-west-2' });
1217

1318
const snsRepository = new SNSRepository(snsClient, SNS_TOPIC_ARN);
1419

1520
const eventBuilder = new EventBuilder(
1621
TEMPLATES_TABLE_NAME,
22+
ROUTING_CONFIG_TABLE_NAME,
1723
EVENT_SOURCE,
1824
logger
1925
);

lambdas/event-publisher/src/domain/event-builder.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { shouldPublish } from './should-publish';
1111
export class EventBuilder {
1212
constructor(
1313
private readonly templatesTableName: string,
14+
private readonly routingConfigTableName: string,
1415
private readonly eventSource: string,
1516
private readonly logger: Logger
1617
) {}
@@ -110,15 +111,21 @@ export class EventBuilder {
110111
buildEvent(
111112
publishableEventRecord: PublishableEventRecord
112113
): Event | undefined {
113-
if (publishableEventRecord.tableName === this.templatesTableName) {
114-
return this.buildTemplateDatabaseEvent(publishableEventRecord);
115-
}
116-
117-
this.logger.error({
118-
description: 'Unrecognised event type',
119-
publishableEventRecord,
120-
});
114+
switch (publishableEventRecord.tableName) {
115+
case this.templatesTableName: {
116+
return this.buildTemplateDatabaseEvent(publishableEventRecord);
117+
}
118+
case this.routingConfigTableName: {
119+
return undefined;
120+
}
121+
default: {
122+
this.logger.error({
123+
description: 'Unrecognised event type',
124+
publishableEventRecord,
125+
});
121126

122-
throw new Error('Unrecognised event type');
127+
throw new Error('Unrecognised event type');
128+
}
129+
}
123130
}
124131
}

0 commit comments

Comments
 (0)