import { describe, expect, it, vi } from "vitest"; import type { HarnessApi } from "../src/api/harness-api.js"; import { HarnessClientStore } from "../src/store/harness-client-store.js"; describe("HarnessClientStore lifecycle", () => { it("deletes the current session and can start a fresh session after dispose", async () => { const createSession = vi.fn() .mockResolvedValueOnce({ sessionId: "ses_1", requestId: "req_1" }) .mockResolvedValueOnce({ sessionId: "ses_2", requestId: "req_2" }); const deleteSession = vi.fn().mockResolvedValue({ deleted: true, requestId: "req_delete" }); const api = { createSession, deleteSession, getSkills: vi.fn().mockResolvedValue({ skills: [], requestId: "req_skills" }), eventsUrl: (sessionId: string) => `/api/sessions/${sessionId}/events`, } as unknown as HarnessApi; const eventSources: Array<{ close: ReturnType }> = []; const store = new HarnessClientStore(api, () => { const source = { addEventListener: vi.fn(), close: vi.fn() }; eventSources.push(source); return source; }); await store.start(); expect(store.getSnapshot().sessionId).toBe("ses_1"); await store.dispose(); await store.start(); expect(deleteSession).toHaveBeenCalledWith("ses_1"); expect(createSession).toHaveBeenCalledTimes(2); expect(eventSources[0]?.close).toHaveBeenCalledTimes(1); expect(store.getSnapshot().sessionId).toBe("ses_2"); }); });