feat: Darkmode, Core/Modul-Gliederung, OptionsWheel & DebugTrading Web-UI, Supervisor entfernt
Build & Test / build (ubuntu-latest) (push) Canceled after 0s
Build & Test / build (windows-latest) (push) Canceled after 0s

This commit is contained in:
Richard
2026-09-08 12:21:26 +02:00
parent 2ca5bc6553
commit 6189d1bf8c
17 changed files with 1403 additions and 472 deletions
@@ -0,0 +1,75 @@
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<IModule>(new CongressTradingModule());
services.AddSingleton<IModule>(new OptionsWheelModule());
services.AddSingleton<IModule>(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<RouteEndpoint>()
.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<RouteEndpoint>()
.Select(e => e.RoutePattern.RawText)
.ToList();
patterns.Should().BeEmpty();
}
}