"""Shared test fixtures. `db_conn` yields a psycopg connection inside a transaction that is rolled back after each test, so DB tests stay isolated and leave no residue. Tests are skipped automatically when no database is reachable or M4 migrations are not applied (e.g. local runs without docker). """ from __future__ import annotations import psycopg import pytest from opengoods.etl.load import default_dsn @pytest.fixture() def db_conn(): try: conn = psycopg.connect(default_dsn(), connect_timeout=3) except psycopg.OperationalError as exc: # pragma: no cover - env dependent pytest.skip(f"no database available: {exc}") has_state = conn.execute("SELECT to_regclass('public.ingest_state') IS NOT NULL").fetchone()[0] if not has_state: conn.close() pytest.skip("M4 migrations not applied") try: yield conn finally: conn.rollback() conn.close()