release: WRNexusJS 0.8.0
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
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");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user