using Xunit; using Moq; using Svrnty.MCP.Gateway.Core.Interfaces; using Svrnty.MCP.Gateway.Core.Models; namespace Svrnty.MCP.Gateway.Core.Tests.Interfaces; /// /// Unit tests for IRoutingStrategy interface following TDD approach. /// Tests server selection logic. /// public class IRoutingStrategyTests { [Fact] public async Task SelectServerAsync_WithHealthyServers_ReturnsServer() { // Arrange var mockStrategy = new Mock(); var servers = new List { new ServerInfo { Id = "server-1", IsHealthy = true }, new ServerInfo { Id = "server-2", IsHealthy = true } }; var context = new RoutingContext { ToolName = "test_tool" }; mockStrategy .Setup(s => s.SelectServerAsync( It.IsAny>(), It.IsAny(), It.IsAny())) .ReturnsAsync(servers[0]); // Act var selected = await mockStrategy.Object.SelectServerAsync(servers, context, CancellationToken.None); // Assert Assert.NotNull(selected); Assert.Equal("server-1", selected.Id); mockStrategy.Verify(s => s.SelectServerAsync(servers, context, It.IsAny()), Times.Once); } [Fact] public async Task SelectServerAsync_WithNoHealthyServers_ReturnsNull() { // Arrange var mockStrategy = new Mock(); var servers = new List { new ServerInfo { Id = "server-1", IsHealthy = false }, new ServerInfo { Id = "server-2", IsHealthy = false } }; var context = new RoutingContext { ToolName = "test_tool" }; mockStrategy .Setup(s => s.SelectServerAsync( It.IsAny>(), It.IsAny(), It.IsAny())) .ReturnsAsync((ServerInfo?)null); // Act var selected = await mockStrategy.Object.SelectServerAsync(servers, context, CancellationToken.None); // Assert Assert.Null(selected); } [Fact] public async Task SelectServerAsync_WithRoutingContext_UsesContext() { // Arrange var mockStrategy = new Mock(); var servers = new List { new ServerInfo { Id = "server-1", IsHealthy = true } }; var context = new RoutingContext { ToolName = "specific_tool", ClientId = "client-123", Metadata = new Dictionary { { "region", "us-east" } } }; mockStrategy .Setup(s => s.SelectServerAsync( It.IsAny>(), It.Is(c => c.ToolName == "specific_tool"), It.IsAny())) .ReturnsAsync(servers[0]); // Act var selected = await mockStrategy.Object.SelectServerAsync(servers, context, CancellationToken.None); // Assert Assert.NotNull(selected); mockStrategy.Verify(s => s.SelectServerAsync( It.IsAny>(), It.Is(c => c.ToolName == "specific_tool"), It.IsAny()), Times.Once); } [Fact] public async Task SelectServerAsync_WithEmptyServerList_ReturnsNull() { // Arrange var mockStrategy = new Mock(); var servers = new List(); var context = new RoutingContext { ToolName = "test_tool" }; mockStrategy .Setup(s => s.SelectServerAsync( It.IsAny>(), It.IsAny(), It.IsAny())) .ReturnsAsync((ServerInfo?)null); // Act var selected = await mockStrategy.Object.SelectServerAsync(servers, context, CancellationToken.None); // Assert Assert.Null(selected); } }