import { describe, expect, it } from "vitest"; import { DEFAULT_PREFS, parsePrefs, resolveRdTheme } from "../src/lib/readerPrefs"; describe("parsePrefs", () => { it("returns defaults for null/garbage", () => { expect(parsePrefs(null)).toEqual(DEFAULT_PREFS); expect(parsePrefs("{oops")).toEqual(DEFAULT_PREFS); }); it("merges partial legacy-free structures with defaults", () => { const p = parsePrefs(JSON.stringify({ themeMode: "night", cbz: { mode: "page" } })); expect(p.themeMode).toBe("night"); expect(p.cbz).toEqual({ ...DEFAULT_PREFS.cbz, mode: "page" }); expect(p.text).toEqual(DEFAULT_PREFS.text); }); it("rejects out-of-range values back to defaults", () => { const p = parsePrefs( JSON.stringify({ text: { sizeIdx: 99, lineIdx: -1, margin: "huge" }, cbz: { prefetch: 7 }, epub: { sizeIdx: 2, lineIdx: 0, marginIdx: 9 }, }), ); expect(p.text).toEqual(DEFAULT_PREFS.text); expect(p.cbz.prefetch).toBe(DEFAULT_PREFS.cbz.prefetch); expect(p.epub.marginIdx).toBe(DEFAULT_PREFS.epub.marginIdx); }); }); describe("resolveRdTheme", () => { it("auto follows global dark/light", () => { expect(resolveRdTheme("auto", true)).toBe("night"); expect(resolveRdTheme("auto", false)).toBe("paper"); }); it("manual overrides global", () => { expect(resolveRdTheme("sepia", true)).toBe("sepia"); expect(resolveRdTheme("night", false)).toBe("night"); }); });