MatchMaster/tools/coin-madness/check-early-reward.cjs

29 lines
1.7 KiB
JavaScript

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; });