#!/usr/bin/env python3 """ Комплексное тестирование функционала бота """ import asyncio from sqlalchemy import select, func from database.db import AsyncSessionLocal from database.models import User, Service, Ad, Poll, Event, Schedule from keyboards.inline import get_main_menu from keyboards.admin_menu import get_admin_main_menu async def test_all(): print("=" * 60) print("🧪 КОМПЛЕКСНОЕ ТЕСТИРОВАНИЕ ДОМОВОЙ БОТ") print("=" * 60) # Тест 1: Проверка меню жильца print("\n1️⃣ ТЕСТ: Меню жильца") menu = get_main_menu() buttons_count = sum(len(row) for row in menu.inline_keyboard) print(f" Кнопок в меню: {buttons_count}") print(f" {'✅' if buttons_count <= 12 else '❌'} Ожидаем 9-12 кнопок") # Тест 2: Проверка меню админа print("\n2️⃣ ТЕСТ: Меню админа") admin_menu = get_admin_main_menu() admin_buttons = sum(len(row) for row in admin_menu.inline_keyboard) print(f" Кнопок в меню: {admin_buttons}") print(f" {'✅' if admin_buttons > 10 else '❌'} OK") # Тест 3: Проверка БД print("\n3️⃣ ТЕСТ: База данных") async with AsyncSessionLocal() as session: users_count = (await session.execute(select(func.count(User.user_id)))).scalar() services_count = (await session.execute(select(func.count(Service.service_id)))).scalar() ads_count = (await session.execute(select(func.count(Ad.ad_id)))).scalar() polls_count = (await session.execute(select(func.count(Poll.poll_id)))).scalar() events_count = (await session.execute(select(func.count(Event.id)))).scalar() schedules_count = (await session.execute(select(func.count(Schedule.schedule_id)))).scalar() print(f" 👥 Пользователей: {users_count}") print(f" 📞 Служб: {services_count}") print(f" 📢 Объявлений: {ads_count}") print(f" 📊 Опросов: {polls_count}") print(f" 📅 Событий: {events_count}") print(f" ⏰ Расписаний: {schedules_count}") # Проверка полиции police = (await session.execute(select(Service).where(Service.category == 'police'))).scalars().all() print(f" 👮 Полиция: {len(police)} записей") if len(police) == 0: print(f" ⚠️ Нет записей полиции! Добавьте через веб-админку.") else: for p in police: print(f" • {p.name}: {p.phone}") # Тест 4: Проверка callback_data на дубликаты print("\n4️⃣ ТЕСТ: Уникальность callback_data") import re import glob callbacks = [] for file in glob.glob("handlers/*.py") + glob.glob("keyboards/*.py"): with open(file, 'r', encoding='utf-8') as f: content = f.read() found = re.findall(r"callback_data=['\"]([^'\"]+)['\"]", content) callbacks.extend(found) # Фильтруем шаблонные simple_callbacks = [c for c in callbacks if not c.split('_')[-1].isdigit()] duplicates = list(set([c for c in simple_callbacks if simple_callbacks.count(c) > 1])) if duplicates: print(f" ❌ Дубликаты: {duplicates[:10]}") else: print(f" ✅ Все callback_data уникальны") # Тест 5: Проверка что сообщения в личку print("\n5️⃣ ТЕСТ: Сообщения в личку") with open("handlers/users.py", 'r', encoding='utf-8') as f: content = f.read() if 'ADMIN_CHAT_ID' in content: print(f" ⚠️ Есть ADMIN_CHAT_ID в users.py — проверить!") else: print(f" ✅ Нет ADMIN_CHAT_ID в users.py — все в личку!") print("\n" + "=" * 60) print("✅ ТЕСТИРОВАНИЕ ЗАВЕРШЕНО") print("=" * 60) if __name__ == '__main__': asyncio.run(test_all())