


















@@ -4,6 +4,7 @@ import {
44buildExecEventPrompt,
55isCronSystemEvent,
66isExecCompletionEvent,
7+isRelayableExecCompletionEvent,
78} from "./heartbeat-events-filter.js";
89910describe("heartbeat event prompts", () => {
@@ -75,6 +76,24 @@ describe("heartbeat event prompts", () => {
7576expected: ["no command output was found", "Reply HEARTBEAT_OK only"],
7677unexpected: ["Please relay the command output to the user", "system messages above"],
7778},
79+{
80+name: "suppresses metadata-only successful exec completions",
81+events: ["Exec completed (abc12345, code 0)"],
82+opts: undefined,
83+expected: ["no command output was found", "Reply HEARTBEAT_OK only"],
84+unexpected: ["Please relay the command output to the user", "abc12345"],
85+},
86+{
87+name: "reports metadata-only failed exec completions without asking for logs",
88+events: ["Exec failed (abc12345, code 1)"],
89+opts: undefined,
90+expected: [
91+"without captured stdout/stderr",
92+"include the exit status or signal",
93+"Do not ask the user to provide missing logs",
94+],
95+unexpected: ["Please relay the command output to the user"],
96+},
7897])("$name", ({ events, opts, expected, unexpected }) => {
7998const prompt = buildExecEventPrompt(events, opts);
8099for (const part of expected) {
@@ -98,7 +117,9 @@ describe("heartbeat event classification", () => {
98117{ value: "exec finished: ok", expected: true },
99118{ value: "Exec finished (node=abc, code 0)", expected: true },
100119{ value: "Exec Finished (node=abc, code 1)", expected: true },
120+{ value: "Exec completed (abc12345, code 0)", expected: true },
101121{ value: "Exec completed (abc12345, code 0) :: some output", expected: true },
122+{ value: "Exec failed (abc12345, code 1)", expected: true },
102123{ value: "Exec failed (abc12345, signal SIGTERM) :: error output", expected: true },
103124{ value: "Exec completed (rotate api keys)", expected: false },
104125{ value: "Exec failed: notify me if this happens", expected: false },
@@ -119,11 +140,23 @@ describe("heartbeat event classification", () => {
119140{ value: "heartbeat wake: noop", expected: false },
120141{ value: "exec finished: ok", expected: false },
121142{ value: "Exec finished (node=abc, code 0)", expected: false },
143+{ value: "Exec completed (abc12345, code 0)", expected: false },
122144{ value: "Exec completed (abc12345, code 0) :: some output", expected: false },
145+{ value: "Exec failed (abc12345, code 1)", expected: false },
123146{ value: "Exec failed (abc12345, signal SIGTERM) :: error output", expected: false },
124147{ value: "Exec completed (rotate api keys)", expected: true },
125148{ value: "Reminder: if exec failed, notify me", expected: true },
126149])("classifies cron system events for %j", ({ value, expected }) => {
127150expect(isCronSystemEvent(value)).toBe(expected);
128151});
152+153+it.each([
154+{ value: "Exec completed (abc12345, code 0)", expected: false },
155+{ value: "Exec completed (abc12345, code 0) :: some output", expected: true },
156+{ value: "Exec failed (abc12345, code 1)", expected: true },
157+{ value: "Exec failed (abc12345, signal SIGTERM)", expected: true },
158+{ value: "exec finished: ok", expected: true },
159+])("classifies relayable exec completion events for %j", ({ value, expected }) => {
160+expect(isRelayableExecCompletionEvent(value)).toBe(expected);
161+});
129162});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。