Skip to content

Commit b3425a4

Browse files
fix mapping
1 parent 9f3836e commit b3425a4

File tree

4 files changed

+520
-15
lines changed

4 files changed

+520
-15
lines changed

lambdas/mi-updates-transformer/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"dependencies": {
33
"@aws-sdk/client-sns": "^3.940.0",
4+
"@aws-sdk/util-dynamodb": "^3.943.0",
45
"@internal/datastore": "^0.1.0",
56
"@nhsdigital/nhs-notify-event-schemas-supplier-api": "*",
67
"aws-lambda": "^1.0.7",

lambdas/mi-updates-transformer/src/__tests__/mi-updates-transformer.test.ts

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { SNSClient } from "@aws-sdk/client-sns";
22
import * as pino from "pino";
33
import {
4+
AttributeValue,
45
Context,
6+
DynamoDBRecord,
57
KinesisStreamEvent,
68
KinesisStreamRecordPayload,
79
} from "aws-lambda";
@@ -48,6 +50,25 @@ function generateMIEvents(numMIEvents: number): MI[] {
4850
}));
4951
}
5052

53+
function toAttr(value: unknown): AttributeValue {
54+
if (value === null || value === undefined) return { NULL: true };
55+
if (typeof value === "string") return { S: value };
56+
if (typeof value === "number") return { N: String(value) };
57+
if (typeof value === "boolean") return { BOOL: value };
58+
// fallback: stringify anything else
59+
return { S: JSON.stringify(value) };
60+
}
61+
62+
function generateInsertRecord(newMI: MI): DynamoDBRecord {
63+
const newImage = Object.fromEntries(
64+
Object.entries(newMI).map(([key, value]) => [key, toAttr(value)]),
65+
);
66+
return {
67+
eventName: "INSERT",
68+
dynamodb: { NewImage: newImage },
69+
};
70+
}
71+
5172
describe("mi-updates-transformer Lambda", () => {
5273
const mockedDeps: jest.Mocked<Deps> = {
5374
snsClient: { send: jest.fn() } as unknown as SNSClient,
@@ -74,11 +95,9 @@ describe("mi-updates-transformer Lambda", () => {
7495
}),
7596
];
7697

77-
await handler(
78-
generateKinesisEvent(miEvents),
79-
mockDeep<Context>(),
80-
jest.fn(),
81-
);
98+
const insertMI = generateInsertRecord(miEvents[0]);
99+
const testData = generateKinesisEvent([insertMI]);
100+
await handler(testData, mockDeep<Context>(), jest.fn());
82101

83102
expect(mockedDeps.snsClient.send).toHaveBeenCalledWith(
84103
expect.objectContaining({
@@ -99,11 +118,9 @@ describe("mi-updates-transformer Lambda", () => {
99118
}),
100119
);
101120

102-
await handler(
103-
generateKinesisEvent(miEvents),
104-
mockDeep<Context>(),
105-
jest.fn(),
106-
);
121+
const insertMIs = miEvents.map((miEvent) => generateInsertRecord(miEvent));
122+
const testData = generateKinesisEvent(insertMIs);
123+
await handler(testData, mockDeep<Context>(), jest.fn());
107124

108125
expect(mockedDeps.snsClient.send).toHaveBeenCalledWith(
109126
expect.objectContaining({
@@ -136,11 +153,9 @@ describe("mi-updates-transformer Lambda", () => {
136153
),
137154
];
138155

139-
await handler(
140-
generateKinesisEvent(miEvents),
141-
mockDeep<Context>(),
142-
jest.fn(),
143-
);
156+
const insertMIs = miEvents.map((miEvent) => generateInsertRecord(miEvent));
157+
const testData = generateKinesisEvent(insertMIs);
158+
await handler(testData, mockDeep<Context>(), jest.fn());
144159

145160
expect(mockedDeps.snsClient.send).toHaveBeenNthCalledWith(
146161
1,

lambdas/mi-updates-transformer/src/mi-updates-transformer.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
KinesisStreamEvent,
55
KinesisStreamRecord,
66
} from "aws-lambda";
7+
import { unmarshall } from "@aws-sdk/util-dynamodb";
78
import { MI, MISchema } from "@internal/datastore";
89
import {
910
PublishBatchCommand,

0 commit comments

Comments
 (0)