11import { SNSClient } from "@aws-sdk/client-sns" ;
22import * as pino from "pino" ;
33import {
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+
5172describe ( "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 ,
0 commit comments