41 lines
1.2 KiB
TypeScript
41 lines
1.2 KiB
TypeScript
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<void>((resolve) => {
|
|
started = resolve;
|
|
});
|
|
const pause = new Promise<void>((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);
|
|
});
|