""" Тесты для исправлений в админ-панели. Проверяет работу обновленных компонентов, исправления в системе ролей и корректность работы интерфейса управления пользователями. """ 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")