Воронка БАЗА: приведение к ТЗ (метки, сохранённые данные, тексты, шаги)
Закрыты расхождения с ТЗ: - Метки (§12) переименованы под спецификацию: role_player, game_dota2, format_help, interest_trial, interest_summer_intensive, manager_requested, source_main_menu, source_keyword_summer; убраны служебные age_*/level_* метки. - Сохранённые данные (§13): кодовое слово, дата запуска бота (started_at), дата передачи менеджеру (manager_at), интересы (пробное/интенсив). Карточка менеджеру дополнена этими полями, заголовок «Новый запрос из бота». - «Пока не знаю, нужен совет» (§7): показ собранных данных + свободный текст → менеджеру. - «Задать вопрос» (§9): промпт «напишите одним сообщением» → BAZA_QUESTION → передача. - Летний интенсив: свой набор уровней (§10.3), экран младше-12 (Передать менеджеру/ Другие тренировки), двухшаговая оплата (Оплатить интенсив → ссылка) (§10.4), различение запуска по кодовому слову vs меню. - Индивидуальная ветка без «пробного» (§6). Fallback-текст дословно по §15. - «Выбрать абонемент» ведёт на страницу тарифов ссылкой (§8). Тексты веток — по ТЗ. Тесты воронки обновлены и дополнены (интенсив-оплата, младше-12 интенсив, свободный вопрос, «нужен совет»). pytest 30 passed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+36
-6
@@ -20,8 +20,9 @@ def test_baza_group_funnel_to_payment(app):
|
||||
app.handle_message(u, "Групповые тренировки"); assert _state(u) == "BAZA_GROUP"
|
||||
app.handle_message(u, "Купить 4 тренировки"); assert _state(u) == "BAZA_PAY"
|
||||
p = _prof(u)
|
||||
assert p["role"].startswith("Для подростка") and p["game"] == "CS2"
|
||||
assert p["role"].startswith("Родитель") and p["game"] == "CS2"
|
||||
assert p["format"] == "Групповые тренировки" and "4" in p["tariff"]
|
||||
assert p.get("started_at") # дата запуска сохранена (§13)
|
||||
assert {"role_parent", "game_cs2", "format_group", "clicked_payment", "lead_hot"} <= set(p["metki"])
|
||||
|
||||
|
||||
@@ -47,7 +48,8 @@ def test_baza_under12_goes_to_manager(app):
|
||||
app.handle_message(u, "Младше 12 лет"); assert _state(u) == "BAZA_YOUNG"
|
||||
app.handle_message(u, "Обсудить с менеджером 💬")
|
||||
assert _state(u) == "OPERATOR_CHAT"
|
||||
assert "age_under12" in _prof(u)["metki"]
|
||||
assert _prof(u)["age"] == "Младше 12 лет"
|
||||
assert "manager_requested" in _prof(u)["metki"]
|
||||
|
||||
|
||||
def test_baza_other_game_goes_to_manager(app):
|
||||
@@ -66,14 +68,42 @@ def test_baza_intensive_by_keyword(app):
|
||||
app.handle_message(u, "лето"); assert _state(u) == "BAZA_INT_INFO"
|
||||
app.handle_message(u, "Хочу участвовать 🔥"); assert _state(u) == "BAZA_INT_AGE"
|
||||
app.handle_message(u, "14–15 лет"); assert _state(u) == "BAZA_INT_LEVEL"
|
||||
app.handle_message(u, "Играет в команде или турнирах"); assert _state(u) == "BAZA_PAY"
|
||||
assert "intensive_interest" in _prof(u)["metki"]
|
||||
app.handle_message(u, "Играю регулярно"); assert _state(u) == "BAZA_INT_PAY_INTRO"
|
||||
app.handle_message(u, "Оплатить интенсив 💳"); assert _state(u) == "BAZA_PAY"
|
||||
p = _prof(u)
|
||||
assert p["keyword"] == "лето" and p.get("interest_summer")
|
||||
assert {"source_keyword_summer", "interest_summer_intensive", "clicked_payment"} <= set(p["metki"])
|
||||
|
||||
|
||||
def test_baza_under12_intensive_to_manager(app):
|
||||
u = 70017
|
||||
app.handle_message(u, "Летний интенсив CS2 🔥")
|
||||
app.handle_message(u, "Хочу участвовать 🔥")
|
||||
app.handle_message(u, "Младше 12 лет"); assert _state(u) == "BAZA_INT_YOUNG"
|
||||
app.handle_message(u, "Передать менеджеру 💬"); assert _state(u) == "OPERATOR_CHAT"
|
||||
|
||||
|
||||
def test_baza_question_button_handoff(app):
|
||||
"""«Задать вопрос» (§9): сначала промпт, затем сообщение → менеджеру."""
|
||||
u = 70015
|
||||
app.handle_message(u, "Задать вопрос 💬"); assert _state(u) == "OPERATOR_CHAT"
|
||||
assert "lead_manager" in _prof(u)["metki"]
|
||||
app.handle_message(u, "Задать вопрос 💬"); assert _state(u) == "BAZA_QUESTION"
|
||||
app.handle_message(u, "Когда занятия?"); assert _state(u) == "OPERATOR_CHAT"
|
||||
assert _prof(u)["message"] == "Когда занятия?"
|
||||
assert "manager_requested" in _prof(u)["metki"]
|
||||
|
||||
|
||||
def test_baza_help_free_text_to_manager(app):
|
||||
"""§7: «Пока не знаю» → свободный текст → менеджеру, format_help."""
|
||||
u = 70018
|
||||
app.handle_message(u, "Подобрать тренировку 🎯")
|
||||
app.handle_message(u, "Для себя")
|
||||
app.handle_message(u, "14–15 лет")
|
||||
app.handle_message(u, "CS2")
|
||||
app.handle_message(u, "Только начинает")
|
||||
app.handle_message(u, "Пока не знаю, нужен совет"); assert _state(u) == "BAZA_HELP"
|
||||
app.handle_message(u, "важно расписание"); assert _state(u) == "OPERATOR_CHAT"
|
||||
assert _prof(u)["message"] == "важно расписание"
|
||||
assert "format_help" in _prof(u)["metki"]
|
||||
|
||||
|
||||
def test_baza_prices_and_menu(app):
|
||||
|
||||
Reference in New Issue
Block a user