Skip to content

Commit a446be4

Browse files
committed
Rewrite testMissingHandlerReturnsMethodNotFoundError using a client transport
Mirrors the setup on HttpServletStreamableIntegrationTests.
1 parent 67747c2 commit a446be4

1 file changed

Lines changed: 31 additions & 26 deletions

File tree

mcp-test/src/test/java/io/modelcontextprotocol/server/HttpServletStatelessIntegrationTests.java

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,12 @@
44

55
package io.modelcontextprotocol.server;
66

7-
import java.net.URI;
8-
import java.net.http.HttpClient;
9-
import java.net.http.HttpRequest;
10-
import java.net.http.HttpResponse;
117
import java.time.Duration;
128
import java.util.List;
139
import java.util.Map;
1410
import java.util.concurrent.atomic.AtomicReference;
1511
import java.util.function.BiFunction;
12+
import java.util.function.Function;
1613

1714
import io.modelcontextprotocol.client.McpClient;
1815
import io.modelcontextprotocol.client.transport.HttpClientStreamableHttpTransport;
@@ -49,6 +46,8 @@
4946
import org.springframework.mock.web.MockHttpServletRequest;
5047
import org.springframework.mock.web.MockHttpServletResponse;
5148
import org.springframework.web.client.RestClient;
49+
import reactor.core.publisher.Mono;
50+
import reactor.test.StepVerifier;
5251

5352
import static io.modelcontextprotocol.server.transport.HttpServletStatelessServerTransport.APPLICATION_JSON;
5453
import static io.modelcontextprotocol.server.transport.HttpServletStatelessServerTransport.TEXT_EVENT_STREAM;
@@ -769,40 +768,46 @@ void testThrownMcpErrorAndJsonRpcError() throws Exception {
769768
mcpServer.close();
770769
}
771770

772-
@ParameterizedTest
773-
@ValueSource(strings = { "tools/list", "resources/list", "prompts/list" })
774-
void testMissingHandlerReturnsMethodNotFoundError(String method) throws Exception {
771+
@Test
772+
void testMissingHandlerReturnsMethodNotFoundError() {
775773
var mcpServer = McpServer.sync(mcpStatelessServerTransport)
776774
.serverInfo("test-server", "1.0.0")
777775
.capabilities(ServerCapabilities.builder().build())
778776
.build();
777+
var clientTransport = HttpClientStreamableHttpTransport.builder("http://localhost:" + PORT)
778+
.endpoint(CUSTOM_MESSAGE_ENDPOINT)
779+
.build();
779780

780-
HttpResponse<String> response;
781+
try (var mcpClient = McpClient.sync(clientTransport).build()) {
782+
// Create a session using an MCP client
783+
McpSchema.InitializeResult initResult = mcpClient.initialize();
784+
assertThat(initResult).isNotNull();
781785

782-
try {
783-
HttpRequest request = HttpRequest.newBuilder()
784-
.uri(URI.create("http://localhost:" + PORT + CUSTOM_MESSAGE_ENDPOINT))
785-
.header("Content-Type", "application/json")
786-
.header("Accept", "application/json, text/event-stream")
787-
.POST(HttpRequest.BodyPublishers.ofString("""
788-
{
789-
"jsonrpc": "2.0",
790-
"method": "%s",
791-
"id": "test-request-123",
792-
"params": {}
786+
// Override the response handler in the client to capture responses
787+
AtomicReference<McpSchema.JSONRPCResponse> response = new AtomicReference<>();
788+
var handler = (Function<Mono<McpSchema.JSONRPCMessage>, Mono<McpSchema.JSONRPCMessage>>) (
789+
message) -> message.doOnNext(r -> {
790+
if (r instanceof McpSchema.JSONRPCResponse resp) {
791+
response.set(resp);
793792
}
794-
""".formatted(method)))
795-
.build();
793+
});
794+
StepVerifier.create(clientTransport.connect(handler)).verifyComplete();
795+
796+
// Send a request for a non-existent method through the transport, bypassing
797+
// the client's capability checks
798+
StepVerifier
799+
.create(clientTransport.sendMessage(new McpSchema.JSONRPCRequest("foo/bar", "test-request-123")))
800+
.verifyComplete();
796801

797-
response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
802+
// Wait until we've received the response
803+
await().atMost(Duration.ofSeconds(1)).until(() -> response.get() != null);
804+
805+
assertThat(response.get().error().code()).isEqualTo(McpSchema.ErrorCodes.METHOD_NOT_FOUND);
806+
assertThat(response.get().error().message()).isEqualTo("Method not found: foo/bar");
798807
}
799808
finally {
800809
mcpServer.closeGracefully();
801810
}
802-
803-
final var responseBody = response.body();
804-
assertThatJson(responseBody).inPath("error.code").isEqualTo(McpSchema.ErrorCodes.METHOD_NOT_FOUND);
805-
assertThatJson(responseBody).inPath("error.message").isEqualTo("Method not found: " + method);
806811
}
807812

808813
private double evaluateExpression(String expression) {

0 commit comments

Comments
 (0)