Support player ping in game telemetry
This commit is contained in:
@@ -180,6 +180,33 @@ it('accepts all four events without an active beta and updates match lifecycle',
|
||||
expect((await post(gameEvent('game_end', 0, 0))).status).toBe(200);
|
||||
});
|
||||
|
||||
it.each(['game_start', 'round_change', 'heartbeat', 'game_end'] as const)('preserves %s player pings through ingestion, streaming and reload', async event => {
|
||||
const payload = gameEvent(event, 17);
|
||||
payload.players = payload.players.map((player, i) => ({ ...player, ping: [0, 42, 999, null][i] }));
|
||||
const { subscribe } = await import('../../src/lib/server/pipeline/bus.js');
|
||||
const listener = vi.fn();
|
||||
const unsubscribe = subscribe(listener);
|
||||
try {
|
||||
const response = await post(payload);
|
||||
expect(response.status).toBe(200);
|
||||
expect((await response.json()).telemetry.players).toEqual(payload.players);
|
||||
expect(listener).toHaveBeenCalledWith({ type: 'server-telemetry', entries: [expect.objectContaining({ players: payload.players })] });
|
||||
const { closeDb } = await import('../../src/lib/server/db/index.js');
|
||||
closeDb();
|
||||
const { listTelemetry } = await import('../../src/lib/server/fleet/telemetry.js');
|
||||
const { telemetryReport } = await import('../../src/lib/server/fleet/status-evidence.js');
|
||||
expect(listTelemetry()[0].players).toEqual(payload.players);
|
||||
expect(telemetryReport(payload.server)?.players).toEqual(payload.players);
|
||||
} finally { unsubscribe(); }
|
||||
});
|
||||
|
||||
it.each([-1, 1.5, '42', false, {}, [], Number.MAX_SAFE_INTEGER + 1])('rejects invalid player ping: %j', async ping => {
|
||||
for (const event of ['game_start', 'heartbeat'] as const) {
|
||||
const body = gameEvent(event, 17, 1);
|
||||
expect((await post({ ...body, players: [{ ...body.players[0], ping }] })).status).toBe(400);
|
||||
}
|
||||
});
|
||||
|
||||
it.each([null, [], {}, ...['boot', 'session_start', 'match_end', 'feature', 'other'].map(event => ({ ...payload, event })),
|
||||
{ ...payload, map: '' }, { ...payload, map: undefined }, { ...payload, round: -1 },
|
||||
{ ...payload, round: 1.5 }, { ...payload, round: '17' }, { ...payload, players: 4 }, { ...payload, players: null },
|
||||
|
||||
Reference in New Issue
Block a user