import { afterEach, beforeEach, expect, it, vi } from "vitest"; import { createProgressSaver } from "../src/lib/progress"; type Sent = [Record, number, boolean]; beforeEach(() => vi.useFakeTimers()); afterEach(() => vi.useRealTimers()); it("leading 立即发;间隔内多次 report 合并成一次 trailing", () => { const sent: Sent[] = []; const s = createProgressSaver((l, p, ka) => { sent.push([l, p, ka]); return Promise.resolve(); }); s.report({ page: 1 }, 0.1); expect(sent.length).toBe(1); s.report({ page: 2 }, 0.2); s.report({ page: 3 }, 0.3); expect(sent.length).toBe(1); vi.advanceTimersByTime(4999); expect(sent.length).toBe(1); vi.advanceTimersByTime(1); expect(sent.length).toBe(2); expect(sent[1]).toEqual([{ page: 3 }, 0.3, false]); }); it("flush 立刻尾随发送且 keepalive=true;重复值去重;清空挂起", () => { const sent: Sent[] = []; const s = createProgressSaver((l, p, ka) => { sent.push([l, p, ka]); return Promise.resolve(); }); s.report({ page: 0 }, 0); s.report({ page: 5 }, 0.5); s.flush(); expect(sent.length).toBe(2); expect(sent[1]).toEqual([{ page: 5 }, 0.5, true]); s.flush(); expect(sent.length).toBe(2); vi.advanceTimersByTime(10_000); expect(sent.length).toBe(2); // 挂起已被 flush 消费,定时器不再补发 });