import os
import pytest
+import logging
+from typing import List
from .utils import check_server_version
dsn = request.config.getoption("--test-dsn")
if dsn is None:
pytest.skip("skipping test as no --test-dsn")
+
+ try:
+ warm_up_database(dsn)
+ except Exception:
+ # This is a session fixture, so, in case of error, the exception would
+ # be cached and nothing would run.
+ # Let the caller fail instead.
+ logging.exception("error warming up database")
+
return dsn
svcconn.execute("create extension if not exists hstore")
except Error as e:
pytest.skip(str(e))
+
+
+def warm_up_database(
+ dsn: str, __first_connection: List[bool] = [True]
+) -> None:
+ """Connect to the database before returning a connection.
+
+ In the CI sometimes, the first test fails with a timeout, probably because
+ the server hasn't started yet. Absorb the delay before the test.
+ """
+ # Do it only once, even in case of failure, otherwise, in case of bad
+ # configuration, with every test timing out, the entire test run would take
+ # forever.
+ if not __first_connection:
+ return
+ del __first_connection[:]
+
+ import psycopg
+
+ with psycopg.connect(dsn, connect_timeout=10) as conn:
+ conn.execute("select 1")