feat(frontend): readerPrefs v2 unified structure (TDD)

This commit is contained in:
2026-09-16 15:15:08 +08:00
parent 72cf13c8c3
commit 64cc293878
3 changed files with 146 additions and 28 deletions
+38
View File
@@ -0,0 +1,38 @@
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");
});
});