using OpenHarbor.MCP.Client.Core.Abstractions; using OpenHarbor.MCP.Client.Core.Exceptions; using OpenHarbor.MCP.Client.Core.Models; using OpenHarbor.MCP.Client.Infrastructure; using Xunit; namespace OpenHarbor.MCP.Client.Core.Tests.Infrastructure; /// /// Unit tests for StdioServerConnection following TDD approach. /// Tests connection lifecycle, tool discovery, and tool execution. /// public class StdioServerConnectionTests { [Fact] public void Constructor_WithValidConfig_CreatesConnection() { // Arrange var config = new McpServerConfig { Name = "test-server", Transport = new StdioTransportConfig { Type = "Stdio", Command = "dotnet", Args = new[] { "run" } } }; // Act var connection = new StdioServerConnection(config); // Assert Assert.Equal("test-server", connection.ServerName); Assert.False(connection.IsConnected); } [Fact] public void ServerName_ReturnsConfiguredName() { // Arrange var config = new McpServerConfig { Name = "my-server", Transport = new StdioTransportConfig { Type = "Stdio", Command = "node", Args = new[] { "server.js" } } }; var connection = new StdioServerConnection(config); // Act var serverName = connection.ServerName; // Assert Assert.Equal("my-server", serverName); } [Fact] public void IsConnected_BeforeConnect_ReturnsFalse() { // Arrange var config = CreateTestConfig(); var connection = new StdioServerConnection(config); // Act var isConnected = connection.IsConnected; // Assert Assert.False(isConnected); } [Fact] public async Task ConnectAsync_WithValidConfig_SetsIsConnectedTrue() { // Arrange var config = CreateTestConfig(); var connection = new StdioServerConnection(config); // Act await connection.ConnectAsync(); // Assert Assert.True(connection.IsConnected); } [Fact] public async Task DisconnectAsync_AfterConnect_SetsIsConnectedFalse() { // Arrange var config = CreateTestConfig(); var connection = new StdioServerConnection(config); await connection.ConnectAsync(); // Act await connection.DisconnectAsync(); // Assert Assert.False(connection.IsConnected); } [Fact] public async Task ListToolsAsync_WithoutConnection_ThrowsException() { // Arrange var config = CreateTestConfig(); var connection = new StdioServerConnection(config); // Act & Assert await Assert.ThrowsAsync( async () => await connection.ListToolsAsync() ); } [Fact] public async Task CallToolAsync_WithoutConnection_ThrowsException() { // Arrange var config = CreateTestConfig(); var connection = new StdioServerConnection(config); // Act & Assert await Assert.ThrowsAsync( async () => await connection.CallToolAsync("test_tool") ); } [Fact] public async Task PingAsync_WhenConnected_DoesNotThrow() { // Arrange var config = CreateTestConfig(); var connection = new StdioServerConnection(config); await connection.ConnectAsync(); // Act & Assert - should not throw await connection.PingAsync(); } [Fact] public async Task DisposeAsync_AfterConnect_DisconnectsCleanly() { // Arrange var config = CreateTestConfig(); var connection = new StdioServerConnection(config); await connection.ConnectAsync(); // Act await connection.DisposeAsync(); // Assert Assert.False(connection.IsConnected); } private static McpServerConfig CreateTestConfig() { return new McpServerConfig { Name = "test-server", Transport = new StdioTransportConfig { Type = "Stdio", Command = "echo", Args = new[] { "test" } } }; } }