using System.Collections.Generic; using Npgsql; using pgLabII.Model; using pgLabII.PgUtils.ConnectionStrings; using pgLabII.Services; using Xunit; namespace pgLabII.Tests.Services; public class ServerConfigurationMappingTests { [Fact] public void ToDescriptor_Basic_MapsExpectedFields() { var cfg = new ServerConfiguration { Name = "Prod", Host = "db.example.com", Port = 5433, InitialDatabase = "appdb", DefaultSslMode = SslMode.Require, User = new ServerUser { Name = "alice", Password = "secret" } }; var extra = new Dictionary{{"search_path","public"}}; var d = ServerConfigurationMapping.ToDescriptor(cfg, applicationName: "pgLabII", timeoutSeconds: 15, extraProperties: extra); Assert.Equal("Prod", d.Name); Assert.Single(d.Hosts); Assert.Equal("db.example.com", d.Hosts[0].Host); Assert.Equal((ushort)5433, d.Hosts[0].Port); Assert.Equal("appdb", d.Database); Assert.Equal("alice", d.Username); Assert.Equal("secret", d.Password); Assert.Equal(SslMode.Require, d.SslMode); Assert.Equal("pgLabII", d.ApplicationName); Assert.Equal(15, d.TimeoutSeconds); Assert.True(d.Properties.ContainsKey("search_path")); Assert.Equal("public", d.Properties["search_path"]); } [Fact] public void ToDescriptor_OmitsEmptyFields() { var cfg = new ServerConfiguration { Name = "Empty", Host = "", InitialDatabase = "", User = new ServerUser { Name = "", Password = "" } }; var d = ServerConfigurationMapping.ToDescriptor(cfg); Assert.Empty(d.Hosts); Assert.Null(d.Database); Assert.Null(d.Username); Assert.Null(d.Password); } [Fact] public void FromDescriptor_CreatesNew_UsesFirstHost() { var desc = new ConnectionDescriptor { Name = "Staging", Hosts = new [] { new HostEndpoint{ Host = "host1", Port = 5432 }, new HostEndpoint{ Host = "host2", Port = 5434 } }, Database = "stagedb", Username = "bob", Password = "pwd", SslMode = SslMode.VerifyFull }; var cfg = ServerConfigurationMapping.FromDescriptor(desc); Assert.Equal("Staging", cfg.Name); Assert.Equal("host1", cfg.Host); Assert.Equal((ushort)5432, cfg.Port); Assert.Equal("stagedb", cfg.InitialDatabase); Assert.Equal(SslMode.VerifyFull, cfg.DefaultSslMode); Assert.Equal("bob", cfg.User.Name); Assert.Equal("pwd", cfg.User.Password); } [Fact] public void FromDescriptor_UpdatesExisting_PreservesMissing() { var existing = new ServerConfiguration { Name = "Existing", Host = "keep-host", Port = 5432, InitialDatabase = "keepdb", DefaultSslMode = SslMode.Prefer, User = new ServerUser { Name = "keepuser", Password = "keeppwd" } }; // Descriptor missing db and user/pass and sslmode var desc = new ConnectionDescriptor { Hosts = new [] { new HostEndpoint{ Host = "new-host" } } }; var cfg = ServerConfigurationMapping.FromDescriptor(desc, existing); Assert.Equal("new-host", cfg.Host); Assert.Equal((ushort)5432, cfg.Port); // unchanged Assert.Equal("keepdb", cfg.InitialDatabase); // preserved Assert.Equal(SslMode.Prefer, cfg.DefaultSslMode); // preserved Assert.Equal("keepuser", cfg.User.Name); // preserved Assert.Equal("keeppwd", cfg.User.Password); // preserved } [Fact] public void Roundtrip_Basic() { var cfg = new ServerConfiguration { Name = "Round", Host = "localhost", Port = 5432, InitialDatabase = "postgres", DefaultSslMode = SslMode.Allow, User = new ServerUser { Name = "me", Password = "pw" } }; var d = ServerConfigurationMapping.ToDescriptor(cfg); var cfg2 = ServerConfigurationMapping.FromDescriptor(d); Assert.Equal(cfg.Name, cfg2.Name); Assert.Equal(cfg.Host, cfg2.Host); Assert.Equal(cfg.Port, cfg2.Port); Assert.Equal(cfg.InitialDatabase, cfg2.InitialDatabase); Assert.Equal(cfg.DefaultSslMode, cfg2.DefaultSslMode); Assert.Equal(cfg.User.Name, cfg2.User.Name); Assert.Equal(cfg.User.Password, cfg2.User.Password); } }