Files
core/tests/test_getSession_cookies.py
Untone 4d42e01bd0
Some checks failed
Deploy on push / deploy (push) Failing after 3m6s
[0.9.13] - 2025-08-27
### 🚨 Исправлено
- **Удалено поле username из модели Author**: Поле `username` больше не является частью модели `Author`
  - Убрано свойство `@property def username` из `orm/author.py`
  - Обновлены все сервисы для использования `email` или `slug` вместо `username`
  - Исправлены резолверы для исключения `username` при обработке данных автора
  - Поле `username` теперь используется только в JWT токенах для совместимости

### 🧪 Исправлено
- **E2E тесты админ-панели**: Полностью переработаны E2E тесты для работы с реальным API
  - Тесты теперь делают реальные HTTP запросы к GraphQL API
  - Бэкенд для тестов использует выделенную тестовую БД (`test_e2e.db`)
  - Создан фикстура `backend_server` для запуска тестового сервера
  - Добавлен фикстура `create_test_users_in_backend_db` для регистрации пользователей через API
  - Убраны несуществующие GraphQL запросы (`get_community_stats`)
  - Тесты корректно работают с системой ролей и правами администратора

### �� Техническое
- **Рефакторинг аутентификации**: Упрощена логика работы с пользователями
  - Убраны зависимости от несуществующих полей в ORM моделях
  - Обновлены сервисы аутентификации для корректной работы без `username`
  - Исправлены все места использования `username` в коде
- **Улучшена тестовая инфраструктура**:
  - Тесты теперь используют реальный HTTP API вместо прямых DB проверок
  - Правильная изоляция тестовых данных через отдельную БД
  - Корректная работа с системой ролей и правами
2025-08-27 12:15:01 +03:00

