import { afterEach, describe, expect, it, vi } from "vitest"; import { deriveWsUrl, fetchBootstrap } from "@/lib/bootstrap"; describe("bootstrap helpers", () => { afterEach(() => { vi.useRealTimers(); vi.unstubAllGlobals(); }); it("prefers the server-provided websocket URL over the current dev host", () => { expect(deriveWsUrl("/", "tok en", "ws://127.0.0.1:8765/")).toBe( "ws://127.0.0.1:8765/?token=tok%20en", ); }); it("preserves the host socket bridge URL", () => { expect(deriveWsUrl("/", "tok en", "nanobot-host://engine/")).toBe( "nanobot-host://engine/?token=tok%20en", ); }); it("falls back to the current window host for legacy bootstrap payloads", () => { expect(deriveWsUrl("/", "tok")).toBe( "ws://localhost:3000/?token=tok", ); }); it("times out when the bootstrap endpoint never responds", async () => { vi.useFakeTimers(); vi.stubGlobal("fetch", vi.fn(() => new Promise(() => {}))); const pending = expect(fetchBootstrap("", "", 25)).rejects.toThrow( "Request timed out after 25ms", ); await vi.advanceTimersByTimeAsync(25); await pending; }); });