using Tau.Acuvim.Portal.Configuration; using Tau.Acuvim.Portal.Tests.Helpers; namespace Tau.Acuvim.Portal.Tests; public class ConnectionStringResolverTests { [Fact] public void ExplicitConnectionString_WinsOverEverything() { var db = new DatabaseOptions { ConnectionString = "Host=elsewhere;Database=mydb;Username=u;Password=p", AutoProvisionLocalTimescaleDb = true }; var ts = new TimescaleDbOptions { Host = "ignored" }; var env = new FakeHostEnvironment("Production"); var r = ConnectionStringResolver.Resolve(db, ts, env); Assert.Equal("Host=elsewhere;Database=mydb;Username=u;Password=p", r.ConnectionString); Assert.Equal("Database:ConnectionString", r.Source); } [Fact] public void AutoProvision_InDev_BuildsFromTimescaleBlock() { var db = new DatabaseOptions { ConnectionString = "", AutoProvisionLocalTimescaleDb = true }; var ts = new TimescaleDbOptions { Host = "timescaledb", Port = 5432, Database = "power_monitoring", Username = "power_user", Password = "local_secret" }; var env = new FakeHostEnvironment("Development"); var r = ConnectionStringResolver.Resolve(db, ts, env); Assert.Equal( "Host=timescaledb;Port=5432;Database=power_monitoring;Username=power_user;Password=local_secret", r.ConnectionString); Assert.Contains("auto-provision", r.Source, StringComparison.OrdinalIgnoreCase); } [Fact] public void AutoProvision_InProduction_Throws() { var db = new DatabaseOptions { ConnectionString = "", AutoProvisionLocalTimescaleDb = true }; var ts = new TimescaleDbOptions(); var env = new FakeHostEnvironment("Production"); var ex = Assert.Throws( () => ConnectionStringResolver.Resolve(db, ts, env)); Assert.Contains("not permitted in Production", ex.Message); } [Fact] public void NoConnectionString_AndAutoProvisionOff_Throws() { var db = new DatabaseOptions { ConnectionString = "", AutoProvisionLocalTimescaleDb = false }; var ts = new TimescaleDbOptions(); var env = new FakeHostEnvironment("Development"); var ex = Assert.Throws( () => ConnectionStringResolver.Resolve(db, ts, env)); Assert.Contains("No database connection string available", ex.Message); } [Theory] [InlineData("Staging")] [InlineData("Production")] public void AutoProvisionOff_AnyEnvironment_Throws(string envName) { var db = new DatabaseOptions { ConnectionString = "", AutoProvisionLocalTimescaleDb = false }; var ts = new TimescaleDbOptions(); var env = new FakeHostEnvironment(envName); Assert.Throws( () => ConnectionStringResolver.Resolve(db, ts, env)); } }