From baa277690048b8b73d0f00a680d3576430487ded Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 11 May 2026 21:20:54 +0100 Subject: [PATCH] test: guard core agent null helpers --- src/agents/command/attempt-execution.cli.test.ts | 2 -- src/agents/pi-embedded-runner/stream-resolution.test.ts | 2 -- src/config/sessions/disk-budget.test.ts | 1 - src/crestodian/assistant.test.ts | 3 --- src/crestodian/operations.test.ts | 2 -- src/crestodian/rescue-channel.live.test.ts | 7 ++++--- src/crestodian/tui-backend.test.ts | 5 +++-- .../delivery-dispatch.double-announce.test.ts | 5 +++-- src/entry.respawn.test.ts | 1 - .../channel-server.shutdown-unhandled-rejection.test.ts | 4 +++- 10 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/agents/command/attempt-execution.cli.test.ts b/src/agents/command/attempt-execution.cli.test.ts index e7beba55e80..cdea28a53a7 100644 --- a/src/agents/command/attempt-execution.cli.test.ts +++ b/src/agents/command/attempt-execution.cli.test.ts @@ -93,8 +93,6 @@ async function readSessionFileJsonLines(sessionFile: string): Promise { } function requireRecord(value: unknown, label: string): Record { - expect(typeof value).toBe("object"); - expect(value).not.toBeNull(); if (typeof value !== "object" || value === null) { throw new Error(`${label} was not an object`); } diff --git a/src/agents/pi-embedded-runner/stream-resolution.test.ts b/src/agents/pi-embedded-runner/stream-resolution.test.ts index 3b20605c0ae..976c6289880 100644 --- a/src/agents/pi-embedded-runner/stream-resolution.test.ts +++ b/src/agents/pi-embedded-runner/stream-resolution.test.ts @@ -30,8 +30,6 @@ const overrideBoundaryAwareStreamFnOnce = (streamFn: StreamFn): void => { }; function requireRecord(value: unknown, label: string): Record { - expect(value).toBeTypeOf("object"); - expect(value).not.toBeNull(); if (!value || typeof value !== "object" || Array.isArray(value)) { throw new Error(`expected ${label} to be an object`); } diff --git a/src/config/sessions/disk-budget.test.ts b/src/config/sessions/disk-budget.test.ts index a9b13d62548..99ccbe70e08 100644 --- a/src/config/sessions/disk-budget.test.ts +++ b/src/config/sessions/disk-budget.test.ts @@ -27,7 +27,6 @@ async function expectPathMissing(targetPath: string): Promise { function expectBudgetResult( result: Awaited>, ): asserts result is NonNullable>> { - expect(result).not.toBeNull(); if (result === null) { throw new Error("expected disk budget enforcement result"); } diff --git a/src/crestodian/assistant.test.ts b/src/crestodian/assistant.test.ts index d84a4627633..4d3aa7911fd 100644 --- a/src/crestodian/assistant.test.ts +++ b/src/crestodian/assistant.test.ts @@ -132,7 +132,6 @@ describe("Crestodian assistant", () => { removeTempDir: async () => {}, }, }); - expect(result).not.toBeNull(); if (result === null) { throw new Error("Expected planner result"); } @@ -214,7 +213,6 @@ describe("Crestodian assistant", () => { removeTempDir: async () => {}, }, }); - expect(result).not.toBeNull(); if (result === null) { throw new Error("Expected planner result"); } @@ -266,7 +264,6 @@ describe("Crestodian assistant", () => { removeTempDir: async () => {}, }, }); - expect(result).not.toBeNull(); if (result === null) { throw new Error("Expected planner result"); } diff --git a/src/crestodian/operations.test.ts b/src/crestodian/operations.test.ts index f3f2bbec5b5..e2322c99e9c 100644 --- a/src/crestodian/operations.test.ts +++ b/src/crestodian/operations.test.ts @@ -17,8 +17,6 @@ function parseLastJsonLine(raw: string): unknown { } function requireRecord(value: unknown, label: string): Record { - expect(typeof value).toBe("object"); - expect(value).not.toBeNull(); if (typeof value !== "object" || value === null) { throw new Error(`${label} was not an object`); } diff --git a/src/crestodian/rescue-channel.live.test.ts b/src/crestodian/rescue-channel.live.test.ts index b35066d2202..629ab19fbc6 100644 --- a/src/crestodian/rescue-channel.live.test.ts +++ b/src/crestodian/rescue-channel.live.test.ts @@ -99,9 +99,10 @@ describeLive("Crestodian live rescue channel smoke", () => { const config = JSON.parse(await fs.readFile(configPath, "utf8")) as OpenClawConfig; const defaultModel = config.agents?.defaults?.model; - expect(typeof defaultModel).toBe("object"); - expect(defaultModel).not.toBeNull(); - expect((defaultModel as { primary?: unknown }).primary).toBe("openai/gpt-5.5"); + if (!defaultModel || typeof defaultModel !== "object") { + throw new Error("expected default model object"); + } + expect(defaultModel.primary).toBe("openai/gpt-5.5"); const auditPath = path.join(tempDir, "audit", "crestodian.jsonl"); const auditLines = (await fs.readFile(auditPath, "utf8")).trim().split("\n"); expect(auditLines.some((line) => line.includes('"operation":"config.setDefaultModel"'))).toBe( diff --git a/src/crestodian/tui-backend.test.ts b/src/crestodian/tui-backend.test.ts index 7ac4da3b859..81fb564b6b0 100644 --- a/src/crestodian/tui-backend.test.ts +++ b/src/crestodian/tui-backend.test.ts @@ -68,7 +68,8 @@ describe("runCrestodianTui", () => { expect(options.historyLimit).toBe(200); expect(options.config).toEqual({}); expect(options.title).toBe("openclaw crestodian"); - expect(typeof options.backend).toBe("object"); - expect(options.backend).not.toBeNull(); + if (!options.backend || typeof options.backend !== "object") { + throw new Error("expected crestodian TUI backend"); + } }); }); diff --git a/src/cron/isolated-agent/delivery-dispatch.double-announce.test.ts b/src/cron/isolated-agent/delivery-dispatch.double-announce.test.ts index c62d5576962..8d0ac442c8e 100644 --- a/src/cron/isolated-agent/delivery-dispatch.double-announce.test.ts +++ b/src/cron/isolated-agent/delivery-dispatch.double-announce.test.ts @@ -184,8 +184,9 @@ function makeBaseParams(overrides: { } function requireRecord(value: unknown, label: string): Record { - expect(value, label).toBeTypeOf("object"); - expect(value, label).not.toBeNull(); + if (!value || typeof value !== "object") { + throw new Error(`expected ${label}`); + } return value as Record; } diff --git a/src/entry.respawn.test.ts b/src/entry.respawn.test.ts index f82c07f3751..adcd7c3d1d8 100644 --- a/src/entry.respawn.test.ts +++ b/src/entry.respawn.test.ts @@ -13,7 +13,6 @@ import { type CliRespawnPlan = NonNullable>; function expectCliRespawnPlan(plan: ReturnType): CliRespawnPlan { - expect(plan).not.toBeNull(); if (plan === null) { throw new Error("Expected CLI respawn plan"); } diff --git a/src/mcp/channel-server.shutdown-unhandled-rejection.test.ts b/src/mcp/channel-server.shutdown-unhandled-rejection.test.ts index 14847d34659..48e04057dca 100644 --- a/src/mcp/channel-server.shutdown-unhandled-rejection.test.ts +++ b/src/mcp/channel-server.shutdown-unhandled-rejection.test.ts @@ -81,7 +81,9 @@ vi.mock("./channel-tools.js", () => ({ async function waitForTransport(): Promise<{ onclose?: (() => void) | undefined }> { await vi.waitFor(() => { - expect(transportState.lastTransport).not.toBeNull(); + if (transportState.lastTransport === null) { + throw new Error("MCP stdio transport was not created"); + } }); if (!transportState.lastTransport) { throw new Error("MCP stdio transport was not created");