import { test } from "node:test"; import assert from "node:assert/strict"; import { createTtlCache } from "../src/cache.js"; test("значение живёт ttl и потом перезагружается", async () => { let t = 1_000; let calls = 0; const get = createTtlCache(100, async () => ++calls, () => t); assert.equal(await get(), 1); t += 99; assert.equal(await get(), 1); t += 1; assert.equal(await get(), 2); assert.equal(calls, 2); }); test("single-flight: один loader на N параллельных get()", async () => { let calls = 0; let release!: (v: string) => void; const get = createTtlCache(1_000, () => { calls++; return new Promise((r) => { release = r; }); }); const all = Promise.all(Array.from({ length: 10 }, () => get())); release("ok"); assert.deepEqual(await all, Array(10).fill("ok")); assert.equal(calls, 1); }); test("ошибка не кэшируется", async () => { let calls = 0; const get = createTtlCache(1_000, async () => { calls++; if (calls === 1) throw new Error("fail"); return "ok"; }); await assert.rejects(get(), /fail/); assert.equal(await get(), "ok"); assert.equal(calls, 2); });