Подготовка к релизу

This commit is contained in:
2025-10-30 18:28:26 +03:00
parent 69c0162c6b
commit 4981db90a0
191 changed files with 45557 additions and 3651 deletions
+272
View File
@@ -0,0 +1,272 @@
#!/usr/bin/env python3
"""
Тесты для системы разделения приветствий по ролям пользователей.
Тестирование функциональности ролей, приветствий и интеграции компонентов.
"""
import pytest
import sys
import os
from unittest.mock import Mock, AsyncMock
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from services.role_service import RoleService
from services.user_service import UserService
from database.repository import BaseRepository
from messages import USER_MESSAGES
class TestRoleBasedGreetings:
"""Тесты для системы ролей и приветствий"""
def setup_method(self):
"""Настройка перед каждым тестом"""
self.db_repo = BaseRepository(':memory:') # Используем in-memory базу для тестов
self.role_service = RoleService(':memory:')
# Инициализируем роли
self.role_service.initialize_roles()
def teardown_method(self):
"""Очистка после каждого теста"""
if hasattr(self.db_repo, '_connection'):
self.db_repo.close()
def test_role_initialization(self):
"""Тест инициализации ролей"""
roles = self.role_service.get_all_roles()
assert len(roles) == 3
role_names = [role.name for role in roles]
assert 'user' in role_names
assert 'moderator' in role_names
assert 'admin' in role_names
def test_default_user_role(self):
"""Тест роли по умолчанию для новых пользователей"""
# Создаем тестового пользователя
user_data = {
'telegram_id': 123456789,
'username': 'testuser',
'first_name': 'Test',
'last_name': 'User'
}
self.db_repo._execute_query("""
INSERT INTO users (telegram_id, username, first_name, last_name, role_id)
VALUES (?, ?, ?, ?, ?)
""", (user_data['telegram_id'], user_data['username'],
user_data['first_name'], user_data['last_name'], 1))
# Проверяем роль
role = self.role_service.get_user_role_name(123456789)
assert role == 'user'
def test_admin_role_assignment(self):
"""Тест назначения роли администратора"""
# Создаем пользователя
user_data = {
'telegram_id': 987654321,
'username': 'adminuser',
'first_name': 'Admin',
'last_name': 'User'
}
self.db_repo._execute_query("""
INSERT INTO users (telegram_id, username, first_name, last_name, role_id)
VALUES (?, ?, ?, ?, ?)
""", (user_data['telegram_id'], user_data['username'],
user_data['first_name'], user_data['last_name'], 1))
# Назначаем роль admin
success = self.role_service.assign_role(987654321, 'admin')
assert success
# Проверяем роль
role = self.role_service.get_user_role_name(987654321)
assert role == 'admin'
# Проверяем методы проверки ролей
assert self.role_service.is_admin(987654321)
assert self.role_service.is_moderator(987654321)
def test_moderator_role_assignment(self):
"""Тест назначения роли модератора"""
# Создаем пользователя
user_data = {
'telegram_id': 555666777,
'username': 'moduser',
'first_name': 'Mod',
'last_name': 'User'
}
self.db_repo._execute_query("""
INSERT INTO users (telegram_id, username, first_name, last_name, role_id)
VALUES (?, ?, ?, ?, ?)
""", (user_data['telegram_id'], user_data['username'],
user_data['first_name'], user_data['last_name'], 1))
# Назначаем роль moderator
success = self.role_service.assign_role(555666777, 'moderator')
assert success
# Проверяем роль
role = self.role_service.get_user_role_name(555666777)
assert role == 'moderator'
# Проверяем методы проверки ролей
assert not self.role_service.is_admin(555666777)
assert self.role_service.is_moderator(555666777)
def test_invalid_role_assignment(self):
"""Тест назначения невалидной роли"""
# Создаем пользователя
user_data = {
'telegram_id': 111222333,
'username': 'invaliduser',
'first_name': 'Invalid',
'last_name': 'User'
}
self.db_repo._execute_query("""
INSERT INTO users (telegram_id, username, first_name, last_name, role_id)
VALUES (?, ?, ?, ?, ?)
""", (user_data['telegram_id'], user_data['username'],
user_data['first_name'], user_data['last_name'], 1))
# Пытаемся назначить невалидную роль
success = self.role_service.assign_role(111222333, 'superuser')
assert not success
# Проверяем, что роль не изменилась
role = self.role_service.get_user_role_name(111222333)
assert role == 'user'
def test_greeting_messages_exist(self):
"""Тест наличия приветственных сообщений для всех ролей"""
assert 'greetings_by_role' in USER_MESSAGES
greetings = USER_MESSAGES['greetings_by_role']
# Проверяем наличие приветствий для всех ролей
assert 'user' in greetings
assert 'moderator' in greetings
assert 'admin' in greetings
# Проверяем, что приветствия содержат плейсхолдер {name}
for role, greeting in greetings.items():
assert '{name}' in greeting
assert isinstance(greeting, str)
assert len(greeting) > 0
def test_greeting_personalization(self):
"""Тест персонализации приветствий"""
greetings = USER_MESSAGES['greetings_by_role']
test_name = "ТестовыйПользователь"
# Проверяем каждое приветствие
for role, template in greetings.items():
personalized = template.format(name=test_name)
assert test_name in personalized
assert '{name}' not in personalized
def test_fallback_greeting(self):
"""Тест fallback приветствия для неизвестной роли"""
greetings = USER_MESSAGES['greetings_by_role']
# Для неизвестной роли должно использоваться приветствие user
unknown_role_greeting = greetings.get('unknown_role', greetings['user'])
assert unknown_role_greeting == greetings['user']
def test_role_permissions(self):
"""Тест получения разрешений для ролей"""
# Проверяем разрешения для каждой роли
user_permissions = self.role_service.get_role_permissions('user')
assert user_permissions['can_use_basic_commands'] is True
assert user_permissions['can_play_games'] is True
assert user_permissions.get('can_moderate', False) is False
moderator_permissions = self.role_service.get_role_permissions('moderator')
assert moderator_permissions['can_use_basic_commands'] is True
assert moderator_permissions['can_play_games'] is True
assert moderator_permissions['can_moderate'] is True
assert moderator_permissions['can_warn_users'] is True
admin_permissions = self.role_service.get_role_permissions('admin')
assert admin_permissions['can_use_basic_commands'] is True
assert admin_permissions['can_play_games'] is True
assert admin_permissions['can_moderate'] is True
assert admin_permissions['can_warn_users'] is True
assert admin_permissions['can_manage_users'] is True
assert admin_permissions['can_schedule_posts'] is True
assert admin_permissions['can_export_data'] is True
def test_nonexistent_user_role(self):
"""Тест получения роли для несуществующего пользователя"""
role = self.role_service.get_user_role_name(999999999)
assert role == 'user' # Должен возвращать роль по умолчанию
class TestIntegrationRoleGreetings:
"""Интеграционные тесты для системы ролей и приветствий"""
def setup_method(self):
"""Настройка перед каждым тестом"""
self.db_repo = BaseRepository(':memory:')
self.role_service = RoleService(':memory:')
self.user_service = UserService(self.db_repo, Mock(), self.role_service)
# Инициализируем роли
self.role_service.initialize_roles()
def teardown_method(self):
"""Очистка после каждого теста"""
if hasattr(self.db_repo, '_connection'):
self.db_repo.close()
@pytest.mark.asyncio
async def test_user_creation_with_default_role(self):
"""Тест создания пользователя с ролью по умолчанию"""
profile = await self.user_service.get_or_create_user(
user_id=123456789,
username='testuser',
first_name='Test',
last_name='User'
)
assert profile is not None
assert profile.user_id == 123456789
# Проверяем роль через UserService
role = self.user_service.get_user_role(123456789)
assert role == 'user'
# Проверяем через RoleService
role_via_service = self.role_service.get_user_role_name(123456789)
assert role_via_service == 'user'
@pytest.mark.asyncio
async def test_role_assignment_integration(self):
"""Тест назначения роли в интеграции"""
# Создаем пользователя
profile = await self.user_service.get_or_create_user(
user_id=987654321,
username='testadmin',
first_name='Test',
last_name='Admin'
)
# Назначаем роль admin
success = self.role_service.assign_role(987654321, 'admin')
assert success
# Проверяем через разные сервисы
role_via_user_service = self.user_service.get_user_role(987654321)
role_via_role_service = self.role_service.get_user_role_name(987654321)
assert role_via_user_service == 'admin'
assert role_via_role_service == 'admin'
assert self.user_service.is_admin(987654321)
assert self.user_service.is_moderator(987654321)
if __name__ == "__main__":
# Запуск тестов
pytest.main([__file__, "-v"])