88 lines
3.8 KiB
C#
88 lines
3.8 KiB
C#
|
|
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);
|
|||
|
|
}
|
|||
|
|
}
|