import bot def _state(uid): return bot.db.get_user_data(uid)["state"] def test_full_lead_flow(app): u = 70001 assert (app.handle_message(u, "Заполнить заявку 📝"), _state(u))[1] == "FORM_NAME" app.handle_message(u, "Иван"); assert _state(u) == "FORM_PHONE" app.handle_message(u, "89990001122"); assert _state(u) == "FORM_QUESTION" app.handle_message(u, "кс"); assert _state(u) == "FORM_CALLDATE" app.handle_message(u, "Завтра"); assert _state(u) == "FORM_CALLTIME" app.handle_message(u, "14:00"); assert _state(u) == "FORM_REVIEW" app.handle_message(u, "Да, всё верно! ✅"); assert _state(u) == "FORM_CONSENT_1" app.handle_message(u, "Согласен(а) и подтверждаю ✅"); assert _state(u) == "FORM_CONSENT_2" app.handle_message(u, "Без рассылки ➡️"); assert _state(u) == "FREE_CHAT" stats = bot.db.get_lead_stats() assert stats["total"] == 1 and stats["from_bot"] == 1 def test_career_player_flow(app): u = 70003 app.handle_message(u, "Карьера в ИКП 💼"); assert _state(u) == "VAC_CHOOSE" app.handle_message(u, "Игроком в состав 🎮"); assert _state(u) == "VAC_P_DISCIPLINE" app.handle_message(u, "Counter-Strike 2 🔫"); assert _state(u) == "VAC_P_RANK" def test_flood_does_not_crash(app): u = 70002 for _ in range(25): app.handle_message(u, "спам") # бот не падает; пользователь остаётся в FREE_CHAT (флуд/бан только игнорят) assert _state(u) == "FREE_CHAT" def test_admin_panel_visible_to_super(app): admin = bot.config.SUPER_ADMIN_IDS[0] app._sent.clear() app.handle_message(admin, "Админка ⚙️") assert any("Статистика" in (s["kb"] or "") for s in app._sent) def test_non_admin_cannot_open_panel(app): app._sent.clear() app.handle_message(424242, "Админка ⚙️") assert not any("Админ-панель" in s["msg"] for s in app._sent)