Some test files (e.g. test_llm_core_sanitize_tool_calls) stub sqlalchemy and core.database at module level with `if mod not in sys.modules`. During pytest collection these stubs fire before the real modules are imported, contaminating every subsequent test that needs real ORM objects (IntegrityError, missing columns, etc.). Pre-import the real modules in conftest.py so the module-level guards find them already loaded and skip the stubs. Fixes ~10+ cascading test failures that only appear in the full suite. Fixes #2395 Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
47 lines
1.9 KiB
Python
47 lines
1.9 KiB
Python
"""Shared test configuration — ensure project root is on sys.path and stub heavy deps."""
|
|
import sys
|
|
import os
|
|
import types
|
|
import importlib.util
|
|
from unittest.mock import MagicMock
|
|
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
# Pre-import real heavy modules BEFORE any test file's module-level stubs can
|
|
# replace them with MagicMock. Some test files (e.g. test_llm_core_sanitize_*)
|
|
# stub sqlalchemy/core.database at module scope with `if mod not in sys.modules`,
|
|
# which fires during collection. If the real module hasn't been imported yet,
|
|
# the stub wins and contaminates every subsequent test that needs the real ORM.
|
|
try:
|
|
import sqlalchemy # noqa: F401
|
|
import sqlalchemy.orm # noqa: F401
|
|
import core.database # noqa: F401
|
|
except ImportError:
|
|
pass # not installed — the stubs below will handle it
|
|
|
|
def _has_module(mod_name: str) -> bool:
|
|
try:
|
|
return importlib.util.find_spec(mod_name) is not None
|
|
except (ImportError, ValueError):
|
|
return False
|
|
|
|
|
|
# Stub optional dependencies only when they are not installed. Do not replace
|
|
# real FastAPI/Starlette/Pydantic modules: route tests import their subpackages.
|
|
for mod_name in [
|
|
"sqlalchemy", "sqlalchemy.orm", "sqlalchemy.types", "sqlalchemy.ext", "sqlalchemy.ext.declarative",
|
|
"sqlalchemy.ext.hybrid", "sqlalchemy.sql", "sqlalchemy.sql.expression",
|
|
"sqlalchemy.sql.sqltypes", "bcrypt", "pyotp",
|
|
"httpx", "fastapi", "fastapi.responses", "fastapi.routing",
|
|
"starlette", "starlette.responses", "starlette.middleware", "starlette.middleware.base",
|
|
"pydantic",
|
|
]:
|
|
if mod_name not in sys.modules and not _has_module(mod_name):
|
|
sys.modules[mod_name] = MagicMock()
|
|
|
|
if "src.database" not in sys.modules:
|
|
_db = types.ModuleType("src.database")
|
|
_db.SessionLocal = MagicMock()
|
|
_db.ModelEndpoint = MagicMock()
|
|
sys.modules["src.database"] = _db
|