pgLabII/pgLabII.Tests/Views/EditServerConfigurationWindowTests.cs

83 lines
3.8 KiB
C#

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 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.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 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.User.Name);
}
[AvaloniaFact]
public void Parse_Npgsql_with_inline_host_port_updates_all_fields()
{
var vm = new EditServerConfigurationViewModel(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.User.Name);
Assert.Equal("admin", vm.Configuration.User.Password);
}
}