96 lines
2.8 KiB
TypeScript
96 lines
2.8 KiB
TypeScript
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
|
|
})
|
|
})
|
|
})
|