pgLabII/pgLabII.PgUtils.Tests/ConnectionStrings/LibpqCodecTests.cs

90 lines
3.3 KiB
C#
Raw Permalink Normal View History

2025-08-30 20:09:10 +02:00
using pgLabII.PgUtils.ConnectionStrings;
using Npgsql;
namespace pgLabII.PgUtils.Tests.ConnectionStrings;
public class LibpqCodecTests
{
[Fact]
public void Parse_Basic()
{
var codec = new LibpqCodec();
var res = codec.TryParse("host=localhost port=5433 dbname=testdb user=alice password=secret sslmode=require connect_timeout=15 application_name='pgLab II'");
Assert.True(res.IsSuccess);
var d = res.Value;
Assert.Single(d.Hosts);
Assert.Equal("localhost", d.Hosts[0].Host);
Assert.Equal((ushort)5433, d.Hosts[0].Port);
Assert.Equal("testdb", d.Database);
Assert.Equal("alice", d.Username);
Assert.Equal("secret", d.Password);
Assert.Equal(SslMode.Require, d.SslMode);
Assert.Equal(15, d.TimeoutSeconds);
Assert.Equal("pgLab II", d.ApplicationName);
}
[Fact]
public void Parse_MultiHost()
{
var codec = new LibpqCodec();
var res = codec.TryParse("host=host1,host2,host3 port=5432 dbname=db user=u");
Assert.True(res.IsSuccess);
var d = res.Value;
Assert.Equal(3, d.Hosts.Count);
Assert.Equal("host1", d.Hosts[0].Host);
Assert.Equal((ushort)5432, d.Hosts[0].Port);
Assert.Equal("host2", d.Hosts[1].Host);
Assert.Equal((ushort)5432, d.Hosts[1].Port);
Assert.Equal("host3", d.Hosts[2].Host);
Assert.Equal((ushort)5432, d.Hosts[2].Port);
}
[Fact]
public void Format_Basic()
{
var codec = new LibpqCodec();
var d = new ConnectionDescriptor
{
Hosts = new [] { new HostEndpoint{ Host = "db.example.com", Port = 5432 } },
Database = "prod db",
Username = "bob",
Password = "p@ss w'rd\\",
SslMode = SslMode.VerifyFull,
ApplicationName = "cli",
TimeoutSeconds = 7,
Properties = new Dictionary<string,string>{{"search_path","public"}}
};
var res = codec.TryFormat(d);
Assert.True(res.IsSuccess);
var s = res.Value;
// ensure critical pairs exist and are quoted when needed
Assert.Contains("host=db.example.com", s);
Assert.Contains("port=5432", s);
Assert.Contains("dbname='prod db'", s);
Assert.Contains("user=bob", s);
Assert.Contains("password='p@ss w\\'rd\\\\'", s);
Assert.Contains("sslmode=verify-full", s);
Assert.Contains("application_name=cli", s);
Assert.Contains("connect_timeout=7", s);
Assert.Contains("search_path=public", s);
}
[Fact]
public void Roundtrip_ParseThenFormat()
{
var codec = new LibpqCodec();
var input = "host='my host' dbname=postgres user=me password='with space' application_name='my app' sslmode=prefer";
var parsed = codec.TryParse(input);
Assert.True(parsed.IsSuccess);
var formatted = codec.TryFormat(parsed.Value);
Assert.True(formatted.IsSuccess);
var s = formatted.Value;
Assert.Contains("host='my host'", s);
Assert.Contains("dbname=postgres", s);
Assert.Contains("user=me", s);
Assert.Contains("password='with space'", s);
Assert.Contains("application_name='my app'", s);
Assert.Contains("sslmode=prefer", s);
}
}