Ctrl K
ComunidadGuías…

tests/conftest.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import os
from unittest.mock import MagicMock, patch

import pytest

# ---------------------------------------------------------------------------
# tests/conftest.py
#
# Stubs that prevent unit tests from needing a live DATABASE_URL, Redis,
# or any other infrastructure at import time.
#
# WHY MODULE-LEVEL PATCHING:
#   database.py calls create_engine() at module level with MySQL-specific
#   pool kwargs (max_overflow, pool_timeout).  pytest collects test files
#   — triggering those imports — BEFORE any fixture runs.  Fixtures are
#   therefore too late.  We call patch.start() here at module level so
#   the mock is active from the moment conftest.py is loaded, which is
#   always before collection begins.
# ---------------------------------------------------------------------------

# ── Step 1: env vars ────────────────────────────────────────────────────────
os.environ.setdefault("DATABASE_URL", "mysql+pymysql://test:test@localhost/test")
os.environ.setdefault("REDIS_URL", "redis://localhost:6379/0")
os.environ.setdefault("SECRET_KEY", "test-secret-key")
os.environ.setdefault("DEFAULT_SECRET_KEY", "test-default-secret-key")

# ── Step 2: patch create_engine before any src module is imported ───────────
_mock_engine = MagicMock(name="MockEngine")
_mock_engine.connect.return_value.__enter__ = MagicMock(return_value=_mock_engine)
_mock_engine.connect.return_value.__exit__ = MagicMock(return_value=False)

_create_engine_patcher = patch("sqlalchemy.create_engine", return_value=_mock_engine)
_create_engine_patcher.start()

_mock_session = MagicMock(name="MockSession")
_mock_session_local = MagicMock(name="MockSessionLocal", return_value=_mock_session)

_session_local_patcher = patch(
    "src.api.entities_api.db.database.SessionLocal",
    _mock_session_local,
    create=True,
)
try:
    _session_local_patcher.start()
except Exception:  # noqa: BLE001
    pass

# ── Step 3: patch Redis ──────────────────────────────────────────────────────
_mock_redis = MagicMock(name="MockRedis")

_redis_patcher = patch("redis.from_url", return_value=_mock_redis)
_redis_patcher.start()

_redis_class_patcher = patch("redis.Redis", return_value=_mock_redis)
_redis_class_patcher.start()


# ── Step 4: clean up at session end ─────────────────────────────────────────
def pytest_sessionfinish(session, exitstatus):  # noqa: ARG001
    _create_engine_patcher.stop()
    _redis_patcher.stop()
    _redis_class_patcher.stop()
    try:
        _session_local_patcher.stop()
    except Exception:  # noqa: BLE001
        pass