From 4c07a2655d1c6780df9641a5500f28e9c1458bc8 Mon Sep 17 00:00:00 2001 From: Marcus Schiesser Date: Mon, 30 Sep 2024 13:13:59 +0700 Subject: [PATCH] text: add cycle test (#1270) --- packages/core/tests/workflow.test.ts | 37 ++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/packages/core/tests/workflow.test.ts b/packages/core/tests/workflow.test.ts index c28770e128..72bfa538e9 100644 --- a/packages/core/tests/workflow.test.ts +++ b/packages/core/tests/workflow.test.ts @@ -193,4 +193,41 @@ describe("Workflow", () => { expect(duration).toBeLessThan(200); expect(result.data.result).toBe("Step 2 completed"); }); + + test("workflow with two concurrent cyclic steps", async () => { + const concurrentCyclicFlow = new Workflow({ verbose: true }); + + class Step1Event extends WorkflowEvent {} + class Step2Event extends WorkflowEvent {} + + let step2Count = 0; + + const step1 = vi.fn(async (_context, ev: StartEvent | Step1Event) => { + await new Promise((resolve) => setTimeout(resolve, 1000)); + return new Step1Event({ result: "Step 1 completed" }); + }); + + const step2 = vi.fn(async (_context, ev: StartEvent | Step2Event) => { + await new Promise((resolve) => setTimeout(resolve, 100)); + step2Count++; + if (step2Count >= 5) { + return new StopEvent({ result: "Step 2 completed 5 times" }); + } + return new Step2Event({ result: "Step 2 completed" }); + }); + + concurrentCyclicFlow.addStep([StartEvent, Step1Event], step1); + concurrentCyclicFlow.addStep([StartEvent, Step2Event], step2); + + const startTime = new Date(); + const result = await concurrentCyclicFlow.run("start"); + const endTime = new Date(); + const duration = endTime.getTime() - startTime.getTime(); + + expect(step1).toHaveBeenCalledTimes(1); + expect(step2).toHaveBeenCalledTimes(5); + expect(duration).toBeGreaterThan(500); // At least 5 * 100ms for step2 + expect(duration).toBeLessThan(1000); // Less than 1 second + expect(result.data.result).toBe("Step 2 completed 5 times"); + }); });