128 lines
3.5 KiB
JavaScript
128 lines
3.5 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import test from "node:test";
|
|
import {
|
|
GM_REVIEW_NOTE_MAX_LENGTH,
|
|
MANASTORM_ADMIN_CONFIG_SCHEMA_VERSION,
|
|
normalizeManastormAdminConfig,
|
|
stampManastormReviewMetadata,
|
|
} from "./manastorm-config.mjs";
|
|
|
|
const global = {
|
|
enabled: true,
|
|
levelingEnabled: true,
|
|
endgameEnabled: true,
|
|
affixesEnabled: true,
|
|
chaoticLinkEnabled: true,
|
|
milestoneEncountersEnabled: true,
|
|
};
|
|
|
|
test("migrates schema-v1 Manastorm configuration and preserves records", () => {
|
|
const migrated = normalizeManastormAdminConfig({
|
|
schemaVersion: 1,
|
|
global,
|
|
dungeonSpawns: {
|
|
deadmines: { footPosition: [1, 2, 3], yaw: 0.25 },
|
|
},
|
|
bosses: {
|
|
"boss:key": { status: "not-ready" },
|
|
},
|
|
});
|
|
|
|
assert.equal(migrated.schemaVersion, MANASTORM_ADMIN_CONFIG_SCHEMA_VERSION);
|
|
assert.deepEqual(migrated.dungeons, {});
|
|
assert.deepEqual(migrated.dungeonSpawns.deadmines, { footPosition: [1, 2, 3], yaw: 0.25 });
|
|
assert.equal(migrated.bosses["boss:key"].status, "not-ready");
|
|
});
|
|
|
|
test("accepts valid dungeon readiness and rejects invalid values", () => {
|
|
const normalized = normalizeManastormAdminConfig({
|
|
schemaVersion: 2,
|
|
global,
|
|
dungeonSpawns: {},
|
|
dungeons: { deadmines: { status: "ready" } },
|
|
bosses: {},
|
|
});
|
|
assert.equal(normalized.dungeons.deadmines.status, "ready");
|
|
|
|
assert.throws(() => normalizeManastormAdminConfig({
|
|
schemaVersion: 2,
|
|
global,
|
|
dungeonSpawns: {},
|
|
dungeons: { deadmines: { status: "unknown" } },
|
|
bosses: {},
|
|
}), /status is invalid/);
|
|
});
|
|
|
|
test("normalizes review notes and rejects oversized comments", () => {
|
|
const normalized = normalizeManastormAdminConfig({
|
|
schemaVersion: 2,
|
|
global,
|
|
dungeonSpawns: {},
|
|
dungeons: {
|
|
deadmines: {
|
|
status: "not-ready",
|
|
note: " Door trigger clips.\r\nRetest after the fix. ",
|
|
reviewedAt: 1_700_000_000_000,
|
|
reviewedBy: "Phenom",
|
|
},
|
|
},
|
|
bosses: {},
|
|
});
|
|
assert.deepEqual(normalized.dungeons.deadmines, {
|
|
status: "not-ready",
|
|
note: "Door trigger clips.\nRetest after the fix.",
|
|
reviewedAt: 1_700_000_000_000,
|
|
reviewedBy: "Phenom",
|
|
});
|
|
|
|
assert.throws(() => normalizeManastormAdminConfig({
|
|
schemaVersion: 2,
|
|
global,
|
|
dungeonSpawns: {},
|
|
dungeons: { deadmines: { status: "not-ready", note: "x".repeat(GM_REVIEW_NOTE_MAX_LENGTH + 1) } },
|
|
bosses: {},
|
|
}), /note must be a string no longer/);
|
|
});
|
|
|
|
test("stamps changed review records and ignores incoming metadata spoofing", () => {
|
|
const previous = normalizeManastormAdminConfig({
|
|
schemaVersion: 2,
|
|
global,
|
|
dungeonSpawns: {},
|
|
dungeons: {
|
|
deadmines: {
|
|
status: "not-ready",
|
|
note: "Existing note",
|
|
reviewedAt: 100,
|
|
reviewedBy: "OriginalGM",
|
|
},
|
|
},
|
|
bosses: {},
|
|
});
|
|
const incoming = normalizeManastormAdminConfig({
|
|
...previous,
|
|
dungeons: {
|
|
deadmines: {
|
|
...previous.dungeons.deadmines,
|
|
reviewedAt: 999,
|
|
reviewedBy: "SpoofedGM",
|
|
},
|
|
stockades: {
|
|
status: "needs-tested",
|
|
note: "Check the prison doors.",
|
|
reviewedAt: 999,
|
|
reviewedBy: "SpoofedGM",
|
|
},
|
|
},
|
|
});
|
|
const stamped = stampManastormReviewMetadata(previous, incoming, "Phenom", 200);
|
|
|
|
assert.deepEqual(stamped.dungeons.deadmines, previous.dungeons.deadmines);
|
|
assert.deepEqual(stamped.dungeons.stockades, {
|
|
status: "needs-tested",
|
|
note: "Check the prison doors.",
|
|
reviewedAt: 200,
|
|
reviewedBy: "Phenom",
|
|
});
|
|
});
|