32 lines
1.5 KiB
TypeScript
32 lines
1.5 KiB
TypeScript
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);
|
||
});
|
||
});
|