Invalidate leaderboard reports only for visible data changes

This commit is contained in:
2026-10-06 14:04:25 -04:00
parent fbf0629486
commit 283a553cc2
2 changed files with 48 additions and 7 deletions
+25
View File
@@ -34,6 +34,31 @@ async function matches() {
}>;
}
it('keeps report revisions stable during a match and invalidates completed data and renamed players', async () => {
const { db, closeDb } = await import('../../src/lib/server/db/index.js');
const revision = () => (db().prepare("SELECT revision FROM report_revisions WHERE topic='leaderboard'").get() as { revision: number }).revision;
await report('game_start');
const started = revision();
for (let round = 1; round <= 30; round++) {
await report('round_change', round, [player(undefined, { kills: round * 10 })]);
await report('heartbeat', round);
}
expect(revision()).toBe(started);
await report('game_end', 30);
expect(revision()).toBeGreaterThan(started);
const completed = revision();
db().prepare('UPDATE leaderboard_players SET last_seen_at=?').run('2026-10-06T12:00:00.000Z');
expect(revision()).toBe(completed);
db().prepare("UPDATE leaderboard_players SET name='Renamed'").run();
expect(revision()).toBe(completed + 1);
db().prepare('UPDATE leaderboard_match_players SET kills=kills+1').run();
expect(revision()).toBe(completed + 2);
closeDb();
const reopened = revision();
db().prepare('DELETE FROM leaderboard_matches').run();
expect(revision()).toBeGreaterThan(reopened);
});
it('publishes round 2 or higher games only after game end, preserving early stats and excluding round 1 departures', async () => {
const { getLeaderboard } = await import('../../src/lib/server/fleet/leaderboard.js');
const { getPlayerProfile } = await import('../../src/lib/server/fleet/player-profile.js');