diff --git a/scripts/metrics-panels.test.js b/scripts/metrics-panels.test.js index 1ab95ca85..f0b4c5fea 100644 --- a/scripts/metrics-panels.test.js +++ b/scripts/metrics-panels.test.js @@ -436,6 +436,21 @@ function render(fixtures) { // ── Tests ────────────────────────────────────────────────────────────────── +test("null change failure rate renders unavailable marker, never 0.0%", () => { + const doraNullRate = { + ...DORA, + current: { ...DORA.current, changeFailureRate: null }, + }; + const html = render({ + countme: COUNTME_FULL, + brew: BREW, + dora: doraNullRate, + scorecard: SCORECARD, + }); + assert.ok(!html.includes("0.0%")); + assert.ok(html.includes("—")); +}); + test("lead time renders as not-measured, never as 0", () => { const html = render({ countme: COUNTME_FULL, diff --git a/src/components/factory/panels/MetricsPanels.tsx b/src/components/factory/panels/MetricsPanels.tsx index cd122472f..618685b4d 100644 --- a/src/components/factory/panels/MetricsPanels.tsx +++ b/src/components/factory/panels/MetricsPanels.tsx @@ -61,7 +61,7 @@ interface DoraMonthly { } interface DoraCurrent { deploymentsPerWeek: number; - changeFailureRate: number; + changeFailureRate: number | null; medianLeadTimeHours: number | null; leadTimeReason?: string; } @@ -113,7 +113,8 @@ function fmt(n: number | null | undefined): string { return n.toLocaleString("en-US"); } -function pct(n: number): string { +function pct(n: number | null | undefined): string { + if (n == null || !Number.isFinite(n)) return "—"; return `${(n * 100).toFixed(1)}%`; }