2026-03-22 19:07:07 +00:00
|
|
|
import "@testing-library/jest-dom";
|
|
|
|
|
import { beforeEach, vi } from "vitest";
|
|
|
|
|
|
2026-04-28 17:05:53 +00:00
|
|
|
// Default WebSocket stub: every `new WebSocket(...)` immediately fires
|
|
|
|
|
// `onerror` + `onclose` on the next microtask. Without this, `rpcCall` from
|
|
|
|
|
// `./api/rpc` (added by 770's HTTP→read-RPC migration) opens a real jsdom
|
|
|
|
|
// WebSocket that hangs ~9s before firing its connection-failure error,
|
|
|
|
|
// making any test that mounts a component calling `listAgents()` time out.
|
|
|
|
|
// Tests that need real WS responses should override per-test with
|
|
|
|
|
// `vi.stubGlobal("WebSocket", ...)`.
|
|
|
|
|
class FailingWebSocket {
|
|
|
|
|
onopen: ((ev: Event) => void) | null = null;
|
|
|
|
|
onmessage: ((ev: MessageEvent) => void) | null = null;
|
|
|
|
|
onerror: ((ev: Event) => void) | null = null;
|
|
|
|
|
onclose: ((ev: CloseEvent) => void) | null = null;
|
|
|
|
|
readyState = 0;
|
|
|
|
|
constructor(_url: string) {
|
|
|
|
|
queueMicrotask(() => {
|
|
|
|
|
this.readyState = 3;
|
|
|
|
|
this.onerror?.(new Event("error"));
|
|
|
|
|
this.onclose?.(new CloseEvent("close"));
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
send(_data: string) {}
|
|
|
|
|
close() {}
|
|
|
|
|
}
|
|
|
|
|
vi.stubGlobal("WebSocket", FailingWebSocket);
|
|
|
|
|
|
2026-03-22 19:07:07 +00:00
|
|
|
// Provide a default fetch mock so components that call API endpoints on mount
|
|
|
|
|
// don't throw URL-parse errors in the jsdom test environment. Tests that need
|
|
|
|
|
// specific responses should mock the relevant `api.*` method as usual.
|
|
|
|
|
beforeEach(() => {
|
|
|
|
|
vi.stubGlobal(
|
|
|
|
|
"fetch",
|
|
|
|
|
vi.fn((input: string | URL | Request) => {
|
|
|
|
|
const url = typeof input === "string" ? input : input.toString();
|
|
|
|
|
// Endpoints that return arrays need [] not {} to avoid "not iterable" errors.
|
2026-04-28 15:31:29 +00:00
|
|
|
const arrayEndpoints = ["/agents/config"];
|
2026-03-22 19:07:07 +00:00
|
|
|
const body = arrayEndpoints.some((ep) => url.endsWith(ep))
|
|
|
|
|
? JSON.stringify([])
|
|
|
|
|
: JSON.stringify({});
|
|
|
|
|
return Promise.resolve(new Response(body, { status: 200 }));
|
|
|
|
|
}),
|
|
|
|
|
);
|
|
|
|
|
});
|