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(){} }; 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(); expect(screen.getByText("Skills Catalog")).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; global.EventSource = class { close() {} set onmessage(_: unknown) {} addEventListener(type: string, listener: EventListenerOrEventListenerObject) { if (type === "tool.completed") reportListener = listener as (event: MessageEvent) => void; } } as unknown as typeof EventSource; render(); 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", ); }); });