import { afterEach, describe, expect, it, vi } from 'vitest' import { createBackgroundPreloadScheduler, getBackgroundPreloadPolicy } from '@/services/performance/backgroundPreloadScheduler' describe('backgroundPreloadScheduler', () => { afterEach(() => { vi.useRealTimers() }) it('waits for an idle window after the defer delay', () => { vi.useFakeTimers() let idleCallback: (() => void) | null = null const task = vi.fn() const scheduler = createBackgroundPreloadScheduler({ setTimeout, clearTimeout, requestIdleCallback: (callback) => { idleCallback = () => callback({ didTimeout: false }) return 1 }, cancelIdleCallback: vi.fn() }) expect(scheduler.schedule(task, { delayMs: 500 })).toBe(true) vi.advanceTimersByTime(499) expect(task).not.toHaveBeenCalled() vi.advanceTimersByTime(1) expect(task).not.toHaveBeenCalled() idleCallback?.() expect(task).toHaveBeenCalledTimes(1) }) it('cancels work that has not entered the idle window', () => { vi.useFakeTimers() const task = vi.fn() const scheduler = createBackgroundPreloadScheduler({ setTimeout, clearTimeout, requestIdleCallback: vi.fn(() => 1), cancelIdleCallback: vi.fn() }) scheduler.schedule(task, { delayMs: 500 }) scheduler.cancel() vi.advanceTimersByTime(1000) expect(task).not.toHaveBeenCalled() }) it('skips background work for data-saving and slow-network connections', () => { expect(getBackgroundPreloadPolicy({ saveData: true })).toEqual({ allowed: false, reason: 'save-data', delayMs: 0 }) expect(getBackgroundPreloadPolicy({ effectiveType: '2g' })).toEqual({ allowed: false, reason: 'slow-network', delayMs: 0 }) expect(getBackgroundPreloadPolicy({ effectiveType: 'slow-2g' })).toEqual({ allowed: false, reason: 'slow-network', delayMs: 0 }) expect(getBackgroundPreloadPolicy({ effectiveType: '4g', downlink: 1.49, rtt: 80 })).toEqual({ allowed: false, reason: 'slow-network', delayMs: 0 }) expect(getBackgroundPreloadPolicy({ effectiveType: '4g', downlink: 8, rtt: 500 })).toEqual({ allowed: false, reason: 'slow-network', delayMs: 0 }) expect(getBackgroundPreloadPolicy({ effectiveType: '3g', downlink: 1.2, rtt: 120 })).toEqual({ allowed: false, reason: 'slow-network', delayMs: 0 }) expect(getBackgroundPreloadPolicy({ effectiveType: '3g' })).toEqual({ allowed: true, reason: 'normal', delayMs: 2400 }) expect(getBackgroundPreloadPolicy({ effectiveType: '4g', downlink: 1.5, rtt: 499 })).toEqual({ allowed: true, reason: 'normal', delayMs: 900 }) }) })