import { afterEach, describe, expect, it, vi } from "vitest"; import { applyTheme, effectiveDark, readTheme, saveTheme } from "./theme.ts"; describe("тема", () => { afterEach(() => document.documentElement.removeAttribute("data-theme")); it("читает graph-theme, неизвестное значение — системная", () => { localStorage.setItem("graph-theme", "dark"); expect(readTheme()).toBe("dark"); localStorage.setItem("graph-theme", "purple"); expect(readTheme()).toBe(""); }); it("без сохранённого значения readTheme возвращает пустую строку, а не null", () => { expect(readTheme()).toBe(""); }); it("applyTheme ставит и снимает data-theme, saveTheme пишет ключ", () => { applyTheme("light"); expect(document.documentElement.getAttribute("data-theme")).toBe("light"); applyTheme(""); expect(document.documentElement.hasAttribute("data-theme")).toBe(false); saveTheme("dark"); expect(localStorage.getItem("graph-theme")).toBe("dark"); }); it("effectiveDark: системная следует matchMedia, light — всегда светлая, dark — тёмная", () => { vi.stubGlobal("matchMedia", (q: string) => ({ matches: q.includes("dark"), media: q })); expect(effectiveDark("")).toBe(true); expect(effectiveDark("light")).toBe(false); expect(effectiveDark("dark")).toBe(true); vi.stubGlobal("matchMedia", undefined); expect(effectiveDark("")).toBe(false); }); });