47 lines
2.8 KiB
JavaScript
47 lines
2.8 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import { mkdtempSync, rmSync } from "node:fs";
|
|
import os from "node:os";
|
|
import path from "node:path";
|
|
import test from "node:test";
|
|
import { GameDatabaseError, openGameDatabase } from "./database.mjs";
|
|
|
|
test("arena loadouts are character-owned, tank-free, and matches settle exactly once", async () => {
|
|
const directory = mkdtempSync(path.join(os.tmpdir(), "healer-man-arena-db-test-"));
|
|
const database = openGameDatabase({ dataDir: directory });
|
|
try {
|
|
const left = await database.register("ArenaLeft", "arena-left-pass");
|
|
const right = await database.register("ArenaRight", "arena-right-pass");
|
|
database.putCloudSave(left.account.id, { version: 1, characters: [{ id: "left-priest", name: "Left", classId: "priest", categoryId: "wow" }] });
|
|
database.putCloudSave(right.account.id, { version: 1, characters: [{ id: "right-mage", name: "Right", classId: "mage", categoryId: "wow" }] });
|
|
const loadout = database.putArenaLoadout(left.account.id, "left-priest", 1, {
|
|
name: "Disc Control", classId: "priest", specializationId: "priest:discipline",
|
|
role: "healer", ruleset: "wow", talents: { "priest:discipline:1": 5 }, actions: { "1": "heal" }, selected: true,
|
|
});
|
|
assert.equal(loadout.level, 80);
|
|
assert.equal(loadout.version, 1);
|
|
assert.equal(database.getArenaState(left.account.id, "left-priest").loadouts.length, 1);
|
|
assert.throws(() => database.putArenaLoadout(right.account.id, "right-mage", 1, {
|
|
name: "Protection", classId: "mage", specializationId: "warrior:protection", ruleset: "wow", talents: {}, actions: {},
|
|
}), (error) => error instanceof GameDatabaseError);
|
|
|
|
database.createArenaMatch({
|
|
id: "arena-idempotent", bracket: "2v2", mode: "rated-ai", ruleset: "wow", stageId: "warnorken-arena", startedAt: Date.now(),
|
|
participants: [
|
|
{ actorId: "left", accountId: left.account.id, characterId: "left-priest", team: 0, role: "healer", isBot: false, rating: 0 },
|
|
{ actorId: "left-bot", team: 0, role: "damage", isBot: true, rating: 0 },
|
|
{ actorId: "right", accountId: right.account.id, characterId: "right-mage", team: 1, role: "damage", isBot: false, rating: 0 },
|
|
{ actorId: "right-bot", team: 1, role: "healer", isBot: true, rating: 0 },
|
|
],
|
|
});
|
|
const first = database.settleArenaMatch("arena-idempotent", 0);
|
|
const retry = database.settleArenaMatch("arena-idempotent", 0);
|
|
assert.equal(first.ratingUpdates.find((update) => update.characterId === "left-priest").after, 32);
|
|
assert.deepEqual(retry.ratingUpdates, first.ratingUpdates);
|
|
assert.equal(database.getArenaRating(left.account.id, "left-priest", "2v2").rating, 32);
|
|
assert.equal(database.getArenaRating(left.account.id, "left-priest", "3v3").rating, 0);
|
|
} finally {
|
|
database.close();
|
|
rmSync(directory, { recursive: true, force: true });
|
|
}
|
|
});
|