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