|
7 | 7 | import java.net.URI; |
8 | 8 | import java.net.http.HttpClient; |
9 | 9 | import java.net.http.HttpRequest; |
| 10 | +import java.net.http.HttpResponse; |
10 | 11 | import java.time.Duration; |
11 | 12 | import java.util.Map; |
| 13 | +import java.util.concurrent.CompletableFuture; |
12 | 14 | import java.util.concurrent.atomic.AtomicBoolean; |
13 | 15 | import java.util.concurrent.atomic.AtomicInteger; |
14 | 16 | import java.util.concurrent.atomic.AtomicReference; |
15 | | -import java.util.function.Consumer; |
16 | 17 | import java.util.function.Function; |
17 | 18 |
|
18 | 19 | import io.modelcontextprotocol.spec.McpSchema; |
|
21 | 22 | import org.junit.jupiter.api.BeforeEach; |
22 | 23 | import org.junit.jupiter.api.Test; |
23 | 24 | import org.junit.jupiter.api.Timeout; |
| 25 | +import org.mockito.ArgumentCaptor; |
| 26 | +import org.mockito.Mockito; |
24 | 27 | import org.testcontainers.containers.GenericContainer; |
25 | 28 | import org.testcontainers.containers.wait.strategy.Wait; |
26 | 29 | import reactor.core.publisher.Mono; |
|
31 | 34 |
|
32 | 35 | import static org.assertj.core.api.Assertions.assertThat; |
33 | 36 | import static org.assertj.core.api.Assertions.assertThatCode; |
| 37 | +import static org.mockito.ArgumentMatchers.any; |
| 38 | +import static org.mockito.Mockito.verify; |
| 39 | +import static org.mockito.Mockito.when; |
34 | 40 |
|
35 | 41 | import com.fasterxml.jackson.databind.ObjectMapper; |
36 | 42 |
|
@@ -364,4 +370,25 @@ void testChainedCustomizations() { |
364 | 370 | customizedTransport.closeGracefully().block(); |
365 | 371 | } |
366 | 372 |
|
| 373 | + @Test |
| 374 | + @SuppressWarnings("unchecked") |
| 375 | + void testResolvingClientEndpoint() { |
| 376 | + HttpClient httpClient = Mockito.mock(HttpClient.class); |
| 377 | + HttpResponse<Void> httpResponse = Mockito.mock(HttpResponse.class); |
| 378 | + CompletableFuture<HttpResponse<Void>> future = new CompletableFuture<>(); |
| 379 | + future.complete(httpResponse); |
| 380 | + when(httpClient.sendAsync(any(HttpRequest.class), any(HttpResponse.BodyHandler.class))).thenReturn(future); |
| 381 | + |
| 382 | + HttpClientSseClientTransport transport = new HttpClientSseClientTransport(httpClient, HttpRequest.newBuilder(), |
| 383 | + "http://example.com", "http://example.com/sse", new ObjectMapper()); |
| 384 | + |
| 385 | + transport.connect(Function.identity()); |
| 386 | + |
| 387 | + ArgumentCaptor<HttpRequest> httpRequestCaptor = ArgumentCaptor.forClass(HttpRequest.class); |
| 388 | + verify(httpClient).sendAsync(httpRequestCaptor.capture(), any(HttpResponse.BodyHandler.class)); |
| 389 | + assertThat(httpRequestCaptor.getValue().uri()).isEqualTo(URI.create("http://example.com/sse")); |
| 390 | + |
| 391 | + transport.closeGracefully().block(); |
| 392 | + } |
| 393 | + |
367 | 394 | } |
0 commit comments