Подготовка к релизу

This commit is contained in:
2025-10-30 18:28:26 +03:00
parent 69c0162c6b
commit 4981db90a0
191 changed files with 45557 additions and 3651 deletions
+229
View File
@@ -0,0 +1,229 @@
#!/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)