gabriel / musehub public
theme.test.ts typescript
60 lines 1.8 KB
Raw
sha256:1dd27e6d5c24550177b01b0a171e8375c07cf046b549e7683364706b6522d3bc docs(#139): mark all 11 checklist items resolved, document … Sonnet 5 12 days ago
1 import { describe, it, expect, beforeEach, vi } from 'vitest';
2 import { applyStoredTheme, toggleTheme } from './theme';
3
4 // Minimal DOM shim — vitest runs in node
5 const makeHtml = () => ({ dataset: {} as Record<string, string> });
6
7 let html: ReturnType<typeof makeHtml>;
8 let store: Record<string, string>;
9
10 beforeEach(() => {
11 html = makeHtml();
12 store = {};
13 vi.stubGlobal('document', { documentElement: html });
14 vi.stubGlobal('localStorage', {
15 getItem: (k: string) => store[k] ?? null,
16 setItem: (k: string, v: string) => { store[k] = v; },
17 removeItem: (k: string) => { delete store[k]; },
18 });
19 });
20
21 describe('applyStoredTheme', () => {
22 it('sets data-theme=light when localStorage has light', () => {
23 store['musehub-theme'] = 'light';
24 applyStoredTheme();
25 expect(html.dataset['theme']).toBe('light');
26 });
27
28 it('does nothing when localStorage has dark', () => {
29 store['musehub-theme'] = 'dark';
30 applyStoredTheme();
31 expect(html.dataset['theme']).toBeUndefined();
32 });
33
34 it('does nothing when localStorage is empty', () => {
35 applyStoredTheme();
36 expect(html.dataset['theme']).toBeUndefined();
37 });
38 });
39
40 describe('toggleTheme', () => {
41 it('dark → light: sets data-theme and saves light', () => {
42 toggleTheme();
43 expect(html.dataset['theme']).toBe('light');
44 expect(store['musehub-theme']).toBe('light');
45 });
46
47 it('light → dark: removes data-theme and saves dark', () => {
48 html.dataset['theme'] = 'light';
49 toggleTheme();
50 expect(html.dataset['theme']).toBeUndefined();
51 expect(store['musehub-theme']).toBe('dark');
52 });
53
54 it('round-trips correctly', () => {
55 toggleTheme(); // → light
56 toggleTheme(); // → dark
57 expect(html.dataset['theme']).toBeUndefined();
58 expect(store['musehub-theme']).toBe('dark');
59 });
60 });
File History 2 commits
sha256:1dd27e6d5c24550177b01b0a171e8375c07cf046b549e7683364706b6522d3bc docs(#139): mark all 11 checklist items resolved, document … Sonnet 5 12 days ago
sha256:649011bedd713e22f7dca4c4be94bdefbf3b10950d9fc80235928d0b0b823be8 docs: track issue #139 (two-column app-shell refactor) plan… Sonnet 5 12 days ago