mirror of
https://github.com/FerraSoft/bottohelp.git
synced 2026-08-06 21:55:03 +00:00
272 lines
11 KiB
Python
272 lines
11 KiB
Python
#!/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"]) |