import { test, expect, describe } from "vitest"; import { aggregateCollectErrors } from "../runtime/execute-pipeline.ts"; import type { KernelExecutionReport } from "@warpgogol/werkstatt-shared/kernel"; import type { StepExecutionResult } from "../runtime/pipeline-scheduler.ts"; /* Unit tests for execute pipeline collect errors covering aggregateCollectErrors (RFC-0809). Not a contract source of truth — the module under test owns the authoritative behavior; fixtures are minimal scaffolding only. Fixtures stay inline and minimal so each case states its own setup. RFC-1311: Compass header sweep — declares the execute suite's contract for test-file scaffold coverage. */ // @ai-invariant fixtures must not couple to internals beyond the public surface under test function okReport(command: string): KernelExecutionReport { return { commandName: command, exitCode: 0, ok: true, summary: `${command}: OK`, metadata: {} as never, logs: [], timing: { durationMs: 10, exceededTimeout: false }, filesModified: [], }; } function failReport(command: string, exitCode = 1): KernelExecutionReport { return { commandName: command, exitCode, ok: false, summary: `${command}: FAIL`, metadata: {} as never, logs: [], timing: { durationMs: 10, exceededTimeout: false }, filesModified: [], }; } function makeResult( stepIndex: number, report: KernelExecutionReport, dependencySkipped = false, ): StepExecutionResult { return { stepIndex, report, dependencySkipped }; } describe("aggregateCollectErrors (RFC-0809)", () => { test("(a) multiple independent failures reported in one run", () => { const results: StepExecutionResult[] = [ makeResult(0, failReport("cmd.a")), makeResult(1, failReport("cmd.b"), true), makeResult(2, failReport("cmd.c", 2)), makeResult(3, okReport("cmd.d")), ]; const collected = aggregateCollectErrors(results, true); expect(collected).toBeDefined(); expect(collected!.ok).toBe(false); expect(collected!.failedSteps).toEqual(["cmd.a", "cmd.c"]); expect(collected!.exitCode).toBe(1); }); test("(b) dependency-skipped steps excluded from failedSteps", () => { const results: StepExecutionResult[] = [ makeResult(0, failReport("cmd.a")), makeResult(1, failReport("cmd.b"), true), ]; const collected = aggregateCollectErrors(results, true); expect(collected).toBeDefined(); expect(collected!.failedSteps).toEqual(["cmd.a"]); expect(collected!.failedSteps).not.toContain("cmd.b"); }); test("(c) collectErrors=false returns undefined (fail-fast fallthrough)", () => { const results: StepExecutionResult[] = [ makeResult(0, failReport("cmd.a")), makeResult(1, okReport("cmd.b")), ]; const collected = aggregateCollectErrors(results, false); expect(collected).toBeUndefined(); }); test("(d) no failures returns undefined even with collectErrors=true", () => { const results: StepExecutionResult[] = [ makeResult(0, okReport("cmd.a")), makeResult(1, okReport("cmd.b")), ]; const collected = aggregateCollectErrors(results, true); expect(collected).toBeUndefined(); }); });