162 lines
6.2 KiB
Python
162 lines
6.2 KiB
Python
|
"""
|
|||
|
Тесты для функциональности кастомных ролей
|
|||
|
"""
|
|||
|
|
|||
|
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
|