import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; const mocks = vi.hoisted(() => ({ loadConfig: vi.fn(() => ({ gateway: { auth: { token: "loopback-token", }, }, })), })); vi.mock("../config/config.js", async (importOriginal) => { const actual = await importOriginal(); return { ...actual, loadConfig: mocks.loadConfig, }; }); vi.mock("./control-service.js", () => ({ createBrowserControlContext: vi.fn(() => ({})), startBrowserControlServiceFromConfig: vi.fn(async () => ({ ok: true })), })); vi.mock("./routes/dispatcher.js", () => ({ createBrowserRouteDispatcher: vi.fn(() => ({ dispatch: vi.fn(async () => ({ status: 200, body: { ok: true } })), })), })); import { fetchBrowserJson } from "./client-fetch.js"; describe("fetchBrowserJson loopback auth", () => { beforeEach(() => { vi.restoreAllMocks(); mocks.loadConfig.mockReset(); mocks.loadConfig.mockReturnValue({ gateway: { auth: { token: "loopback-token", }, }, }); }); afterEach(() => { vi.unstubAllGlobals(); }); it("adds bearer auth for loopback absolute HTTP URLs", async () => { const fetchMock = vi.fn( async () => new Response(JSON.stringify({ ok: true }), { status: 200, headers: { "Content-Type": "application/json" }, }), ); vi.stubGlobal("fetch", fetchMock); const res = await fetchBrowserJson<{ ok: boolean }>("http://127.0.0.1:18888/"); expect(res.ok).toBe(true); const init = fetchMock.mock.calls[0]?.[1] as RequestInit; const headers = new Headers(init?.headers); expect(headers.get("authorization")).toBe("Bearer loopback-token"); }); it("does not inject auth for non-loopback absolute URLs", async () => { const fetchMock = vi.fn( async () => new Response(JSON.stringify({ ok: true }), { status: 200, headers: { "Content-Type": "application/json" }, }), ); vi.stubGlobal("fetch", fetchMock); await fetchBrowserJson<{ ok: boolean }>("http://example.com/"); const init = fetchMock.mock.calls[0]?.[1] as RequestInit; const headers = new Headers(init?.headers); expect(headers.get("authorization")).toBeNull(); }); it("keeps caller-supplied auth header", async () => { const fetchMock = vi.fn( async () => new Response(JSON.stringify({ ok: true }), { status: 200, headers: { "Content-Type": "application/json" }, }), ); vi.stubGlobal("fetch", fetchMock); await fetchBrowserJson<{ ok: boolean }>("http://localhost:18888/", { headers: { Authorization: "Bearer caller-token", }, }); const init = fetchMock.mock.calls[0]?.[1] as RequestInit; const headers = new Headers(init?.headers); expect(headers.get("authorization")).toBe("Bearer caller-token"); }); });