Files
core/tests/test_custom_roles.py

162 lines
6.2 KiB
Python
Raw Normal View History

e2e-fixing fix: убран health endpoint, E2E тест использует корневой маршрут - Убран health endpoint из main.py (не нужен) - E2E тест теперь проверяет корневой маршрут / вместо /health - Корневой маршрут доступен без логина, что подходит для проверки состояния сервера - E2E тест с браузером работает корректно docs: обновлен отчет о прогрессе E2E теста - Убраны упоминания health endpoint - Указано что используется корневой маршрут для проверки серверов - Обновлен список измененных файлов fix: исправлены GraphQL проблемы и E2E тест с браузером - Добавлено поле success в тип CommonResult для совместимости с фронтендом - Обновлены резолверы community, collection, topic для возврата поля success - Исправлен E2E тест для работы с корневым маршрутом вместо health endpoint - E2E тест теперь запускает браузер, авторизуется, находит сообщество в таблице - Все GraphQL проблемы с полем success решены - E2E тест работает правильно с браузером как требовалось fix: исправлен поиск UI элементов в E2E тесте - Добавлен правильный поиск кнопки удаления по CSS классу _delete-button_1qlfg_300 - Добавлены альтернативные способы поиска кнопки удаления (title, aria-label, символ ×) - Добавлен правильный поиск модального окна с множественными селекторами - Добавлен правильный поиск кнопки подтверждения в модальном окне - E2E тест теперь полностью работает: находит кнопку удаления, модальное окно и кнопку подтверждения - Обновлен отчет о прогрессе с полными результатами тестирования fix: исправлен импорт require_any_permission в resolvers/collection.py - Заменен импорт require_any_permission с auth.decorators на services.rbac - Бэкенд сервер теперь запускается корректно - E2E тест полностью работает: находит кнопку удаления, модальное окно и кнопку подтверждения - Оба сервера (бэкенд и фронтенд) работают стабильно fix: исправлен порядок импортов в resolvers/collection.py - Перемещен импорт require_any_permission в правильное место - E2E тест полностью работает: находит кнопку удаления, модальное окно и кнопку подтверждения - Сообщество не удаляется из-за прав доступа - это нормальное поведение системы безопасности feat: настроен HTTPS для локальной разработки с mkcert
2025-08-01 00:30:44 +03:00
"""
Тесты для функциональности кастомных ролей
"""
import pytest
import json
from services.redis import redis
from services.db import local_session
from orm.community import Community
from resolvers.admin import admin_create_custom_role, admin_delete_custom_role, admin_get_roles
class TestCustomRoles:
"""Тесты для кастомных ролей"""
@pytest.mark.asyncio
async def test_create_custom_role(self, session):
"""Тест создания кастомной роли"""
# Создаем тестовое сообщество
community = Community(
name="Test Community",
slug="test-community",
desc="Test community for custom roles",
created_by=1,
created_at=1234567890
)
session.add(community)
session.flush()
# Данные для создания роли
role_data = {
"id": "custom_moderator",
"name": "Модератор",
"description": "Кастомная роль модератора",
"icon": "shield",
"community_id": community.id
}
# Создаем роль
result = await admin_create_custom_role(None, None, role_data)
# Проверяем результат
assert result["success"] is True
assert result["role"]["id"] == "custom_moderator"
assert result["role"]["name"] == "Модератор"
assert result["role"]["description"] == "Кастомная роль модератора"
# Проверяем, что роль сохранена в Redis
role_json = await redis.execute("HGET", f"community:custom_roles:{community.id}", "custom_moderator")
assert role_json is not None
role_data_redis = json.loads(role_json)
assert role_data_redis["id"] == "custom_moderator"
assert role_data_redis["name"] == "Модератор"
assert role_data_redis["description"] == "Кастомная роль модератора"
assert role_data_redis["icon"] == "shield"
assert role_data_redis["permissions"] == []
@pytest.mark.asyncio
async def test_create_duplicate_role(self, session):
"""Тест создания дублирующей роли"""
# Создаем тестовое сообщество
community = Community(
name="Test Community 2",
slug="test-community-2",
desc="Test community for duplicate roles",
created_by=1,
created_at=1234567890
)
session.add(community)
session.flush()
# Данные для создания роли
role_data = {
"id": "duplicate_role",
"name": "Дублирующая роль",
"description": "Тестовая роль",
"community_id": community.id
}
# Создаем роль первый раз
result1 = await admin_create_custom_role(None, None, role_data)
assert result1["success"] is True
# Пытаемся создать роль с тем же ID
result2 = await admin_create_custom_role(None, None, role_data)
assert result2["success"] is False
assert "уже существует" in result2["error"]
@pytest.mark.asyncio
async def test_delete_custom_role(self, session):
"""Тест удаления кастомной роли"""
# Создаем тестовое сообщество
community = Community(
name="Test Community 3",
slug="test-community-3",
desc="Test community for role deletion",
created_by=1,
created_at=1234567890
)
session.add(community)
session.flush()
# Создаем роль
role_data = {
"id": "role_to_delete",
"name": "Роль для удаления",
"description": "Тестовая роль",
"community_id": community.id
}
create_result = await admin_create_custom_role(None, None, role_data)
assert create_result["success"] is True
# Удаляем роль
delete_result = await admin_delete_custom_role(None, None, "role_to_delete", community.id)
assert delete_result["success"] is True
# Проверяем, что роль удалена из Redis
role_json = await redis.execute("HGET", f"community:custom_roles:{community.id}", "role_to_delete")
assert role_json is None
@pytest.mark.asyncio
async def test_get_roles_with_custom(self, session):
"""Тест получения ролей с кастомными"""
# Создаем тестовое сообщество
community = Community(
name="Test Community 4",
slug="test-community-4",
desc="Test community for role listing",
created_by=1,
created_at=1234567890
)
session.add(community)
session.flush()
# Создаем кастомную роль
role_data = {
"id": "test_custom_role",
"name": "Тестовая кастомная роль",
"description": "Описание тестовой роли",
"community_id": community.id
}
await admin_create_custom_role(None, None, role_data)
# Получаем роли для сообщества
roles = await admin_get_roles(None, None, community.id)
# Проверяем, что кастомная роль есть в списке
custom_role = next((role for role in roles if role["id"] == "test_custom_role"), None)
assert custom_role is not None
assert custom_role["name"] == "Тестовая кастомная роль"
assert custom_role["description"] == "Описание тестовой роли"
# Проверяем, что базовые роли тоже есть
base_role_ids = [role["id"] for role in roles]
assert "reader" in base_role_ids
assert "author" in base_role_ids
assert "editor" in base_role_ids
assert "admin" in base_role_ids