Files
openclaw/src/cli/cron-cli/shared.cause-display.test.ts
Yoshikazu Terashi 3104f36329 fix(cron): surface classified run failure causes
Surface classified cron failure causes without changing raw cron JSON error text.

- add additive CLI `cause` output for finished run entries with `errorReason`
- persist/backfill full `FailoverReason` values on cron run-log entries
- thread provider context through cron finalization so provider-specific failure causes stay accurate
- extend protocol/Swift models and regression coverage for CLI JSON, run-log parsing/search, alerts, and protocol conformance

Verification:
- `pnpm lint --threads=8`
- `pnpm protocol:check`
- `pnpm exec oxfmt --check src/cli/cron-cli/shared.ts src/cli/cron-cli/shared.cause-display.test.ts src/cron/run-log.ts src/cron/run-log.error-reason.test.ts src/cron/cron-protocol-conformance.test.ts src/cron/service.failure-alert.test.ts src/cron/service/timer.ts src/cron/service/ops.ts src/gateway/protocol/schema/cron.ts scripts/protocol-gen-swift.ts`
- `git diff --check`
- AWS Crabbox `cbx_8a6a65ab83b0` / `run_42b73a4a9750`: 4 files, 20 tests passed
- autoreview clean, no accepted/actionable findings
- GitHub CI/CodeQL/OpenGrep/Workflow Sanity green/skipped/neutral on `aa29b087b2587d0aed3d409de5e7a2c706c32cdf`

Co-authored-by: Yoshikazu Terashi <yterashi@peperon-works.jp>
2026-05-27 09:03:17 +01:00

53 lines
1.5 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { defaultRuntime } from "../../runtime.js";
import { printCronJson } from "./shared.js";
describe("printCronJson cause display", () => {
it("adds an additive cause without changing raw cron run errors", () => {
let written: unknown;
const original = defaultRuntime.writeJson;
defaultRuntime.writeJson = (value: unknown) => {
written = value;
};
try {
printCronJson({
entries: [
{
ts: 1,
jobId: "job-1",
action: "finished",
status: "error",
errorReason: "timeout",
error: "cron: job execution timed out",
},
],
});
} finally {
defaultRuntime.writeJson = original;
}
const result = written as { entries: Array<Record<string, unknown>> };
expect(result.entries[0]?.cause).toBe("timeout");
expect(result.entries[0]?.error).toBe("cron: job execution timed out");
expect(result.entries[0]?.errorReason).toBe("timeout");
});
it("does not add cause fields to non-run-log entries", () => {
let written: unknown;
const original = defaultRuntime.writeJson;
defaultRuntime.writeJson = (value: unknown) => {
written = value;
};
try {
printCronJson({
entries: [{ errorReason: "timeout", status: "error" }],
});
} finally {
defaultRuntime.writeJson = original;
}
const result = written as { entries: Array<Record<string, unknown>> };
expect(result.entries[0]?.cause).toBeUndefined();
});
});