Files
bottohelp/tests/test_core/test_menu_manager.py
T

155 lines
6.2 KiB
Python

"""
Тесты для ContextMenuManager.
"""
import pytest
from unittest.mock import Mock, AsyncMock
from telegram import InlineKeyboardMarkup, InlineKeyboardButton
from core.menu_manager import ContextMenuManager, MenuConfig
from core.permissions import UserRole
class TestContextMenuManager:
"""Тесты менеджера контекстных меню"""
@pytest.fixture
def mock_formatter(self):
"""Мок-объект для KeyboardFormatter"""
formatter = Mock()
formatter.create_main_menu.return_value = InlineKeyboardMarkup([
[InlineKeyboardButton("📋 Помощь", callback_data='menu_help')]
])
formatter.create_games_menu.return_value = InlineKeyboardMarkup([
[InlineKeyboardButton("🎯 Игра 1", callback_data='game_1')]
])
formatter.create_admin_menu.return_value = InlineKeyboardMarkup([
[InlineKeyboardButton("👥 Пользователи", callback_data='admin_users')]
])
return formatter
@pytest.fixture
def mock_permission_manager(self):
"""Мок-объект для PermissionManager"""
pm = Mock()
pm.has_permission.return_value = True
return pm
@pytest.fixture
def menu_manager(self, mock_permission_manager, mock_formatter):
"""Фикстура для ContextMenuManager"""
return ContextMenuManager(mock_permission_manager, mock_formatter)
def test_initialization(self, menu_manager):
"""Тест инициализации менеджера меню"""
assert menu_manager.menus is not None
assert 'menu_main' in menu_manager.menus
assert 'menu_admin' in menu_manager.menus
# Проверка разделения по уровням
assert 'user' in menu_manager.menu_levels
assert 'admin' in menu_manager.menu_levels
assert 'super_admin' in menu_manager.menu_levels
def test_menu_registration(self, menu_manager):
"""Тест регистрации нового меню"""
async def test_builder(role, **context):
return InlineKeyboardMarkup([[InlineKeyboardButton("Test", callback_data='test')]])
menu_manager.register_menu(
'test_menu', test_builder, UserRole.USER, 'user', 'Тестовое меню'
)
assert 'test_menu' in menu_manager.menus
config = menu_manager.menus['test_menu']
assert config.required_role == UserRole.USER
assert config.level == 'user'
assert config.description == 'Тестовое меню'
@pytest.mark.asyncio
async def test_get_menu_for_user_success(self, menu_manager):
"""Тест успешного получения меню для пользователя"""
menu = await menu_manager.get_menu_for_user('menu_main', UserRole.USER)
assert menu is not None
assert isinstance(menu, InlineKeyboardMarkup)
assert len(menu.inline_keyboard) > 0
@pytest.mark.asyncio
async def test_get_menu_for_user_insufficient_permissions(self, menu_manager, mock_permission_manager):
"""Тест получения меню при недостаточных правах"""
mock_permission_manager.has_permission.return_value = False
menu = await menu_manager.get_menu_for_user('menu_admin', UserRole.USER)
assert menu is None
@pytest.mark.asyncio
async def test_get_menu_for_user_unknown_menu(self, menu_manager):
"""Тест получения неизвестного меню"""
menu = await menu_manager.get_menu_for_user('unknown_menu', UserRole.USER)
assert menu is None
def test_is_menu_available(self, menu_manager, mock_permission_manager):
"""Тест проверки доступности меню"""
# Доступно
mock_permission_manager.has_permission.return_value = True
assert menu_manager.is_menu_available('menu_main', UserRole.USER)
# Недоступно
mock_permission_manager.has_permission.return_value = False
assert not menu_manager.is_menu_available('menu_admin', UserRole.USER)
def test_is_menu_available_unknown_menu(self, menu_manager):
"""Тест проверки доступности неизвестного меню"""
assert not menu_manager.is_menu_available('unknown_menu', UserRole.USER)
def test_get_available_menus_for_role(self, menu_manager, mock_permission_manager):
"""Тест получения списка доступных меню для роли"""
mock_permission_manager.has_permission.return_value = True
menus = menu_manager.get_available_menus_for_role(UserRole.USER)
assert isinstance(menus, list)
assert 'menu_main' in menus
assert 'menu_help' in menus
def test_get_menus_by_level(self, menu_manager):
"""Тест получения меню по уровням"""
user_menus = menu_manager.get_menus_by_level('user')
admin_menus = menu_manager.get_menus_by_level('admin')
assert isinstance(user_menus, list)
assert isinstance(admin_menus, list)
assert 'menu_main' in user_menus
assert 'menu_admin' in admin_menus
def test_get_menus_by_unknown_level(self, menu_manager):
"""Тест получения меню для неизвестного уровня"""
menus = menu_manager.get_menus_by_level('unknown')
assert menus == []
def test_clear_cache(self, menu_manager):
"""Тест очистки кеша"""
# Добавляем что-то в кеш
menu_manager.menu_cache['test'] = Mock()
assert len(menu_manager.menu_cache) > 0
menu_manager.clear_cache()
assert len(menu_manager.menu_cache) == 0
def test_menu_config(self):
"""Тест конфигурации меню"""
async def handler():
pass
config = MenuConfig('test', handler, UserRole.ADMIN, 'admin', 'Test menu')
assert config.menu_id == 'test'
assert config.required_role == UserRole.ADMIN
assert config.level == 'admin'
assert config.description == 'Test menu'