refactor
This commit is contained in:
164
scripts/examples.py
Normal file
164
scripts/examples.py
Normal file
@@ -0,0 +1,164 @@
|
||||
"""
|
||||
Примеры использования API сервисов для тестирования
|
||||
"""
|
||||
import asyncio
|
||||
from database import async_session_maker, init_db
|
||||
from services import UserService, LotteryService, ParticipationService
|
||||
|
||||
|
||||
async def example_usage():
|
||||
"""Пример использования всех основных функций бота"""
|
||||
|
||||
print("🔄 Инициализация базы данных...")
|
||||
await init_db()
|
||||
|
||||
async with async_session_maker() as session:
|
||||
print("\n👤 Создание пользователей...")
|
||||
|
||||
# Создаем администратора
|
||||
admin = await UserService.get_or_create_user(
|
||||
session,
|
||||
telegram_id=123456789,
|
||||
username="admin_user",
|
||||
first_name="Администратор",
|
||||
last_name="Бота"
|
||||
)
|
||||
await UserService.set_admin(session, 123456789, True)
|
||||
print(f"✅ Создан админ: {admin.first_name} (@{admin.username})")
|
||||
|
||||
# Создаем обычных пользователей
|
||||
users = []
|
||||
for i in range(1, 6):
|
||||
user = await UserService.get_or_create_user(
|
||||
session,
|
||||
telegram_id=100000000 + i,
|
||||
username=f"user{i}",
|
||||
first_name=f"Пользователь{i}",
|
||||
last_name="Тестовый"
|
||||
)
|
||||
users.append(user)
|
||||
print(f"✅ Создан пользователь: {user.first_name}")
|
||||
|
||||
print(f"\n🎲 Создание розыгрыша...")
|
||||
|
||||
# Создаем розыгрыш
|
||||
lottery = await LotteryService.create_lottery(
|
||||
session,
|
||||
title="🎉 Новогодний розыгрыш 2025",
|
||||
description="Грандиозный новогодний розыгрыш с крутыми призами!",
|
||||
prizes=[
|
||||
"🥇 iPhone 15 Pro Max",
|
||||
"🥈 MacBook Air M2",
|
||||
"🥉 AirPods Pro",
|
||||
"🏆 PlayStation 5",
|
||||
"🎁 Подарочный сертификат 10,000₽"
|
||||
],
|
||||
creator_id=admin.id
|
||||
)
|
||||
print(f"✅ Создан розыгрыш: {lottery.title}")
|
||||
|
||||
print(f"\n🎫 Регистрация участников...")
|
||||
|
||||
# Добавляем участников
|
||||
for user in users:
|
||||
success = await LotteryService.add_participant(session, lottery.id, user.id)
|
||||
if success:
|
||||
print(f"✅ {user.first_name} присоединился к розыгрышу")
|
||||
|
||||
print(f"\n👑 Установка ручного победителя...")
|
||||
|
||||
# Устанавливаем ручного победителя на 1 место
|
||||
manual_winner = users[0] # Первый пользователь
|
||||
success = await LotteryService.set_manual_winner(
|
||||
session, lottery.id, 1, manual_winner.telegram_id
|
||||
)
|
||||
if success:
|
||||
print(f"✅ {manual_winner.first_name} установлен как победитель 1 места")
|
||||
|
||||
# Устанавливаем еще одного ручного победителя на 3 место
|
||||
manual_winner2 = users[2] # Третий пользователь
|
||||
success = await LotteryService.set_manual_winner(
|
||||
session, lottery.id, 3, manual_winner2.telegram_id
|
||||
)
|
||||
if success:
|
||||
print(f"✅ {manual_winner2.first_name} установлен как победитель 3 места")
|
||||
|
||||
print(f"\n📊 Статистика перед розыгрышем...")
|
||||
participants_count = await ParticipationService.get_participants_count(
|
||||
session, lottery.id
|
||||
)
|
||||
print(f"👥 Участников в розыгрыше: {participants_count}")
|
||||
|
||||
print(f"\n🎲 Проведение розыгрыша...")
|
||||
|
||||
# Проводим розыгрыш
|
||||
results = await LotteryService.conduct_draw(session, lottery.id)
|
||||
|
||||
print(f"\n🏆 Результаты розыгрыша:")
|
||||
print(f"🎯 Розыгрыш: {lottery.title}")
|
||||
print("=" * 50)
|
||||
|
||||
for place, winner_info in results.items():
|
||||
user = winner_info['user']
|
||||
prize = winner_info['prize']
|
||||
is_manual = winner_info['is_manual']
|
||||
|
||||
manual_indicator = "👑 (установлен вручную)" if is_manual else "🎲 (случайный)"
|
||||
print(f"{place}. {user.first_name} (@{user.username}) {manual_indicator}")
|
||||
print(f" 🎁 {prize}")
|
||||
print()
|
||||
|
||||
print("=" * 50)
|
||||
print("✅ Розыгрыш завершен успешно!")
|
||||
|
||||
print(f"\n📈 Финальная статистика...")
|
||||
|
||||
# Получаем победителей из базы данных
|
||||
winners = await LotteryService.get_winners(session, lottery.id)
|
||||
print(f"🏆 Сохранено победителей в базе: {len(winners)}")
|
||||
|
||||
# Проверяем участия пользователей
|
||||
for user in users[:2]: # Проверяем первых двух
|
||||
participations = await ParticipationService.get_user_participations(
|
||||
session, user.id
|
||||
)
|
||||
print(f"📝 {user.first_name} участвует в {len(participations)} розыгрышах")
|
||||
|
||||
|
||||
async def test_edge_cases():
|
||||
"""Тестирование граничных случаев"""
|
||||
print("\n🧪 Тестирование граничных случаев...")
|
||||
|
||||
async with async_session_maker() as session:
|
||||
# Попытка добавить участника дважды
|
||||
user = await UserService.get_user_by_telegram_id(session, 100000001)
|
||||
lottery = (await LotteryService.get_active_lotteries(session))[0]
|
||||
|
||||
success = await LotteryService.add_participant(session, lottery.id, user.id)
|
||||
print(f"Повторное добавление участника: {'❌ Заблокировано' if not success else '⚠️ Разрешено'}")
|
||||
|
||||
# Попытка установить ручного победителя для несуществующего пользователя
|
||||
success = await LotteryService.set_manual_winner(session, lottery.id, 10, 999999999)
|
||||
print(f"Установка несуществующего победителя: {'❌ Заблокировано' if not success else '⚠️ Разрешено'}")
|
||||
|
||||
# Попытка провести розыгрыш завершенной лотереи
|
||||
results = await LotteryService.conduct_draw(session, lottery.id)
|
||||
print(f"Повторный розыгрыш: {'❌ Заблокирован' if not results else '⚠️ Разрешен'}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("🚀 Запуск примера использования бота для розыгрышей")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
asyncio.run(example_usage())
|
||||
asyncio.run(test_edge_cases())
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
print("✅ Все тесты выполнены успешно!")
|
||||
print("🎉 Бот готов к использованию!")
|
||||
|
||||
except Exception as e:
|
||||
print(f"\n❌ Ошибка во время выполнения: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
Reference in New Issue
Block a user