Skip to content

Commit ae5c3ce

Browse files
committed
test: refactor SqsFifoPartialProcessor & SqsFifoPartialProcessorAsync tests
1 parent f561c1c commit ae5c3ce

File tree

2 files changed

+162
-284
lines changed

2 files changed

+162
-284
lines changed

packages/batch/tests/unit/SqsFifoPartialProcessor.test.ts

Lines changed: 162 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,42 @@ import { afterAll, beforeEach, describe, expect, it, vi } from 'vitest';
22
import {
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';
811
import { sqsRecordFactory } from '../helpers/factories.js';
912
import { 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

Comments
 (0)