mirror of
https://github.com/FerraSoft/bottohelp.git
synced 2026-08-06 21:55:03 +00:00
Подготовка к релизу
This commit is contained in:
@@ -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"])
|
||||
Reference in New Issue
Block a user