From edc08b7db85d44c009ff35f7dfae5e87c9b253f1 Mon Sep 17 00:00:00 2001 From: Diego Rodrigues de Sa e Souza Date: Tue, 14 Jul 2026 01:03:31 -0300 Subject: [PATCH] feat(homolog): L0 avaliador de paridade de deploy (TDD) --- scripts/homolog/lib/parity.mjs | 15 +++++++++++++++ tests/unit/homolog-parity.test.ts | 29 +++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 scripts/homolog/lib/parity.mjs create mode 100644 tests/unit/homolog-parity.test.ts diff --git a/scripts/homolog/lib/parity.mjs b/scripts/homolog/lib/parity.mjs new file mode 100644 index 0000000000..0fa00ea37c --- /dev/null +++ b/scripts/homolog/lib/parity.mjs @@ -0,0 +1,15 @@ +/** + * Avaliação pura de paridade do deploy (testável sem rede). + * @param {{status?: string, version?: string}} health corpo de /api/monitoring/health + * @param {{expectedVersion: string, httpStatus: number}} ctx + * @returns {{ok: boolean, failures: string[]}} + */ +export function evaluateParity(health, ctx) { + const failures = []; + if (ctx.httpStatus !== 200) failures.push(`health HTTP ${ctx.httpStatus} (esperado 200)`); + if (health?.status !== "healthy") + failures.push(`status "${health?.status}" (esperado "healthy")`); + if (health?.version !== ctx.expectedVersion) + failures.push(`version "${health?.version}" (esperado "${ctx.expectedVersion}")`); + return { ok: failures.length === 0, failures }; +} diff --git a/tests/unit/homolog-parity.test.ts b/tests/unit/homolog-parity.test.ts new file mode 100644 index 0000000000..0c3d779f41 --- /dev/null +++ b/tests/unit/homolog-parity.test.ts @@ -0,0 +1,29 @@ +import { test } from "node:test"; +import assert from "node:assert/strict"; +import { evaluateParity } from "../../scripts/homolog/lib/parity.mjs"; + +test("parity OK quando health bate com a versão esperada", () => { + const r = evaluateParity( + { status: "healthy", version: "3.8.49" }, + { expectedVersion: "3.8.49", httpStatus: 200 } + ); + assert.equal(r.ok, true); + assert.deepEqual(r.failures, []); +}); + +test("parity falha listando cada divergência", () => { + const r = evaluateParity( + { status: "degraded", version: "3.8.47" }, + { expectedVersion: "3.8.49", httpStatus: 200 } + ); + assert.equal(r.ok, false); + assert.equal(r.failures.length, 2); // status!=healthy, version mismatch +}); + +test("parity falha em HTTP não-200 mesmo com body bom", () => { + const r = evaluateParity( + { status: "healthy", version: "3.8.49" }, + { expectedVersion: "3.8.49", httpStatus: 503 } + ); + assert.equal(r.ok, false); +});