From a530ec00e1274e87ca64a75dfa4f97a12bf30f06 Mon Sep 17 00:00:00 2001 From: urielit1313-creator Date: Tue, 13 Oct 2026 21:06:29 -0600 Subject: [PATCH] test(scripts): add sync unit test for error-codes.mjs vs error.rs enums (#499) --- scripts/error-codes.mjs | 10 ++++-- scripts/error-codes.test.mjs | 60 ++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 scripts/error-codes.test.mjs diff --git a/scripts/error-codes.mjs b/scripts/error-codes.mjs index 182434d6..5830e9ef 100644 --- a/scripts/error-codes.mjs +++ b/scripts/error-codes.mjs @@ -24,7 +24,8 @@ export const errorMappings = { 16: "InvalidTarget", 17: "InvalidTreasury", 19: "ContractPaused", - 20: "SelfPayout" + 20: "SelfPayout", + 21: "ArithmeticOverflow" }, // Milestones contract errors @@ -48,7 +49,8 @@ export const errorMappings = { 17: "IssueNotAllocatedForDeallocate", 18: "ContractPaused", 19: "ContributionNotFound", - 20: "SelfPayout" + 20: "SelfPayout", + 21: "ArithmeticOverflow" }, // Maintenance-pool contract errors @@ -66,7 +68,9 @@ export const errorMappings = { 11: "NotDepositSponsor", 12: "DepositNotFound", 13: "ContractPaused", - 14: "DepositCountOverflow" + 14: "DepositCountOverflow", + 15: "TooManyDeposits", + 16: "ArithmeticOverflow" } }; diff --git a/scripts/error-codes.test.mjs b/scripts/error-codes.test.mjs new file mode 100644 index 00000000..135c2390 --- /dev/null +++ b/scripts/error-codes.test.mjs @@ -0,0 +1,60 @@ +import { test, describe } from "node:test"; +import assert from "node:assert/strict"; +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { errorMappings } from "./error-codes.mjs"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const repoRoot = path.resolve(__dirname, ".."); + +function parseRustErrorEnum(filePath) { + const content = fs.readFileSync(filePath, "utf8"); + const mapping = {}; + const regex = /^\s*([A-Za-z0-9_]+)\s*=\s*(\d+)\s*,/gm; + let match; + while ((match = regex.exec(content)) !== null) { + const [, name, code] = match; + mapping[parseInt(code, 10)] = name; + } + return mapping; +} + +describe("scripts/error-codes.mjs error mapping synchronization", () => { + test("escrow errorMappings matches contracts/escrow/src/error.rs", () => { + const rustPath = path.join(repoRoot, "contracts", "escrow", "src", "error.rs"); + const expected = parseRustErrorEnum(rustPath); + + const actual = {}; + for (const [k, v] of Object.entries(errorMappings.escrow)) { + actual[parseInt(k, 10)] = v; + } + + assert.deepStrictEqual(actual, expected); + }); + + test("milestones errorMappings matches contracts/milestones/src/error.rs", () => { + const rustPath = path.join(repoRoot, "contracts", "milestones", "src", "error.rs"); + const expected = parseRustErrorEnum(rustPath); + + const actual = {}; + for (const [k, v] of Object.entries(errorMappings.milestones)) { + actual[parseInt(k, 10)] = v; + } + + assert.deepStrictEqual(actual, expected); + }); + + test("maintenancePool errorMappings matches contracts/maintenance-pool/src/error.rs", () => { + const rustPath = path.join(repoRoot, "contracts", "maintenance-pool", "src", "error.rs"); + const expected = parseRustErrorEnum(rustPath); + + const actual = {}; + for (const [k, v] of Object.entries(errorMappings.maintenancePool)) { + actual[parseInt(k, 10)] = v; + } + + assert.deepStrictEqual(actual, expected); + }); +});