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 <noreply@anthropic.com>
This commit is contained in:
Kaoru0822andClaude Opus 5.5 authored and GitHub committed 2026-10-12 18:36:58 +08:00
1 parent c22111eca2
commit 621cee192d
2 files changed
+16 -10

No files matched your search

+3 -5
View File
@@ -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(
+13 -5
View File
@@ -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<Readonly<Record<string, unknown>>>,
): 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)),
};
};