7ebcb851e7
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
108 lines
4.1 KiB
Python
108 lines
4.1 KiB
Python
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)
|
||
|
||
|
||
def _admin():
|
||
return bot.config.SUPER_ADMIN_IDS[0]
|
||
|
||
|
||
def test_admin_services_crud(app):
|
||
a = _admin()
|
||
app.handle_message(a, "Управление услугами ⚙️")
|
||
app.handle_message(a, "➕ Добавить услугу")
|
||
app.handle_message(a, "Тест-у | 1 ₽ | описание")
|
||
nid = [k for k, v in bot.db.get_services().items() if v["name"] == "Тест-у"]
|
||
assert nid
|
||
n = nid[0]
|
||
app.handle_message(a, "✏️ Изменить услугу"); app.handle_message(a, f"{n}. Тест-у")
|
||
app.handle_message(a, "цена | 999 ₽")
|
||
assert bot.db.get_services()[n]["price"] == "999 ₽"
|
||
app.handle_message(a, "🗑 Удалить услугу"); app.handle_message(a, f"{n}. Тест-у")
|
||
assert n not in bot.db.get_services()
|
||
|
||
|
||
def test_admin_faq_crud(app):
|
||
a = _admin()
|
||
app.handle_message(a, "Быстрые ответы 💬")
|
||
app.handle_message(a, "➕ Добавить ответ")
|
||
app.handle_message(a, "вопрос | ответ")
|
||
assert any(kw == "вопрос" for _, kw, _ in bot.db.get_custom_faq())
|
||
|
||
|
||
def test_admin_vacancy_crud(app):
|
||
a = _admin()
|
||
app.handle_message(a, "Вакансии 💼")
|
||
app.handle_message(a, "➕ Вакансия игрок")
|
||
app.handle_message(a, "Valorant 🎯")
|
||
assert any(l == "Valorant 🎯" for _, l in bot.db.get_vacancy_options("player"))
|
||
|
||
|
||
def test_admin_add_remove_admin(app):
|
||
a = _admin()
|
||
app.handle_message(a, "Администраторы 👑")
|
||
app.handle_message(a, "➕ Добавить админа")
|
||
app.handle_message(a, "888001")
|
||
assert 888001 in bot.db.get_admins()
|
||
assert app._is_admin(888001)
|
||
|
||
|
||
def test_broadcast_preview_and_cancel(app):
|
||
a = _admin()
|
||
app.handle_message(a, "рассылка Привет, акция!")
|
||
assert a in app._pending_broadcasts
|
||
app.handle_message(a, "Отмена ❌")
|
||
assert a not in app._pending_broadcasts
|
||
|
||
|
||
def test_stats_runs(app):
|
||
a = _admin()
|
||
app._sent.clear()
|
||
app.handle_message(a, "Статистика 📊")
|
||
assert any("Статистика" in s["msg"] for s in app._sent)
|