Files
ttstd-infinite-canvas/web/test/storyboard-submission.test.ts
2026-09-14 01:11:56 +08:00

38 lines
2.3 KiB
TypeScript

import { expect, test } from "bun:test";
import { submitStoryboardTask } from "../src/services/storyboard-submission";
import { creationRuns, type CreationSubmission } from "../src/services/api/creation-runs";
import type { CreateTaskInput } from "../src/services/api/task-center";
const request = { type: "canvas_text", operation: "storyboard", projectId: "canvas", prompt: "剧本" } as CreateTaskInput;
function harness(expiresAt = "2099-01-01") {
const calls: string[] = [];
const run = { id: "run", executionEpoch: 1, executionOwner: "owner" };
const submission = { id: "quote", quote: { expiresAt } } as CreationSubmission;
const api = {
...creationRuns,
create: async () => ({ run, submissions: [] }), claim: async () => run,
prepare: async () => { calls.push("prepare"); return submission; },
approve: async () => { calls.push("approve"); return { submissions: [{ ...submission, approvedAt: "now" }] }; },
execute: async () => { calls.push("execute"); return { id: "task" }; },
release: async () => { calls.push("release"); return { released: true }; },
} as typeof creationRuns;
return { api, calls };
}
test("取消专业拆镜费用确认不会批准或提交任务", async () => {
const h = harness();
expect(await submitStoryboardTask(request, { signal: new AbortController().signal, assertCurrent() {}, confirm: async () => false }, h.api)).toBeUndefined();
expect(h.calls).toEqual(["prepare", "release"]);
});
test("确认后提交原报价对应的专业任务", async () => {
const h = harness();
expect((await submitStoryboardTask(request, { signal: new AbortController().signal, assertCurrent() {}, confirm: async () => true }, h.api))?.id).toBe("task");
expect(h.calls).toEqual(["prepare", "approve", "execute", "release"]);
});
test("过期报价或确认期间编辑分镜均阻止提交", async () => {
for (const changed of [false, true]) {
const h = harness(changed ? "2099-01-01" : "2000-01-01");
await expect(submitStoryboardTask(request, { signal: new AbortController().signal, assertCurrent() { if (changed) throw new Error("分镜已编辑"); }, confirm: async () => true }, h.api)).rejects.toThrow();
expect(h.calls).toEqual(["prepare", "release"]);
}
});