mirror of
https://github.com/FerraSoft/bottohelp.git
synced 2026-08-06 21:55:03 +00:00
229 lines
9.3 KiB
Python
229 lines
9.3 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Тесты для проверки работы SUPER_ADMIN роли.
|
||
Проверяет корректность назначения ролей и доступ к командам.
|
||
"""
|
||
|
||
import logging
|
||
import sys
|
||
import os
|
||
from pathlib import Path
|
||
|
||
# Настраиваем кодировку для корректного вывода Unicode
|
||
sys.stdout.reconfigure(encoding='utf-8')
|
||
|
||
# Добавляем корневую директорию в путь
|
||
sys.path.insert(0, str(Path(__file__).parent))
|
||
|
||
# Устанавливаем переменные окружения для тестов
|
||
os.environ['BOT_TOKEN'] = 'test_token_for_tests'
|
||
os.environ['ADMIN_IDS'] = '1278359005'
|
||
os.environ['SUPER_ADMIN_IDS'] = '1278359005'
|
||
|
||
from core.config import Config
|
||
from core.permissions import permission_manager, UserRole
|
||
from core.middleware import MiddlewareContext
|
||
from telegram import User, CallbackQuery
|
||
|
||
|
||
def test_super_admin_config():
|
||
"""Тест загрузки SUPER_ADMIN из конфигурации"""
|
||
print("=== Тест загрузки SUPER_ADMIN из конфигурации ===")
|
||
|
||
try:
|
||
config = Config()
|
||
print(f"✓ Конфигурация загружена")
|
||
print(f" SUPER_ADMIN_IDS: {config.bot_config.super_admin_ids}")
|
||
print(f" ADMIN_IDS: {config.bot_config.admin_ids}")
|
||
|
||
# Проверяем что пользователь 1278359005 в SUPER_ADMIN_IDS
|
||
assert 1278359005 in config.bot_config.super_admin_ids, "Пользователь не найден в SUPER_ADMIN_IDS"
|
||
print("✓ Пользователь 1278359005 найден в SUPER_ADMIN_IDS")
|
||
|
||
# Проверяем роль из конфигурации
|
||
role = permission_manager.get_user_role_from_config(1278359005, config)
|
||
assert role == UserRole.SUPER_ADMIN, f"Ожидалась роль SUPER_ADMIN, получена {role}"
|
||
print("✓ Пользователь имеет роль SUPER_ADMIN из конфигурации")
|
||
|
||
return True
|
||
except Exception as e:
|
||
print(f"✗ Ошибка в тесте конфигурации: {e}")
|
||
return False
|
||
|
||
|
||
def test_super_admin_permissions():
|
||
"""Тест разрешений для SUPER_ADMIN"""
|
||
print("\n=== Тест разрешений SUPER_ADMIN ===")
|
||
|
||
try:
|
||
config = Config()
|
||
user_role = permission_manager.get_user_role_from_config(1278359005, config)
|
||
assert user_role == UserRole.SUPER_ADMIN, f"Ожидалась роль SUPER_ADMIN, получена {user_role}"
|
||
|
||
# Тестируем команды которые должны быть доступны SUPER_ADMIN
|
||
super_admin_commands = [
|
||
'report_error', 'admin_errors', 'analyze_error_ai',
|
||
'process_all_errors_ai', 'add_error_to_todo', 'add_all_analyzed_to_todo',
|
||
'menu_moderation', 'menu_admin', 'menu_triggers'
|
||
]
|
||
|
||
for cmd in super_admin_commands:
|
||
can_execute = permission_manager.can_execute_command(user_role, cmd)
|
||
assert can_execute, f"Команда /{cmd} должна быть доступна SUPER_ADMIN"
|
||
print(f"✓ Команда /{cmd} доступна SUPER_ADMIN")
|
||
|
||
# Тестируем базовые команды
|
||
basic_commands = ['start', 'help', 'info', 'rank', 'leaderboard', 'donate']
|
||
for cmd in basic_commands:
|
||
can_execute = permission_manager.can_execute_command(user_role, cmd)
|
||
assert can_execute, f"Команда /{cmd} должна быть доступна SUPER_ADMIN"
|
||
print(f"✓ Команда /{cmd} доступна SUPER_ADMIN")
|
||
|
||
return True
|
||
except Exception as e:
|
||
print(f"✗ Ошибка в тесте разрешений: {e}")
|
||
return False
|
||
|
||
|
||
async def test_middleware_super_admin():
|
||
"""Тест middleware с SUPER_ADMIN"""
|
||
print("\n=== Test middleware with SUPER_ADMIN ===")
|
||
|
||
try:
|
||
config = Config()
|
||
|
||
# Создаем фейковый callback update
|
||
user = User(id=1278359005, first_name='Test Super Admin', is_bot=False)
|
||
callback_query = CallbackQuery(id='123', from_user=user, chat_instance='123', data='menu_admin')
|
||
fake_update = type('FakeUpdate', (), {'effective_user': user, 'callback_query': callback_query})()
|
||
|
||
# Тестируем middleware context
|
||
ctx = MiddlewareContext(fake_update, None)
|
||
await ctx.initialize(config)
|
||
|
||
assert ctx.user_id == 1278359005, f"Expected user_id 1278359005, got {ctx.user_id}"
|
||
assert ctx.user_role == UserRole.SUPER_ADMIN, f"Expected SUPER_ADMIN role, got {ctx.user_role}"
|
||
assert ctx.command == 'menu_admin', f"Expected command menu_admin, got {ctx.command}"
|
||
|
||
print("[OK] Middleware correctly initializes SUPER_ADMIN")
|
||
print(f" User ID: {ctx.user_id}")
|
||
print(f" User Role: {ctx.user_role}")
|
||
print(f" Command: {ctx.command}")
|
||
|
||
return True
|
||
except Exception as e:
|
||
print(f"[ERROR] Middleware test error: {e}")
|
||
import traceback
|
||
traceback.print_exc()
|
||
return False
|
||
async def test_middleware_super_admin():
|
||
"""Тест middleware с SUPER_ADMIN"""
|
||
print("\n=== Test middleware with SUPER_ADMIN ===")
|
||
|
||
try:
|
||
config = Config()
|
||
|
||
# Создаем фейковый callback update
|
||
user = User(id=1278359005, first_name='Test Super Admin', is_bot=False)
|
||
callback_query = CallbackQuery(id='123', from_user=user, chat_instance='123', data='menu_admin')
|
||
fake_update = type('FakeUpdate', (), {'effective_user': user, 'callback_query': callback_query})()
|
||
|
||
# Тестируем middleware context
|
||
ctx = MiddlewareContext(fake_update, None)
|
||
await ctx.initialize(config)
|
||
|
||
assert ctx.user_id == 1278359005, f"Expected user_id 1278359005, got {ctx.user_id}"
|
||
assert ctx.user_role == UserRole.SUPER_ADMIN, f"Expected SUPER_ADMIN role, got {ctx.user_role}"
|
||
assert ctx.command == 'menu_admin', f"Expected command menu_admin, got {ctx.command}"
|
||
|
||
print("[OK] Middleware correctly initializes SUPER_ADMIN")
|
||
print(f" User ID: {ctx.user_id}")
|
||
print(f" User Role: {ctx.user_role}")
|
||
print(f" Command: {ctx.command}")
|
||
|
||
return True
|
||
except Exception as e:
|
||
print(f"[ERROR] Middleware test error: {e}")
|
||
return False
|
||
|
||
|
||
def test_role_hierarchy():
|
||
"""Тест иерархии ролей"""
|
||
print("\n=== Тест иерархии ролей ===")
|
||
|
||
try:
|
||
# Проверяем что SUPER_ADMIN имеет все разрешения
|
||
super_admin_perms = permission_manager.get_role_permissions(UserRole.SUPER_ADMIN)
|
||
admin_perms = permission_manager.get_role_permissions(UserRole.ADMIN)
|
||
moderator_perms = permission_manager.get_role_permissions(UserRole.MODERATOR)
|
||
user_perms = permission_manager.get_role_permissions(UserRole.USER)
|
||
|
||
# SUPER_ADMIN должен иметь все разрешения
|
||
assert len(super_admin_perms) >= len(admin_perms), "SUPER_ADMIN должен иметь как минимум все разрешения ADMIN"
|
||
assert len(super_admin_perms) >= len(moderator_perms), "SUPER_ADMIN должен иметь как минимум все разрешения MODERATOR"
|
||
assert len(super_admin_perms) >= len(user_perms), "SUPER_ADMIN должен иметь как минимум все разрешения USER"
|
||
|
||
print("✓ Иерархия ролей корректна")
|
||
print(f" SUPER_ADMIN разрешений: {len(super_admin_perms)}")
|
||
print(f" ADMIN разрешений: {len(admin_perms)}")
|
||
print(f" MODERATOR разрешений: {len(moderator_perms)}")
|
||
print(f" USER разрешений: {len(user_perms)}")
|
||
|
||
return True
|
||
except Exception as e:
|
||
print(f"✗ Ошибка в тесте иерархии ролей: {e}")
|
||
return False
|
||
|
||
|
||
import asyncio
|
||
|
||
async def main():
|
||
"""Основная функция тестирования"""
|
||
print("Running SUPER_ADMIN role tests...")
|
||
print("=" * 50)
|
||
|
||
tests = [
|
||
test_super_admin_config,
|
||
test_super_admin_permissions,
|
||
test_middleware_super_admin, # Теперь async
|
||
test_role_hierarchy
|
||
]
|
||
|
||
passed = 0
|
||
failed = 0
|
||
|
||
for test in tests:
|
||
try:
|
||
if asyncio.iscoroutinefunction(test):
|
||
result = await test()
|
||
else:
|
||
result = test()
|
||
|
||
if result:
|
||
passed += 1
|
||
print(f"[OK] {test.__name__} - PASSED")
|
||
else:
|
||
failed += 1
|
||
print(f"[FAIL] {test.__name__} - FAILED")
|
||
except Exception as e:
|
||
failed += 1
|
||
print(f"[ERROR] {test.__name__} - ERROR: {e}")
|
||
|
||
print("\n" + "=" * 50)
|
||
print("Test Results:")
|
||
print(f"[OK] Passed: {passed}")
|
||
print(f"[FAIL] Failed: {failed}")
|
||
print(f"Total tests: {passed + failed}")
|
||
|
||
if failed > 0:
|
||
print("\n[ERROR] Some tests failed!")
|
||
return 1
|
||
else:
|
||
print("\n[SUCCESS] All tests passed!")
|
||
return 0
|
||
|
||
|
||
if __name__ == "__main__":
|
||
logging.basicConfig(level=logging.ERROR) # Уменьшаем логирование для тестов
|
||
exit_code = asyncio.run(main())
|
||
sys.exit(exit_code) |