1
+ import {
2
+ KinesisDataStreamRecord ,
3
+ KinesisDataStreamRecordPayload ,
4
+ KinesisDataStreamSchema ,
5
+ } from 'src/schemas/kinesis.js' ;
1
6
import { describe , expect , it } from 'vitest' ;
2
7
import { z } from 'zod' ;
3
8
import { DynamoDBMarshalled } from '../../src/helpers/dynamodb.js' ;
4
- import { JSONStringified } from '../../src/helpers/index.js' ;
9
+ import { Base64Encoded , JSONStringified } from '../../src/helpers/index.js' ;
5
10
import { AlbSchema } from '../../src/schemas/alb.js' ;
6
11
import {
7
12
DynamoDBStreamRecord ,
@@ -14,6 +19,7 @@ import {
14
19
import { SqsRecordSchema , SqsSchema } from '../../src/schemas/sqs.js' ;
15
20
import type {
16
21
DynamoDBStreamEvent ,
22
+ KinesisDataStreamEvent ,
17
23
SnsEvent ,
18
24
SqsEvent ,
19
25
} from '../../src/types/schema.js' ;
@@ -277,3 +283,95 @@ describe('Helper: DynamoDBMarshalled', () => {
277
283
expect ( ( ) => extendedSchema . parse ( event ) ) . toThrow ( ) ;
278
284
} ) ;
279
285
} ) ;
286
+
287
+ describe ( 'Helper: Base64Encoded' , ( ) => {
288
+ it ( 'returns a valid base64 decoded payload' , ( ) => {
289
+ // Prepare
290
+ const data = {
291
+ body : Buffer . from ( JSON . stringify ( structuredClone ( basePayload ) ) ) . toString (
292
+ 'base64'
293
+ ) ,
294
+ } ;
295
+
296
+ // Act
297
+ const extendedSchema = envelopeSchema . extend ( {
298
+ body : Base64Encoded ( bodySchema ) ,
299
+ } ) ;
300
+
301
+ // Assess
302
+ expect ( extendedSchema . parse ( data ) ) . toStrictEqual ( {
303
+ body : basePayload ,
304
+ } ) ;
305
+ } ) ;
306
+
307
+ it ( 'throws an error if the payload is invalid' , ( ) => {
308
+ // Prepare
309
+ const data = {
310
+ body : Buffer . from (
311
+ JSON . stringify ( { ...basePayload , email : 'invalid' } )
312
+ ) . toString ( 'base64' ) ,
313
+ } ;
314
+
315
+ // Act
316
+ const extendedSchema = envelopeSchema . extend ( {
317
+ body : Base64Encoded ( bodySchema ) ,
318
+ } ) ;
319
+
320
+ // Assess
321
+ expect ( ( ) => extendedSchema . parse ( data ) ) . toThrow ( ) ;
322
+ } ) ;
323
+
324
+ it ( 'throws an error if the base64 payload is malformed' , ( ) => {
325
+ // Prepare
326
+ const data = {
327
+ body : 'invalid-base64-string' ,
328
+ } ;
329
+
330
+ // Act
331
+ const extendedSchema = envelopeSchema . extend ( {
332
+ body : Base64Encoded ( bodySchema ) ,
333
+ } ) ;
334
+
335
+ // Assess
336
+ expect ( ( ) => extendedSchema . parse ( data ) ) . toThrow ( ) ;
337
+ } ) ;
338
+
339
+ it ( 'parses extended KinesisDataStreamSchema' , ( ) => {
340
+ // Prepare
341
+ const testEvent = getTestEvent < KinesisDataStreamEvent > ( {
342
+ eventsPath : 'kinesis' ,
343
+ filename : 'stream' ,
344
+ } ) ;
345
+ const stringifiedBody = JSON . stringify ( basePayload ) ;
346
+ testEvent . Records [ 0 ] . kinesis . data =
347
+ Buffer . from ( stringifiedBody ) . toString ( 'base64' ) ;
348
+ testEvent . Records [ 1 ] . kinesis . data =
349
+ Buffer . from ( stringifiedBody ) . toString ( 'base64' ) ;
350
+
351
+ // Act
352
+ const extendedSchema = KinesisDataStreamSchema . extend ( {
353
+ Records : z . array (
354
+ KinesisDataStreamRecord . extend ( {
355
+ kinesis : KinesisDataStreamRecordPayload . extend ( {
356
+ data : Base64Encoded ( bodySchema ) ,
357
+ } ) ,
358
+ } )
359
+ ) ,
360
+ } ) ;
361
+
362
+ // Assess
363
+ expect ( extendedSchema . parse ( testEvent ) ) . toStrictEqual ( {
364
+ ...testEvent ,
365
+ Records : [
366
+ {
367
+ ...testEvent . Records [ 0 ] ,
368
+ kinesis : { ...testEvent . Records [ 0 ] . kinesis , data : basePayload } ,
369
+ } ,
370
+ {
371
+ ...testEvent . Records [ 1 ] ,
372
+ kinesis : { ...testEvent . Records [ 1 ] . kinesis , data : basePayload } ,
373
+ } ,
374
+ ] ,
375
+ } ) ;
376
+ } ) ;
377
+ } ) ;
0 commit comments