Files

43 lines
1.3 KiB
TypeScript

import { afterEach, beforeEach, expect, it, vi } from "vitest";
import { createProgressSaver } from "../src/lib/progress";
type Sent = [Record<string, unknown>, 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 消费,定时器不再补发
});