Add Prettier and ESLint tooling (Refs #77)

This commit is contained in:
2026-10-09 15:56:13 -04:00
parent 8ed059b8d3
commit 16469e2d43
711 changed files with 99737 additions and 28286 deletions
+36 -17
View File
@@ -2,34 +2,53 @@ import { beforeEach, expect, it, vi } from 'vitest';
import { GET } from '../../src/routes/api/leaderboard/+server.js';
import { load } from '../../src/routes/leaderboard/+page.server.js';
vi.mock('../../src/routes/api/leaderboard/+server.js', () => ({ GET: vi.fn() }));
beforeEach(() => { vi.clearAllMocks(); });
beforeEach(() => {
vi.clearAllMocks();
});
it('requests the same 25-player page on initial load and preserves filters without mutating the page URL', async () => {
vi.mocked(GET).mockResolvedValueOnce(new Response(JSON.stringify({ entries: [], limit: 25, offset: 25 })));
const url = new URL('http://localhost/leaderboard?game=t5&map=theater&players=2&metric=kills&q=123&offset=25&limit=100');
vi.mocked(GET).mockResolvedValueOnce(
new Response(JSON.stringify({ entries: [], limit: 25, offset: 25 }))
);
const url = new URL(
'http://localhost/leaderboard?game=t5&map=theater&players=2&metric=kills&q=123&offset=25&limit=100'
);
const original = url.href;
const data = await load({ url });
const requested = vi.mocked(GET).mock.calls[0][0].url;
expect(requested.searchParams.get('limit')).toBe('25');
for (const key of ['game', 'map', 'players', 'metric', 'q', 'offset']) expect(requested.searchParams.get(key)).toBe(url.searchParams.get(key));
for (const key of ['game', 'map', 'players', 'metric', 'q', 'offset'])
expect(requested.searchParams.get(key)).toBe(url.searchParams.get(key));
expect(url.href).toBe(original);
expect(data.leaderboard.limit).toBe(25);
});
it.each(['', '?game=t6&players=2&metric=kills&q=Cherry&offset=25'])('defaults to All maps without redirecting or changing other filters: %s', async query => {
vi.mocked(GET).mockResolvedValueOnce(new Response(JSON.stringify({ entries: [], maps: [{ key: 't6:town' }], limit: 25 })));
const url = new URL(`http://localhost/leaderboard${query}`);
const original = url.href;
expect(await load({ url })).toMatchObject({ leaderboard: { entries: [], limit: 25 } });
const requested = vi.mocked(GET).mock.calls[0][0].url;
expect(requested.searchParams.has('map')).toBe(false);
for (const key of ['game', 'players', 'metric', 'q', 'offset']) expect(requested.searchParams.get(key)).toBe(url.searchParams.get(key));
expect(url.href).toBe(original);
});
it.each(['', '?game=t6&players=2&metric=kills&q=Cherry&offset=25'])(
'defaults to All maps without redirecting or changing other filters: %s',
async (query) => {
vi.mocked(GET).mockResolvedValueOnce(
new Response(JSON.stringify({ entries: [], maps: [{ key: 't6:town' }], limit: 25 }))
);
const url = new URL(`http://localhost/leaderboard${query}`);
const original = url.href;
expect(await load({ url })).toMatchObject({ leaderboard: { entries: [], limit: 25 } });
const requested = vi.mocked(GET).mock.calls[0][0].url;
expect(requested.searchParams.has('map')).toBe(false);
for (const key of ['game', 'players', 'metric', 'q', 'offset'])
expect(requested.searchParams.get(key)).toBe(url.searchParams.get(key));
expect(url.href).toBe(original);
}
);
it('honors explicit All maps and handles an empty recorded-map catalog without redirecting', async () => {
vi.mocked(GET).mockResolvedValue(new Response(JSON.stringify({ entries: [], maps: [], limit: 25 })));
vi.mocked(GET).mockResolvedValue(
new Response(JSON.stringify({ entries: [], maps: [], limit: 25 }))
);
await load({ url: new URL('http://localhost/leaderboard?map=&players=3') });
expect(vi.mocked(GET).mock.calls[0][0].url.searchParams.get('map')).toBe('');
vi.mocked(GET).mockResolvedValueOnce(new Response(JSON.stringify({ entries: [], maps: [], limit: 25 })));
expect(await load({ url: new URL('http://localhost/leaderboard') })).toMatchObject({ leaderboard: { entries: [], maps: [] } });
vi.mocked(GET).mockResolvedValueOnce(
new Response(JSON.stringify({ entries: [], maps: [], limit: 25 }))
);
expect(await load({ url: new URL('http://localhost/leaderboard') })).toMatchObject({
leaderboard: { entries: [], maps: [] }
});
});