54 lines
1.6 KiB
TypeScript
54 lines
1.6 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import test from "node:test";
|
|
import { RefreshQueue } from "../src/refresh";
|
|
|
|
test("refreshes coalesce bursts and rerun after in-flight invalidation", async (t) => {
|
|
const reads: (() => void)[] = [];
|
|
const queue = new RefreshQueue(
|
|
() =>
|
|
new Promise<void>((resolve) => {
|
|
reads.push(resolve);
|
|
}),
|
|
(error) => {
|
|
throw error;
|
|
},
|
|
);
|
|
t.after(() => queue.dispose());
|
|
for (let i = 0; i < 100; i++) queue.invalidate();
|
|
await waitFor(() => reads.length === 1);
|
|
for (let i = 0; i < 100; i++) queue.invalidate();
|
|
assert.equal(reads.length, 1);
|
|
reads[0]?.();
|
|
await waitFor(() => reads.length === 2);
|
|
reads[1]?.();
|
|
await new Promise((resolve) => setTimeout(resolve, 60));
|
|
assert.equal(reads.length, 2);
|
|
});
|
|
|
|
test("disposed sessions never run queued refreshes and errors are reported", async () => {
|
|
let calls = 0;
|
|
const errors: unknown[] = [];
|
|
const queue = new RefreshQueue(
|
|
async () => {
|
|
calls++;
|
|
throw new Error("refresh failed");
|
|
},
|
|
(error) => errors.push(error),
|
|
);
|
|
queue.invalidate();
|
|
await waitFor(() => errors.length === 1);
|
|
assert.equal(calls, 1);
|
|
queue.invalidate();
|
|
queue.dispose();
|
|
await new Promise((resolve) => setTimeout(resolve, 60));
|
|
assert.equal(calls, 1);
|
|
});
|
|
|
|
async function waitFor(condition: () => boolean): Promise<void> {
|
|
const deadline = Date.now() + 2000;
|
|
while (!condition()) {
|
|
if (Date.now() > deadline) throw new Error("Refresh queue did not make progress");
|
|
await new Promise((resolve) => setTimeout(resolve, 5));
|
|
}
|
|
}
|