

























@@ -49,6 +49,19 @@ function requireTimestamp(value: number | undefined, label: string): number {
4949return value;
5050}
515152+function requireRecord(value: unknown): Record<string, unknown> {
53+expect(value).toBeTruthy();
54+expect(typeof value).toBe("object");
55+expect(Array.isArray(value)).toBe(false);
56+return value as Record<string, unknown>;
57+}
58+59+function firstMockArg(mock: unknown): unknown {
60+const calls = (mock as { mock: { calls: readonly (readonly unknown[])[] } }).mock.calls;
61+expect(calls[0]).toBeTruthy();
62+return calls[0]?.[0];
63+}
64+5265describe("cron service timer regressions", () => {
5366it("caps timer delay to 60s for far-future schedules", async () => {
5467const timeoutSpy = vi.spyOn(globalThis, "setTimeout");
@@ -101,7 +114,7 @@ describe("cron service timer regressions", () => {
101114await onTimer(state);
102115103116expect(timeoutSpy).toHaveBeenCalled();
104-expect(state.timer).toEqual(expect.anything());
117+expect(state.timer).toBeTruthy();
105118const delays = timeoutSpy.mock.calls
106119.map(([, delay]) => delay)
107120.filter((d): d is number => typeof d === "number");
@@ -1124,24 +1137,26 @@ describe("cron service timer regressions", () => {
11241137await onTimer(state);
1125113811261139expect(state.store?.jobs).toStrictEqual([]);
1127-expect(log.warn).not.toHaveBeenCalledWith(
1128-expect.anything(),
1129-"cron: applyOutcomeToStoredJob — job not found after forceReload, result discarded",
1130-);
1140+expect(
1141+log.warn.mock.calls.some(
1142+([, message]) =>
1143+message ===
1144+"cron: applyOutcomeToStoredJob — job not found after forceReload, result discarded",
1145+),
1146+).toBe(false);
11311147expect(log.info).toHaveBeenCalledWith(
11321148{ jobId: selfRemovingJob.id },
11331149"cron: finalized successful run after job was removed during execution",
11341150);
1135-expect(events).toContainEqual(
1136-expect.objectContaining({
1137-jobId: selfRemovingJob.id,
1138-action: "finished",
1139-status: "ok",
1140-summary: `finished ${selfRemovingJob.id}`,
1141-delivered: true,
1142-deliveryStatus: "delivered",
1143-}),
1151+const event = events.find(
1152+(candidate) => candidate.jobId === selfRemovingJob.id && candidate.action === "finished",
11441153);
1154+expect(event).toBeTruthy();
1155+expect(event?.action).toBe("finished");
1156+expect(event?.status).toBe("ok");
1157+expect(event?.summary).toBe(`finished ${selfRemovingJob.id}`);
1158+expect(event?.delivered).toBe(true);
1159+expect(event?.deliveryStatus).toBe("delivered");
11451160});
1146116111471162it("keeps missing-job discard semantics for failed isolated outcomes", async () => {
@@ -1335,15 +1350,15 @@ describe("cron service timer regressions", () => {
13351350await timerPromise;
1336135113371352expect(abortObserved).toBe(true);
1338-expect(cleanupTimedOutAgentRun).toHaveBeenCalledWith({
1339- job: expect.objectContaining({ id: "timeout-cleanup-stuck-run" }),
1340- timeoutMs: 1_000,
1341- execution: {
1342- jobId: "timeout-cleanup-stuck-run",
1343- agentId: "main",
1344- sessionId: "cron-run-session",
1345- sessionKey: "agent:main:cron:timeout-cleanup-stuck-run:run:cron-run-session",
1346-},
1353+expect(cleanupTimedOutAgentRun).toHaveBeenCalledTimes(1);
1354+const cleanupArgs = requireRecord(firstMockArg(cleanupTimedOutAgentRun));
1355+expect(requireRecord(cleanupArgs.job).id).toBe("timeout-cleanup-stuck-run");
1356+expect(cleanupArgs.timeoutMs).toBe(1_000);
1357+expect(cleanupArgs.execution).toEqual({
1358+jobId: "timeout-cleanup-stuck-run",
1359+agentId: "main",
1360+sessionId: "cron-run-session",
1361+sessionKey: "agent:main:cron:timeout-cleanup-stuck-run:run:cron-run-session",
13471362});
13481363const job = state.store?.jobs.find((entry) => entry.id === "timeout-cleanup-stuck-run");
13491364expect(job?.state.lastStatus).toBe("error");
@@ -1404,11 +1419,11 @@ describe("cron service timer regressions", () => {
14041419expect(abortObserved).toBe(true);
14051420expect(job.state.lastStatus).toBe("error");
14061421expect(job.state.lastError).toContain("setup timed out before runner start");
1407-expect(cleanupTimedOutAgentRun).toHaveBeenCalledWith({
1408- job: expect.objectContaining({ id: "isolated-setup-timeout-74803" }),
1409- timeoutMs: 120_000,
1410- execution: undefined,
1411-});
1422+expect(cleanupTimedOutAgentRun).toHaveBeenCalledTimes(1);
1423+const cleanupArgs = requireRecord(firstMockArg(cleanupTimedOutAgentRun));
1424+expect(requireRecord(cleanupArgs.job).id).toBe("isolated-setup-timeout-74803");
1425+expect(cleanupArgs.timeoutMs).toBe(120_000);
1426+expect(cleanupArgs.execution).toBeUndefined();
14121427} finally {
14131428vi.useRealTimers();
14141429}
@@ -1490,14 +1505,13 @@ describe("cron service timer regressions", () => {
14901505expect(job.state.lastStatus).toBe("error");
14911506expect(job.state.lastError).toContain("stalled before first model call");
14921507expect(job.state.lastError).toContain("context-engine");
1493-expect(cleanupTimedOutAgentRun).toHaveBeenCalledWith({
1494-job: expect.objectContaining({ id: "isolated-pre-model-timeout-74803" }),
1495-timeoutMs: 1_200_000,
1496-execution: expect.objectContaining({
1497-jobId: "isolated-pre-model-timeout-74803",
1498-phase: "context_engine",
1499-}),
1500-});
1508+expect(cleanupTimedOutAgentRun).toHaveBeenCalledTimes(1);
1509+const cleanupArgs = requireRecord(firstMockArg(cleanupTimedOutAgentRun));
1510+expect(requireRecord(cleanupArgs.job).id).toBe("isolated-pre-model-timeout-74803");
1511+expect(cleanupArgs.timeoutMs).toBe(1_200_000);
1512+const execution = requireRecord(cleanupArgs.execution);
1513+expect(execution.jobId).toBe("isolated-pre-model-timeout-74803");
1514+expect(execution.phase).toBe("context_engine");
15011515} finally {
15021516vi.useRealTimers();
15031517}
@@ -1741,10 +1755,16 @@ describe("cron service timer regressions", () => {
17411755 endedAt,
17421756});
174317571744-expect(job.state.lastDiagnostics).toMatchObject({
1745-summary: "exec stderr tail",
1746-entries: [{ source: "exec", severity: "error", message: "exec stderr tail", exitCode: 1 }],
1747-});
1758+expect(job.state.lastDiagnostics?.summary).toBe("exec stderr tail");
1759+expect(job.state.lastDiagnostics?.entries).toEqual([
1760+{
1761+ts: startedAt,
1762+source: "exec",
1763+severity: "error",
1764+message: "exec stderr tail",
1765+exitCode: 1,
1766+},
1767+]);
17481768expect(job.state.lastDiagnosticSummary).toBe("exec stderr tail");
17491769expect(log.warn).toHaveBeenCalledWith(
17501770{
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。