Skip to content

Commit b701a36

Browse files
committed
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 aacc631 commit b701a36

File tree

6 files changed

+342
-127
lines changed

6 files changed

+342
-127
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.
@@ -406,18 +411,59 @@ void testRemoveNonExistentRoot() {
406411
}
407412

408413
@Test
409-
@Disabled
410414
void testReadResource() {
411-
withClient(createMcpTransport(), mcpAsyncClient -> {
412-
StepVerifier.create(mcpAsyncClient.listResources()).consumeNextWith(resources -> {
413-
if (!resources.resources().isEmpty()) {
414-
Resource firstResource = resources.resources().get(0);
415-
StepVerifier.create(mcpAsyncClient.readResource(firstResource)).consumeNextWith(result -> {
416-
assertThat(result).isNotNull();
417-
assertThat(result.contents()).isNotNull();
418-
}).verifyComplete();
415+
withClient(createMcpTransport(), client -> {
416+
Flux<McpSchema.ReadResourceResult> resources = client.initialize()
417+
.then(client.listResources(null))
418+
.flatMapMany(r -> Flux.fromIterable(r.resources()))
419+
.flatMap(r -> client.readResource(r));
420+
421+
StepVerifier.create(resources).recordWith(ArrayList::new).consumeRecordedWith(readResourceResults -> {
422+
423+
for (ReadResourceResult result : readResourceResults) {
424+
425+
assertThat(result).isNotNull();
426+
assertThat(result.contents()).isNotNull().isNotEmpty();
427+
428+
// Validate each content item
429+
for (ResourceContents content : result.contents()) {
430+
assertThat(content).isNotNull();
431+
assertThat(content.uri()).isNotNull().isNotEmpty();
432+
assertThat(content.mimeType()).isNotNull().isNotEmpty();
433+
434+
// Validate content based on its type with more comprehensive
435+
// checks
436+
switch (content.mimeType()) {
437+
case "text/plain" -> {
438+
TextResourceContents textContent = assertInstanceOf(TextResourceContents.class,
439+
content);
440+
assertThat(textContent.text()).isNotNull().isNotEmpty();
441+
assertThat(textContent.uri()).isNotEmpty();
442+
}
443+
case "application/octet-stream" -> {
444+
BlobResourceContents blobContent = assertInstanceOf(BlobResourceContents.class,
445+
content);
446+
assertThat(blobContent.blob()).isNotNull().isNotEmpty();
447+
assertThat(blobContent.uri()).isNotNull().isNotEmpty();
448+
// Validate base64 encoding format
449+
assertThat(blobContent.blob()).matches("^[A-Za-z0-9+/]*={0,2}$");
450+
}
451+
default -> {
452+
453+
// Still validate basic properties
454+
if (content instanceof TextResourceContents textContent) {
455+
assertThat(textContent.text()).isNotNull();
456+
}
457+
else if (content instanceof BlobResourceContents blobContent) {
458+
assertThat(blobContent.blob()).isNotNull();
459+
}
460+
}
461+
}
462+
}
419463
}
420-
}).verifyComplete();
464+
})
465+
.expectNextCount(10) // Expect 10 elements
466+
.verifyComplete();
421467
});
422468
}
423469

0 commit comments

Comments
 (0)