Add player leaderboard and homepage preview

This commit is contained in:
2026-10-06 15:21:49 +05:00
parent 2bbf5ae2c0
commit 949aa6627a
25 changed files with 2363 additions and 28 deletions

41
tests/leaderboard.test.ts Normal file
View File

@@ -0,0 +1,41 @@
import { test } from "node:test";
import assert from "node:assert/strict";
import { leaderboardFilters, leaderboardHref } from "../shared/leaderboard";
test("leaderboard filters constrain malformed and repeated query parameters", () => {
assert.deepEqual(
leaderboardFilters({ difficulty: "hard", q: " Alex ", page: "3" }),
{ difficulty: "hard", search: "Alex", page: 3 },
);
for (const page of ["-4", "0", "Infinity", "2.5", "no", ["2", "3"]]) {
assert.equal(leaderboardFilters({ page }).page, 1);
}
assert.equal(
leaderboardFilters({ difficulty: ["hard", "easy"] }).difficulty,
"all",
);
assert.equal(
leaderboardFilters({ difficulty: "creative" }).difficulty,
"all",
);
assert.equal(
leaderboardFilters({ q: "x".repeat(100), page: "2000000" }).search.length,
64,
);
assert.equal(leaderboardFilters({ page: "2000000" }).page, 1_000_000);
});
test("leaderboard navigation preserves and encodes player searches", () => {
const link = new URL(
leaderboardHref("normal", "Alex & %_", 3),
"https://minegeo.test",
);
assert.equal(link.searchParams.get("difficulty"), "normal");
assert.equal(link.searchParams.get("q"), "Alex & %_");
assert.equal(link.searchParams.get("page"), "3");
assert.equal(leaderboardHref("all"), "/leaderboard");
assert.equal(
new URL(leaderboardHref("easy", "Alex"), link).searchParams.has("page"),
false,
);
});