### 🚨 Исправлено - **Удалено поле 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 проверок - Правильная изоляция тестовых данных через отдельную БД - Корректная работа с системой ролей и правами
This commit is contained in:
@@ -697,6 +697,66 @@ def test_user_credentials():
|
||||
}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def create_test_users_in_backend_db():
|
||||
"""
|
||||
👥 Создает тестовых пользователей в базе данных бэкенда для E2E тестов.
|
||||
"""
|
||||
import requests
|
||||
import time
|
||||
|
||||
# Создаем пользователя через API
|
||||
register_user_mutation = """
|
||||
mutation RegisterUser($email: String!, $password: String!, $name: String) {
|
||||
registerUser(email: $email, password: $password, name: $name) {
|
||||
success
|
||||
author {
|
||||
id
|
||||
email
|
||||
name
|
||||
}
|
||||
error
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
# Создаем админа
|
||||
admin_data = {
|
||||
"email": "test_admin@discours.io",
|
||||
"password": "password123",
|
||||
"name": "Test Admin"
|
||||
}
|
||||
|
||||
try:
|
||||
response = requests.post(
|
||||
"http://localhost:8000/graphql",
|
||||
json={"query": register_user_mutation, "variables": admin_data},
|
||||
headers={"Content-Type": "application/json"},
|
||||
timeout=10
|
||||
)
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
if data.get("data", {}).get("registerUser", {}).get("success"):
|
||||
print("✅ Админ создан в базе бэкенда")
|
||||
else:
|
||||
error = data.get("data", {}).get("registerUser", {}).get("error")
|
||||
if "уже существует" in error:
|
||||
print("✅ Админ уже существует в базе бэкенда")
|
||||
else:
|
||||
print(f"⚠️ Ошибка создания админа: {error}")
|
||||
else:
|
||||
print(f"⚠️ HTTP ошибка при создании админа: {response.status_code}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"⚠️ Ошибка при создании админа: {e}")
|
||||
|
||||
# Ждем немного для завершения операции
|
||||
time.sleep(1)
|
||||
|
||||
return True
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def auth_headers(api_base_url, test_user_credentials):
|
||||
"""
|
||||
@@ -737,41 +797,103 @@ def test_users(db_session):
|
||||
from orm.author import Author
|
||||
|
||||
# Создаем первого пользователя (администратор)
|
||||
# Этот email должен быть в ADMIN_EMAILS для автоматического получения роли admin
|
||||
admin_user = Author(
|
||||
slug="test-admin",
|
||||
email="test_admin@discours.io",
|
||||
password="hashed_password_123",
|
||||
name="Test Admin",
|
||||
bio="Test admin user for testing",
|
||||
pic="https://example.com/avatar1.jpg",
|
||||
oauth={}
|
||||
)
|
||||
admin_user.set_password("password123")
|
||||
db_session.add(admin_user)
|
||||
|
||||
# Создаем второго пользователя (обычный пользователь)
|
||||
regular_user = Author(
|
||||
slug="test-user",
|
||||
email="test_user@discours.io",
|
||||
password="hashed_password_456",
|
||||
name="Test User",
|
||||
bio="Test regular user for testing",
|
||||
pic="https://example.com/avatar2.jpg",
|
||||
oauth={}
|
||||
)
|
||||
regular_user.set_password("password456")
|
||||
db_session.add(regular_user)
|
||||
|
||||
# Создаем третьего пользователя (только читатель)
|
||||
reader_user = Author(
|
||||
slug="test-reader",
|
||||
email="test_reader@discours.io",
|
||||
password="hashed_password_789",
|
||||
name="Test Reader",
|
||||
bio="Test reader user for testing",
|
||||
pic="https://example.com/avatar3.jpg",
|
||||
oauth={}
|
||||
)
|
||||
reader_user.set_password("password789")
|
||||
db_session.add(reader_user)
|
||||
|
||||
# Сохраняем изменения с паролями
|
||||
db_session.commit()
|
||||
|
||||
# Создаем сообщество с ID 1 и назначаем роли
|
||||
from orm.community import Community, CommunityAuthor
|
||||
|
||||
# Проверяем, существует ли сообщество с ID 1
|
||||
existing_community = db_session.query(Community).where(Community.id == 1).first()
|
||||
if existing_community:
|
||||
community = existing_community
|
||||
else:
|
||||
# Создаем сообщество с ID 1
|
||||
community = Community(
|
||||
id=1,
|
||||
name="Test Community",
|
||||
slug="test-community",
|
||||
desc="A test community for testing purposes",
|
||||
created_by=admin_user.id,
|
||||
settings={"default_roles": ["reader", "author"]}
|
||||
)
|
||||
db_session.add(community)
|
||||
db_session.commit()
|
||||
|
||||
# Назначаем роли пользователям (если их еще нет)
|
||||
# Для admin_user не назначаем роль admin вручную - она определяется автоматически по email
|
||||
existing_admin_ca = db_session.query(CommunityAuthor).where(
|
||||
CommunityAuthor.community_id == community.id,
|
||||
CommunityAuthor.author_id == admin_user.id
|
||||
).first()
|
||||
if not existing_admin_ca:
|
||||
admin_ca = CommunityAuthor(
|
||||
community_id=community.id,
|
||||
author_id=admin_user.id,
|
||||
roles="author,reader" # admin роль добавляется автоматически по email
|
||||
)
|
||||
db_session.add(admin_ca)
|
||||
|
||||
existing_regular_ca = db_session.query(CommunityAuthor).where(
|
||||
CommunityAuthor.community_id == community.id,
|
||||
CommunityAuthor.author_id == regular_user.id
|
||||
).first()
|
||||
if not existing_regular_ca:
|
||||
regular_ca = CommunityAuthor(
|
||||
community_id=community.id,
|
||||
author_id=regular_user.id,
|
||||
roles="author,reader"
|
||||
)
|
||||
db_session.add(regular_ca)
|
||||
|
||||
existing_reader_ca = db_session.query(CommunityAuthor).where(
|
||||
CommunityAuthor.community_id == community.id,
|
||||
CommunityAuthor.author_id == reader_user.id
|
||||
).first()
|
||||
if not existing_reader_ca:
|
||||
reader_ca = CommunityAuthor(
|
||||
community_id=community.id,
|
||||
author_id=reader_user.id,
|
||||
roles="reader"
|
||||
)
|
||||
db_session.add(reader_ca)
|
||||
|
||||
db_session.commit()
|
||||
|
||||
return [admin_user, regular_user, reader_user]
|
||||
@@ -782,7 +904,9 @@ def test_community(db_session, test_users):
|
||||
"""Создает тестовое сообщество для тестов"""
|
||||
from orm.community import Community
|
||||
|
||||
# Создаем сообщество с ID 2, так как ID 1 уже занят основным сообществом
|
||||
community = Community(
|
||||
id=2, # Используем ID 2, чтобы не конфликтовать с основным сообществом
|
||||
name="Test Community",
|
||||
slug="test-community",
|
||||
desc="A test community for testing purposes",
|
||||
|
||||
Reference in New Issue
Block a user