[0.9.13] - 2025-08-27
Some checks failed
Deploy on push / deploy (push) Failing after 3m6s

### 🚨 Исправлено
- **Удалено поле 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:
2025-08-27 12:15:01 +03:00
parent eef2ae1d5e
commit 4d42e01bd0
22 changed files with 1621 additions and 336 deletions

View File

@@ -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",