From 63af3bcfdbc20cd4a317b2c9eab87bc0c17ab875 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 11 May 2026 20:45:44 +0100 Subject: [PATCH] test: guard remaining truthiness assertions --- .../src/browser/chrome.internal.test.ts | 4 +-- .../qa-lab/src/qa-channel-transport.test.ts | 1 - .../monitor/message-handler/prepare.test.ts | 24 ++++++++------- .../telegram/src/bot-message-dispatch.test.ts | 5 +++- extensions/telegram/src/webhook.test.ts | 1 - src/acp/translator.permission-relay.test.ts | 4 ++- .../reply/commands-export-trajectory.test.ts | 12 +++++--- src/cli/directory-cli.test.ts | 4 ++- src/config/config.web-search-provider.test.ts | 6 ++-- src/gateway/openai-http.test.ts | 24 ++++++++++----- ...server.node-invoke-approval-bypass.test.ts | 30 ++++++++++++++----- .../server.sessions.reset-cleanup.test.ts | 4 ++- 12 files changed, 80 insertions(+), 39 deletions(-) diff --git a/extensions/browser/src/browser/chrome.internal.test.ts b/extensions/browser/src/browser/chrome.internal.test.ts index a7f09d88411..11b9744c8fb 100644 --- a/extensions/browser/src/browser/chrome.internal.test.ts +++ b/extensions/browser/src/browser/chrome.internal.test.ts @@ -459,8 +459,8 @@ describe("chrome.ts internal", () => { expect(spawnOptions.env?.HTTPS_PROXY).toBeUndefined(); expect(spawnOptions.env?.NO_PROXY).toBeUndefined(); if (process.platform === "linux") { - expect(spawnOptions.env?.XDG_CONFIG_HOME).toBeTruthy(); - expect(spawnOptions.env?.XDG_CACHE_HOME).toBeTruthy(); + expect(spawnOptions.env?.XDG_CONFIG_HOME).toEqual(expect.any(String)); + expect(spawnOptions.env?.XDG_CACHE_HOME).toEqual(expect.any(String)); } // Cleanup. running.proc.kill?.("SIGTERM"); diff --git a/extensions/qa-lab/src/qa-channel-transport.test.ts b/extensions/qa-lab/src/qa-channel-transport.test.ts index 355d410967d..c21c252da8e 100644 --- a/extensions/qa-lab/src/qa-channel-transport.test.ts +++ b/extensions/qa-lab/src/qa-channel-transport.test.ts @@ -110,7 +110,6 @@ describe("qa channel transport", () => { const message = await transport.capabilities.readNormalizedMessage({ messageId: inbound.id, }); - expect(message).toBeTruthy(); if (!message) { throw new Error("expected normalized QA message"); } diff --git a/extensions/slack/src/monitor/message-handler/prepare.test.ts b/extensions/slack/src/monitor/message-handler/prepare.test.ts index a841aa3da59..71265202396 100644 --- a/extensions/slack/src/monitor/message-handler/prepare.test.ts +++ b/extensions/slack/src/monitor/message-handler/prepare.test.ts @@ -1626,12 +1626,14 @@ Second paragraph should still reach the agent after Slack's preview cutoff.`; opts: { source: "message" }, }); - expect(prepared).toBeTruthy(); - expect(prepared!.ctxPayload.WasMentioned).toBe(true); - expect(prepared!.ctxPayload.ExplicitlyMentionedBot).toBe(false); - expect(prepared!.ctxPayload.MentionedUserIds).toEqual(["UOTHER"]); - expect(prepared!.ctxPayload.ImplicitMentionKinds).toEqual(["reply_to_bot"]); - expect(prepared!.ctxPayload.MentionSource).toBe("implicit_thread"); + if (!prepared) { + throw new Error("expected prepared Slack message"); + } + expect(prepared.ctxPayload.WasMentioned).toBe(true); + expect(prepared.ctxPayload.ExplicitlyMentionedBot).toBe(false); + expect(prepared.ctxPayload.MentionedUserIds).toEqual(["UOTHER"]); + expect(prepared.ctxPayload.ImplicitMentionKinds).toEqual(["reply_to_bot"]); + expect(prepared.ctxPayload.MentionSource).toBe("implicit_thread"); }); it("marks authorized implicit thread control-command wakes as command bypass source", async () => { @@ -1670,10 +1672,12 @@ Second paragraph should still reach the agent after Slack's preview cutoff.`; opts: { source: "message" }, }); - expect(prepared).toBeTruthy(); - expect(prepared!.ctxPayload.WasMentioned).toBe(true); - expect(prepared!.ctxPayload.ImplicitMentionKinds).toEqual(["reply_to_bot"]); - expect(prepared!.ctxPayload.MentionSource).toBe("command_bypass"); + if (!prepared) { + throw new Error("expected prepared Slack message"); + } + expect(prepared.ctxPayload.WasMentioned).toBe(true); + expect(prepared.ctxPayload.ImplicitMentionKinds).toEqual(["reply_to_bot"]); + expect(prepared.ctxPayload.MentionSource).toBe("command_bypass"); }); it("keeps an implicit-conversation root and its Slack thread follow-up on one parent session in `requireMention: false` channels (#78505)", async () => { diff --git a/extensions/telegram/src/bot-message-dispatch.test.ts b/extensions/telegram/src/bot-message-dispatch.test.ts index f202a209ffb..e616d70d2aa 100644 --- a/extensions/telegram/src/bot-message-dispatch.test.ts +++ b/extensions/telegram/src/bot-message-dispatch.test.ts @@ -1797,7 +1797,10 @@ describe("dispatchTelegramMessage draft streaming", () => { const replies = deliverReplies.mock.calls[0]?.[0]?.replies as | Array<{ text?: string }> | undefined; - expect(replies?.[0]?.text?.trim()).toBeTruthy(); + const replyText = replies?.[0]?.text?.trim(); + if (!replyText) { + throw new Error("expected non-empty Telegram reply text"); + } expect(replies?.[0]?.text).not.toBe("NO_REPLY"); }); diff --git a/extensions/telegram/src/webhook.test.ts b/extensions/telegram/src/webhook.test.ts index f48be7d8845..a14a114efa6 100644 --- a/extensions/telegram/src/webhook.test.ts +++ b/extensions/telegram/src/webhook.test.ts @@ -570,7 +570,6 @@ describe("startTelegramWebhook", () => { const setWebhookCall = requireMockCall(setWebhookSpy, 0, "setWebhook"); expect(typeof setWebhookCall[0]).toBe("string"); const options = requireRecord(setWebhookCall[1], "setWebhook options"); - expect(options.certificate).toBeTruthy(); const certificate = options.certificate as | { path?: string; fileData?: string; filename?: string } | undefined; diff --git a/src/acp/translator.permission-relay.test.ts b/src/acp/translator.permission-relay.test.ts index 3282711d1ac..9063fb27439 100644 --- a/src/acp/translator.permission-relay.test.ts +++ b/src/acp/translator.permission-relay.test.ts @@ -149,7 +149,9 @@ function hasApprovalRelay(agent: AcpGatewayAgent, approvalId: string): boolean { } function requireRecord(value: unknown): Record { - expect(value).toBeTruthy(); + if (!value) { + throw new Error("expected record"); + } expect(typeof value).toBe("object"); expect(Array.isArray(value)).toBe(false); return value as Record; diff --git a/src/auto-reply/reply/commands-export-trajectory.test.ts b/src/auto-reply/reply/commands-export-trajectory.test.ts index 45a4f1d2b75..c5b24674c94 100644 --- a/src/auto-reply/reply/commands-export-trajectory.test.ts +++ b/src/auto-reply/reply/commands-export-trajectory.test.ts @@ -175,7 +175,9 @@ function readEncodedRequestFromCommand(command: string): Record } function requireRecord(value: unknown): Record { - expect(value).toBeTruthy(); + if (!value) { + throw new Error("expected record"); + } expect(typeof value).toBe("object"); expect(Array.isArray(value)).toBe(false); return value as Record; @@ -191,10 +193,12 @@ function execCallRecord( index = 0, ): { defaults: Record; params: Record } { const call = execCalls[index]; - expect(call).toBeTruthy(); + if (!call) { + throw new Error(`expected exec call at index ${index}`); + } return { - defaults: requireRecord(call?.defaults), - params: requireRecord(call?.params), + defaults: requireRecord(call.defaults), + params: requireRecord(call.params), }; } diff --git a/src/cli/directory-cli.test.ts b/src/cli/directory-cli.test.ts index 2935e16a01e..3593580a9bb 100644 --- a/src/cli/directory-cli.test.ts +++ b/src/cli/directory-cli.test.ts @@ -50,7 +50,9 @@ vi.mock("../runtime.js", () => ({ })); function requireRecord(value: unknown): Record { - expect(value).toBeTruthy(); + if (!value) { + throw new Error("expected record"); + } expect(typeof value).toBe("object"); expect(Array.isArray(value)).toBe(false); return value as Record; diff --git a/src/config/config.web-search-provider.test.ts b/src/config/config.web-search-provider.test.ts index 943dc296c3a..541f7664645 100644 --- a/src/config/config.web-search-provider.test.ts +++ b/src/config/config.web-search-provider.test.ts @@ -248,8 +248,10 @@ type ValidationMessage = { function findValidationMessage(messages: ValidationMessage[], path: string): ValidationMessage { const message = messages.find((entry) => entry.path === path); - expect(message).toBeTruthy(); - return message ?? {}; + if (!message) { + throw new Error(`expected validation message for ${path}`); + } + return message; } function expectAllowedValuesInclude(message: ValidationMessage, values: string[]): void { diff --git a/src/gateway/openai-http.test.ts b/src/gateway/openai-http.test.ts index 06c173d0657..77eb23fffc7 100644 --- a/src/gateway/openai-http.test.ts +++ b/src/gateway/openai-http.test.ts @@ -1446,7 +1446,9 @@ describe("OpenAI-compatible HTTP API (e2e)", () => { | string | undefined) === "get_weather", ); - expect(withIdentity).toBeTruthy(); + if (!withIdentity) { + throw new Error("expected tool call delta with identity"); + } const argsJoined = toolCallDeltaRecords .filter((record) => record.index === 0) .map( @@ -1460,7 +1462,9 @@ describe("OpenAI-compatible HTTP API (e2e)", () => { const finishChunk = toolCallChunks .flatMap((chunk) => (chunk.choices as Array> | undefined) ?? []) .find((choice) => choice.finish_reason === "tool_calls"); - expect(finishChunk).toBeTruthy(); + if (!finishChunk) { + throw new Error("expected tool_calls finish chunk"); + } } { @@ -1499,9 +1503,11 @@ describe("OpenAI-compatible HTTP API (e2e)", () => { .filter((d) => d !== "[DONE]") .map((d) => JSON.parse(d) as Record); const usageChunk = jsonChunks.find((chunk) => "usage" in chunk); - expect(usageChunk).toBeTruthy(); - expect(usageChunk?.choices).toEqual([]); - expect(usageChunk?.usage).toEqual({ + if (!usageChunk) { + throw new Error("expected streamed usage chunk"); + } + expect(usageChunk.choices).toEqual([]); + expect(usageChunk.usage).toEqual({ prompt_tokens: 12, completion_tokens: 3, total_tokens: 15, @@ -1566,7 +1572,9 @@ describe("OpenAI-compatible HTTP API (e2e)", () => { const finishChunk = lateToolCallChunks .flatMap((chunk) => (chunk.choices as Array> | undefined) ?? []) .find((choice) => choice.finish_reason === "tool_calls"); - expect(finishChunk).toBeTruthy(); + if (!finishChunk) { + throw new Error("expected late tool_calls finish chunk"); + } const anyToolCalls = lateToolCallChunks.some((chunk) => { const choice = ((chunk.choices as Array> | undefined) ?? [])[0]; const delta = (choice?.delta as Record | undefined) ?? {}; @@ -1608,7 +1616,9 @@ describe("OpenAI-compatible HTTP API (e2e)", () => { ((chunk.error as { type?: unknown }).type ?? "") === "invalid_request_error" && ((chunk.error as { message?: unknown }).message ?? "") === "invalid tool configuration", ); - expect(protocolError).toBeTruthy(); + if (!protocolError) { + throw new Error("expected invalid tool configuration protocol error"); + } const stopChoice = toolConflictChunks .flatMap((c) => (c.choices as Array> | undefined) ?? []) .find((choice) => choice.finish_reason === "stop"); diff --git a/src/gateway/server.node-invoke-approval-bypass.test.ts b/src/gateway/server.node-invoke-approval-bypass.test.ts index 0c2c305c54d..f1d1cfda19c 100644 --- a/src/gateway/server.node-invoke-approval-bypass.test.ts +++ b/src/gateway/server.node-invoke-approval-bypass.test.ts @@ -493,10 +493,17 @@ describe("node.invoke approval bypass", () => { idempotencyKey: crypto.randomUUID(), }); expect(invoke.ok).toBe(true); - await vi.waitFor(() => expect(lastInvokeParams).toBeTruthy(), { - timeout: 5_000, - interval: 50, - }); + await vi.waitFor( + () => { + if (!lastInvokeParams) { + throw new Error("expected forwarded invoke params"); + } + }, + { + timeout: 5_000, + interval: 50, + }, + ); const forwardedParams = requireRecord(lastInvokeParams, "forwarded invoke params"); expect(forwardedParams["approved"]).toBe(true); expect(forwardedParams["approvalDecision"]).toBe("allow-once"); @@ -576,10 +583,17 @@ describe("node.invoke approval bypass", () => { idempotencyKey: crypto.randomUUID(), }); expect(invoke.ok).toBe(true); - await vi.waitFor(() => expect(lastInvokeParams).toBeTruthy(), { - timeout: 5_000, - interval: 50, - }); + await vi.waitFor( + () => { + if (!lastInvokeParams) { + throw new Error("expected forwarded invoke params"); + } + }, + { + timeout: 5_000, + interval: 50, + }, + ); const forwardedParams = requireRecord(lastInvokeParams, "forwarded invoke params"); expect(forwardedParams["approved"]).toBe(true); expect(forwardedParams["approvalDecision"]).toBe("allow-once"); diff --git a/src/gateway/server.sessions.reset-cleanup.test.ts b/src/gateway/server.sessions.reset-cleanup.test.ts index 1db5c9ef048..82c75b7fea4 100644 --- a/src/gateway/server.sessions.reset-cleanup.test.ts +++ b/src/gateway/server.sessions.reset-cleanup.test.ts @@ -196,7 +196,9 @@ test("sessions.reset closes ACP runtime handles for ACP sessions", async () => { } | undefined; expect(closeSessionParams?.allowBackendUnavailable).toBe(true); - expect(closeSessionParams?.cfg).toBeTruthy(); + if (!closeSessionParams?.cfg) { + throw new Error("expected closeSession config"); + } expect(closeSessionParams?.discardPersistentState).toBe(true); expect(closeSessionParams?.requireAcpSession).toBe(false); expect(closeSessionParams?.reason).toBe("session-reset");