import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'
import { bootstrapDensity, setDensity, getDensityPreference } from './density'
// ── localStorage stub ────────────────────────────────────────────────────────
function makeLocalStorageStub(): Storage {
const store: Record<string, string> = {}
return {
getItem: (key: string) => store[key] ?? null,
setItem: (key: string, val: string) => { store[key] = val },
removeItem: (key: string) => { delete store[key] },
clear: () => { Object.keys(store).forEach(k => delete store[k]) },
key: (index: number) => Object.keys(store)[index] ?? null,
get length() { return Object.keys(store).length },
} as Storage
}
// ── Setup / teardown ─────────────────────────────────────────────────────────
let lsStub: Storage
beforeEach(() => {
lsStub = makeLocalStorageStub()
vi.stubGlobal('localStorage', lsStub)
delete document.documentElement.dataset['density']
})
afterEach(() => {
vi.restoreAllMocks()
vi.unstubAllGlobals()
})
// ── Tests ────────────────────────────────────────────────────────────────────
describe('getDensityPreference', () => {
it('no stored value → "cozy"', () => {
expect(getDensityPreference()).toBe('cozy')
})
it('stored "compact" → "compact"', () => {
lsStub.setItem('density', 'compact')
expect(getDensityPreference()).toBe('compact')
})
it('stored "cozy" → "cozy"', () => {
lsStub.setItem('density', 'cozy')
expect(getDensityPreference()).toBe('cozy')
})
})
describe('bootstrapDensity', () => {
it('no stored value → data-density="cozy"', () => {
bootstrapDensity()
expect(document.documentElement.dataset['density']).toBe('cozy')
})
it('stored "compact" → data-density="compact"', () => {
lsStub.setItem('density', 'compact')
bootstrapDensity()
expect(document.documentElement.dataset['density']).toBe('compact')
})
it('does not register a matchMedia listener', () => {
const spy = vi.spyOn(window, 'matchMedia')
bootstrapDensity()
expect(spy).not.toHaveBeenCalled()
})
})
describe('setDensity', () => {
it('setDensity("compact") stores and sets data-density', () => {
setDensity('compact')
expect(lsStub.getItem('density')).toBe('compact')
expect(document.documentElement.dataset['density']).toBe('compact')
})
it('setDensity("cozy") stores and sets data-density', () => {
setDensity('cozy')
expect(lsStub.getItem('density')).toBe('cozy')
expect(document.documentElement.dataset['density']).toBe('cozy')
})
it('setDensity(null) removes key and applies default "cozy"', () => {
lsStub.setItem('density', 'compact')
document.documentElement.dataset['density'] = 'compact'
setDensity(null)
expect(lsStub.getItem('density')).toBeNull()
expect(document.documentElement.dataset['density']).toBe('cozy')
})
})