muse-agent-example/web/tests/交互/切作品隔离.test.tsx
zizi 98530437f2 W11 编辑器、动态表单与人审工作台:编辑器、动态表单与人审工作台(确认前正文不落正式库)。
按 R2 串行阶段整理提交;包内文件为该阶段交付(含后续小增量),状态以工作包清单为准。
2026-09-10 19:25:41 +08:00

77 lines
2.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/** 组件传输替身只验证迟到响应,不作为真实后端旅程证据。 */
import { afterEach, expect, it, vi } from "vitest";
import {
fireEvent,
render,
screen,
waitFor,
cleanup,
} from "@testing-library/react";
import { Ui依赖装配 } from "../../src/应用/依赖装配";
import { Ui任务列表 } from "../../src/功能/任务运行/任务列表";
const taskA = {
task_id: "task-A",
work_id: "A",
task_type: "甲的任务",
state: "queued",
last_sequence: 1,
steps: [],
};
const taskB = {
...taskA,
task_id: "task-B",
work_id: "B",
task_type: "乙的任务",
};
afterEach(() => {
cleanup();
vi.unstubAllGlobals();
});
it("NC-ui-work-scope:切作品后迟到响应不覆盖当前作品", async () => {
let finishA!: (response: Response) => void;
const delayed = new Promise<Response>((resolve) => {
finishA = resolve;
});
vi.stubGlobal(
"fetch",
vi.fn(async (request: Request) => {
const work = new URL(request.url).searchParams.get("work_id");
if (work === "A") return delayed;
return new Response(
JSON.stringify(work === "B" ? [taskB] : [taskA, taskB]),
{ headers: { "Content-Type": "application/json" } },
);
}),
);
render(
<Ui依赖装配>
<Ui任务列表 />
</Ui依赖装配>,
);
await screen.findByRole("button", { name: /甲的任务/ });
fireEvent.change(screen.getByLabelText("作品范围"), {
target: { value: "A" },
});
await waitFor(() =>
expect(fetch).toHaveBeenCalledWith(
expect.objectContaining({ url: expect.stringContaining("work_id=A") }),
),
);
fireEvent.change(screen.getByLabelText("作品范围"), {
target: { value: "B" },
});
await screen.findByRole("button", { name: /乙的任务/ });
finishA(
new Response(JSON.stringify([taskA]), {
headers: { "Content-Type": "application/json" },
}),
);
await waitFor(() =>
expect(screen.queryByRole("button", { name: /甲的任务/ })).toBeNull(),
);
expect(screen.getByRole("button", { name: /乙的任务/ })).toBeTruthy();
});