43 lines
1.3 KiB
TypeScript
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 消费,定时器不再补发
|
|
});
|