Because as long as I have no clear plan for how to manage multiple users per server it is better to keep it simple. Also some other tweaks to make edits appear in the list.
83 lines
3.8 KiB
C#
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(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);
|
|
}
|
|
}
|