import { describe, expect, it } from 'vitest' import { getViewportSnapshot, viewportSnapshotKey } from '../lib/viewportStore.js' describe('viewportStore', () => { it('normalizes absent scroll handles', () => { expect(getViewportSnapshot(null)).toEqual({ atBottom: true, bottom: 0, pending: 0, scrollHeight: 0, top: 0, viewportHeight: 0 }) }) it('includes pending scroll delta in snapshot math and keying', () => { const handle = { getPendingDelta: () => 3, getScrollHeight: () => 40, getScrollTop: () => 10, getViewportHeight: () => 5, isSticky: () => false } const snap = getViewportSnapshot(handle as any) expect(snap).toMatchObject({ atBottom: false, bottom: 18, pending: 3, scrollHeight: 40, top: 13, viewportHeight: 5 }) expect(viewportSnapshotKey(snap)).toBe('0:16:5:40:3') }) it('uses fresh scroll height to clear stale non-bottom state', () => { const handle = { getFreshScrollHeight: () => 20, getPendingDelta: () => 0, getScrollHeight: () => 40, getScrollTop: () => 15, getViewportHeight: () => 5, isSticky: () => false } const snap = getViewportSnapshot(handle as any) expect(snap.atBottom).toBe(true) expect(snap.scrollHeight).toBe(20) }) })