mirror of
https://github.com/FerraSoft/bottohelp.git
synced 2026-08-06 21:55:03 +00:00
155 lines
6.2 KiB
Python
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' |