import psycopg
from psycopg import pq
from psycopg import sql
+from psycopg.conninfo import conninfo_to_dict, make_conninfo
from psycopg._compat import cache
from psycopg.pq._debug import PGconnDebug
return session_dsn
+@pytest.fixture
+def dsn_env(dsn):
+ """Return a dsn including the connection parameters set in PG* env vars.
+
+ Provide a working conninfo even in tests that modify the env vars.
+ """
+ args = conninfo_to_dict(dsn)
+ for opt in pq.Conninfo.get_defaults():
+ if not (opt.envvar and opt.envvar.decode() in os.environ):
+ continue
+ if opt.keyword.decode() in args:
+ continue
+ args[opt.keyword.decode()] = os.environ[opt.envvar.decode()]
+
+ return make_conninfo(**args)
+
+
@pytest.fixture(scope="session")
def tracefile(request):
"""Open and yield a file for libpq client/server communication traces if
((), {"user": "foo", "dbname": None}, "user=foo"),
],
)
-def test_connect(monkeypatch, dsn, args, kwargs, want, setpgenv):
+def test_connect(monkeypatch, dsn_env, args, kwargs, want, setpgenv):
# Check the main args passing from psycopg.connect to the conn generator
# Details of the params manipulation are in test_conninfo.
import psycopg.connection
def mock_connect(conninfo):
nonlocal got_conninfo
got_conninfo = conninfo
- return orig_connect(dsn)
+ return orig_connect(dsn_env)
setpgenv({})
monkeypatch.setattr(psycopg.generators, "connect", mock_connect)