# backend/tests/conftest.py import pytest from fastapi.testclient import TestClient from sqlmodel import Session, SQLModel, create_engine from sqlmodel.pool import StaticPool from app import seed as seed_mod from app.db import get_session from app.llm.provider import get_provider from app.main import app from tests._fake_llm import FakeLLMProvider @pytest.fixture(autouse=True) def _clear_llm_overlay(): """설정 페이지 LLM 런타임 오버레이를 테스트마다 비운다(전역 상태 누수 방지·결정성).""" from app import runtime_config runtime_config.clear() yield runtime_config.clear() @pytest.fixture(autouse=True) def _neutralize_dev_env(monkeypatch): """개발용 .env(실 OAuth 자격·CONNECTOR_*=real)가 테스트 결정성을 깨지 않도록 기본값으로 되돌린다. env 값이 .env 파일보다 우선하므로 명시적으로 덮어써서 CI 기본(미설정·mock)을 보장한다.""" for k in ( "GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET", "MICROSOFT_CLIENT_ID", "MICROSOFT_CLIENT_SECRET", ): monkeypatch.setenv(k, "") for dom in ("CALENDAR", "MAIL"): monkeypatch.setenv(f"CONNECTOR_{dom}", "mock") monkeypatch.setenv("AUTO_SYNC_ENABLED", "false") # 백그라운드 풀링 비활성(결정성) from app.config import get_settings get_settings.cache_clear() yield get_settings.cache_clear() @pytest.fixture() def session(): engine = create_engine( "sqlite://", connect_args={"check_same_thread": False}, poolclass=StaticPool ) SQLModel.metadata.create_all(engine) with Session(engine) as s: yield s, engine @pytest.fixture() def client(session): s, engine = session # 테스트 세션을 주입해 시드(정본 시그니처: run_seed(session=..., reset=True)). with Session(engine) as seed_s: seed_mod.run_seed(session=seed_s, reset=True) def _get_session(): with Session(engine) as ss: yield ss app.dependency_overrides[get_session] = _get_session # LLM은 기본적으로 heuristic 강제(테스트 결정성). app.dependency_overrides[get_provider] = lambda: FakeLLMProvider() yield TestClient(app) app.dependency_overrides.clear() @pytest.fixture() def client_auth(session, monkeypatch): """phase-15: AUTH_ENABLED=true 클라이언트 — 자격(지우 admin / 현우 member) 시드. TestClient 가 쿠키 잼을 유지하므로 로그인 후 세션 쿠키가 이어진다.""" s, engine = session monkeypatch.setenv("AUTH_ENABLED", "true") from app.config import get_settings get_settings.cache_clear() with Session(engine) as seed_s: seed_mod.run_seed(session=seed_s, reset=True) # AUTH_ENABLED → UserCredential 생성 def _get_session(): with Session(engine) as ss: yield ss app.dependency_overrides[get_session] = _get_session app.dependency_overrides[get_provider] = lambda: FakeLLMProvider() yield TestClient(app) app.dependency_overrides.clear() get_settings.cache_clear()