MatchMaster/tools/coin-madness/check-first-display.cjs

33 lines
1.7 KiB
JavaScript

const assert = require('node:assert/strict');
const { fixture } = require('./check-api.cjs');
(async () => {
let release;
const f = fixture(new Map(), { intercept(path, body, ok) {
if (path !== 'activityConfig/list') return false;
release = () => ok({ schemaVersion: 1, serverNow: f.info.serverTime, activities: [] });
return true;
} });
const early = f.client.readForDisplay();
const recovery = f.client.refresh();
let recovered = false;
recovery.then(() => recovered = true);
const data = await early;
await new Promise(resolve => setImmediate(resolve));
assert.equal(data.state.config.periodId, f.periodId);
assert.equal(recovered, false, 'first display does not wait for slow schedule/recovery');
assert.equal(f.calls.filter(c => c.body.action === 'info').length, 1);
assert.equal(await f.client.readForDisplay(), data, 'opening during recovery reuses first snapshot');
release(); await recovery;
assert.equal(recovered, true);
assert(f.calls.some(c => c.body.action === 'settlements'), 'background settlement still runs');
const broken = fixture(new Map(), { intercept(path, body, ok, fail) {
if (body.action !== 'info') return false;
fail('NETWORK_UNKNOWN'); return true;
} });
await assert.rejects(broken.client.readForDisplay());
broken.server.intercept = null;
assert((await broken.client.readForDisplay()).state, 'failed first read can retry');
await broken.client.refresh();
console.log('PASS: first snapshot before slow recovery, shared requests, settlement recovery and read retry');
})().catch(error => { console.error(error); process.exitCode = 1; });