// @vitest-environment jsdom import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { BodyScrollLock } from './body-scroll-lock.svelte' describe('BodyScrollLock', () => { beforeEach(() => { vi.useFakeTimers() BodyScrollLock.reset() document.body.setAttribute('style', 'background: red;') Object.defineProperty(window, 'innerWidth', { configurable: true, writable: true, value: 1200 }) Object.defineProperty(document.documentElement, 'clientWidth', { configurable: true, value: 1180 }) }) afterEach(() => { BodyScrollLock.reset() vi.useRealTimers() }) it('locks body scroll and restores the initial body style when unlocked', async () => { const lock = new BodyScrollLock(true) await Promise.resolve() expect(document.body.style.overflow).toBe('hidden') expect(document.body.style.getPropertyValue('--scrollbar-width')).toBe('20px') lock.locked.current = false vi.runAllTimers() await Promise.resolve() expect(document.body.getAttribute('style')).toBe('background: red;') }) it('keeps the body locked until the last lock is released', async () => { const first = new BodyScrollLock(true) const second = new BodyScrollLock(true) await Promise.resolve() first.locked.current = false vi.runAllTimers() await Promise.resolve() expect(document.body.style.overflow).toBe('hidden') second.destroy() vi.runAllTimers() await Promise.resolve() expect(document.body.getAttribute('style')).toBe('background: red;') }) it('allows creating unlocked instances without mutating the body', () => { new BodyScrollLock(false) expect(document.body.getAttribute('style')).toBe('background: red;') }) })