// theme store 单测(B1):持久化与 dataset 同步(FR-THEME-002 / UI_SPEC §6) import { beforeEach, describe, expect, it } from 'vitest'; import { createPinia, setActivePinia } from 'pinia'; import { useThemeStore, applyTheme, currentTheme } from '../../../../ui/src/stores/theme.js'; describe('theme store', () => { beforeEach(() => { localStorage.clear(); document.documentElement.dataset.theme = 'dark'; setActivePinia(createPinia()); }); it('从 dataset 初始化状态(dataset 缺失时回退 dark)', () => { document.documentElement.dataset.theme = 'light'; setActivePinia(createPinia()); expect(useThemeStore().theme).toBe('light'); delete document.documentElement.dataset.theme; setActivePinia(createPinia()); expect(useThemeStore().theme).toBe('dark'); }); it('toggle:dark→light,同步 dataset 与 localStorage', () => { const store = useThemeStore(); expect(store.theme).toBe('dark'); store.toggle(); expect(store.theme).toBe('light'); expect(document.documentElement.dataset.theme).toBe('light'); expect(localStorage.getItem('pa-theme')).toBe('light'); store.toggle(); expect(store.theme).toBe('dark'); expect(document.documentElement.dataset.theme).toBe('dark'); expect(localStorage.getItem('pa-theme')).toBe('dark'); }); it('applyTheme:写 dataset + localStorage', () => { applyTheme('light'); expect(document.documentElement.dataset.theme).toBe('light'); expect(localStorage.getItem('pa-theme')).toBe('light'); }); it('set:非法值归一为 dark', () => { const store = useThemeStore(); store.set('neon'); expect(store.theme).toBe('dark'); }); it('currentTheme:恒有值(未知 dataset 值归一 dark)', () => { document.documentElement.dataset.theme = 'hacker'; expect(currentTheme()).toBe('dark'); document.documentElement.dataset.theme = 'light'; expect(currentTheme()).toBe('light'); }); });