Files
frontend-miniapp/tests/unit/BackgroundPreloadScheduler.spec.ts
lyf 9ea1bfab71
Some checks failed
CI / verify (push) Has been cancelled
同步 sgs-frontend-mobile 源码
2026-07-27 11:26:01 +08:00

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
})
})
})