Files
kandev/apps/web/e2e/scripts/retry-summary.test.ts
T
2026-08-11 19:33:50 +01:00

141 lines
3.9 KiB
TypeScript

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>): 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,
}),
]);
});
});