import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { DESKTOP_SERVER_URL_CHANGED_EVENT, DESKTOP_SERVER_URL_KEY, getDefaultDesktopServerUrl, getDesktopServerUrl, normalizeDesktopServerUrl, setDesktopServerUrl, shouldRequireDesktopServerUrl, } from "./desktopServerConfig"; const setTauriRuntime = (enabled: boolean) => { if (enabled) { Object.defineProperty(window, "isTauri", { value: true, configurable: true }); } else { Reflect.deleteProperty(window, "isTauri"); } }; const createMemoryStorage = (): Storage => { const store = new Map(); return { get length() { return store.size; }, clear: vi.fn(() => store.clear()), getItem: vi.fn((key: string) => store.get(key) ?? null), key: vi.fn((index: number) => Array.from(store.keys())[index] ?? null), removeItem: vi.fn((key: string) => store.delete(key)), setItem: vi.fn((key: string, value: string) => store.set(key, value)), }; }; beforeEach(() => { vi.stubEnv("VITE_DESKTOP_SERVER_URL", ""); Object.defineProperty(window, "localStorage", { value: createMemoryStorage(), configurable: true, }); }); afterEach(() => { window.localStorage.clear(); setTauriRuntime(false); vi.unstubAllEnvs(); }); describe("desktop server config", () => { it("normalizes server URLs to an origin with trailing slash", () => { expect(normalizeDesktopServerUrl("https://ctms.example.com/api")).toEqual({ ok: true, url: "https://ctms.example.com/", }); }); it("allows local HTTP but rejects non-local HTTP", () => { expect(normalizeDesktopServerUrl("http://localhost:8000")).toEqual({ ok: true, url: "http://localhost:8000/", }); expect(normalizeDesktopServerUrl("http://ctms.example.com").ok).toBe(false); }); it("stores valid desktop server URLs and emits a change event", () => { const listener = vi.fn(); window.addEventListener(DESKTOP_SERVER_URL_CHANGED_EVENT, listener); const result = setDesktopServerUrl("https://ctms.example.com"); expect(result).toEqual({ ok: true, url: "https://ctms.example.com/" }); expect(window.localStorage.getItem(DESKTOP_SERVER_URL_KEY)).toBe("https://ctms.example.com/"); expect(getDesktopServerUrl()).toBe("https://ctms.example.com/"); expect(listener).toHaveBeenCalledOnce(); }); it("uses the build-time default while allowing a persisted manual override", () => { vi.stubEnv("VITE_DESKTOP_SERVER_URL", "https://default.ctms.example.com"); expect(getDefaultDesktopServerUrl()).toBe("https://default.ctms.example.com/"); expect(getDesktopServerUrl()).toBe("https://default.ctms.example.com/"); setDesktopServerUrl("https://manual.ctms.example.com"); expect(getDesktopServerUrl()).toBe("https://manual.ctms.example.com/"); }); it("ignores an invalid build-time default", () => { vi.stubEnv("VITE_DESKTOP_SERVER_URL", "http://public.ctms.example.com"); expect(getDefaultDesktopServerUrl()).toBeNull(); expect(getDesktopServerUrl()).toBeNull(); }); it("requires a server URL only inside the Tauri runtime", () => { expect(shouldRequireDesktopServerUrl()).toBe(false); setTauriRuntime(true); expect(shouldRequireDesktopServerUrl()).toBe(true); setDesktopServerUrl("https://ctms.example.com"); expect(shouldRequireDesktopServerUrl()).toBe(false); }); it("does not require first-run configuration when a valid build-time default exists", () => { vi.stubEnv("VITE_DESKTOP_SERVER_URL", "https://default.ctms.example.com"); setTauriRuntime(true); expect(shouldRequireDesktopServerUrl()).toBe(false); }); });