This commit is contained in:
79
tests/test_oauth_dry.py
Normal file
79
tests/test_oauth_dry.py
Normal file
@@ -0,0 +1,79 @@
|
||||
"""
|
||||
🧪 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
|
||||
Reference in New Issue
Block a user