using FluentAssertions; using IBKRTrader.Core.Modularity; using IBKRTrader.Core.Workers; using IBKRTrader.Modules.CongressTrading; using IBKRTrader.Modules.CongressTrading.Database; using IBKRTrader.Modules.CongressTrading.Scraper; using IBKRTrader.Modules.CongressTrading.Workers; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using NSubstitute; namespace IBKRTrader.Tests.Modules; [Trait("cat", "unit")] public class CongressTradingModuleTests { private sealed class CapturingUiHost : IModuleUiHost { private readonly List _views = new(); public IReadOnlyList Views => _views; public void RegisterView(ModuleView view) => _views.Add(view); public bool IsOpen(string viewId) => false; public void OpenView(string viewId) { } public void ActivateMain() { } public void RequestShutdown() { } public event Action? OpenStateChanged { add { } remove { } } } [Fact] public void Metadata_IsAsExpected() { var module = new CongressTradingModule(); module.Name.Should().Be("CongressTrading"); module.DbPrefix.Should().Be("ct_"); } [Fact] public void RegisterServices_RegistersServicesAndWorkers() { var services = new ServiceCollection(); new CongressTradingModule().RegisterServices(services, Substitute.For()); var types = services.Select(d => d.ServiceType).ToList(); types.Should().Contain(new[] { typeof(CongressRepository), typeof(CapitolTradesScraper), typeof(CongressHistoryImportWorker), typeof(CongressScrapeWorker), }); // Worker werden zusätzlich als IWorker registriert (für die WorkerEngine). services.Count(d => d.ServiceType == typeof(IWorker)).Should().Be(2); } [Fact] public void RegisterUi_RegistriertNichts_DamitDasModulPlattformneutralBleibt() { // Absicht, kein Versehen: würde das Modul sein Fenster selbst erzeugen, müsste es das // UI-Toolkit referenzieren – und wäre damit nicht mehr kopflos auf Linux lauffähig. // Das Fenster registriert die Shell zentral (App: UI/ModuleViews.cs). var host = new CapturingUiHost(); var provider = new ServiceCollection().BuildServiceProvider(); new CongressTradingModule().RegisterUi(host, provider); host.Views.Should().BeEmpty(); } [Fact] public void GetActivationBlocker_DefaultsToNull() { // Default-Interface-Methode → über die Interface-Referenz aufrufen. IModule module = new CongressTradingModule(); module.GetActivationBlocker(Substitute.For()).Should().BeNull(); } }