Add Beryl Agent and harness source
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
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",
|
||||
);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user