""" Fixtures para los tests del shape web-backend/python. Los tests corren contra una BD SQLite efímera en archivo temporal — el runner CI (executor=host, ADR-043) no tiene Docker daemon, por lo que no se usa testcontainers (ADR-061). El deploy real usa MariaDB (claim-mariadb.yaml + hook Alembic); los tests del scaffold solo ejercen /health, /demo y /metrics, sin tocar Alembic ni modelos de dominio. Al añadir modelos reales, agrega tests de integración contra tu propia infra. """ import os import tempfile from collections.abc import Iterator import pytest from fastapi.testclient import TestClient # La configuración debe existir ANTES de importar app.settings: Settings() exige # DATABASE_URL al cargar el módulo. Se usa un archivo SQLite temporal (no # :memory:) para evitar problemas de hilos con el TestClient. _DB_FD, _DB_PATH = tempfile.mkstemp(suffix=".sqlite", prefix="webapp-test-") os.close(_DB_FD) _SQLITE_URL = f"sqlite:///{_DB_PATH}" os.environ.setdefault("DATABASE_URL", _SQLITE_URL) os.environ.setdefault("MIGRATION_DATABASE_URL", _SQLITE_URL) # El frontend estático /demo se sirve desde el árbol del repo durante los tests. _DEMO_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "app", "static", "demo")) os.environ.setdefault("STATIC_DEMO_PATH", _DEMO_DIR) @pytest.fixture(scope="session", autouse=True) def _cleanup_sqlite() -> Iterator[None]: """Borra el archivo SQLite temporal al terminar la sesión de tests.""" yield try: os.unlink(_DB_PATH) except OSError: pass @pytest.fixture def client() -> Iterator[TestClient]: """TestClient con la app cargada contra la BD SQLite efímera.""" from app.main import create_app app = create_app() with TestClient(app) as c: yield c