using FluentAssertions; using IBKRTrader.Core.Configuration; using IBKRTrader.Core.Settings; namespace IBKRTrader.Tests.Configuration; /// /// Die eine maßgebliche Datenbankverbindung. Vorher lasen EF-Kontexte und BackupWorker je eine /// eigene Konfiguration – eine Installation konnte laufen und dabei eine andere Datenbank sichern. /// [Trait("cat", "unit")] public class DatabaseEndpointTests { private static DatabaseSettings Settings() => new() { Host = "db.example", Port = 3306, Database = "ibkrtrader", User = "trader", Password = "geheim" }; [Fact] public void ConfiguredConnectionString_Wins_AndIsDecomposed() { var endpoint = DatabaseEndpoint.Resolve( "Server=127.0.0.1;Port=3999;Database=ibkrtrader_test;User ID=tester;Password=x;", Settings()); endpoint.Source.Should().Be("appsettings"); endpoint.Host.Should().Be("127.0.0.1"); endpoint.Port.Should().Be(3999); endpoint.Database.Should().Be("ibkrtrader_test"); endpoint.User.Should().Be("tester"); } [Fact] public void WithoutConnectionString_SettingsJsonIsUsed() { var endpoint = DatabaseEndpoint.Resolve(null, Settings()); endpoint.Source.Should().Be("settings.json"); endpoint.Host.Should().Be("db.example"); endpoint.Database.Should().Be("ibkrtrader"); endpoint.DescribeDivergence(Settings()).Should().BeNull("aus einer Quelle kann nichts auseinanderlaufen"); } [Fact] public void DivergingSources_AreReported() { var endpoint = DatabaseEndpoint.Resolve( "Server=127.0.0.1;Port=3306;Database=ibkrtrader_test;User ID=tester;Password=x;", Settings()); var divergence = endpoint.DescribeDivergence(Settings()); divergence.Should().NotBeNull(); divergence.Should().Contain("ibkrtrader_test").And.Contain("db.example"); } [Fact] public void MatchingSources_AreSilent() { var settings = Settings(); var endpoint = DatabaseEndpoint.Resolve(settings.BuildConnectionString(), settings); endpoint.DescribeDivergence(settings).Should().BeNull(); } [Fact] public void UnreadableConnectionString_FallsBackToSettingsJson() { var endpoint = DatabaseEndpoint.Resolve("das ist kein Connection-String", Settings()); endpoint.Host.Should().Be("db.example"); endpoint.Source.Should().StartWith("settings.json"); } [Fact] public void ToString_NeverContainsThePassword() { var endpoint = DatabaseEndpoint.Resolve(null, Settings()); endpoint.ToString().Should().NotContain("geheim"); endpoint.ToString().Should().Be("trader@db.example:3306/ibkrtrader"); } }