diff --git a/agent-studio-mini/apps/web/tests/app.test.tsx b/agent-studio-mini/apps/web/tests/app.test.tsx index c00ecf0..8a93c8b 100644 --- a/agent-studio-mini/apps/web/tests/app.test.tsx +++ b/agent-studio-mini/apps/web/tests/app.test.tsx @@ -3,6 +3,7 @@ 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 () => { @@ -20,7 +21,8 @@ describe("App", () => { set onmessage(_: unknown) {} } as unknown as typeof EventSource; render(); - expect(screen.getByText("Skills Catalog")).toBeInTheDocument(); + expect(screen.getByText("Beryl Agent")).toBeInTheDocument(); + expect(screen.getByText("技能目录")).toBeInTheDocument(); expect(screen.getByText("AGENT LOOP")).toBeInTheDocument(); expect(screen.getByText("运行阶段")).toBeInTheDocument(); expect(screen.getByText("工具任务")).toBeInTheDocument(); @@ -43,12 +45,14 @@ describe("App", () => { ) 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; @@ -76,5 +80,22 @@ describe("App", () => { "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(); }); });