Files
core/tests/test_admin_panel_fixes.py
2025-07-31 18:55:59 +03:00

485 lines
18 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.
"""
Тесты для исправлений в админ-панели.
Проверяет работу обновленных компонентов, исправления в системе ролей
и корректность работы интерфейса управления пользователями.
"""
import pytest
import time
from unittest.mock import patch, MagicMock
from auth.orm import Author
from orm.community import Community, CommunityAuthor
from services.db import local_session
# Используем общую фикстуру из conftest.py
@pytest.fixture
def test_community(db_session, test_users):
"""Создает тестовое сообщество для админ-панели"""
community = Community(
id=100,
name="Admin Test Community",
slug="admin-test-community",
desc="Test community for admin panel tests",
created_by=test_users[0].id,
created_at=int(time.time())
)
db_session.add(community)
db_session.commit()
return community
@pytest.fixture
def admin_user_with_roles(db_session, test_users, test_community):
"""Создает пользователя с ролями администратора"""
user = test_users[0]
# Создаем CommunityAuthor с ролями администратора
ca = CommunityAuthor(
community_id=test_community.id,
author_id=user.id,
roles="admin,editor,author"
)
db_session.add(ca)
db_session.commit()
return user
@pytest.fixture
def regular_user_with_roles(db_session, test_users, test_community):
"""Создает обычного пользователя с ролями"""
user = test_users[1]
# Создаем CommunityAuthor с обычными ролями
ca = CommunityAuthor(
community_id=test_community.id,
author_id=user.id,
roles="reader,author"
)
db_session.add(ca)
db_session.commit()
return user
class TestAdminUserManagement:
"""Тесты для управления пользователями в админ-панели"""
def test_admin_user_creation(self, db_session, test_users):
"""Тест создания пользователя через админ-панель"""
user = test_users[0]
# Проверяем что пользователь создан
assert user.id == 1
assert user.email is not None
assert user.name is not None
assert user.slug is not None
def test_user_role_assignment(self, db_session, test_users, test_community):
"""Тест назначения ролей пользователю"""
user = test_users[0]
# Назначаем роли
ca = CommunityAuthor(
community_id=test_community.id,
author_id=user.id,
roles="admin,editor"
)
db_session.add(ca)
db_session.commit()
# Проверяем что роли назначены
assert ca.has_role("admin")
assert ca.has_role("editor")
assert not ca.has_role("reader")
def test_user_role_removal(self, db_session, test_users, test_community):
"""Тест удаления ролей пользователя"""
user = test_users[0]
# Создаем пользователя с ролями
ca = CommunityAuthor(
community_id=test_community.id,
author_id=user.id,
roles="admin,editor,author"
)
db_session.add(ca)
db_session.commit()
# Удаляем роль
ca.remove_role("editor")
db_session.commit()
# Проверяем что роль удалена
assert ca.has_role("admin")
assert not ca.has_role("editor")
assert ca.has_role("author")
def test_user_profile_update(self, db_session, test_users):
"""Тест обновления профиля пользователя"""
user = test_users[0]
# Обновляем данные пользователя
user.email = "updated@example.com"
user.name = "Updated Name"
user.slug = "updated-slug"
db_session.commit()
# Проверяем что данные обновлены
updated_user = db_session.query(Author).where(Author.id == user.id).first()
assert updated_user.email == "updated@example.com"
assert updated_user.name == "Updated Name"
assert updated_user.slug == "updated-slug"
class TestRoleSystemFixes:
"""Тесты для исправлений в системе ролей"""
def test_system_admin_role_handling(self, db_session, test_users, test_community):
"""Тест обработки системной роли администратора"""
user = test_users[0]
# Создаем пользователя с системной ролью admin
ca = CommunityAuthor(
community_id=test_community.id,
author_id=user.id,
roles="admin"
)
db_session.add(ca)
db_session.commit()
# Проверяем что системная роль обрабатывается корректно
assert ca.has_role("admin")
# Удаляем системную роль (в текущей реализации это разрешено)
ca.remove_role("admin")
db_session.commit()
# Проверяем что роль была удалена
assert not ca.has_role("admin")
def test_role_validation(self, db_session, test_users, test_community):
"""Тест валидации ролей"""
user = test_users[0]
# Создаем пользователя с валидными ролями
ca = CommunityAuthor(
community_id=test_community.id,
author_id=user.id,
roles="reader,author,expert"
)
db_session.add(ca)
db_session.commit()
# Проверяем что все роли валидны
valid_roles = ["reader", "author", "expert", "editor", "admin"]
for role in ca.role_list:
assert role in valid_roles
def test_empty_roles_handling(self, db_session, test_users, test_community):
"""Тест обработки пустых ролей"""
user = test_users[0]
# Создаем пользователя без ролей
ca = CommunityAuthor(
community_id=test_community.id,
author_id=user.id,
roles=""
)
db_session.add(ca)
db_session.commit()
# Проверяем что пустые роли обрабатываются корректно
assert ca.role_list == []
assert not ca.has_role("reader")
def test_duplicate_roles_handling(self, db_session, test_users, test_community):
"""Тест обработки дублирующихся ролей"""
user = test_users[0]
# Создаем пользователя с дублирующимися ролями
ca = CommunityAuthor(
community_id=test_community.id,
author_id=user.id,
roles="reader,reader,author,author"
)
db_session.add(ca)
db_session.commit()
# Проверяем что дублирующиеся роли обрабатываются корректно
assert set(ca.role_list) == {"reader", "author"}
class TestCommunityManagement:
"""Тесты для управления сообществами"""
def test_community_without_creator_handling(self, db_session, test_users):
"""Тест обработки сообщества без создателя"""
# Создаем сообщество без создателя
community = Community(
id=200,
name="Community Without Creator",
slug="community-without-creator",
desc="Test community without creator",
created_by=None,
created_at=int(time.time())
)
db_session.add(community)
db_session.commit()
# Проверяем что сообщество создано корректно
assert community.created_by is None
assert community.name == "Community Without Creator"
def test_community_creator_assignment(self, db_session, test_users):
"""Тест назначения создателя сообществу"""
# Создаем сообщество без создателя
community = Community(
id=201,
name="Community for Creator Assignment",
slug="community-creator-assignment",
desc="Test community for creator assignment",
created_by=None,
created_at=int(time.time())
)
db_session.add(community)
db_session.commit()
# Назначаем создателя
community.created_by = test_users[0].id
db_session.commit()
# Проверяем что создатель назначен
assert community.created_by == test_users[0].id
def test_community_followers_management(self, db_session, test_users, test_community):
"""Тест управления подписчиками сообщества"""
from orm.community import CommunityFollower
# Добавляем подписчиков
follower1 = CommunityFollower(
community=test_community.id,
follower=test_users[0].id
)
follower2 = CommunityFollower(
community=test_community.id,
follower=test_users[1].id
)
db_session.add(follower1)
db_session.add(follower2)
db_session.commit()
# Проверяем что подписчики добавлены
followers = db_session.query(CommunityFollower).where(
CommunityFollower.community == test_community.id
).all()
assert len(followers) == 2
follower_ids = [f.follower for f in followers]
assert test_users[0].id in follower_ids
assert test_users[1].id in follower_ids
class TestPermissionSystem:
"""Тесты для системы разрешений"""
def test_admin_permissions(self, db_session, admin_user_with_roles, test_community):
"""Тест разрешений администратора"""
from auth.permissions import ContextualPermissionCheck
# Проверяем что администратор имеет все разрешения
permissions_to_check = [
"shout:read", "shout:create", "shout:update", "shout:delete",
"topic:create", "topic:update", "topic:delete",
"user:manage", "community:manage"
]
for permission in permissions_to_check:
resource, operation = permission.split(":")
has_permission = ContextualPermissionCheck.check_permission(
db_session,
admin_user_with_roles.id,
test_community.slug,
resource,
operation
)
# Администратор должен иметь все разрешения
assert has_permission is True
def test_regular_user_permissions(self, db_session, regular_user_with_roles, test_community):
"""Тест разрешений обычного пользователя"""
from auth.permissions import ContextualPermissionCheck
# Проверяем что обычный пользователь имеет роли reader и author
ca = CommunityAuthor.find_author_in_community(
regular_user_with_roles.id,
test_community.id,
db_session
)
assert ca is not None
assert ca.has_role("reader")
assert ca.has_role("author")
# Проверяем что пользователь не имеет админских ролей
assert not ca.has_role("admin")
def test_permission_without_community_author(self, db_session, test_users, test_community):
"""Тест разрешений для пользователя без CommunityAuthor"""
from auth.permissions import ContextualPermissionCheck
# Проверяем разрешения для пользователя без ролей в сообществе
has_permission = ContextualPermissionCheck.check_permission(
db_session,
test_users[2].id, # Пользователь без ролей
test_community.slug,
"shout",
"read"
)
# Пользователь без ролей не должен иметь разрешений
assert has_permission is False
class TestEdgeCases:
"""Тесты краевых случаев"""
def test_user_with_none_roles(self, db_session, test_users, test_community):
"""Тест пользователя с None ролями"""
user = test_users[0]
# Создаем CommunityAuthor с None ролями
ca = CommunityAuthor(
community_id=test_community.id,
author_id=user.id,
roles=None
)
db_session.add(ca)
db_session.commit()
# Проверяем что None роли обрабатываются корректно
assert ca.role_list == []
assert not ca.has_role("reader")
def test_user_with_whitespace_roles(self, db_session, test_users, test_community):
"""Тест пользователя с ролями содержащими пробелы"""
user = test_users[0]
# Создаем CommunityAuthor с ролями содержащими пробелы
ca = CommunityAuthor(
community_id=test_community.id,
author_id=user.id,
roles="reader, author, expert"
)
db_session.add(ca)
db_session.commit()
# Проверяем что пробелы корректно обрабатываются
assert set(ca.role_list) == {"reader", "author", "expert"}
def test_community_with_deleted_creator(self, db_session, test_users):
"""Тест сообщества с удаленным создателем"""
# Создаем пользователя
user = test_users[0]
# Создаем сообщество с создателем
community = Community(
id=300,
name="Community with Creator",
slug="community-with-creator",
desc="Test community with creator",
created_by=user.id,
created_at=int(time.time())
)
db_session.add(community)
db_session.commit()
# Удаляем создателя
db_session.delete(user)
db_session.commit()
# Проверяем что сообщество остается с ID создателя
updated_community = db_session.query(Community).where(Community.id == 300).first()
assert updated_community.created_by == user.id # ID остается, но пользователь удален
class TestIntegration:
"""Интеграционные тесты"""
def test_full_admin_workflow(self, db_session, test_users, test_community):
"""Полный тест рабочего процесса админ-панели"""
user = test_users[0]
# 1. Создаем пользователя с ролями
ca = CommunityAuthor(
community_id=test_community.id,
author_id=user.id,
roles="admin,editor"
)
db_session.add(ca)
db_session.commit()
# 2. Проверяем роли
assert ca.has_role("admin")
assert ca.has_role("editor")
# 3. Добавляем новую роль
ca.add_role("author")
db_session.commit()
assert ca.has_role("author")
# 4. Удаляем роль
ca.remove_role("editor")
db_session.commit()
assert not ca.has_role("editor")
assert ca.has_role("admin")
assert ca.has_role("author")
# 5. Устанавливаем новые роли
ca.set_roles(["reader", "expert"])
db_session.commit()
assert ca.has_role("reader")
assert ca.has_role("expert")
assert not ca.has_role("admin")
assert not ca.has_role("author")
def test_multiple_users_admin_management(self, db_session, test_users, test_community):
"""Тест управления несколькими пользователями"""
# Создаем CommunityAuthor для всех пользователей
for i, user in enumerate(test_users):
roles = ["reader"]
if i == 0:
roles.append("admin")
elif i == 1:
roles.append("editor")
ca = CommunityAuthor(
community_id=test_community.id,
author_id=user.id,
roles=",".join(roles)
)
db_session.add(ca)
db_session.commit()
# Проверяем роли каждого пользователя
for i, user in enumerate(test_users):
ca = CommunityAuthor.find_author_in_community(
user.id,
test_community.id,
db_session
)
assert ca is not None
if i == 0:
assert ca.has_role("admin")
elif i == 1:
assert ca.has_role("editor")
assert ca.has_role("reader")