42 lines
1.4 KiB
TypeScript
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,
|
|
);
|
|
});
|