const assert = require('node:assert/strict'); const { fixture } = require('./check-api.cjs'); (async () => { const f = fixture(); await f.client.refresh(); let confirm, animations = 0; f.server.intercept = (path, body, ok) => { if (body.action !== 'confirm_delivery') return false; confirm = () => ok({}); return true; }; const claim = f.client.request('claim', { periodId: f.periodId, stage: 0 }, amount => { animations++; assert.equal(amount, 100); assert.equal(f.counts().saves, 1); assert.equal(f.calls.at(-1).path, 'userCoin', 'animation starts immediately after save'); }); await new Promise(resolve => setImmediate(resolve)); assert.equal(animations, 1); assert(confirm, 'confirmation continues while animation is running'); confirm(); await claim; const broken = fixture(new Map(), { unknownSave: true }); await broken.client.refresh(); await broken.client.request('claim', { periodId: broken.periodId, stage: 0 }, () => assert.fail('ambiguous save must not animate')); const recovery = fixture(); await recovery.client.refresh(); recovery.calls.length = 0; recovery.server.intercept = (path, body, ok) => { if (body.action !== 'settlements') return false; ok({ status: 'settling' }); return true; }; await recovery.client.retryRecovery(); assert.equal(recovery.client.refreshNeedsRetry, true); assert.deepEqual(recovery.calls.map(c => c.body.action), ['settlements']); console.log('PASS: saved reward animates before confirmation; uncertain save never animates; settlement retry only queries settlements.'); })().catch(error => { console.error(error); process.exitCode = 1; });