/*
Unit tests for diagnostics summary covering summarizeStepDiagnostics. It also guards the documented public contract and regression-sensitive edge cases.
- Not a contract source of truth — the module under test owns the authoritative behavior; fixtures are minimal scaffolding only.
- RFC-1311: Compass header sweep — declares the diagnostics suite's contract for test-file scaffold coverage.
*/
import { describe, expect, it } from "vitest";
import { summarizeStepDiagnostics } from "./diagnostics-summary.ts";
describe("summarizeStepDiagnostics", () => {
it("counts data.findings warnings per rule id (AC-1)", () => {
const summary = summarizeStepDiagnostics({
findings: [
{ ruleId: "TERMS-DRIFT-01", severity: "warning" },
{ ruleId: "TERMS-DRIFT-01", severity: "warning" },
{ ruleId: "DIST-LEAK-06", severity: "error" },
{ ruleId: "LOCALFACT-01", severity: "info" },
],
});
expect(summary.warnings).toBe(2);
expect(summary.errors).toBe(1);
expect(summary.rules["TERMS-DRIFT-01"]).toEqual({ error: 0, warning: 2 });
expect(summary.rules["DIST-LEAK-06"]).toEqual({ error: 1, warning: 0 });
expect(summary.rules["LOCALFACT-01"]).toBeUndefined();
});
it("counts data.diagnostics object array (diagnosticsResult shape)", () => {
const summary = summarizeStepDiagnostics({
diagnostics: [
{ ruleId: "LP-01", severity: "warning" },
{ severity: "error" },
],
});
expect(summary.warnings).toBe(1);
expect(summary.errors).toBe(1);
expect(summary.rules["(no-rule)"]).toEqual({ error: 1, warning: 0 });
});
it("counts data.result.diagnostics (nested shape)", () => {
const summary = summarizeStepDiagnostics({
result: { diagnostics: [{ ruleId: "X-01", severity: "warning" }] },
});
expect(summary.warnings).toBe(1);
expect(summary.rules["X-01"]).toEqual({ error: 0, warning: 1 });
});
it("counts string diagnostics as (untyped) errors only on non-zero exit", () => {
const failed = summarizeStepDiagnostics({ diagnostics: ["boom", "bam"] }, 1);
expect(failed.errors).toBe(2);
expect(failed.rules["(untyped)"]).toEqual({ error: 2, warning: 0 });
const passed = summarizeStepDiagnostics({ diagnostics: ["note"] }, 0);
expect(passed.errors).toBe(0);
expect(passed.rules["(untyped)"]).toBeUndefined();
});
it("returns zeros for unrecognized shapes", () => {
for (const data of [undefined, null, {}, { diagnostics: "nope" }, 42, []]) {
expect(summarizeStepDiagnostics(data)).toEqual({ errors: 0, warnings: 0, rules: {} });
}
});
});