""" 🧪 DRY версия OAuth тестов - применение принципов DRY и YAGNI Упрощенные тесты без дублирования Mock классов и избыточной сложности. """ import pytest from unittest.mock import patch from starlette.responses import JSONResponse from auth.oauth import oauth_callback_http from tests.test_utils import MockRequest class MockOAuthRequest(MockRequest): """🔍 Специализированный Mock для OAuth запросов""" def __init__(self, query_params=None, path_params=None): super().__init__() self.query_params = query_params or {} self.path_params = path_params or {} @pytest.mark.asyncio async def test_oauth_callback_invalid_state(): """🧪 DRY тест неправильного state параметра""" mock_request = MockOAuthRequest(query_params={"state": "wrong_state"}) with patch("auth.oauth.get_oauth_state", return_value=None): response = await oauth_callback_http(mock_request) assert isinstance(response, JSONResponse) assert response.status_code == 400 body_content = response.body if isinstance(body_content, memoryview): body_content = bytes(body_content) response_data = body_content.decode() assert "oauth_state_expired" in response_data @pytest.mark.asyncio async def test_oauth_callback_missing_state(): """🧪 DRY тест отсутствующего state параметра""" mock_request = MockOAuthRequest(query_params={}) response = await oauth_callback_http(mock_request) assert isinstance(response, JSONResponse) assert response.status_code == 400 body_content = response.body if isinstance(body_content, memoryview): body_content = bytes(body_content) response_data = body_content.decode() assert "Missing OAuth state parameter" in response_data # 🔍 Реальное сообщение # 🔍 YAGNI: Убираем сложный тест успешного callback - слишком много моков # Вместо этого тестируем только критичные пути через интеграционные тесты # 🔍 YAGNI: Упрощенный тест ошибок провайдера - проверяем только статус @pytest.mark.asyncio async def test_oauth_callback_provider_error(): """🧪 DRY тест ошибки провайдера - только статус""" mock_request = MockOAuthRequest( query_params={"state": "valid_state", "code": "auth_code"}, path_params={"provider": "invalid_provider"} ) with patch("auth.oauth.get_oauth_state", return_value={"redirect_uri": "https://localhost:3000"}): response = await oauth_callback_http(mock_request) # 🔍 YAGNI: Проверяем только статус, не конкретное сообщение assert isinstance(response, JSONResponse) assert response.status_code == 400