import { describe, expect, it } from "vitest"; import { summarizeObservations } from "./retry-summary"; import type { ShardMetadata } from "./e2e-timings"; import type { TimingObservation } from "./e2e-timings"; function observation(overrides: Partial): TimingObservation { return { key: "chromium::tests/example.spec.ts::works", project: "chromium", file: "tests/example.spec.ts", title: "works", retry: 0, status: "passed", durationSeconds: 1, errors: [], attachments: [], ...overrides, }; } describe("retry summary", () => { it("distinguishes first-attempt passes, passed retries, and failures", () => { const summary = summarizeObservations( [ observation({}), observation({ key: "chromium::tests/flaky.spec.ts::flaky", title: "flaky", status: "failed", }), observation({ key: "chromium::tests/flaky.spec.ts::flaky", title: "flaky", retry: 1, status: "passed", durationSeconds: 2, errors: [{ message: "temporary failure" }], }), observation({ key: "chromium::tests/slow.spec.ts::slow", title: "slow", status: "timedOut", errors: [{ message: "Timeout 60000ms exceeded" }], }), observation({ key: "chromium::tests/terminal.spec.ts::terminal", title: "terminal", status: "failed", errors: [{ message: "terminal failure" }], attachments: [{ name: "trace", path: "resources/trace.zip" }], }), ], "2026-08-10T10:02:00.000Z", { attachmentArtifact: { name: "e2e-timing-diagnostics", url: "https://github.com/kdlbs/kandev/actions/runs/42#artifacts", pathPrefix: "retry-artifacts", availablePaths: new Set(["resources/trace.zip"]), }, }, ); expect(summary.counts).toEqual({ passedFirstAttempt: 1, passedAfterRetry: 1, failed: 1, timedOut: 1, skipped: 0, }); expect(summary.tests).toEqual( expect.arrayContaining([ expect.objectContaining({ key: "chromium::tests/flaky.spec.ts::flaky", attempts: 2 }), expect.objectContaining({ key: "chromium::tests/slow.spec.ts::slow", finalStatus: "timedOut", }), expect.objectContaining({ key: "chromium::tests/terminal.spec.ts::terminal", finalStatus: "failed", errorCategory: "failure", attachments: [ { name: "trace", path: "retry-artifacts/trace.zip", artifactName: "e2e-timing-diagnostics", artifactUrl: "https://github.com/kdlbs/kandev/actions/runs/42#artifacts", }, ], }), ]), ); }); it("compares planned and actual shard durations and keeps plan health counters", () => { const metadata: ShardMetadata[] = [ { cohort: "normal", shard: 1, shardCount: 2, startedAt: "2026-08-10T10:00:00.000Z", finishedAt: "2026-08-10T10:02:00.000Z", exitCode: 0, predictedSeconds: 90, unitIds: ["chromium::tests/example.spec.ts"], }, ]; const summary = summarizeObservations([], "2026-08-10T10:02:00.000Z", { shardMetadata: metadata, planSummaries: [ { profileMode: "count-fallback", unknownUnits: 3, warmUnits: 1, staleUnits: 2, targetSeconds: 120, }, ], }); expect(summary.planning).toEqual({ mode: "count-fallback", unknownUnits: 3, warmUnits: 1, staleUnits: 2, targetSeconds: 120, }); expect(summary.shards).toEqual([ expect.objectContaining({ cohort: "normal", shard: 1, predictedSeconds: 90, actualSeconds: 120, deltaSeconds: 30, exitCode: 0, }), ]); }); });