From d18da9a08d6f2ee0acddf58012aac512a5f88afe Mon Sep 17 00:00:00 2001 From: Jared Parsons Date: Sat, 22 Mar 2025 02:56:05 -0700 Subject: [PATCH] Remove reflection from Connect test (#57) * Remove reflection from Connect test This removes the reflection from the double connection test and replaces it with a `MockHttpHandler` to let the connection actually succeed and then test the redundant `ConnectAsync` call. partial fix for #48 * remove unneeded using --------- Co-authored-by: Stephen Toub --- .../Transport/SseClientTransportTests.cs | 45 ++++++++++++++++++- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/tests/ModelContextProtocol.Tests/Transport/SseClientTransportTests.cs b/tests/ModelContextProtocol.Tests/Transport/SseClientTransportTests.cs index 0749eed..53d41cc 100644 --- a/tests/ModelContextProtocol.Tests/Transport/SseClientTransportTests.cs +++ b/tests/ModelContextProtocol.Tests/Transport/SseClientTransportTests.cs @@ -107,12 +107,53 @@ public class SseClientTransportTests [Fact] public async Task ConnectAsync_Throws_If_Already_Connected() { - await using var transport = new SseClientTransport(_transportOptions, _serverConfig, NullLoggerFactory.Instance); - transport.GetType().BaseType!.GetField("_isConnected", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.SetValue(transport, true); + using var mockHttpHandler = new MockHttpHandler(); + using var httpClient = new HttpClient(mockHttpHandler); + await using var transport = new SseClientTransport(_transportOptions, _serverConfig, httpClient, NullLoggerFactory.Instance); + using var mreConnected = new ManualResetEventSlim(false); + using var mreDone = new ManualResetEventSlim(false); + var callIndex = 0; + mockHttpHandler.RequestHandler = (request) => + { + switch (callIndex++) + { + case 0: + return Task.FromResult(new HttpResponseMessage + { + StatusCode = HttpStatusCode.OK, + Content = new StringContent("event: endpoint\r\ndata: http://localhost\r\n\r\n") + }); + case 1: + mreConnected.Set(); + mreDone.Wait(); + return Task.FromResult(new HttpResponseMessage + { + StatusCode = HttpStatusCode.OK, + Content = new StringContent("") + }); + default: + return Task.FromResult(new HttpResponseMessage + { + StatusCode = HttpStatusCode.OK, + Content = new StringContent("") + }); + } + }; + + var task = Task.Run(async () => + { + await transport.ConnectAsync(TestContext.Current.CancellationToken); + }, TestContext.Current.CancellationToken); + + mreConnected.Wait(TestContext.Current.CancellationToken); + Assert.True(transport.IsConnected); var action = async () => await transport.ConnectAsync(); var exception = await Assert.ThrowsAsync(action); Assert.Equal("Transport is already connected", exception.Message); + mreDone.Set(); + await transport.CloseAsync(); + await task; } [Fact]