Files
WRNexusJS/packages/queue/test/workflow.test.ts
Clintchiz 586a6db8ff
Quality / quality (ubuntu-latest) (push) Failing after 21s
Quality / quality (windows-latest) (push) Canceled after 0s
release: WRNexusJS 0.8.0
2026-08-02 23:18:51 +05:30

54 lines
2.1 KiB
TypeScript

import { describe, expect, test } from "bun:test";
import { createWorkflowEngine, defineDurableWorkflow, memoryWorkflowStore } from "../src/index.ts";
describe("durable workflows", () => {
test("runs dependency steps and persists results", async () => {
const store = memoryWorkflowStore();
const engine = createWorkflowEngine(store);
const workflow = defineDurableWorkflow({
name: "report",
steps: [
{ name: "load", run: (input: number) => input * 2 },
{ name: "render", dependsOn: ["load"], run: (input: number) => `report:${input}` },
],
});
const result = await engine.start(workflow, 4, "report-1");
expect(result.status).toBe("completed");
expect(result.results.render).toBe("report:8");
expect((await store.get("report-1"))?.progress).toBe(100);
});
test("pauses for a durable human approval and resumes", async () => {
const engine = createWorkflowEngine();
const workflow = defineDurableWorkflow({
name: "publish",
steps: [
{ name: "draft", run: () => "ready" },
{ name: "approve", dependsOn: ["draft"], approval: true, run: (input: string) => input },
{ name: "publish", dependsOn: ["approve"], run: () => "published" },
],
});
const waiting = await engine.start(workflow, null, "publish-1");
expect(waiting).toMatchObject({ status: "waiting-approval", waitingFor: "approve" });
const completed = await engine.approve(workflow, "publish-1", "approve", "user-42");
expect(completed.status).toBe("completed");
expect(completed.results["approve:approval"]).toMatchObject({ actor: "user-42" });
});
test("rejects invalid dependency graphs", () => {
expect(() =>
defineDurableWorkflow({
name: "bad",
steps: [{ name: "a", dependsOn: ["missing"], run() {} }],
}),
).toThrow("WRN-WORKFLOW-DEPENDENCY");
expect(() =>
defineDurableWorkflow({
name: "cycle",
steps: [
{ name: "a", dependsOn: ["b"], run() {} },
{ name: "b", dependsOn: ["a"], run() {} },
],
}),
).toThrow("WRN-WORKFLOW-CYCLE");
});
});