Skip to content

Commit dc3fd66

Browse files
Add guard to non insert events
1 parent 1037922 commit dc3fd66

4 files changed

Lines changed: 53 additions & 6 deletions

File tree

infrastructure/terraform/components/api/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@ No requirements.
5050
| <a name="module_letter_updates_transformer"></a> [letter\_updates\_transformer](#module\_letter\_updates\_transformer) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
5151
| <a name="module_logging_bucket"></a> [logging\_bucket](#module\_logging\_bucket) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.26/terraform-s3bucket.zip | n/a |
5252
| <a name="module_mi_updates_transformer"></a> [mi\_updates\_transformer](#module\_mi\_updates\_transformer) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.26/terraform-lambda.zip | n/a |
53-
| <a name="module_patch_letter"></a> [patch\_letter](#module\_patch\_letter) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.26/terraform-lambda.zip | n/a |
54-
| <a name="module_post_letters"></a> [post\_letters](#module\_post\_letters) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.24/terraform-lambda.zip | n/a |
55-
| <a name="module_post_mi"></a> [post\_mi](#module\_post\_mi) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.26/terraform-lambda.zip | n/a |
53+
| <a name="module_patch_letter"></a> [patch\_letter](#module\_patch\_letter) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
54+
| <a name="module_post_letters"></a> [post\_letters](#module\_post\_letters) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
55+
| <a name="module_post_mi"></a> [post\_mi](#module\_post\_mi) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
5656
| <a name="module_s3bucket_test_letters"></a> [s3bucket\_test\_letters](#module\_s3bucket\_test\_letters) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.26/terraform-s3bucket.zip | n/a |
5757
| <a name="module_sqs_letter_updates"></a> [sqs\_letter\_updates](#module\_sqs\_letter\_updates) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.26/terraform-sqs.zip | n/a |
5858
| <a name="module_supplier_ssl"></a> [supplier\_ssl](#module\_supplier\_ssl) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.26/terraform-ssl.zip | n/a |

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

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
} from "aws-lambda";
1010
import { mockDeep } from "jest-mock-extended";
1111
import { MI } from "@internal/datastore";
12-
import { createHandler } from "../mi-updates-transformer";
12+
import createHandler from "../mi-updates-transformer";
1313
import { Deps } from "../deps";
1414
import { EnvVars } from "../env";
1515
import { mapMIToCloudEvent } from "../mappers/mi-mapper";
@@ -69,6 +69,29 @@ function generateInsertRecord(newMI: MI): DynamoDBRecord {
6969
};
7070
}
7171

72+
function generateDeleteRecord(oldMI: MI): DynamoDBRecord {
73+
const oldImage = Object.fromEntries(
74+
Object.entries(oldMI).map(([key, value]) => [key, toAttr(value)]),
75+
);
76+
return {
77+
eventName: "REMOVE",
78+
dynamodb: { OldImage: oldImage },
79+
};
80+
}
81+
82+
function generateModifyRecord(oldMI: MI, newMI: MI): DynamoDBRecord {
83+
const oldImage = Object.fromEntries(
84+
Object.entries(oldMI).map(([key, value]) => [key, toAttr(value)]),
85+
);
86+
const newImage = Object.fromEntries(
87+
Object.entries(newMI).map(([key, value]) => [key, toAttr(value)]),
88+
);
89+
return {
90+
eventName: "MODIFY",
91+
dynamodb: { OldImage: oldImage, NewImage: newImage },
92+
};
93+
}
94+
7295
describe("mi-updates-transformer Lambda", () => {
7396
const mockedDeps: jest.Mocked<Deps> = {
7497
snsClient: { send: jest.fn() } as unknown as SNSClient,
@@ -122,6 +145,28 @@ describe("mi-updates-transformer Lambda", () => {
122145
expect(mockedDeps.snsClient.send).not.toHaveBeenCalled();
123146
});
124147

148+
it("does not publish modify data", async () => {
149+
const handler = createHandler(mockedDeps);
150+
const miEvents = generateMIEvents(2);
151+
152+
const updateMI = generateModifyRecord(miEvents[0], miEvents[1]);
153+
const testData = generateKinesisEvent([updateMI]);
154+
await handler(testData, mockDeep<Context>(), jest.fn());
155+
156+
expect(mockedDeps.snsClient.send).not.toHaveBeenCalled();
157+
});
158+
159+
it("does not publish delete data", async () => {
160+
const handler = createHandler(mockedDeps);
161+
const miEvents = generateMIEvents(2);
162+
163+
const deleteMI = generateDeleteRecord(miEvents[0]);
164+
const testData = generateKinesisEvent([deleteMI]);
165+
await handler(testData, mockDeep<Context>(), jest.fn());
166+
167+
expect(mockedDeps.snsClient.send).not.toHaveBeenCalled();
168+
});
169+
125170
it("batches mutiple records into a single call to SNS", async () => {
126171
const handler = createHandler(mockedDeps);
127172
const miEvents = generateMIEvents(10);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { createHandler } from "./mi-updates-transformer";
1+
import createHandler from "./mi-updates-transformer";
22
import { createDependenciesContainer } from "./deps";
33

44
const container = createDependenciesContainer();

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
import { MISubmittedEvent } from "@nhsdigital/nhs-notify-event-schemas-supplier-api/src";
1414
import { mapMIToCloudEvent } from "./mappers/mi-mapper";
1515
import { Deps } from "./deps";
16+
1617
// SNS PublishBatchCommand supports up to 10 messages per batch
1718
const BATCH_SIZE = 10;
1819

@@ -48,13 +49,14 @@ function extractMIData(record: DynamoDBRecord): MI {
4849
return MISchema.parse(unmarshall(newImage as any));
4950
}
5051

51-
export function createHandler(deps: Deps): Handler<KinesisStreamEvent> {
52+
export default function createHandler(deps: Deps): Handler<KinesisStreamEvent> {
5253
return async (streamEvent: KinesisStreamEvent) => {
5354
deps.logger.info({ description: "Received event", streamEvent });
5455

5556
const cloudEvents: MISubmittedEvent[] = streamEvent.Records.map((record) =>
5657
extractPayload(record, deps),
5758
)
59+
.filter((record) => record.eventName === "INSERT")
5860
.map((element) => extractMIData(element))
5961
.map((payload) => mapMIToCloudEvent(payload, deps));
6062

0 commit comments

Comments
 (0)