"""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__)))) # Importing core.database below runs init_db() at import time, and its default # (sqlite:///./data/app.db) can't be opened in a clean worktree because SQLite # won't create the missing ./data parent dir — pytest then dies during # collection, before any test module loads. Default to an in-memory DB for the # test session so collection is deterministic and writes no repo-local # artifacts. An explicit DATABASE_URL (a real test/CI database) is preserved. # This only unblocks collection/import-time init; it does not provide a shared # file-backed DB across processes — tests needing that must set DATABASE_URL. os.environ.setdefault("DATABASE_URL", "sqlite:///:memory:") # 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