""" 테스트 환경 설정 실제 데이터베이스를 사용하지 않고 Mock만 사용하는 간단한 테스트 설정 """ import pytest from fastapi.testclient import TestClient from unittest.mock import MagicMock, AsyncMock import sys import os # 프로젝트 루트를 Python 경로에 추가 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from app.main import app from app.dependencies import get_auth_service, get_user_service, get_video_service, get_google_service from app.core.database import get_db # Mock 데이터베이스 세션 class MockDB: def __init__(self): self.committed = False self.rolled_back = False def commit(self): self.committed = True def rollback(self): self.rolled_back = True def close(self): pass def add(self, obj): pass def query(self, model): return MagicMock() def refresh(self, obj): pass # 테스트용 데이터베이스 의존성 오버라이드 def override_get_db(): try: db = MockDB() yield db finally: db.close() # Mock 서비스 생성 def create_mock_auth_service(): mock = MagicMock() mock.join = MagicMock() mock.login = MagicMock() return mock def create_mock_user_service(): mock = MagicMock() mock.get_items = MagicMock() mock.update_item = MagicMock() mock.delete_item = MagicMock() mock.get_user_profile = MagicMock() mock.update_user_profile = MagicMock() return mock def create_mock_video_service(): mock = MagicMock() mock.get_all_by_user_id = MagicMock() mock.delete_by_video_id = MagicMock() return mock def create_mock_google_service(): mock = MagicMock() mock.get_login_url = AsyncMock() mock.handle_callback = AsyncMock() mock.get_token_by_temp_id = AsyncMock() return mock def create_mock_redis_manager(): mock = MagicMock() mock.get = AsyncMock(return_value=None) mock.set = AsyncMock(return_value=True) mock.delete = AsyncMock(return_value=True) mock.exists = AsyncMock(return_value=False) return mock # 공통 Fixtures @pytest.fixture def client(): # 의존성 오버라이드 app.dependency_overrides[get_db] = override_get_db with TestClient(app) as test_client: yield test_client app.dependency_overrides.clear() @pytest.fixture def mock_auth_service(): return create_mock_auth_service() @pytest.fixture def mock_user_service(): return create_mock_user_service() @pytest.fixture def mock_video_service(): return create_mock_video_service() @pytest.fixture def mock_google_service(): return create_mock_google_service() @pytest.fixture def mock_redis_manager(): return create_mock_redis_manager() @pytest.fixture def authenticated_client(client, mock_auth_service): """인증된 테스트 클라이언트""" app.dependency_overrides[get_auth_service] = lambda: mock_auth_service # 로그인 성공 시뮬레이션 mock_auth_service.login.return_value = { "access_token": "test_access_token", "token_type": "bearer", "user_id": 1 } # 헤더에 토큰 추가 client.headers = {"Authorization": "Bearer test_access_token"} yield client app.dependency_overrides.clear()