Files
core/tests/test_community_creator_fix.py

375 lines
15 KiB
Python
Raw Normal View History

2025-07-31 18:55:59 +03:00
"""
Тесты для исправлений системы обработки сообществ без создателя.
Проверяет работу с сообществами, у которых отсутствует создатель (created_by = None),
и корректность работы обновленных методов.
"""
import pytest
import time
from sqlalchemy.orm import Session
from auth.orm import Author
from orm.community import (
Community,
CommunityAuthor,
CommunityFollower,
get_user_roles_in_community,
assign_role_to_user,
remove_role_from_user
)
from services.db import local_session
# Используем общую фикстуру из conftest.py
# Используем общую фикстуру из conftest.py
@pytest.fixture
def community_with_creator(db_session, test_users):
"""Создает сообщество с создателем"""
community = Community(
id=101,
name="Community With Creator",
slug="community-with-creator",
desc="Test community with creator",
created_by=test_users[0].id,
created_at=int(time.time())
)
db_session.add(community)
db_session.commit()
return community
class TestCommunityWithoutCreator:
"""Тесты для работы с сообществами без создателя"""
def test_community_creation_without_creator(self, db_session, community_without_creator):
"""Тест создания сообщества без создателя"""
assert community_without_creator.created_by is None
assert community_without_creator.name == "Community Without Creator"
assert community_without_creator.slug == "community-without-creator"
def test_community_creation_with_creator(self, db_session, community_with_creator):
"""Тест создания сообщества с создателем"""
assert community_with_creator.created_by is not None
assert community_with_creator.created_by == 1 # ID первого пользователя
def test_community_creator_assignment(self, db_session, community_without_creator, test_users):
"""Тест назначения создателя сообществу"""
# Назначаем создателя
community_without_creator.created_by = test_users[0].id
db_session.commit()
# Проверяем что создатель назначен
assert community_without_creator.created_by == test_users[0].id
def test_community_followers_without_creator(self, db_session, community_without_creator, test_users):
"""Тест работы с подписчиками сообщества без создателя"""
# Добавляем подписчиков
follower1 = CommunityFollower(
community=community_without_creator.id,
follower=test_users[0].id
)
follower2 = CommunityFollower(
community=community_without_creator.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 == community_without_creator.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 TestUpdatedMethods:
"""Тесты для обновленных методов"""
def test_find_author_in_community_method(self, db_session, test_users, community_with_creator):
"""Тест обновленного метода find_author_in_community"""
# Создаем запись CommunityAuthor
ca = CommunityAuthor(
community_id=community_with_creator.id,
author_id=test_users[0].id,
roles="reader,author"
)
db_session.add(ca)
db_session.commit()
# Тестируем метод find_author_in_community
result = CommunityAuthor.find_author_in_community(test_users[0].id, community_with_creator.id, db_session)
assert result is not None
assert result.author_id == test_users[0].id
assert result.community_id == community_with_creator.id
assert result.roles == "reader,author"
def test_find_author_in_community_not_found(self, db_session, test_users, community_with_creator):
"""Тест метода find_author_in_community когда запись не найдена"""
result = CommunityAuthor.find_author_in_community(999, community_with_creator.id, db_session)
assert result is None
def test_get_user_roles_in_community_without_creator(self, db_session, test_users, community_without_creator):
"""Тест получения ролей пользователя в сообществе без создателя"""
# Создаем запись CommunityAuthor
ca = CommunityAuthor(
community_id=community_without_creator.id,
author_id=test_users[0].id,
roles="reader,expert"
)
db_session.add(ca)
db_session.commit()
# Получаем роли через CommunityAuthor напрямую
ca_found = CommunityAuthor.find_author_in_community(test_users[0].id, community_without_creator.id, db_session)
assert ca_found is not None
roles = ca_found.role_list
# Проверяем что роли получены корректно
assert "reader" in roles
assert "expert" in roles
assert len(roles) == 2
def test_assign_role_to_user_without_creator(self, db_session, test_users, community_without_creator):
"""Тест назначения роли пользователю в сообществе без создателя"""
# Назначаем роль
result = assign_role_to_user(test_users[0].id, "reader", community_without_creator.id)
assert result is True
# Проверяем что роль назначена
roles = get_user_roles_in_community(test_users[0].id, community_without_creator.id)
assert "reader" in roles
def test_remove_role_from_user_without_creator(self, db_session, test_users, community_without_creator):
"""Тест удаления роли пользователя в сообществе без создателя"""
# Сначала назначаем роль
assign_role_to_user(test_users[0].id, "reader", community_without_creator.id)
assign_role_to_user(test_users[0].id, "author", community_without_creator.id)
# Удаляем одну роль
result = remove_role_from_user(test_users[0].id, "reader", community_without_creator.id)
assert result is True
# Проверяем что роль удалена
roles = get_user_roles_in_community(test_users[0].id, community_without_creator.id)
assert "reader" not in roles
assert "author" in roles
class TestCommunityAuthorMethods:
"""Тесты для методов CommunityAuthor"""
def test_add_role_method(self, db_session, test_users, community_with_creator):
"""Тест метода add_role"""
ca = CommunityAuthor(
community_id=community_with_creator.id,
author_id=test_users[0].id,
roles="reader"
)
db_session.add(ca)
db_session.commit()
# Добавляем роль
ca.add_role("author")
db_session.commit()
# Проверяем что роль добавлена
assert ca.has_role("reader")
assert ca.has_role("author")
def test_remove_role_method(self, db_session, test_users, community_with_creator):
"""Тест метода remove_role"""
ca = CommunityAuthor(
community_id=community_with_creator.id,
author_id=test_users[0].id,
roles="reader,author,expert"
)
db_session.add(ca)
db_session.commit()
# Удаляем роль
ca.remove_role("author")
db_session.commit()
# Проверяем что роль удалена
assert ca.has_role("reader")
assert not ca.has_role("author")
assert ca.has_role("expert")
def test_has_role_method(self, db_session, test_users, community_with_creator):
"""Тест метода has_role"""
ca = CommunityAuthor(
community_id=community_with_creator.id,
author_id=test_users[0].id,
roles="reader,author"
)
db_session.add(ca)
db_session.commit()
# Проверяем существующие роли
assert ca.has_role("reader") is True
assert ca.has_role("author") is True
# Проверяем несуществующие роли
assert ca.has_role("admin") is False
assert ca.has_role("editor") is False
def test_set_roles_method(self, db_session, test_users, community_with_creator):
"""Тест метода set_roles"""
ca = CommunityAuthor(
community_id=community_with_creator.id,
author_id=test_users[0].id,
roles="reader"
)
db_session.add(ca)
db_session.commit()
# Устанавливаем новые роли
ca.set_roles(["admin", "editor"])
db_session.commit()
# Проверяем что роли установлены
assert ca.roles == "admin,editor"
assert ca.has_role("admin")
assert ca.has_role("editor")
assert not ca.has_role("reader")
class TestEdgeCases:
"""Тесты краевых случаев"""
def test_empty_roles_string(self, db_session, test_users, community_with_creator):
"""Тест обработки пустой строки ролей"""
ca = CommunityAuthor(
community_id=community_with_creator.id,
author_id=test_users[0].id,
roles=""
)
db_session.add(ca)
db_session.commit()
# Проверяем что пустые роли обрабатываются корректно
assert ca.role_list == []
assert not ca.has_role("reader")
def test_none_roles(self, db_session, test_users, community_with_creator):
"""Тест обработки None ролей"""
ca = CommunityAuthor(
community_id=community_with_creator.id,
author_id=test_users[0].id,
roles=None
)
db_session.add(ca)
db_session.commit()
# Проверяем что None роли обрабатываются корректно
assert ca.role_list == []
assert not ca.has_role("reader")
def test_whitespace_in_roles(self, db_session, test_users, community_with_creator):
"""Тест обработки пробелов в ролях"""
ca = CommunityAuthor(
community_id=community_with_creator.id,
author_id=test_users[0].id,
roles=" reader , author , expert "
)
db_session.add(ca)
db_session.commit()
# Проверяем что пробелы корректно обрабатываются
assert set(ca.role_list) == {"reader", "author", "expert"}
class TestIntegration:
"""Интеграционные тесты"""
def test_full_workflow_without_creator(self, db_session, test_users, community_without_creator):
"""Полный тест рабочего процесса с сообществом без создателя"""
# 1. Создаем CommunityAuthor
ca = CommunityAuthor(
community_id=community_without_creator.id,
author_id=test_users[0].id,
roles="reader"
)
db_session.add(ca)
db_session.commit()
# 2. Добавляем роли
ca.add_role("author")
ca.add_role("expert")
db_session.commit()
# 3. Проверяем роли
assert ca.has_role("reader")
assert ca.has_role("author")
assert ca.has_role("expert")
# 4. Удаляем роль
ca.remove_role("author")
db_session.commit()
# 5. Проверяем результат
assert ca.has_role("reader")
assert not ca.has_role("author")
assert ca.has_role("expert")
# 6. Устанавливаем новые роли
ca.set_roles(["admin", "editor"])
db_session.commit()
# 7. Финальная проверка
assert ca.has_role("admin")
assert ca.has_role("editor")
assert not ca.has_role("reader")
assert not ca.has_role("expert")
def test_multiple_users_in_community_without_creator(self, db_session, test_users, community_without_creator):
"""Тест работы с несколькими пользователями в сообществе без создателя"""
# Создаем записи для всех пользователей
for i, user in enumerate(test_users):
roles = ["reader"]
if i == 0:
roles.append("author")
elif i == 1:
roles.append("expert")
ca = CommunityAuthor(
community_id=community_without_creator.id,
author_id=user.id,
roles=",".join(roles)
)
db_session.add(ca)
db_session.commit()
# Проверяем роли каждого пользователя через CommunityAuthor напрямую
user1_ca = CommunityAuthor.find_author_in_community(test_users[0].id, community_without_creator.id, db_session)
user2_ca = CommunityAuthor.find_author_in_community(test_users[1].id, community_without_creator.id, db_session)
user3_ca = CommunityAuthor.find_author_in_community(test_users[2].id, community_without_creator.id, db_session)
user1_roles = user1_ca.role_list if user1_ca else []
user2_roles = user2_ca.role_list if user2_ca else []
user3_roles = user3_ca.role_list if user3_ca else []
# Проверяем что роли назначены корректно
assert "reader" in user1_roles
assert "author" in user1_roles
assert len(user1_roles) == 2
assert "reader" in user2_roles
assert "expert" in user2_roles
assert len(user2_roles) == 2
assert "reader" in user3_roles
assert len(user3_roles) == 1