Phase 2: Launcher-UI + eigenstaendige Modul-Fenster - Form1 -> LauncherForm (Dateien via git mv, Designer/resx angepasst) - Modul-Tab: Karten aus ModuleRegistry mit "Fenster oeffnen"-Button je Modul - UI/WindowManager: Fenster-Tracking (Key->Form), Re-Open fokussiert, CloseAll - UI/ModuleFormBase: Basisklasse fuer eigenstaendige Modul-Fenster - CongressTradingForm: DB-Kennzahlen + manueller Scrape-Trigger (Phase-4-Ausbau folgt) - WindowManager in DI; Launcher schliesst Modul-Fenster beim Beenden - Tests: WindowManager (6) -> 21/21 gruen; Launcher-Start verifiziert Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> @
66 lines
2.1 KiB
C#
66 lines
2.1 KiB
C#
using FluentAssertions;
|
|
using IBKRTrader.Core.Database;
|
|
using IBKRTrader.Core.Logging;
|
|
using IBKRTrader.Core.Settings;
|
|
using IBKRTrader.Core.Workers;
|
|
using IBKRTrader.Modules.CongressTrading;
|
|
using IBKRTrader.Modules.CongressTrading.Database;
|
|
using IBKRTrader.Modules.CongressTrading.Scraper;
|
|
using IBKRTrader.Modules.CongressTrading.Workers;
|
|
using IBKRTrader.UI;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
|
namespace IBKRTrader.Tests.Modules;
|
|
|
|
[Trait("cat", "unit")]
|
|
public class CongressTradingModuleTests
|
|
{
|
|
[Fact]
|
|
public void Metadata_IsAsExpected()
|
|
{
|
|
var module = new CongressTradingModule();
|
|
|
|
module.Key.Should().Be("CT");
|
|
module.DisplayName.Should().NotBeNullOrWhiteSpace();
|
|
module.Version.Should().Be("1.0.0");
|
|
}
|
|
|
|
[Fact]
|
|
public void RegisterServices_RegistersAllModuleServices()
|
|
{
|
|
var services = new ServiceCollection();
|
|
|
|
new CongressTradingModule().RegisterServices(services);
|
|
|
|
var registered = services.Select(d => d.ServiceType).ToList();
|
|
registered.Should().Contain(new[]
|
|
{
|
|
typeof(CongressMigrations),
|
|
typeof(CongressRepository),
|
|
typeof(CapitolTradesScraper),
|
|
typeof(CongressHistoryImportWorker),
|
|
typeof(CongressScrapeWorker),
|
|
});
|
|
}
|
|
|
|
[Fact]
|
|
public void CreateWindow_ReturnsModuleForm()
|
|
{
|
|
// Minimaler DI-Container mit allen von CreateWindow benötigten Abhängigkeiten.
|
|
var services = new ServiceCollection();
|
|
services.AddSingleton<SettingsService>();
|
|
services.AddSingleton<LoggingService>();
|
|
services.AddSingleton<DatabaseService>();
|
|
services.AddSingleton<IEnumerable<IWorker>>(_ => Array.Empty<IWorker>());
|
|
services.AddSingleton<WorkerEngine>();
|
|
var module = new CongressTradingModule();
|
|
module.RegisterServices(services);
|
|
|
|
using var provider = services.BuildServiceProvider();
|
|
using var form = module.CreateWindow(provider);
|
|
|
|
form.Should().BeAssignableTo<ModuleFormBase>();
|
|
((ModuleFormBase)form).ModuleKey.Should().Be("CT");
|
|
}
|
|
}
|