From 621cee192d582c87ca3d254d4cb22c9d209d3aea Mon Sep 17 00:00:00 2001 From: Kaoru0822 <208281322+kaoru0822-kitauji@users.noreply.github.com> Date: Mon, 12 Oct 2026 03:36:58 -0700 Subject: [PATCH] test(mcp): ready providers before live prompt completion checks (#2137) 07b36c148 made document and procedure completion read only from an already-started provider client. Two checks still completed right after opening a target, so they observed an empty cold result: - promptCompletion.test.ts used a fixture client without executeIfReady and never ran an ordinary operation, so the composite provider had not created a client yet. - The packaged MCP smoke expected live completions on non-Linux hosts immediately after open_binary, before current_document started Hopper. Both now assert the cold result is empty, ready the provider through an ordinary operation, and then assert the unchanged live candidates. Fixes #2123 Co-authored-by: Claude Opus 5.5 --- scripts/verify-package-mcp.mjs | 8 +++----- tests/boundary/mcp/promptCompletion.test.ts | 18 +++++++++++++----- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/scripts/verify-package-mcp.mjs b/scripts/verify-package-mcp.mjs index 0d03abab1..5f43bf9b2 100644 --- a/scripts/verify-package-mcp.mjs +++ b/scripts/verify-package-mcp.mjs @@ -121,11 +121,8 @@ const verifyMcpNonLinuxCurrentDocument = async ( const verifyMcpBinaryLifecycle = async (client, mcpOptions) => { await verifyMcpOpenAndBind(client, mcpOptions); - await prompts.verifyPromptCompletion( - client, - mcpOptions, - process.platform !== "linux", - ); + // Completion never starts a provider; only an ordinary operation readies it. + await prompts.verifyPromptCompletion(client, mcpOptions, false); if (process.platform === "linux") { await verifyMcpLinuxToolAvailability(client, mcpOptions); } else { @@ -133,6 +130,7 @@ const verifyMcpBinaryLifecycle = async (client, mcpOptions) => { { name: "current_document", arguments: {} }, mcpOptions, ); + await prompts.verifyPromptCompletion(client, mcpOptions, true); await verifyMcpNonLinuxCurrentDocument(client, mcpOptions, current); } const closed = await client.callTool( diff --git a/tests/boundary/mcp/promptCompletion.test.ts b/tests/boundary/mcp/promptCompletion.test.ts index d74deb86f..f09725e12 100644 --- a/tests/boundary/mcp/promptCompletion.test.ts +++ b/tests/boundary/mcp/promptCompletion.test.ts @@ -50,6 +50,9 @@ describe("guided prompt completion from live analysis", () => { expect((await session.open(target)).ok).toBe(true); const completion = createPromptCompletionSource(session, session); + // Completion never starts a provider; an ordinary operation readies it. + expect(await completion.complete("document", "app")).toEqual([]); + expect((await session.execute("list_documents", {})).ok).toBe(true); expect(await completion.complete("document", "app")).toEqual([ "App", "AppTests", @@ -269,8 +272,8 @@ const fixtureEnvironment = { const client = ( requests: Array>>, -): AnalysisClient => ({ - execute(operation, parameters) { +): AnalysisClient => { + const execute: AnalysisClient["execute"] = (operation, parameters) => { if (operation === "list_documents") return Promise.resolve(observed(["AppTests", "App", "App"])); if (operation === "list_procedures") { @@ -285,6 +288,11 @@ const client = ( ); } return Promise.resolve(observed(null)); - }, - close: () => Promise.resolve(resultOk(null)), -}); + }; + // An in-process fixture client is ready as soon as the session opens. + return { + execute, + executeIfReady: execute, + close: () => Promise.resolve(resultOk(null)), + }; +};