Initial hop. implementation and UGREEN NAS deployment guide
This commit is contained in:
40
apps/server/test/refresh-queue.test.ts
Normal file
40
apps/server/test/refresh-queue.test.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
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);
|
||||
});
|
||||
Reference in New Issue
Block a user