Files
short-video-viral-replicator/agent-studio-mini/apps/web/tests/app.test.tsx
T

102 lines
4.6 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, 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();
});
});