135 lines
3.3 KiB
Python
135 lines
3.3 KiB
Python
"""
|
|
테스트 환경 설정
|
|
실제 데이터베이스를 사용하지 않고 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()
|