import { DEFAULT_CLIENT_SETTINGS } from "@t3tools/contracts"; import { afterEach, describe, expect, it, vi } from "vite-plus/test"; function createLocalStorageStub(): Storage { const store = new Map(); return { getItem: (key) => store.get(key) ?? null, setItem: (key, value) => { store.set(key, value); }, removeItem: (key) => { store.delete(key); }, clear: () => { store.clear(); }, key: (index) => [...store.keys()][index] ?? null, get length() { return store.size; }, }; } function getTestWindow(): Window & typeof globalThis { const localStorage = createLocalStorageStub(); const testWindow = { localStorage, } as Window & typeof globalThis; vi.stubGlobal("window", testWindow); vi.stubGlobal("localStorage", localStorage); return testWindow; } afterEach(() => { vi.resetModules(); vi.unstubAllGlobals(); vi.restoreAllMocks(); }); describe("clientPersistenceStorage", () => { it("persists client settings in browser storage", async () => { getTestWindow(); const { readBrowserClientSettings, writeBrowserClientSettings } = await import("./clientPersistenceStorage"); const settings = { ...DEFAULT_CLIENT_SETTINGS, timestampFormat: "24-hour" as const, }; writeBrowserClientSettings(settings); expect(readBrowserClientSettings()).toEqual(settings); }); it("reports structured decode failures while preserving the fallback", async () => { const testWindow = getTestWindow(); testWindow.localStorage.setItem("t3code:client-settings:v1", "not-json"); const consoleError = vi.spyOn(console, "error").mockImplementation(() => undefined); const { readBrowserClientSettings } = await import("./clientPersistenceStorage"); expect(readBrowserClientSettings()).toBeNull(); expect(consoleError).toHaveBeenCalledWith( "Could not read persisted client settings.", expect.objectContaining({ _tag: "LocalStorageOperationError", operation: "decode", storageKey: "t3code:client-settings:v1", cause: expect.anything(), }), ); }); it("defaults word wrap on and discards obsolete wrapping preferences", async () => { const testWindow = getTestWindow(); testWindow.localStorage.setItem( "t3code:client-settings:v1", JSON.stringify({ chatWordWrap: false, diffWordWrap: false, }), ); const { readBrowserClientSettings } = await import("./clientPersistenceStorage"); const settings = readBrowserClientSettings(); expect(settings).toEqual( expect.objectContaining({ wordWrap: true, }), ); expect(settings).not.toHaveProperty("chatWordWrap"); expect(settings).not.toHaveProperty("diffWordWrap"); }); });