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{{"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); } }