using System; using System.Linq; using Avalonia; using Avalonia.Controls; using Avalonia.Headless.XUnit; using Avalonia.Threading; 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 ServerConfiguration()); 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.User.Name); Assert.Equal("pass", vm.Configuration.User.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 ServerConfiguration()); // A semicolon-separated string that could be auto-detected as Npgsql vm.InputConnectionString = "Host=server;Username=bob;Password=secret;Database=db1;SSL Mode=Require"; // Force interpret as libpq should fail to parse (libpq uses spaces) and keep defaults 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", vm.Configuration.Host); Assert.Equal("db1", vm.Configuration.InitialDatabase); Assert.Equal("bob", vm.Configuration.User.Name); } [AvaloniaFact] public void Parse_Npgsql_with_inline_host_port_updates_all_fields() { var vm = new EditServerConfigurationViewModel(new ServerConfiguration()); 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.User.Name); Assert.Equal("admin", vm.Configuration.User.Password); } }