108 lines
3.6 KiB
TypeScript
108 lines
3.6 KiB
TypeScript
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<string, string>();
|
|
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);
|
|
});
|
|
});
|