import assert from "node:assert/strict";
import test from "node:test";
import { createAsyncMemoByKey, createStartupTimer } from "../apps/api/dist/async-memo.js";
test("createAsyncMemoByKey runs once per key and coalesces in-flight calls", async () => {
let runs = 0;
const memo = createAsyncMemoByKey(
async (id) => {
runs += 1;
await new Promise((resolve) => setTimeout(resolve, 30));
return `ok:${id}`;
},
(id) => id,
);
const [a, b, c] = await Promise.all([memo("u1"), memo("u1"), memo("u2")]);
assert.equal(a, "ok:u1");
assert.equal(b, "ok:u1");
assert.equal(c, "ok:u2");
assert.equal(runs, 2);
await memo("u1");
assert.equal(runs, 2);
});
test("createStartupTimer records phase durations", async () => {
const timer = createStartupTimer();
await timer.measure("alpha", async () => {
await new Promise((resolve) => setTimeout(resolve, 20));
});
await timer.measure("beta", () => 1);
const timings = timer.timings();
assert.ok((timings.alpha ?? 0) >= 15);
assert.ok((timings.beta ?? 0) >= 0);
assert.ok(timer.totalMs() >= (timings.alpha ?? 0));
});