102 lines
4.6 KiB
TypeScript
102 lines
4.6 KiB
TypeScript
import { afterEach, describe, expect, it, vi } from "vitest";
|
||
import { act, cleanup, render, screen, waitFor } from "@testing-library/react";
|
||
import "@testing-library/jest-dom/vitest";
|
||
import { App } from "../src/App.js";
|
||
global.ResizeObserver = class { observe(){} unobserve(){} disconnect(){} };
|
||
HTMLElement.prototype.scrollTo = () => {};
|
||
afterEach(cleanup);
|
||
describe("App", () => {
|
||
it("renders three principal surfaces", async () => {
|
||
localStorage.clear();
|
||
const fetchMock = vi.fn(() =>
|
||
Promise.resolve({
|
||
json: () => Promise.resolve({ skills: [], sessionId: "s" }),
|
||
ok: true,
|
||
}),
|
||
);
|
||
global.fetch = fetchMock as unknown as typeof fetch;
|
||
global.EventSource = class {
|
||
close() {}
|
||
addEventListener() {}
|
||
set onmessage(_: unknown) {}
|
||
} as unknown as typeof EventSource;
|
||
render(<App />);
|
||
expect(screen.getByText("Beryl Agent")).toBeInTheDocument();
|
||
expect(screen.getByText("技能目录")).toBeInTheDocument();
|
||
expect(screen.getByText("AGENT LOOP")).toBeInTheDocument();
|
||
expect(screen.getByText("运行阶段")).toBeInTheDocument();
|
||
expect(screen.getByText("工具任务")).toBeInTheDocument();
|
||
expect(screen.getByLabelText("消息")).toBeInTheDocument();
|
||
await waitFor(() => expect(fetchMock).toHaveBeenCalledTimes(2));
|
||
});
|
||
|
||
it("shows a completed daily report image in the conversation", async () => {
|
||
localStorage.clear();
|
||
global.fetch = vi.fn((input: RequestInfo | URL) =>
|
||
Promise.resolve({
|
||
json: () =>
|
||
Promise.resolve(
|
||
String(input).includes("/api/skills")
|
||
? { skills: [] }
|
||
: { sessionId: "session-report" },
|
||
),
|
||
ok: true,
|
||
}),
|
||
) as unknown as typeof fetch;
|
||
|
||
let reportListener: ((event: MessageEvent) => void) | undefined;
|
||
let completedListener: ((event: MessageEvent) => void) | undefined;
|
||
global.EventSource = class {
|
||
close() {}
|
||
set onmessage(_: unknown) {}
|
||
addEventListener(type: string, listener: EventListenerOrEventListenerObject) {
|
||
if (type === "tool.completed")
|
||
reportListener = listener as (event: MessageEvent) => void;
|
||
if (type === "run.completed") completedListener = listener as (event: MessageEvent) => void;
|
||
}
|
||
} as unknown as typeof EventSource;
|
||
|
||
render(<App />);
|
||
await waitFor(() => expect(reportListener).toBeDefined());
|
||
act(() =>
|
||
reportListener?.({
|
||
data: JSON.stringify({
|
||
eventId: "evt-report",
|
||
runId: "run-report",
|
||
sessionId: "session-report",
|
||
sequence: 1,
|
||
timestamp: new Date().toISOString(),
|
||
type: "tool.completed",
|
||
payload: {
|
||
toolName: "save_report_image",
|
||
result: { details: { reportType: "daily" } },
|
||
},
|
||
}),
|
||
} as MessageEvent),
|
||
);
|
||
|
||
const image = await screen.findByRole("img", { name: "日报图片" });
|
||
expect(image).toHaveAttribute(
|
||
"src",
|
||
"/api/sessions/session-report/reports/daily?v=evt-report",
|
||
);
|
||
act(() => reportListener?.({ data: JSON.stringify({
|
||
eventId: "evt-ppt", runId: "run-ppt", sessionId: "session-report", sequence: 2,
|
||
timestamp: new Date().toISOString(), type: "tool.completed",
|
||
payload: { toolName: "generate_pptx", result: { details: { artifactId: "12345678-1234-1234-1234-123456789abc", title: "测试演示", deliveryAccepted: true } } },
|
||
}) } as MessageEvent));
|
||
expect(screen.queryByRole("link", { name: "测试演示 · 下载 PPTX" })).not.toBeInTheDocument();
|
||
act(() => completedListener?.({ data: JSON.stringify({ eventId: "evt-final", runId: "run-ppt", type: "run.completed", sequence: 3, timestamp: new Date().toISOString(),
|
||
payload: { delivery: { details: { artifactId: "12345678-1234-1234-1234-123456789abc", title: "测试演示", deliveryAccepted: true } } },
|
||
}) } as MessageEvent));
|
||
expect(await screen.findByRole("link", { name: "测试演示 · 下载 PPTX" })).toHaveAttribute("href", "/api/sessions/session-report/presentations/12345678-1234-1234-1234-123456789abc");
|
||
act(() => reportListener?.({ data: JSON.stringify({
|
||
eventId: "evt-document", runId: "run-document", sessionId: "session-report", sequence: 3,
|
||
timestamp: new Date().toISOString(), type: "tool.completed",
|
||
payload: { toolName: "save_report_draft" },
|
||
}) } as MessageEvent));
|
||
expect(await screen.findByRole("link", { name: "下载报告(Markdown)" })).toHaveAttribute("href", "/api/sessions/session-report/reports/document");
|
||
expect(screen.getByText("报告草稿已保存,等待交付验收")).toBeInTheDocument();
|
||
});
|
||
});
|