From 579c38dc687af7a5b64451fd78bbb7b105c2dd0f Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 11 Aug 2026 00:55:04 -0700 Subject: [PATCH] test(core): remove session heartbeat test seams (#121913) --- src/commands/sessions.test-support.ts | 17 ----------- src/commands/sessions.test.ts | 29 +++++++++++++++++-- src/commands/sessions.ts | 9 ------ .../heartbeat-runner.session-state.test.ts | 11 ++++--- .../heartbeat-runner.tool-response.test.ts | 7 +++-- src/infra/heartbeat-runner.ts | 12 -------- 6 files changed, 37 insertions(+), 48 deletions(-) delete mode 100644 src/commands/sessions.test-support.ts diff --git a/src/commands/sessions.test-support.ts b/src/commands/sessions.test-support.ts deleted file mode 100644 index 5e1db3ad27fa..000000000000 --- a/src/commands/sessions.test-support.ts +++ /dev/null @@ -1,17 +0,0 @@ -import "./sessions.js"; - -type SessionsCommandTestApi = { - parseSessionsLimit(value: string | undefined): number; -}; - -function getTestApi(): SessionsCommandTestApi { - return (globalThis as Record)[ - Symbol.for("openclaw.sessionsCommandTestApi") - ] as SessionsCommandTestApi; -} - -export const testing: SessionsCommandTestApi = { - parseSessionsLimit(value) { - return getTestApi().parseSessionsLimit(value); - }, -}; diff --git a/src/commands/sessions.test.ts b/src/commands/sessions.test.ts index eb31374291f9..684c63f0ea64 100644 --- a/src/commands/sessions.test.ts +++ b/src/commands/sessions.test.ts @@ -17,7 +17,6 @@ process.env.FORCE_COLOR = "0"; mockSessionsConfig(); import { sessionsCommand } from "./sessions.js"; -import { testing } from "./sessions.test-support.js"; describe("sessionsCommand", () => { beforeEach(() => { @@ -341,8 +340,32 @@ describe("sessionsCommand", () => { expect(main?.runtimePolicySessionKey).toBe("agent:main:telegram:default:direct:42"); }); - it("uses a default JSON output limit of 100 sessions", () => { - expect(testing.parseSessionsLimit(undefined)).toBe(100); + it("uses a default JSON output limit of 100 sessions", async () => { + const entries = Object.fromEntries( + Array.from({ length: 101 }, (_, index) => [ + `agent:main:session-${index}`, + { + sessionId: `session-${index}`, + updatedAt: Date.now() - index, + model: "test:opus", + }, + ]), + ); + const store = await writeStore(entries, "sessions-default-limit"); + + const payload = await runSessionsJson<{ + count?: number; + totalCount?: number; + limitApplied?: number | null; + hasMore?: boolean; + sessions?: Array<{ key: string }>; + }>(sessionsCommand, store); + + expect(payload.count).toBe(100); + expect(payload.totalCount).toBe(101); + expect(payload.limitApplied).toBe(100); + expect(payload.hasMore).toBe(true); + expect(payload.sessions).toHaveLength(100); }); it("honors explicit JSON output limits", async () => { diff --git a/src/commands/sessions.ts b/src/commands/sessions.ts index c16f7c4e5b47..3cc75e04ed91 100644 --- a/src/commands/sessions.ts +++ b/src/commands/sessions.ts @@ -526,12 +526,3 @@ export async function sessionsCommand( runtime.log(line.trimEnd()); } } - -const testing = { - parseSessionsLimit, -} as const; - -if (process.env.VITEST || process.env.NODE_ENV === "test") { - (globalThis as Record)[Symbol.for("openclaw.sessionsCommandTestApi")] = - testing; -} diff --git a/src/infra/heartbeat-runner.session-state.test.ts b/src/infra/heartbeat-runner.session-state.test.ts index ceb6c41f8519..8f8ac9abc559 100644 --- a/src/infra/heartbeat-runner.session-state.test.ts +++ b/src/infra/heartbeat-runner.session-state.test.ts @@ -1,18 +1,21 @@ import { describe, expect, it } from "vitest"; -import { testing } from "./heartbeat-runner.js"; +import { + inferHeartbeatWakeSourceFromReason, + resolveHeartbeatWakePayloadFlags, +} from "./heartbeat-wake-policy.js"; describe("session-state heartbeat wakes", () => { it("infers the source and marks the wake as payload-bearing", () => { - expect(testing.inferHeartbeatWakeSourceFromReason("session-state:agent:main:child")).toBe( + expect(inferHeartbeatWakeSourceFromReason("session-state:agent:main:child")).toBe( "session-state", ); expect( - testing.resolveHeartbeatWakePayloadFlags({ + resolveHeartbeatWakePayloadFlags({ reason: "session-state:agent:main:child", }), ).toMatchObject({ isWakePayload: true }); expect( - testing.resolveHeartbeatWakePayloadFlags({ + resolveHeartbeatWakePayloadFlags({ source: "session-state", }), ).toMatchObject({ isWakePayload: true }); diff --git a/src/infra/heartbeat-runner.tool-response.test.ts b/src/infra/heartbeat-runner.tool-response.test.ts index b0b84c07243b..3f7760b5cc2f 100644 --- a/src/infra/heartbeat-runner.tool-response.test.ts +++ b/src/infra/heartbeat-runner.tool-response.test.ts @@ -27,7 +27,8 @@ import { closeOpenClawStateDatabaseForTest } from "../state/openclaw-state-db.js import { stripTrailingHeartbeatNotifyFalse } from "./heartbeat-delivery-normalization.js"; import { getLastHeartbeatEvent, resetHeartbeatEventsForTest } from "./heartbeat-events.js"; import { claimHeartbeatOutcomeForRun } from "./heartbeat-outcome-store.js"; -import { runHeartbeatOnce, testing, type HeartbeatDeps } from "./heartbeat-runner.js"; +import { truncateHeartbeatPreview } from "./heartbeat-runner-prompt.js"; +import { runHeartbeatOnce, type HeartbeatDeps } from "./heartbeat-runner.js"; import { installHeartbeatRunnerTestRuntime } from "./heartbeat-runner.test-harness.js"; import { readSessionStoreForTest, @@ -45,8 +46,8 @@ installHeartbeatRunnerTestRuntime(); describe("heartbeat event previews", () => { it("keeps the 200-code-unit preview UTF-16 well-formed", () => { - expect(testing.truncateHeartbeatPreview(`${"x".repeat(199)}🚀tail`)).toBe("x".repeat(199)); - expect(testing.truncateHeartbeatPreview(undefined)).toBeUndefined(); + expect(truncateHeartbeatPreview(`${"x".repeat(199)}🚀tail`)).toBe("x".repeat(199)); + expect(truncateHeartbeatPreview(undefined)).toBeUndefined(); }); }); diff --git a/src/infra/heartbeat-runner.ts b/src/infra/heartbeat-runner.ts index 904f895e321b..28f528d6c80f 100644 --- a/src/infra/heartbeat-runner.ts +++ b/src/infra/heartbeat-runner.ts @@ -1,10 +1,4 @@ // Runs heartbeat checks and emits status updates for configured agents. -import { truncateHeartbeatPreview } from "./heartbeat-runner-prompt.js"; -import { - inferHeartbeatWakeSourceFromReason, - resolveHeartbeatWakePayloadFlags, -} from "./heartbeat-wake-policy.js"; - export type { HeartbeatDeps } from "./heartbeat-runner-execution.js"; export { resolveHeartbeatAgents, @@ -22,9 +16,3 @@ export { type HeartbeatSummary, } from "./heartbeat-summary.js"; export { areHeartbeatsEnabled, setHeartbeatsEnabled } from "./heartbeat-wake.js"; - -export const testing = { - inferHeartbeatWakeSourceFromReason, - resolveHeartbeatWakePayloadFlags, - truncateHeartbeatPreview, -};