From 2a35ea4f07b4dcd41b99669ad263a5ec5b0384cf Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 19 Apr 2026 04:31:01 +0100 Subject: [PATCH] test: share pi embedded helper setup --- ...ded-subscribe.handlers.tools.media.test.ts | 52 ++++++++----------- ...ts-block-replies-text-end-does-not.test.ts | 50 ++++++++++-------- 2 files changed, 50 insertions(+), 52 deletions(-) diff --git a/src/agents/pi-embedded-subscribe.handlers.tools.media.test.ts b/src/agents/pi-embedded-subscribe.handlers.tools.media.test.ts index 41c2fc5cec0..e1c2274564a 100644 --- a/src/agents/pi-embedded-subscribe.handlers.tools.media.test.ts +++ b/src/agents/pi-embedded-subscribe.handlers.tools.media.test.ts @@ -121,6 +121,26 @@ async function emitMcpMediaToolResult(ctx: EmbeddedPiSubscribeContext, mediaPath }); } +async function handleCaseVariantBuiltinMedia(mediaPathOrUrl: string) { + const ctx = createMockContext({ + shouldEmitToolOutput: false, + onToolResult: vi.fn(), + builtinToolNames: new Set(["web_search"]), + }); + + await handleToolExecutionEnd(ctx, { + type: "tool_execution_end", + toolName: "Web_Search", + toolCallId: "tc-1", + isError: false, + result: { + content: [{ type: "text", text: `MEDIA:${mediaPathOrUrl}` }], + }, + }); + + return ctx; +} + describe("handleToolExecutionEnd media emission", () => { it("does not warn for read tool when path is provided via file_path alias", async () => { const ctx = createMockContext(); @@ -176,41 +196,13 @@ describe("handleToolExecutionEnd media emission", () => { }); it("does NOT emit local media for case-variant collisions with trusted built-ins", async () => { - const ctx = createMockContext({ - shouldEmitToolOutput: false, - onToolResult: vi.fn(), - builtinToolNames: new Set(["web_search"]), - }); - - await handleToolExecutionEnd(ctx, { - type: "tool_execution_end", - toolName: "Web_Search", - toolCallId: "tc-1", - isError: false, - result: { - content: [{ type: "text", text: "MEDIA:/tmp/secret.png" }], - }, - }); + const ctx = await handleCaseVariantBuiltinMedia("/tmp/secret.png"); expect(ctx.state.pendingToolMediaUrls).toEqual([]); }); it("still emits remote media for case-variant collisions with trusted built-ins", async () => { - const ctx = createMockContext({ - shouldEmitToolOutput: false, - onToolResult: vi.fn(), - builtinToolNames: new Set(["web_search"]), - }); - - await handleToolExecutionEnd(ctx, { - type: "tool_execution_end", - toolName: "Web_Search", - toolCallId: "tc-1", - isError: false, - result: { - content: [{ type: "text", text: "MEDIA:https://example.com/file.png" }], - }, - }); + const ctx = await handleCaseVariantBuiltinMedia("https://example.com/file.png"); expect(ctx.state.pendingToolMediaUrls).toEqual(["https://example.com/file.png"]); }); diff --git a/src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.emits-block-replies-text-end-does-not.test.ts b/src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.emits-block-replies-text-end-does-not.test.ts index a254d4e6a76..ea02ea3a45b 100644 --- a/src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.emits-block-replies-text-end-does-not.test.ts +++ b/src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.emits-block-replies-text-end-does-not.test.ts @@ -74,6 +74,30 @@ function emitOpenAiResponsesFinalMessageEnd(params: { }); } +async function emitSuppressedCommentary(params: { + emit: TextEndBlockReplyHarness["emit"]; + text: string; +}) { + params.emit({ type: "message_start", message: { role: "assistant" } }); + emitOpenAiResponsesTextDeltaAndEnd({ + emit: params.emit, + text: params.text, + id: "item_commentary", + phase: "commentary", + }); + await Promise.resolve(); +} + +function expectSingleBlockReplyText(params: { + onBlockReply: ReturnType; + subscription: TextEndBlockReplyHarness["subscription"]; + text: string; +}) { + expect(params.onBlockReply).toHaveBeenCalledTimes(1); + expect(params.onBlockReply.mock.calls[0]?.[0]?.text).toBe(params.text); + expect(params.subscription.assistantTexts).toEqual([params.text]); +} + describe("subscribeEmbeddedPiSession", () => { it("emits block replies on text_end and does not duplicate on message_end", async () => { const onBlockReply = vi.fn(); @@ -167,14 +191,7 @@ describe("subscribeEmbeddedPiSession", () => { const onBlockReply = vi.fn(); const { emit, subscription } = createTextEndBlockReplyHarness({ onBlockReply }); - emit({ type: "message_start", message: { role: "assistant" } }); - emitOpenAiResponsesTextDeltaAndEnd({ - emit, - text: "Working...", - id: "item_commentary", - phase: "commentary", - }); - await Promise.resolve(); + await emitSuppressedCommentary({ emit, text: "Working..." }); expect(onBlockReply).not.toHaveBeenCalled(); expect(subscription.assistantTexts).toEqual([]); @@ -189,9 +206,7 @@ describe("subscribeEmbeddedPiSession", () => { emitOpenAiResponsesFinalMessageEnd({ emit, commentaryText: "Working...", finalText: "Done." }); - expect(onBlockReply).toHaveBeenCalledTimes(1); - expect(onBlockReply.mock.calls[0]?.[0]?.text).toBe("Done."); - expect(subscription.assistantTexts).toEqual(["Done."]); + expectSingleBlockReplyText({ onBlockReply, subscription, text: "Done." }); }); it("emits the full final answer on text_end when it extends suppressed commentary", async () => { @@ -253,19 +268,10 @@ describe("subscribeEmbeddedPiSession", () => { const onBlockReply = vi.fn(); const { emit, subscription } = createTextEndBlockReplyHarness({ onBlockReply }); - emit({ type: "message_start", message: { role: "assistant" } }); - emitOpenAiResponsesTextDeltaAndEnd({ - emit, - text: "Working...", - id: "item_commentary", - phase: "commentary", - }); - await Promise.resolve(); + await emitSuppressedCommentary({ emit, text: "Working..." }); emitOpenAiResponsesFinalMessageEnd({ emit, commentaryText: "Working...", finalText: "Done." }); - expect(onBlockReply).toHaveBeenCalledTimes(1); - expect(onBlockReply.mock.calls[0]?.[0]?.text).toBe("Done."); - expect(subscription.assistantTexts).toEqual(["Done."]); + expectSingleBlockReplyText({ onBlockReply, subscription, text: "Done." }); }); });