@@ -2,13 +2,42 @@ import { afterAll, beforeEach, describe, expect, it, vi } from 'vitest';
22import {
33 SqsFifoMessageGroupShortCircuitError ,
44 SqsFifoPartialProcessor ,
5+ SqsFifoPartialProcessorAsync ,
56 SqsFifoShortCircuitError ,
7+ processPartialResponse ,
68 processPartialResponseSync ,
79} from '../../src/index.js' ;
10+ import type { PartialItemFailureResponse } from '../../src/types.js' ;
811import { sqsRecordFactory } from '../helpers/factories.js' ;
912import { sqsRecordHandler } from '../helpers/handlers.js' ;
1013
11- describe ( 'Class: SqsFifoBatchProcessor' , ( ) => {
14+ type ProcessorConfig = {
15+ name : string ;
16+ processorClass :
17+ | typeof SqsFifoPartialProcessor
18+ | typeof SqsFifoPartialProcessorAsync ;
19+ processFunction :
20+ | typeof processPartialResponse
21+ | typeof processPartialResponseSync ;
22+ isAsync : boolean ;
23+ } ;
24+
25+ const processors : ProcessorConfig [ ] = [
26+ {
27+ name : 'Synchronous' ,
28+ processorClass : SqsFifoPartialProcessor ,
29+ processFunction : processPartialResponseSync ,
30+ isAsync : false ,
31+ } ,
32+ {
33+ name : 'Asynchronous' ,
34+ processorClass : SqsFifoPartialProcessorAsync ,
35+ processFunction : processPartialResponse ,
36+ isAsync : true ,
37+ } ,
38+ ] ;
39+
40+ describe ( 'SQS FIFO Processors' , ( ) => {
1241 const ENVIRONMENT_VARIABLES = process . env ;
1342
1443 beforeEach ( ( ) => {
@@ -20,136 +49,140 @@ describe('Class: SqsFifoBatchProcessor', () => {
2049 process . env = ENVIRONMENT_VARIABLES ;
2150 } ) ;
2251
23- describe ( 'Synchronous SQS FIFO batch processing' , ( ) => {
24- it ( 'completes processing with no failures' , async ( ) => {
25- // Prepare
26- const firstRecord = sqsRecordFactory ( 'success' ) ;
27- const secondRecord = sqsRecordFactory ( 'success' ) ;
28- const event = { Records : [ firstRecord , secondRecord ] } ;
29- const processor = new SqsFifoPartialProcessor ( ) ;
30-
31- // Act
32- const result = processPartialResponseSync (
33- event ,
34- sqsRecordHandler ,
35- processor
36- ) ;
37-
38- // Assess
39- expect ( result . batchItemFailures ) . toStrictEqual ( [ ] ) ;
40- } ) ;
52+ for ( const { name, processorClass, processFunction, isAsync } of processors ) {
53+ describe ( `${ name } SQS FIFO batch processing` , ( ) => {
54+ it ( 'completes processing with no failures' , async ( ) => {
55+ // Prepare
56+ const firstRecord = sqsRecordFactory ( 'success' ) ;
57+ const secondRecord = sqsRecordFactory ( 'success' ) ;
58+ const event = { Records : [ firstRecord , secondRecord ] } ;
59+ const processor = new processorClass ( ) ;
4160
42- it ( 'completes processing with some failures' , async ( ) => {
43- // Prepare
44- const firstRecord = sqsRecordFactory ( 'success' ) ;
45- const secondRecord = sqsRecordFactory ( 'fail' ) ;
46- const thirdRecord = sqsRecordFactory ( 'success' ) ;
47- const event = { Records : [ firstRecord , secondRecord , thirdRecord ] } ;
48- const processor = new SqsFifoPartialProcessor ( ) ;
49-
50- // Act
51- const result = processPartialResponseSync (
52- event ,
53- sqsRecordHandler ,
54- processor
55- ) ;
56-
57- // Assess
58- expect ( result . batchItemFailures . length ) . toBe ( 2 ) ;
59- expect ( result . batchItemFailures [ 0 ] . itemIdentifier ) . toBe (
60- secondRecord . messageId
61- ) ;
62- expect ( result . batchItemFailures [ 1 ] . itemIdentifier ) . toBe (
63- thirdRecord . messageId
64- ) ;
65- expect ( processor . errors [ 1 ] ) . toBeInstanceOf ( SqsFifoShortCircuitError ) ;
66- } ) ;
61+ // Act
62+ const result = isAsync
63+ ? await processFunction ( event , sqsRecordHandler , processor )
64+ : ( processFunction (
65+ event ,
66+ sqsRecordHandler ,
67+ processor
68+ ) as PartialItemFailureResponse ) ;
6769
68- it ( 'continues processing and moves to the next group when `skipGroupOnError` is true' , ( ) => {
69- // Prepare
70- const firstRecord = sqsRecordFactory ( 'fail' , '1' ) ;
71- const secondRecord = sqsRecordFactory ( 'success' , '1' ) ;
72- const thirdRecord = sqsRecordFactory ( 'fail' , '2' ) ;
73- const fourthRecord = sqsRecordFactory ( 'success' , '2' ) ;
74- const fifthRecord = sqsRecordFactory ( 'success' , '3' ) ;
75- const event = {
76- Records : [
77- firstRecord ,
78- secondRecord ,
79- thirdRecord ,
80- fourthRecord ,
81- fifthRecord ,
82- ] ,
83- } ;
84- const processor = new SqsFifoPartialProcessor ( ) ;
85-
86- // Act
87- const result = processPartialResponseSync (
88- event ,
89- sqsRecordHandler ,
90- processor ,
91- {
92- skipGroupOnError : true ,
93- }
94- ) ;
95-
96- // Assess
97- expect ( result . batchItemFailures . length ) . toBe ( 4 ) ;
98- expect ( result . batchItemFailures [ 0 ] . itemIdentifier ) . toBe (
99- firstRecord . messageId
100- ) ;
101- expect ( result . batchItemFailures [ 1 ] . itemIdentifier ) . toBe (
102- secondRecord . messageId
103- ) ;
104- expect ( result . batchItemFailures [ 2 ] . itemIdentifier ) . toBe (
105- thirdRecord . messageId
106- ) ;
107- expect ( result . batchItemFailures [ 3 ] . itemIdentifier ) . toBe (
108- fourthRecord . messageId
109- ) ;
110- expect ( processor . errors . length ) . toBe ( 4 ) ;
111- expect ( processor . errors [ 1 ] ) . toBeInstanceOf (
112- SqsFifoMessageGroupShortCircuitError
113- ) ;
114- expect ( processor . errors [ 3 ] ) . toBeInstanceOf (
115- SqsFifoMessageGroupShortCircuitError
116- ) ;
117- } ) ;
70+ // Assess
71+ expect ( result . batchItemFailures ) . toStrictEqual ( [ ] ) ;
72+ } ) ;
73+
74+ it ( 'completes processing with some failures' , async ( ) => {
75+ // Prepare
76+ const firstRecord = sqsRecordFactory ( 'success' ) ;
77+ const secondRecord = sqsRecordFactory ( 'fail' ) ;
78+ const thirdRecord = sqsRecordFactory ( 'success' ) ;
79+ const event = { Records : [ firstRecord , secondRecord , thirdRecord ] } ;
80+ const processor = new processorClass ( ) ;
81+
82+ // Act
83+ const result = isAsync
84+ ? await processFunction ( event , sqsRecordHandler , processor )
85+ : ( processFunction (
86+ event ,
87+ sqsRecordHandler ,
88+ processor
89+ ) as PartialItemFailureResponse ) ;
11890
119- it ( 'short circuits on the first failure when `skipGroupOnError` is false' , ( ) => {
120- // Prepare
121- const firstRecord = sqsRecordFactory ( 'success' , '1' ) ;
122- const secondRecord = sqsRecordFactory ( 'fail' , '2' ) ;
123- const thirdRecord = sqsRecordFactory ( 'success' , '3' ) ;
124- const fourthRecord = sqsRecordFactory ( 'success' , '4' ) ;
125- const event = {
126- Records : [ firstRecord , secondRecord , thirdRecord , fourthRecord ] ,
127- } ;
128- const processor = new SqsFifoPartialProcessor ( ) ;
129-
130- // Act
131- const result = processPartialResponseSync (
132- event ,
133- sqsRecordHandler ,
134- processor ,
135- {
136- skipGroupOnError : false ,
137- }
138- ) ;
139-
140- // Assess
141- expect ( result . batchItemFailures . length ) . toBe ( 3 ) ;
142- expect ( result . batchItemFailures [ 0 ] . itemIdentifier ) . toBe (
143- secondRecord . messageId
144- ) ;
145- expect ( result . batchItemFailures [ 1 ] . itemIdentifier ) . toBe (
146- thirdRecord . messageId
147- ) ;
148- expect ( result . batchItemFailures [ 2 ] . itemIdentifier ) . toBe (
149- fourthRecord . messageId
150- ) ;
151- expect ( processor . errors . length ) . toBe ( 3 ) ;
152- expect ( processor . errors [ 1 ] ) . toBeInstanceOf ( SqsFifoShortCircuitError ) ;
91+ // Assess
92+ expect ( result . batchItemFailures . length ) . toBe ( 2 ) ;
93+ expect ( result . batchItemFailures [ 0 ] . itemIdentifier ) . toBe (
94+ secondRecord . messageId
95+ ) ;
96+ expect ( result . batchItemFailures [ 1 ] . itemIdentifier ) . toBe (
97+ thirdRecord . messageId
98+ ) ;
99+ expect ( processor . errors [ 1 ] ) . toBeInstanceOf ( SqsFifoShortCircuitError ) ;
100+ } ) ;
101+
102+ it ( 'continues processing and moves to the next group when `skipGroupOnError` is true' , async ( ) => {
103+ // Prepare
104+ const firstRecord = sqsRecordFactory ( 'fail' , '1' ) ;
105+ const secondRecord = sqsRecordFactory ( 'success' , '1' ) ;
106+ const thirdRecord = sqsRecordFactory ( 'fail' , '2' ) ;
107+ const fourthRecord = sqsRecordFactory ( 'success' , '2' ) ;
108+ const fifthRecord = sqsRecordFactory ( 'success' , '3' ) ;
109+ const event = {
110+ Records : [
111+ firstRecord ,
112+ secondRecord ,
113+ thirdRecord ,
114+ fourthRecord ,
115+ fifthRecord ,
116+ ] ,
117+ } ;
118+ const processor = new processorClass ( ) ;
119+
120+ // Act
121+ const result = isAsync
122+ ? await processFunction ( event , sqsRecordHandler , processor , {
123+ skipGroupOnError : true ,
124+ } )
125+ : ( processFunction ( event , sqsRecordHandler , processor , {
126+ skipGroupOnError : true ,
127+ } ) as PartialItemFailureResponse ) ;
128+
129+ // Assess
130+ expect ( result . batchItemFailures . length ) . toBe ( 4 ) ;
131+ expect ( result . batchItemFailures [ 0 ] . itemIdentifier ) . toBe (
132+ firstRecord . messageId
133+ ) ;
134+ expect ( result . batchItemFailures [ 1 ] . itemIdentifier ) . toBe (
135+ secondRecord . messageId
136+ ) ;
137+ expect ( result . batchItemFailures [ 2 ] . itemIdentifier ) . toBe (
138+ thirdRecord . messageId
139+ ) ;
140+ expect ( result . batchItemFailures [ 3 ] . itemIdentifier ) . toBe (
141+ fourthRecord . messageId
142+ ) ;
143+ expect ( processor . errors . length ) . toBe ( 4 ) ;
144+ expect ( processor . errors [ 1 ] ) . toBeInstanceOf (
145+ SqsFifoMessageGroupShortCircuitError
146+ ) ;
147+ expect ( processor . errors [ 3 ] ) . toBeInstanceOf (
148+ SqsFifoMessageGroupShortCircuitError
149+ ) ;
150+ } ) ;
151+
152+ it ( 'short circuits on the first failure when `skipGroupOnError` is false' , async ( ) => {
153+ // Prepare
154+ const firstRecord = sqsRecordFactory ( 'success' , '1' ) ;
155+ const secondRecord = sqsRecordFactory ( 'fail' , '2' ) ;
156+ const thirdRecord = sqsRecordFactory ( 'success' , '3' ) ;
157+ const fourthRecord = sqsRecordFactory ( 'success' , '4' ) ;
158+ const event = {
159+ Records : [ firstRecord , secondRecord , thirdRecord , fourthRecord ] ,
160+ } ;
161+ const processor = new processorClass ( ) ;
162+
163+ // Act
164+ const result = isAsync
165+ ? await processFunction ( event , sqsRecordHandler , processor , {
166+ skipGroupOnError : false ,
167+ } )
168+ : ( processFunction ( event , sqsRecordHandler , processor , {
169+ skipGroupOnError : false ,
170+ } ) as PartialItemFailureResponse ) ;
171+
172+ // Assess
173+ expect ( result . batchItemFailures . length ) . toBe ( 3 ) ;
174+ expect ( result . batchItemFailures [ 0 ] . itemIdentifier ) . toBe (
175+ secondRecord . messageId
176+ ) ;
177+ expect ( result . batchItemFailures [ 1 ] . itemIdentifier ) . toBe (
178+ thirdRecord . messageId
179+ ) ;
180+ expect ( result . batchItemFailures [ 2 ] . itemIdentifier ) . toBe (
181+ fourthRecord . messageId
182+ ) ;
183+ expect ( processor . errors . length ) . toBe ( 3 ) ;
184+ expect ( processor . errors [ 1 ] ) . toBeInstanceOf ( SqsFifoShortCircuitError ) ;
185+ } ) ;
153186 } ) ;
154- } ) ;
187+ }
155188} ) ;
0 commit comments