81 lines
2.7 KiB
TypeScript
81 lines
2.7 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(){} };
|
|
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("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(<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",
|
|
);
|
|
});
|
|
});
|