import { afterEach, expect, it, vi } from 'vitest'; import { betaUpdates } from '../../src/lib/ui/beta-updates.js'; afterEach(() => { vi.useRealTimers(); vi.unstubAllGlobals(); }); it('refreshes relevant pushes and reconnects without polling, pauses hidden tabs, and cleans up', async () => { vi.useFakeTimers(); const window = new EventTarget(), document = Object.assign(new EventTarget(), { hidden: false }); vi.stubGlobal('window', window); vi.stubGlobal('document', document); let finish!: () => void; const load = vi.fn( () => new Promise((resolve) => { finish = resolve; }) ); const stop = betaUpdates(load, () => 7); const change = (id: number) => window.dispatchEvent( Object.assign(new Event('ec:beta-changed'), { detail: { betaId: id } }) ); try { change(2); await vi.advanceTimersByTimeAsync(1000); expect(load).not.toHaveBeenCalled(); change(7); change(7); await vi.advanceTimersByTimeAsync(200); expect(load).toHaveBeenCalledTimes(1); change(7); await vi.advanceTimersByTimeAsync(200); expect(load).toHaveBeenCalledTimes(1); finish(); await vi.advanceTimersByTimeAsync(200); expect(load).toHaveBeenCalledTimes(2); finish(); await vi.advanceTimersByTimeAsync(30000); expect(load).toHaveBeenCalledTimes(2); document.hidden = true; change(7); await vi.advanceTimersByTimeAsync(1000); expect(load).toHaveBeenCalledTimes(2); document.hidden = false; document.dispatchEvent(new Event('visibilitychange')); await vi.advanceTimersByTimeAsync(200); expect(load).toHaveBeenCalledTimes(3); finish(); window.dispatchEvent(new Event('ec:pipeline-connected')); await vi.advanceTimersByTimeAsync(200); expect(load).toHaveBeenCalledTimes(4); finish(); stop(); change(7); await vi.advanceTimersByTimeAsync(1000); expect(load).toHaveBeenCalledTimes(4); } finally { stop(); } });