Skip to content

Commit 3f6f879

Browse files
tzolovpantanurag555
authored andcommitted
test: enhance resource reading tests (#314)
- Implement comprehensive resource content validation for text/plain and application/octet-stream MIME types - Validate resource count expectations (10 resources) - Add elicitation capability testing with ElicitRequest/ElicitResult support - Clean up unused imports (ObjectMapper, ImageFromDockerfile) Signed-off-by: Christian Tzolov <christian.tzolov@broadcom.com>
1 parent 86a9579 commit 3f6f879

File tree

6 files changed

+337
-109
lines changed

6 files changed

+337
-109
lines changed

mcp-spring/mcp-spring-webflux/src/test/java/io/modelcontextprotocol/client/WebClientStreamableHttpAsyncClientTests.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
package io.modelcontextprotocol.client;
22

3-
import com.fasterxml.jackson.databind.ObjectMapper;
43
import io.modelcontextprotocol.client.transport.WebClientStreamableHttpTransport;
54
import io.modelcontextprotocol.spec.McpClientTransport;
65
import org.junit.jupiter.api.Timeout;
7-
import org.springframework.web.reactive.function.client.WebClient;
86
import org.testcontainers.containers.GenericContainer;
97
import org.testcontainers.containers.wait.strategy.Wait;
10-
import org.testcontainers.images.builder.ImageFromDockerfile;
8+
9+
import org.springframework.web.reactive.function.client.WebClient;
1110

1211
@Timeout(15)
1312
public class WebClientStreamableHttpAsyncClientTests extends AbstractMcpAsyncClientTests {

mcp-spring/mcp-spring-webflux/src/test/java/io/modelcontextprotocol/client/WebFluxSseMcpAsyncClientTests.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66

77
import java.time.Duration;
88

9-
import io.modelcontextprotocol.client.transport.WebFluxSseClientTransport;
10-
import io.modelcontextprotocol.spec.McpClientTransport;
119
import org.junit.jupiter.api.Timeout;
10+
import org.springframework.web.reactive.function.client.WebClient;
1211
import org.testcontainers.containers.GenericContainer;
1312
import org.testcontainers.containers.wait.strategy.Wait;
1413

15-
import org.springframework.web.reactive.function.client.WebClient;
14+
import io.modelcontextprotocol.client.transport.WebFluxSseClientTransport;
15+
import io.modelcontextprotocol.spec.McpClientTransport;
1616

1717
/**
1818
* Tests for the {@link McpAsyncClient} with {@link WebFluxSseClientTransport}.

mcp-test/src/main/java/io/modelcontextprotocol/client/AbstractMcpAsyncClientTests.java

Lines changed: 68 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,14 @@
44

55
package io.modelcontextprotocol.client;
66

7+
import static org.assertj.core.api.Assertions.assertThat;
8+
import static org.assertj.core.api.Assertions.assertThatCode;
9+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
10+
import static org.assertj.core.api.Assertions.fail;
11+
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
12+
713
import java.time.Duration;
14+
import java.util.ArrayList;
815
import java.util.Map;
916
import java.util.Objects;
1017
import java.util.concurrent.atomic.AtomicBoolean;
@@ -13,9 +20,16 @@
1320
import java.util.function.Consumer;
1421
import java.util.function.Function;
1522

23+
import org.junit.jupiter.api.AfterEach;
24+
import org.junit.jupiter.api.BeforeEach;
25+
import org.junit.jupiter.api.Test;
26+
import org.junit.jupiter.params.ParameterizedTest;
27+
import org.junit.jupiter.params.provider.ValueSource;
28+
1629
import io.modelcontextprotocol.spec.McpClientTransport;
1730
import io.modelcontextprotocol.spec.McpError;
1831
import io.modelcontextprotocol.spec.McpSchema;
32+
import io.modelcontextprotocol.spec.McpSchema.BlobResourceContents;
1933
import io.modelcontextprotocol.spec.McpSchema.CallToolRequest;
2034
import io.modelcontextprotocol.spec.McpSchema.ClientCapabilities;
2135
import io.modelcontextprotocol.spec.McpSchema.CreateMessageRequest;
@@ -24,28 +38,19 @@
2438
import io.modelcontextprotocol.spec.McpSchema.ElicitResult;
2539
import io.modelcontextprotocol.spec.McpSchema.GetPromptRequest;
2640
import io.modelcontextprotocol.spec.McpSchema.Prompt;
41+
import io.modelcontextprotocol.spec.McpSchema.ReadResourceResult;
2742
import io.modelcontextprotocol.spec.McpSchema.Resource;
43+
import io.modelcontextprotocol.spec.McpSchema.ResourceContents;
2844
import io.modelcontextprotocol.spec.McpSchema.Root;
2945
import io.modelcontextprotocol.spec.McpSchema.SubscribeRequest;
46+
import io.modelcontextprotocol.spec.McpSchema.TextResourceContents;
3047
import io.modelcontextprotocol.spec.McpSchema.Tool;
3148
import io.modelcontextprotocol.spec.McpSchema.UnsubscribeRequest;
3249
import io.modelcontextprotocol.spec.McpTransport;
33-
import org.junit.jupiter.api.AfterEach;
34-
import org.junit.jupiter.api.BeforeEach;
35-
import org.junit.jupiter.api.Disabled;
36-
import org.junit.jupiter.api.Test;
37-
import org.junit.jupiter.params.ParameterizedTest;
38-
import org.junit.jupiter.params.provider.ValueSource;
3950
import reactor.core.publisher.Flux;
4051
import reactor.core.publisher.Mono;
4152
import reactor.test.StepVerifier;
4253

43-
import static org.assertj.core.api.Assertions.assertThat;
44-
import static org.assertj.core.api.Assertions.assertThatCode;
45-
import static org.assertj.core.api.Assertions.assertThatThrownBy;
46-
import static org.assertj.core.api.Assertions.fail;
47-
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
48-
4954
/**
5055
* Test suite for the {@link McpAsyncClient} that can be used with different
5156
* {@link McpTransport} implementations.
@@ -457,18 +462,59 @@ void testRemoveNonExistentRoot() {
457462
}
458463

459464
@Test
460-
@Disabled
461465
void testReadResource() {
462-
withClient(createMcpTransport(), mcpAsyncClient -> {
463-
StepVerifier.create(mcpAsyncClient.listResources()).consumeNextWith(resources -> {
464-
if (!resources.resources().isEmpty()) {
465-
Resource firstResource = resources.resources().get(0);
466-
StepVerifier.create(mcpAsyncClient.readResource(firstResource)).consumeNextWith(result -> {
467-
assertThat(result).isNotNull();
468-
assertThat(result.contents()).isNotNull();
469-
}).verifyComplete();
466+
withClient(createMcpTransport(), client -> {
467+
Flux<McpSchema.ReadResourceResult> resources = client.initialize()
468+
.then(client.listResources(null))
469+
.flatMapMany(r -> Flux.fromIterable(r.resources()))
470+
.flatMap(r -> client.readResource(r));
471+
472+
StepVerifier.create(resources).recordWith(ArrayList::new).consumeRecordedWith(readResourceResults -> {
473+
474+
for (ReadResourceResult result : readResourceResults) {
475+
476+
assertThat(result).isNotNull();
477+
assertThat(result.contents()).isNotNull().isNotEmpty();
478+
479+
// Validate each content item
480+
for (ResourceContents content : result.contents()) {
481+
assertThat(content).isNotNull();
482+
assertThat(content.uri()).isNotNull().isNotEmpty();
483+
assertThat(content.mimeType()).isNotNull().isNotEmpty();
484+
485+
// Validate content based on its type with more comprehensive
486+
// checks
487+
switch (content.mimeType()) {
488+
case "text/plain" -> {
489+
TextResourceContents textContent = assertInstanceOf(TextResourceContents.class,
490+
content);
491+
assertThat(textContent.text()).isNotNull().isNotEmpty();
492+
assertThat(textContent.uri()).isNotEmpty();
493+
}
494+
case "application/octet-stream" -> {
495+
BlobResourceContents blobContent = assertInstanceOf(BlobResourceContents.class,
496+
content);
497+
assertThat(blobContent.blob()).isNotNull().isNotEmpty();
498+
assertThat(blobContent.uri()).isNotNull().isNotEmpty();
499+
// Validate base64 encoding format
500+
assertThat(blobContent.blob()).matches("^[A-Za-z0-9+/]*={0,2}$");
501+
}
502+
default -> {
503+
504+
// Still validate basic properties
505+
if (content instanceof TextResourceContents textContent) {
506+
assertThat(textContent.text()).isNotNull();
507+
}
508+
else if (content instanceof BlobResourceContents blobContent) {
509+
assertThat(blobContent.blob()).isNotNull();
510+
}
511+
}
512+
}
513+
}
470514
}
471-
}).verifyComplete();
515+
})
516+
.expectNextCount(10) // Expect 10 elements
517+
.verifyComplete();
472518
});
473519
}
474520

0 commit comments

Comments
 (0)