Files
new_lottery_bot/tests/test_admin_improvements.py
2025-11-16 12:36:02 +09:00

164 lines
8.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
Тест всех новых функций: пакетного добавления счетов и админских хэндлеров
"""
import asyncio
import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from src.core.database import async_session_maker, engine
from src.core.services import UserService, LotteryService, ParticipationService
from src.utils.account_utils import validate_account_number, format_account_number, mask_account_number
from src.display.winner_display import format_winner_display
import random
async def test_comprehensive_features():
print("🧪 Комплексное тестирование всех функций")
print("="*60)
async with async_session_maker() as session:
# 1. Создаем тестовых пользователей с номерами счетов
print("\n1. 📝 Создание тестовых пользователей:")
test_users = []
test_accounts = []
for i in range(5):
# Генерируем уникальные данные
unique_id = random.randint(10000000, 99999999)
account = f"{random.randint(10,99)}-{random.randint(10,99)}-{random.randint(10,99)}-{random.randint(10,99)}-{random.randint(10,99)}-{random.randint(10,99)}-{random.randint(10,99)}-{random.randint(10,99)}"
user = await UserService.get_or_create_user(
session,
telegram_id=unique_id,
username=f'test_user_{i}_{unique_id}',
first_name=f'Тестовый{i}',
last_name=f'Пользователь{i}'
)
# Устанавливаем номер счёта
success = await UserService.set_account_number(session, user.telegram_id, account)
if success:
test_users.append(user)
test_accounts.append(account)
print(f"✅ Пользователь {i+1}: {user.first_name} ({account})")
else:
print(f"Не удалось создать пользователя {i+1}")
# 2. Создаем тестовый розыгрыш
print(f"\n2. 🎯 Создание тестового розыгрыша:")
lottery = await LotteryService.create_lottery(
session,
title="Тест массовых операций",
description="Розыгрыш для тестирования массовых операций",
prizes=["Приз 1", "Приз 2"],
creator_id=1
)
print(f"✅ Розыгрыш создан: {lottery.title}")
# 3. Тестируем массовое добавление по номерам счетов
print(f"\n3. 🏦 Массовое добавление по номерам счетов:")
accounts_to_add = test_accounts[:3] # Первые 3
print(f"Добавляем {len(accounts_to_add)} счетов: {', '.join(accounts_to_add)}")
results = await ParticipationService.add_participants_by_accounts_bulk(
session, lottery.id, accounts_to_add
)
print(f"📊 Результат:")
print(f" ✅ Добавлено: {results['added']}")
print(f" ⚠️ Пропущено: {results['skipped']}")
print(f" ❌ Ошибок: {len(results['errors'])}")
# 4. Проверяем участников
print(f"\n4. 👥 Проверка участников:")
participants = await ParticipationService.get_participants(session, lottery.id)
print(f"Участников в розыгрыше: {len(participants)}")
for participant in participants:
print(f"{participant.first_name} ({participant.account_number})")
# 5. Тестируем настройки отображения победителей
print(f"\n5. 🎭 Тестирование настроек отображения:")
for display_type in ["username", "chat_id", "account_number"]:
await LotteryService.set_winner_display_type(session, lottery.id, display_type)
lottery.winner_display_type = display_type # Обновляем локально
if participants:
test_participant = participants[0]
public_display = format_winner_display(test_participant, lottery, show_sensitive_data=False)
admin_display = format_winner_display(test_participant, lottery, show_sensitive_data=True)
print(f" 📺 Тип {display_type}:")
print(f" 👥 Публично: {public_display}")
print(f" 🔧 Админ: {admin_display}")
# 6. Тестируем массовое удаление по счетам
print(f"\n6. 🗑️ Массовое удаление по номерам счетов:")
accounts_to_remove = test_accounts[:2] # Первые 2
print(f"Удаляем {len(accounts_to_remove)} счетов")
results = await ParticipationService.remove_participants_by_accounts_bulk(
session, lottery.id, accounts_to_remove
)
print(f"📊 Результат:")
print(f" ✅ Удалено: {results['removed']}")
print(f" ⚠️ Не найдено: {results['not_found']}")
print(f" ❌ Ошибок: {len(results['errors'])}")
# 7. Проверяем оставшихся участников
print(f"\n7. 👥 Проверка оставшихся участников:")
remaining_participants = await ParticipationService.get_participants(session, lottery.id)
print(f"Участников осталось: {len(remaining_participants)}")
for participant in remaining_participants:
print(f"{participant.first_name} ({participant.account_number})")
# 8. Тестируем методы управления розыгрышем
print(f"\n8. ⚙️ Тестирование управления розыгрышем:")
# Деактивируем
success = await LotteryService.set_lottery_active(session, lottery.id, False)
print(f" 🔴 Деактивация: {'' if success else ''}")
# Активируем обратно
success = await LotteryService.set_lottery_active(session, lottery.id, True)
print(f" 🟢 Активация: {'' if success else ''}")
# Завершаем
success = await LotteryService.complete_lottery(session, lottery.id)
print(f" 🏁 Завершение: {'' if success else ''}")
# 9. Тестируем валидацию счетов с неправильными форматами
print(f"\n9. 🔍 Тестирование валидации:")
invalid_accounts = [
"invalid-account",
"12345", # Слишком короткий
"12-34-56-78", # Неполный
"ab-cd-ef-gh-12-34-56-78", # С буквами
"12-34-56-78-90-12-34-56-78" # Слишком длинный
]
results = await ParticipationService.add_participants_by_accounts_bulk(
session, lottery.id, invalid_accounts
)
print(f"📊 Результат добавления невалидных счетов:")
print(f" ✅ Добавлено: {results['added']}")
print(f" 🚫 Неверных форматов: {len(results['invalid_accounts'])}")
print(f" ❌ Ошибок: {len(results['errors'])}")
if results['invalid_accounts']:
print(f" 🚫 Неверные форматы:")
for invalid in results['invalid_accounts']:
print(f"{invalid}")
print(f"\n🎉 Все тесты завершены успешно!")
print(f"✅ Массовое добавление и удаление по счетам работает")
print(f"✅ Настройка отображения победителей работает")
print(f"✅ Управление розыгрышами работает")
print(f"✅ Валидация счетов работает")
if __name__ == "__main__":
asyncio.run(test_comprehensive_features())