import { test } from 'node:test'; import assert from 'node:assert/strict'; import { createRefreshQueue } from '../../web/src/refreshQueue.js'; test('조회 중 들어온 수락 이벤트를 버리지 않고 최신 상태를 다시 읽는다', async () => { let status = 'pending', seen: string[] = []; let release!: () => void, started!: () => void; const firstStarted = new Promise((resolve) => { started = resolve; }); const pause = new Promise((resolve) => { release = resolve; }); const refresh = createRefreshQueue(async () => { const snapshot = status; if (!seen.length) { started(); await pause; } seen.push(snapshot); }); const initial = refresh(); await firstStarted; status = 'accepted'; const update = refresh(); refresh(); release(); await Promise.all([initial, update]); assert.deepEqual(seen, ['pending', 'accepted']); }); test('실패한 조회 다음 요청은 정상 재시도', async () => { let calls = 0; const refresh = createRefreshQueue(async () => { if (++calls === 1) throw Error('network'); }); await assert.rejects(refresh(), /network/); await refresh(); assert.equal(calls, 2); });