You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
3.1 KiB
Python
94 lines
3.1 KiB
Python
# 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()
|