From 3bd64d60dfbe4804c550ea46fe61acdc8ae95f64 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 10 May 2026 02:11:50 +0100 Subject: [PATCH] test: tighten codex run attempt tool events --- .../codex/src/app-server/run-attempt.test.ts | 116 ++++++++---------- 1 file changed, 53 insertions(+), 63 deletions(-) diff --git a/extensions/codex/src/app-server/run-attempt.test.ts b/extensions/codex/src/app-server/run-attempt.test.ts index 0d245866fdd..58fd1e694ff 100644 --- a/extensions/codex/src/app-server/run-attempt.test.ts +++ b/extensions/codex/src/app-server/run-attempt.test.ts @@ -915,77 +915,67 @@ describe("runCodexAppServerAttempt", () => { const run = runCodexAppServerAttempt(params); await harness.waitForMethod("turn/start"); - await expect( - harness.handleServerRequest({ - id: "request-tool-1", - method: "item/tool/call", - params: { - threadId: "thread-1", - turnId: "turn-1", - callId: "call-1", - namespace: null, - tool: "message", - arguments: { - action: "send", - token: "plain-secret-value-12345", - text: "hello", - }, + const toolResult = (await harness.handleServerRequest({ + id: "request-tool-1", + method: "item/tool/call", + params: { + threadId: "thread-1", + turnId: "turn-1", + callId: "call-1", + namespace: null, + tool: "message", + arguments: { + action: "send", + token: "plain-secret-value-12345", + text: "hello", }, - }), - ).resolves.toMatchObject({ - success: false, - contentItems: [ - { - type: "inputText", - text: expect.stringMatching( - /^(Unknown OpenClaw tool: message|Action send requires a target\.)$/u, - ), - }, - ], - }); + }, + })) as { + contentItems?: Array<{ text?: string; type?: string }>; + success?: boolean; + }; + expect(toolResult.success).toBe(false); + expect(toolResult.contentItems?.[0]?.type).toBe("inputText"); + expect(toolResult.contentItems?.[0]?.text).toMatch( + /^(Unknown OpenClaw tool: message|Action send requires a target\.)$/u, + ); await harness.completeTurn({ threadId: "thread-1", turnId: "turn-1" }); await run; - const agentEvents = onRunAgentEvent.mock.calls.map(([event]) => event); - expect(agentEvents).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - stream: "tool", - data: expect.objectContaining({ - phase: "start", - name: "message", - toolCallId: "call-1", - args: expect.objectContaining({ - action: "send", - token: "plain-…2345", - text: "hello", - }), - }), - }), - expect.objectContaining({ - stream: "tool", - data: expect.objectContaining({ - phase: "result", - name: "message", - toolCallId: "call-1", - isError: true, - result: expect.objectContaining({ success: false }), - }), - }), - ]), + const agentEvents = onRunAgentEvent.mock.calls.map(([event]) => event) as Array<{ + data?: { + args?: Record; + isError?: boolean; + name?: string; + phase?: string; + result?: { success?: boolean }; + toolCallId?: string; + }; + stream?: string; + }>; + const startEvent = agentEvents.find( + (event) => event.stream === "tool" && event.data?.phase === "start", ); + expect(startEvent?.data?.name).toBe("message"); + expect(startEvent?.data?.toolCallId).toBe("call-1"); + expect(startEvent?.data?.args?.action).toBe("send"); + expect(startEvent?.data?.args?.token).toBe("plain-…2345"); + expect(startEvent?.data?.args?.text).toBe("hello"); + const resultEvent = agentEvents.find( + (event) => event.stream === "tool" && event.data?.phase === "result", + ); + expect(resultEvent?.data?.name).toBe("message"); + expect(resultEvent?.data?.toolCallId).toBe("call-1"); + expect(resultEvent?.data?.isError).toBe(true); + expect(resultEvent?.data?.result?.success).toBe(false); expect(JSON.stringify(agentEvents)).not.toContain("plain-secret-value-12345"); - expect(globalAgentEvents).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - runId: "run-1", - sessionKey: "agent:main:session-1", - stream: "tool", - data: expect.objectContaining({ phase: "start", name: "message" }), - }), - ]), + const globalStartEvent = globalAgentEvents.find( + (event) => event.stream === "tool" && event.data.phase === "start", ); + expect(globalStartEvent?.runId).toBe("run-1"); + expect(globalStartEvent?.sessionKey).toBe("agent:main:session-1"); + expect(globalStartEvent?.data.name).toBe("message"); }); it("releases the session when Codex never completes after a dynamic tool response", async () => {