Files
fusion/packages/dashboard/app/hooks/__tests__/useBackgroundSessions.resume-instrumentation.test.ts
Fusion (runfusion.ai) 854045f430 feat(FN-5416): instrument SSE stream resume events across PR checks, dev-se
Adds structured stream-resume instrumentation to the dashboard across four SSE hooks (PR checks, dev-server logs, research, background sessions), wiring `[wake-trigger-diagnostics]` log markers and view-resume route guards so the engine can distinguish cold starts from resume paths; includes tests f

Fusion-Task-Id: FN-5416
2026-05-21 18:15:26 -07:00

74 lines
2.0 KiB
TypeScript

import { act, renderHook, waitFor } from "@testing-library/react";
import { beforeEach, describe, expect, it, vi } from "vitest";
const recordResumeEvent = vi.fn();
const subscribeSse = vi.fn();
const requestSync = vi.fn();
const broadcastUpdate = vi.fn();
const broadcastCompleted = vi.fn();
vi.mock("../../utils/resumeInstrumentation", () => ({
recordResumeEvent,
}));
vi.mock("../../sse-bus", () => ({
subscribeSse,
}));
vi.mock("../useAiSessionSync", () => ({
useAiSessionSync: () => ({
sessions: new Map(),
requestSync,
broadcastUpdate,
broadcastCompleted,
}),
}));
vi.mock("../../api", () => ({
fetchAiSessions: vi.fn().mockResolvedValue([]),
deleteAiSession: vi.fn(),
cancelPlanning: vi.fn(),
cancelSubtaskBreakdown: vi.fn(),
cancelMissionInterview: vi.fn(),
}));
describe("useBackgroundSessions resume instrumentation", () => {
beforeEach(() => {
recordResumeEvent.mockReset();
subscribeSse.mockReset();
requestSync.mockReset();
});
it("emits sse-open and reconnect instrumentation, then refreshes", async () => {
const { fetchAiSessions } = await import("../../api");
const mockFetch = vi.mocked(fetchAiSessions);
let reconnect: (() => void) | undefined;
subscribeSse.mockImplementation((_url, handlers) => {
reconnect = handlers.onReconnect;
return () => {};
});
const { useBackgroundSessions } = await import("../useBackgroundSessions");
renderHook(() => useBackgroundSessions("proj-1"));
await waitFor(() => {
expect(recordResumeEvent).toHaveBeenCalledWith(expect.objectContaining({
view: "useBackgroundSessions",
trigger: "sse-open",
sseChannel: "/api/events?projectId=proj-1",
}));
});
mockFetch.mockClear();
act(() => reconnect?.());
await waitFor(() => expect(mockFetch).toHaveBeenCalled());
expect(recordResumeEvent).toHaveBeenCalledWith(expect.objectContaining({
view: "useBackgroundSessions",
trigger: "sse-reconnect",
sseChannel: "/api/events?projectId=proj-1",
}));
});
});