import { afterEach, describe, expect, it, vi } from "vitest"; import * as provider from "@/lib/storage/providers/server-http.js"; afterEach(() => vi.unstubAllGlobals()); describe("server HTTP investigation provider", () => { it("maps save, load, list, and restart to authenticated investigation API paths", async () => { const fetch = vi.fn() .mockResolvedValueOnce({ ok: true, json: async () => ({ snapshot: { id: "inv/a" } }) }) .mockResolvedValueOnce({ ok: true, json: async () => ({ snapshot: { id: "inv/a" } }) }) .mockResolvedValueOnce({ ok: true, json: async () => ({ investigations: [] }) }) .mockResolvedValueOnce({ ok: true, json: async () => ({ snapshot: { id: "inv/a" } }) }); vi.stubGlobal("fetch", fetch); await expect(provider.saveInvestigation({ id: "inv/a" }, "inv/a")).resolves.toEqual({ id: "inv/a" }); await expect(provider.loadInvestigation("inv/a")).resolves.toEqual({ id: "inv/a" }); await expect(provider.listInvestigations()).resolves.toEqual([]); await expect(provider.restartInvestigation("inv/a")).resolves.toEqual({ id: "inv/a" }); expect(fetch).toHaveBeenNthCalledWith(1, "/api/investigations", expect.objectContaining({ method: "POST", body: JSON.stringify({ id: "inv/a", snapshot: { id: "inv/a" } }), })); expect(fetch).toHaveBeenNthCalledWith(2, "/api/investigations/inv%2Fa"); expect(fetch).toHaveBeenNthCalledWith(3, "/api/investigations", undefined); expect(fetch).toHaveBeenNthCalledWith(4, "/api/investigations/inv%2Fa/restart", { method: "POST" }); }); it("returns null for a missing investigation (HTTP 404) rather than throwing", async () => { vi.stubGlobal("fetch", vi.fn().mockResolvedValue({ ok: false, status: 404, json: async () => ({ error: "Investigation not found" }) })); await expect(provider.loadInvestigation("inv/missing")).resolves.toBeNull(); }); it("surfaces API failures rather than returning an empty result", async () => { vi.stubGlobal("fetch", vi.fn().mockResolvedValue({ ok: false, status: 500, json: async () => ({ error: "Unauthorized" }) })); await expect(provider.listInvestigations()).rejects.toThrow("Unauthorized"); }); });