Files
diegosouzapw--omniroute/tests/unit/quota-pool-wizard-edit.test.ts
2026-07-13 13:39:12 +08:00

172 lines
6.5 KiB
TypeScript

/**
* Structure tests for PoolWizard editPool mode (Task 5 — Phase C1).
*
* Source-scan style, mirroring quota-pool-wizard.test.ts.
* No JSdom needed — pure text analysis of the source file.
*/
import test from "node:test";
import assert from "node:assert/strict";
import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
const ROOT = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
const WIZARD_PATH = path.join(
ROOT,
"src",
"app",
"(dashboard)",
"dashboard",
"costs",
"quota-share",
"components",
"PoolWizard.tsx"
);
const EN_JSON_PATH = path.join(ROOT, "src", "i18n", "messages", "en.json");
const PT_BR_JSON_PATH = path.join(ROOT, "src", "i18n", "messages", "pt-BR.json");
const wizardSrc = fs.readFileSync(WIZARD_PATH, "utf-8");
const enJson = JSON.parse(fs.readFileSync(EN_JSON_PATH, "utf-8")) as Record<string, unknown>;
const ptBrJson = JSON.parse(fs.readFileSync(PT_BR_JSON_PATH, "utf-8")) as Record<string, unknown>;
// ── PoolWizardProps: editPool field ───────────────────────────────────────────
test("PoolWizard.tsx: declares editPool in PoolWizardProps", () => {
assert.ok(
wizardSrc.includes("editPool?"),
"Expected optional editPool field in PoolWizardProps"
);
});
test("PoolWizard.tsx: imports QuotaPool type", () => {
assert.ok(
wizardSrc.includes("QuotaPool"),
"Expected QuotaPool type to be referenced in PoolWizard"
);
});
// ── Submit handler branching ──────────────────────────────────────────────────
test("PoolWizard.tsx: submit handler contains a PATCH to /api/quota/pools/ (edit branch)", () => {
assert.ok(
wizardSrc.includes("PATCH") && wizardSrc.includes("/api/quota/pools/"),
"Expected PATCH call to /api/quota/pools/ in PoolWizard"
);
});
test("PoolWizard.tsx: submit handler still contains a POST to /api/quota/pools (create branch)", () => {
assert.ok(
wizardSrc.includes('method: "POST"') && wizardSrc.includes("/api/quota/pools"),
"Expected POST call to /api/quota/pools in PoolWizard (create branch must remain)"
);
});
test("PoolWizard.tsx: submit handler branches on editPool", () => {
assert.ok(
wizardSrc.includes("editPool"),
"Expected editPool to appear in PoolWizard source (branching in submit)"
);
// The branching condition inside handleFinish
assert.ok(
wizardSrc.includes("if (editPool)"),
"Expected if (editPool) branch in handleFinish"
);
});
// ── Pre-fill references ───────────────────────────────────────────────────────
test("PoolWizard.tsx: pre-fills pool name from editPool.name", () => {
assert.ok(
wizardSrc.includes("editPool.name"),
"Expected editPool.name used for pre-filling pool name"
);
});
test("PoolWizard.tsx: pre-fills allocations from editPool.allocations", () => {
assert.ok(
wizardSrc.includes("editPool.allocations"),
"Expected editPool.allocations used for pre-filling allocations"
);
});
test("PoolWizard.tsx: pre-fills connectionIds using editPool.connectionIds and editPool.connectionId", () => {
assert.ok(
wizardSrc.includes("editPool.connectionIds"),
"Expected editPool.connectionIds referenced in pre-fill logic"
);
assert.ok(
wizardSrc.includes("editPool.connectionId"),
"Expected editPool.connectionId referenced as fallback in pre-fill logic"
);
});
test("PoolWizard.tsx: pre-fills groupId from editPool.groupId", () => {
assert.ok(
wizardSrc.includes("editPool.groupId"),
"Expected editPool.groupId used for pre-filling group selector"
);
});
// ── i18n key usage ────────────────────────────────────────────────────────────
test("PoolWizard.tsx: uses t(\"saveChanges\") for the submit button in edit mode", () => {
assert.ok(
wizardSrc.includes('t("saveChanges")'),
"Expected t(\"saveChanges\") used in submit button (edit mode)"
);
});
test("PoolWizard.tsx: uses t(\"editPoolTitle\") for the modal title in edit mode", () => {
assert.ok(
wizardSrc.includes('t("editPoolTitle")'),
"Expected t(\"editPoolTitle\") used in modal title (edit mode)"
);
});
// ── i18n parity: en.json ─────────────────────────────────────────────────────
test("en.json quotaShare namespace: contains editPoolTitle key", () => {
const quotaShare = enJson["quotaShare"] as Record<string, unknown> | undefined;
assert.ok(quotaShare, "Expected quotaShare namespace in en.json");
assert.ok(
"editPoolTitle" in quotaShare,
"Expected editPoolTitle key in en.json quotaShare namespace"
);
assert.equal(typeof quotaShare["editPoolTitle"], "string", "editPoolTitle must be a string");
});
test("en.json quotaShare namespace: contains saveChanges key", () => {
const quotaShare = enJson["quotaShare"] as Record<string, unknown> | undefined;
assert.ok(quotaShare, "Expected quotaShare namespace in en.json");
assert.ok(
"saveChanges" in quotaShare,
"Expected saveChanges key in en.json quotaShare namespace"
);
assert.equal(typeof quotaShare["saveChanges"], "string", "saveChanges must be a string");
});
// ── i18n parity: pt-BR.json ──────────────────────────────────────────────────
test("pt-BR.json quotaShare namespace: contains editPoolTitle key", () => {
const quotaShare = ptBrJson["quotaShare"] as Record<string, unknown> | undefined;
assert.ok(quotaShare, "Expected quotaShare namespace in pt-BR.json");
assert.ok(
"editPoolTitle" in quotaShare,
"Expected editPoolTitle key in pt-BR.json quotaShare namespace"
);
assert.equal(typeof quotaShare["editPoolTitle"], "string", "editPoolTitle must be a string");
});
test("pt-BR.json quotaShare namespace: contains saveChanges key", () => {
const quotaShare = ptBrJson["quotaShare"] as Record<string, unknown> | undefined;
assert.ok(quotaShare, "Expected quotaShare namespace in pt-BR.json");
assert.ok(
"saveChanges" in quotaShare,
"Expected saveChanges key in pt-BR.json quotaShare namespace"
);
assert.equal(typeof quotaShare["saveChanges"], "string", "saveChanges must be a string");
});