using FluentAssertions; using IBKRTrader.Core.Modularity; using IBKRTrader.Hosting.Web.Endpoints; using IBKRTrader.Modules.CongressTrading; using IBKRTrader.Modules.DebugTrading; using IBKRTrader.Modules.OptionsWheel; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.DependencyInjection; namespace IBKRTrader.Tests.Web; [Trait("cat", "unit")] public class ModuleEndpointsTests { [Fact] public void Map_RegistersEndpoints_ForConfiguredModules() { var services = new ServiceCollection(); services.AddSingleton(new CongressTradingModule()); services.AddSingleton(new OptionsWheelModule()); services.AddSingleton(new DebugTradingModule()); var sp = services.BuildServiceProvider(); var builder = WebApplication.CreateBuilder(); var app = builder.Build(); var api = app.MapGroup("/api"); // Act ModuleEndpoints.Map(api, sp); // Assert - Verify registered endpoints var routeBuilder = (IEndpointRouteBuilder)app; var patterns = routeBuilder.DataSources .SelectMany(ds => ds.Endpoints) .OfType() .Select(e => e.RoutePattern.RawText) .ToList(); patterns.Should().Contain(p => p != null && p.Contains("/modules/congresstrading")); patterns.Should().Contain(p => p != null && p.Contains("/modules/optionswheel/status")); patterns.Should().Contain(p => p != null && p.Contains("/modules/optionswheel/underlyings")); patterns.Should().Contain(p => p != null && p.Contains("/modules/debugtrading/status")); patterns.Should().Contain(p => p != null && p.Contains("/modules/debugtrading/positions")); // Verify Supervisor is NOT registered patterns.Should().NotContain(p => p != null && p.Contains("/supervisor")); } [Fact] public void Map_DoesNotRegisterEndpoints_WhenModulesOmitted() { var services = new ServiceCollection(); // Empty modules list var sp = services.BuildServiceProvider(); var builder = WebApplication.CreateBuilder(); var app = builder.Build(); var api = app.MapGroup("/api"); // Act ModuleEndpoints.Map(api, sp); // Assert - None of the module endpoints should be mapped var routeBuilder = (IEndpointRouteBuilder)app; var patterns = routeBuilder.DataSources .SelectMany(ds => ds.Endpoints) .OfType() .Select(e => e.RoutePattern.RawText) .ToList(); patterns.Should().BeEmpty(); } }