This commit is contained in:
95
tests/unit/BackgroundPreloadScheduler.spec.ts
Normal file
95
tests/unit/BackgroundPreloadScheduler.spec.ts
Normal file
@@ -0,0 +1,95 @@
|
||||
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
|
||||
})
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user