54 lines
2.1 KiB
TypeScript
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");
|
|
});
|
|
});
|