Skip to content

Commit d3a9d33

Browse files
author
Max Gruenfelder
committed
add tests for general
1 parent c9863d3 commit d3a9d33

File tree

3 files changed

+85
-14
lines changed

3 files changed

+85
-14
lines changed

src/outbox/EventQueueGenericOutboxHandler.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,10 @@ class EventQueueGenericOutboxHandler extends EventQueueBaseClass {
381381
return;
382382
}
383383

384+
if (req.event.endsWith(EVENT_QUEUE_ACTIONS.SAGA_SUCCESS) || req.event.endsWith(EVENT_QUEUE_ACTIONS.SAGA_FAILED)) {
385+
return;
386+
}
387+
384388
// NOTE: required for #failed because tx is rolledback and new events would not be commmited!
385389
const tx = cds.tx(processContext);
386390
const nextEvents = tx._eventQueue?.events;

test/asset/outboxProject/srv/service/saga-service.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,46 @@ class StandardService extends cds.Service {
1919
};
2020
});
2121

22+
this.on("general", (req) => {
23+
cds.log(this.name).info(req.event, {
24+
data: req.data,
25+
user: req.user.id,
26+
error: req.data.error,
27+
});
28+
29+
return {
30+
status: req.data.status ?? 2,
31+
...(req.data.nextData && { nextData: req.data.nextData }),
32+
...(req.data.errorMessage && { error: new Error(req.data.errorMessage) }),
33+
};
34+
});
35+
36+
this.on("#succeeded", (req) => {
37+
cds.log(this.name).info(req.event, {
38+
data: req.data,
39+
user: req.user.id,
40+
error: req.data.error,
41+
});
42+
43+
return {
44+
status: req.data.status ?? 2,
45+
...(req.data.errorMessage && { error: new Error(req.data.errorMessage) }),
46+
};
47+
});
48+
49+
this.on("#failed", (req) => {
50+
cds.log(this.name).info(req.event, {
51+
data: req.data,
52+
user: req.user.id,
53+
error: req.data.error,
54+
});
55+
56+
return {
57+
status: 2,
58+
...(req.data.errorMessage && { error: new Error(req.data.errorMessage) }),
59+
};
60+
});
61+
2262
this.on("specific", (req) => {
2363
cds.log(this.name).info(req.event, {
2464
data: req.data,

test/eventQueueOutbox.test.js

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
const { promisify } = require("util");
44
const otel = require("@opentelemetry/api");
55
jest.mock("@opentelemetry/api", () => require("./mocks/openTelemetry"));
6+
jest.mock("@cap-js-community/common", () => {
7+
return {
8+
RedisClient: { create: () => ({}) },
9+
};
10+
});
611
const { Logger: mockLogger } = require("./mocks/logger");
712
const loggerMock = mockLogger();
813

@@ -2536,20 +2541,6 @@ describe("event-queue outbox", () => {
25362541
expect(loggerMock.callsLengths().error).toEqual(0);
25372542
config.insertEventsBeforeCommit = true;
25382543
});
2539-
2540-
// it.skip("how to deal with specific event configuration srv.actionName", async () => {
2541-
// const service = await cds.connect.to("Saga");
2542-
// await service.send("saga");
2543-
// await commitAndOpenNew();
2544-
// await processEventQueue(tx.context, "CAP_OUTBOX", service.name);
2545-
// const [done, next] = await testHelper.selectEventQueueAndReturn(tx, {
2546-
// expectedLength: 2,
2547-
// additionalColumns: ["payload", "status"],
2548-
// });
2549-
// expect(JSON.parse(done.payload)).toMatchObject({});
2550-
// expect(JSON.parse(done.payload)).toMatchObject({});
2551-
// expect(loggerMock.callsLengths().error).toEqual(0);
2552-
// });
25532544
});
25542545

25552546
describe("provide next data", () => {
@@ -2635,6 +2626,42 @@ describe("event-queue outbox", () => {
26352626
expect(loggerMock.callsLengths().error).toEqual(0);
26362627
});
26372628
});
2629+
2630+
describe("general handlers", () => {
2631+
it("if succeeded handler exists and event is green, trigger next event", async () => {
2632+
const service = await cds.connect.to("Saga");
2633+
await service.send("general", {});
2634+
await commitAndOpenNew();
2635+
await processEventQueue(tx.context, "CAP_OUTBOX", service.name);
2636+
const [done, next] = await testHelper.selectEventQueueAndReturn(tx, {
2637+
expectedLength: 2,
2638+
additionalColumns: ["payload"],
2639+
});
2640+
expect(JSON.parse(done.payload)).toMatchObject({ event: "general" });
2641+
expect(done.status).toEqual(EventProcessingStatus.Done);
2642+
2643+
expect(JSON.parse(next.payload)).toMatchObject({ event: "#succeeded" });
2644+
expect(next.status).toEqual(EventProcessingStatus.Done);
2645+
expect(loggerMock.callsLengths().error).toEqual(0);
2646+
});
2647+
2648+
it("if failed handler exists and event is red, trigger next event", async () => {
2649+
const service = await cds.connect.to("Saga");
2650+
await service.send("general", { status: EventProcessingStatus.Error });
2651+
await commitAndOpenNew();
2652+
await processEventQueue(tx.context, "CAP_OUTBOX", service.name);
2653+
const [done, next] = await testHelper.selectEventQueueAndReturn(tx, {
2654+
expectedLength: 2,
2655+
additionalColumns: ["payload", "lastAttemptTimestamp"],
2656+
});
2657+
expect(JSON.parse(done.payload)).toMatchObject({ event: "general" });
2658+
expect(done.status).toEqual(EventProcessingStatus.Error);
2659+
2660+
expect(JSON.parse(next.payload)).toMatchObject({ event: "#failed" });
2661+
expect(next.status).toEqual(EventProcessingStatus.Done);
2662+
expect(loggerMock.callsLengths().error).toEqual(0);
2663+
});
2664+
});
26382665
});
26392666
});
26402667

0 commit comments

Comments
 (0)