feat(desktop): implement phase 1 tauri client

This commit is contained in:
Cheng Zhou
2026-06-30 17:25:03 +08:00
parent 4654a812a0
commit d1a6c957f7
45 changed files with 5473 additions and 27 deletions
@@ -0,0 +1,80 @@
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import {
DESKTOP_SERVER_URL_CHANGED_EVENT,
DESKTOP_SERVER_URL_KEY,
getDesktopServerUrl,
normalizeDesktopServerUrl,
setDesktopServerUrl,
shouldRequireDesktopServerUrl,
} from "./desktopServerConfig";
const setTauriRuntime = (enabled: boolean) => {
if (enabled) {
Object.defineProperty(window, "__TAURI_INTERNALS__", { value: {}, configurable: true });
} else {
Reflect.deleteProperty(window, "__TAURI_INTERNALS__");
}
};
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(() => {
Object.defineProperty(window, "localStorage", {
value: createMemoryStorage(),
configurable: true,
});
});
afterEach(() => {
window.localStorage.clear();
setTauriRuntime(false);
});
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("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);
});
});