276 lines
9.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Тест для проверки работы getSession с cookies
Проверяет:
1. getSession работает без токена в заголовке, но с валидным cookie
2. getSession возвращает данные пользователя при валидном cookie
3. getSession возвращает ошибку при невалидном cookie
4. getSession работает с токеном в заголовке
"""
import pytest
from unittest.mock import patch, MagicMock
from graphql import GraphQLResolveInfo
from resolvers.auth import get_session
from auth.tokens.storage import TokenStorage as TokenManager
from orm.author import Author
class MockRequest:
"""Мок для Request объекта"""
def __init__(self, headers=None, cookies=None):
self.headers = headers or {}
self.cookies = cookies or {}
class MockContext:
"""Мок для GraphQL контекста"""
def __init__(self, request=None):
self.request = request
def get(self, key, default=None):
"""Мокаем метод get для совместимости с DRY функциями"""
if key == "request":
return self.request
return default
class MockGraphQLResolveInfo:
"""Мок для GraphQLResolveInfo"""
def __init__(self, context):
self.context = context
@pytest.fixture
def mock_author():
"""Мок для объекта Author"""
author = MagicMock(spec=Author)
author.id = 123
author.email = "test@example.com"
author.name = "Test User"
author.slug = "test-user"
# author.username = "testuser" # username не существует в модели Author
# Мокаем метод dict()
author.dict.return_value = {
"id": 123,
"email": "test@example.com",
"name": "Test User",
"slug": "test-user"
}
return author
@pytest.fixture
def mock_payload():
"""Мок для payload токена"""
payload = MagicMock()
payload.user_id = "123"
return payload
@pytest.mark.asyncio
async def test_getSession_with_valid_cookie(mock_author, mock_payload):
"""Тест getSession с валидным cookie"""
# Мокаем request с cookie
request = MockRequest(
headers={},
cookies={"session_token": "valid_token_123"}
)
context = MockContext(request)
info = MockGraphQLResolveInfo(context)
# Мокаем DRY функции из auth/utils.py
with patch('resolvers.auth.get_auth_token_from_context') as mock_get_token, \
patch('resolvers.auth.get_user_data_by_token') as mock_get_user_data:
mock_get_token.return_value = "valid_token_123"
mock_get_user_data.return_value = (True, mock_author.dict(), None)
result = await get_session(None, info)
# Проверяем результат
assert result["success"] is True
assert result["token"] == "valid_token_123"
assert result["author"]["id"] == 123
assert result["author"]["email"] == "test@example.com"
assert result["error"] is None
# Проверяем вызовы DRY функций
mock_get_token.assert_called_once_with(info)
mock_get_user_data.assert_called_once_with("valid_token_123")
@pytest.mark.asyncio
async def test_getSession_with_authorization_header(mock_author, mock_payload):
"""Тест getSession с заголовком Authorization"""
# Мокаем request с заголовком Authorization
request = MockRequest(
headers={"authorization": "Bearer bearer_token_456"},
cookies={}
)
context = MockContext(request)
info = MockGraphQLResolveInfo(context)
# Мокаем DRY функции из auth/utils.py
with patch('resolvers.auth.get_auth_token_from_context') as mock_get_token, \
patch('resolvers.auth.get_user_data_by_token') as mock_get_user_data:
mock_get_token.return_value = "bearer_token_456"
mock_get_user_data.return_value = (True, mock_author.dict(), None)
result = await get_session(None, info)
# Проверяем результат
assert result["success"] is True
assert result["token"] == "bearer_token_456"
assert result["author"]["id"] == 123
assert result["error"] is None
# Проверяем вызовы DRY функций
mock_get_token.assert_called_once_with(info)
mock_get_user_data.assert_called_once_with("bearer_token_456")
@pytest.mark.asyncio
async def test_getSession_with_invalid_token(mock_author):
"""Тест getSession с невалидным токеном"""
# Мокаем request с невалидным cookie
request = MockRequest(
headers={},
cookies={"session_token": "invalid_token"}
)
context = MockContext(request)
info = MockGraphQLResolveInfo(context)
# Мокаем DRY функции из auth/utils.py
with patch('resolvers.auth.get_auth_token_from_context') as mock_get_token, \
patch('resolvers.auth.get_user_data_by_token') as mock_get_user_data:
mock_get_token.return_value = "invalid_token"
mock_get_user_data.return_value = (False, None, "Сессия не найдена")
result = await get_session(None, info)
# Проверяем результат
assert result["success"] is False
assert result["token"] is None
assert result["author"] is None
assert result["error"] == "Сессия не найдена"
@pytest.mark.asyncio
async def test_getSession_without_token():
"""Тест getSession без токена"""
# Мокаем request без токена
request = MockRequest(headers={}, cookies={})
context = MockContext(request)
info = MockGraphQLResolveInfo(context)
# Мокаем DRY функции из auth/utils.py
with patch('resolvers.auth.get_auth_token_from_context') as mock_get_token:
mock_get_token.return_value = None
result = await get_session(None, info)
# Проверяем результат
assert result["success"] is False
assert result["token"] is None
assert result["author"] is None
assert result["error"] == "Сессия не найдена"
@pytest.mark.asyncio
async def test_getSession_without_request():
"""Тест getSession без request в контексте"""
# Мокаем контекст без request
context = MockContext(request=None)
info = MockGraphQLResolveInfo(context)
# Мокаем DRY функции из auth/utils.py
with patch('resolvers.auth.get_auth_token_from_context') as mock_get_token:
mock_get_token.return_value = None
result = await get_session(None, info)
# Проверяем результат
assert result["success"] is False
assert result["token"] is None
assert result["author"] is None
assert result["error"] == "Сессия не найдена"
@pytest.mark.asyncio
async def test_getSession_user_not_found(mock_payload):
"""Тест getSession когда пользователь не найден в БД"""
# Мокаем request с валидным cookie
request = MockRequest(
headers={},
cookies={"session_token": "valid_token_123"}
)
context = MockContext(request)
info = MockGraphQLResolveInfo(context)
# Мокаем DRY функции из auth/utils.py
with patch('resolvers.auth.get_auth_token_from_context') as mock_get_token, \
patch('resolvers.auth.get_user_data_by_token') as mock_get_user_data:
mock_get_token.return_value = "valid_token_123"
mock_get_user_data.return_value = (False, None, f"Пользователь с ID 123 не найден в БД")
result = await get_session(None, info)
# Проверяем результат
assert result["success"] is False
assert result["token"] is None
assert result["author"] is None
assert result["error"] == "Пользователь с ID 123 не найден в БД"
@pytest.mark.asyncio
async def test_getSession_payload_without_user_id():
"""Тест getSession когда payload не содержит user_id"""
# Мокаем request с валидным cookie
request = MockRequest(
headers={},
cookies={"session_token": "valid_token_123"}
)
context = MockContext(request)
info = MockGraphQLResolveInfo(context)
# Мокаем DRY функции из auth/utils.py
with patch('resolvers.auth.get_auth_token_from_context') as mock_get_token, \
patch('resolvers.auth.get_user_data_by_token') as mock_get_user_data:
mock_get_token.return_value = "valid_token_123"
mock_get_user_data.return_value = (False, None, "Токен не содержит user_id")
result = await get_session(None, info)
# Проверяем результат
assert result["success"] is False
assert result["token"] is None
assert result["author"] is None
assert result["error"] == "Токен не содержит user_id"
if __name__ == "__main__":
pytest.main([__file__, "-v"])