forked from phenom/healer-man
Update Healer Man server
This commit is contained in:
1 parent
8a98797fcf
commit
11934a3979
44 files changed
+3183
-329
No files matched your search
@@ -58,18 +58,34 @@ test("validates final boss, dungeon/difficulty, duration and party without trust
|
||||
assert.throws(() => database.listDungeonLeaderboard({ dungeonId: "deadmines", clear: "bad" }), { status: 400 });
|
||||
assert.throws(() => database.listDungeonLeaderboard({ dungeonId: "deadmines", offset: -1 }), { status: 400 });
|
||||
}));
|
||||
test("accepts any rolled Stockades boss as a full clear for both bite-sized modes", () => withDatabase((database) => {
|
||||
for (const dungeonId of ["bite-sized-stormwind-stockade", "randomized-bite-sized-stormwind-stockade"]) {
|
||||
test("separates each rolled boss's board within its dungeon", () => withDatabase((database, reopen) => {
|
||||
for (const dungeonId of ["bite-sized-stormwind-stockade", "randomized-bite-sized-stormwind-stockade",
|
||||
"randomized-bite-sized-stormwind-stockade-available",
|
||||
"bite-sized-wailing-caverns", "bite-sized-deadmines-ship", "bite-sized-utgarde-pinnacle-skadi",
|
||||
"bite-sized-forsaken-abbey-ancalon", "bite-sized-paspers-shrine-hafiz", "bite-sized-mystic-altar-golem"]) {
|
||||
const dungeon = catalog.dungeons.find((entry) => entry.id === dungeonId);
|
||||
const difficulty = dungeon.difficulties[0];
|
||||
assert.equal(difficulty.finalBossIds.length, 5);
|
||||
assert.equal(difficulty.finalBossIds.length, dungeon.bosses.length);
|
||||
assert.ok(difficulty.finalBossIds.length > 1);
|
||||
for (const [index, bossId] of difficulty.finalBossIds.entries()) {
|
||||
const payload = run(`${dungeonId}-${index}-run`, 1000 + index, false, dungeon.id);
|
||||
payload.killedBossIds = [bossId];
|
||||
assert.equal(database.submitDungeonRun(null, payload).run.fullClear, true);
|
||||
const submitted = database.submitDungeonRun(null, payload);
|
||||
assert.equal(submitted.run.fullClear, true);
|
||||
assert.deepEqual(submitted.placement, { finalRank: 1, finalTotal: 1, fullRank: 1, fullTotal: 1 });
|
||||
assert.equal(database.listDungeonLeaderboard({ dungeonId, bossId, clear: "full" }).total, 1);
|
||||
assert.equal(database.listDungeonLeaderboard({ dungeonId, bossId, clear: "full" }).entries[0].id, payload.id);
|
||||
}
|
||||
assert.equal(database.listDungeonLeaderboard({ dungeonId: dungeon.id, clear: "full" }).total, 5);
|
||||
assert.equal(database.listDungeonLeaderboard({ dungeonId: dungeon.id, clear: "full" }).total, 1);
|
||||
assert.throws(() => database.listDungeonLeaderboard({ dungeonId, bossId: "wrong-boss" }), { status: 400 });
|
||||
const impossible = run(`${dungeonId}-multiple-run`, 1234, false, dungeonId);
|
||||
impossible.killedBossIds = difficulty.finalBossIds.slice(0, 2);
|
||||
assert.throws(() => database.submitDungeonRun(null, impossible), { status: 400 });
|
||||
}
|
||||
database = reopen();
|
||||
const id = "bite-sized-mystic-altar-golem";
|
||||
const bosses = catalog.dungeons.find((entry) => entry.id === id).difficulties[0].finalBossIds;
|
||||
assert.equal(database.listDungeonLeaderboard({ dungeonId: id, bossId: bosses[1] }).total, 1);
|
||||
}));
|
||||
test("public HTTP leaderboards accept completion records and return results with rank while rejecting unfinished runs", async () => {
|
||||
const directory = mkdtempSync(path.join(os.tmpdir(), "healer-man-leaderboard-http-"));
|
||||
@@ -93,6 +109,16 @@ test("public HTTP leaderboards accept completion records and return results with
|
||||
assert.deepEqual((await sliderBoard.json()).entries.map((entry) => entry.id), [slider.id]);
|
||||
assert.equal((await (await fetch(`${base}/api/dungeon-leaderboards?dungeon=barren-caves&bossDifficulty=1`)).json()).total, 0);
|
||||
assert.equal((await fetch(`${base}/api/dungeon-leaderboards?dungeon=barren-caves&bossDifficulty=11`)).status, 400);
|
||||
const romDungeon = catalog.dungeons.find((entry) => entry.id === "bite-sized-mystic-altar-golem");
|
||||
const romBoss = romDungeon.difficulties[0].finalBossIds[1];
|
||||
const romRun = run("http-rom-boss-run", 23456, false, romDungeon.id);
|
||||
romRun.killedBossIds = [romBoss];
|
||||
assert.equal((await fetch(`${base}/api/dungeon-runs`, { method: "POST", headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify(romRun) })).status, 201);
|
||||
const romBoard = await fetch(`${base}/api/dungeon-leaderboards?dungeon=${romDungeon.id}&boss=${romBoss}`);
|
||||
assert.equal(romBoard.status, 200);
|
||||
assert.deepEqual((await romBoard.json()).entries.map((entry) => entry.id), [romRun.id]);
|
||||
assert.equal((await (await fetch(`${base}/api/dungeon-leaderboards?dungeon=${romDungeon.id}`)).json()).total, 0);
|
||||
const bad = await fetch(`${base}/api/dungeon-runs`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ ...payload, id: "unfinished-run", killedBossIds: [] }) });
|
||||
assert.equal(bad.status, 400);
|
||||
const unauthorized = await fetch(`${base}/api/dungeon-runs`, { method: "POST", headers: { Authorization: "Bearer invalid", "Content-Type": "application/json" }, body: JSON.stringify(payload) });
|
||||
@@ -141,12 +167,22 @@ test("migrates the old leaderboard schema and keeps its scores outside Easy", ()
|
||||
duration_ms INTEGER NOT NULL, full_clear INTEGER NOT NULL, finished_at INTEGER NOT NULL,
|
||||
party_json TEXT NOT NULL, bosses_json TEXT NOT NULL, submitted_by_account_id TEXT, received_at INTEGER NOT NULL)`);
|
||||
const legacy = run("pre-slider-result", 5000);
|
||||
database.prepare("INSERT INTO dungeon_runs VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)").run(legacy.id,
|
||||
const insert = database.prepare("INSERT INTO dungeon_runs VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||
insert.run(legacy.id,
|
||||
legacy.dungeonId, legacy.difficultyId, legacy.durationMs, 1, legacy.finishedAt,
|
||||
JSON.stringify(legacy.party), JSON.stringify(legacy.killedBossIds), null, Date.now());
|
||||
const oldShip = run("pre-single-boss-ship", 6000, false, "bite-sized-deadmines-ship");
|
||||
oldShip.killedBossIds = ["creature-79333", "creature-79336"];
|
||||
insert.run(oldShip.id, oldShip.dungeonId, oldShip.difficultyId, oldShip.durationMs, 1,
|
||||
oldShip.finishedAt, JSON.stringify(oldShip.party), JSON.stringify(oldShip.killedBossIds), null, Date.now());
|
||||
const repository = createDungeonLeaderboardRepository(database, { ErrorType: Error });
|
||||
assert.equal(repository.listDungeonLeaderboard({ dungeonId: "deadmines" }).total, 1);
|
||||
assert.equal(repository.listDungeonLeaderboard({ dungeonId: "deadmines", bossDifficulty: 1 }).total, 0);
|
||||
assert.equal(repository.listDungeonLeaderboard({ dungeonId: oldShip.dungeonId,
|
||||
bossId: "creature-79336" }).total, 1);
|
||||
assert.equal(repository.listDungeonLeaderboard({ dungeonId: oldShip.dungeonId,
|
||||
bossId: "creature-79333" }).total, 0);
|
||||
assert.equal(repository.getDungeonRun(oldShip.id).placement.finalTotal, 1);
|
||||
createDungeonLeaderboardRepository(database, { ErrorType: Error });
|
||||
assert.equal(repository.getDungeonRun(legacy.id).run.durationMs, 5000);
|
||||
} finally { database.close(); }
|
||||
|
||||
Reference in new issue
Block a user