Files
MineGeo/tests/leaderboard.test.ts

42 lines
1.4 KiB
TypeScript

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