164 lines
8.5 KiB
Python
164 lines
8.5 KiB
Python
#!/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())
|