using System; using Avalonia.Headless.XUnit; using pgLabII.Model; using pgLabII.ViewModels; using pgLabII.Views; using Xunit; namespace pgLabII.Tests.Views; public class EditServerConfigurationWindowTests { [AvaloniaFact] public void Parse_and_Generate_roundtrip_via_UI_bindings() { // Arrange: initialize Avalonia headless app once for the test var vm = new EditServerConfigurationViewModel(new(new ServerConfigurationEntity())); var window = new EditServerConfigurationWindow(vm); // Act: set an URL input, auto mode, then parse vm.InputConnectionString = "postgresql://user:pass@localhost:5433/mydb?sslmode=require"; vm.ForcedFormat = EditServerConfigurationViewModel.ForcedFormatOption.Auto; vm.ParseConnectionStringCommand.Execute().Subscribe(); // Assert fields updated Assert.Equal("localhost", vm.Configuration.Host); Assert.Equal((ushort)5433, vm.Configuration.Port); Assert.Equal("mydb", vm.Configuration.InitialDatabase); Assert.Equal("user", vm.Configuration.UserName); Assert.Equal("pass", vm.Configuration.Password); Assert.Equal(Npgsql.SslMode.Require, vm.Configuration.DefaultSslMode); // Generate back as libpq and validate vm.OutputFormat = pgLabII.PgUtils.ConnectionStrings.ConnStringFormat.Libpq; vm.GenerateConnectionStringCommand.Execute().Subscribe(); var outStr = vm.OutputConnectionString; Assert.Contains("host=localhost", outStr); Assert.Contains("port=5433", outStr); Assert.Contains("dbname=mydb", outStr); Assert.Contains("user=user", outStr); Assert.Contains("password=pass", outStr); Assert.Contains("sslmode=require", outStr); window.Close(); } [AvaloniaFact] public void Forced_format_overrides_auto_detection() { var vm = new EditServerConfigurationViewModel(new(new ServerConfigurationEntity())); // Use a string with quoted values that libpq would struggle with due to incorrect quoting vm.InputConnectionString = "Host=\"server with spaces\";Username=\"bob\";Password=\"secret\";Database=\"db1\""; // Force interpret as libpq should fail to parse (libpq expects single quotes, not double quotes for quoting) vm.ForcedFormat = EditServerConfigurationViewModel.ForcedFormatOption.Libpq; vm.ParseConnectionStringCommand.Execute().Subscribe(); // Since forced libpq parse would fail, configuration should remain default (Host empty) Assert.True(string.IsNullOrEmpty(vm.Configuration.Host)); // Now set to Auto and parse again -> should detect Npgsql and parse vm.ForcedFormat = EditServerConfigurationViewModel.ForcedFormatOption.Auto; vm.ParseConnectionStringCommand.Execute().Subscribe(); Assert.Equal("server with spaces", vm.Configuration.Host); Assert.Equal("db1", vm.Configuration.InitialDatabase); Assert.Equal("bob", vm.Configuration.UserName); } [AvaloniaFact] public void Parse_Npgsql_with_inline_host_port_updates_all_fields() { var vm = new EditServerConfigurationViewModel(new(new ServerConfigurationEntity())); vm.InputConnectionString = "Host=host.docker.internal:5432;Database=kms_quartz;Username=postgres;Password=admin;Trust Server Certificate=true"; vm.ForcedFormat = EditServerConfigurationViewModel.ForcedFormatOption.Auto; vm.ParseConnectionStringCommand.Execute().Subscribe(); Assert.Equal("host.docker.internal", vm.Configuration.Host); Assert.Equal((ushort)5432, vm.Configuration.Port); Assert.Equal("kms_quartz", vm.Configuration.InitialDatabase); Assert.Equal("postgres", vm.Configuration.UserName); Assert.Equal("admin", vm.Configuration.Password); } }