work_item: ORCH-067 description: > План тестов для ORCH-067 (Telegram tracker: bump по умолчанию, статус-строка карточки по модели Plane ORCH-066, кликабельный номер задачи в карточке и во всех уведомлениях орка). Сеть изолируется: send_telegram/edit_telegram/ delete_telegram подменяются рекордерами (как в tests/conftest.py и tests/test_notify_approve_links.py); БД — временный SQLite, сидируемый фикстурой. tests: # --- Группа A: bump по умолчанию (AC-1..AC-4) --- - id: TC-01 type: unit description: "Дефолт Settings().tracker_mode == 'bump' без env ORCH_TRACKER_MODE" module: tests/test_tracker_bump_default.py asserts: "AC-1" expected: PASS - id: TC-02 type: unit description: > bump-поведение: при повторном update_task_tracker с сохранённым tracker_message_id вызывается delete_telegram(old) -> send_telegram(..., disable_notification=True) -> set_tracker_message_id(new). Одна карточка. module: tests/test_tracker_bump_default.py asserts: "AC-2" expected: PASS - id: TC-03 type: unit description: > bump fail-safe: send_telegram вернул None (нет креды/транзиент) -> tracker_message_id не обнуляется, дубликат в вызове не создаётся. module: tests/test_tracker_bump_default.py asserts: "AC-3" expected: PASS - id: TC-04 type: unit description: "ORCH_TRACKER_MODE=edit -> прежнее edit-поведение (editMessageText)" module: tests/test_tracker_bump_default.py asserts: "AC-4" expected: PASS # --- Группа B: статус-строка карточки (AC-5..AC-9) --- - id: TC-05 type: unit description: "render_task_tracker содержит явную строку текущего Plane-статуса" module: tests/test_tracker_status_line.py asserts: "AC-5" expected: PASS - id: TC-06 type: unit description: > Маппинг stage -> Plane-статус по таблице ТЗ §2.2: created->To Analyse, analysis->Analysis, architecture->Architecture, development->Development, review->Code-Review, testing->Testing, deploy->Awaiting Deploy, done->Done (параметризованный тест по всем stage). module: tests/test_tracker_status_line.py asserts: "AC-6" expected: PASS - id: TC-07 type: unit description: > analysis + brd_review_started_at задан + brd_review_ended_at пуст -> статус '⏸️ In Review' (ожидание согласования BRD); строка 'Подтверждение BRD' с ⏸️/⏳ сохранена; без сетевых вызовов. module: tests/test_tracker_status_line.py asserts: "AC-7" expected: PASS - id: TC-08 type: unit description: > Awaiting Deploy ('ожидание Confirm Deploy') и Needs Input ('нужны уточнения') корректно отражаются в статус-строке. module: tests/test_tracker_status_line.py asserts: "AC-8" expected: PASS - id: TC-09 type: unit description: > render_task_tracker не падает при битых/недоступных данных статуса (деградация на stage-маппинг/fallback, исключение не наружу). module: tests/test_tracker_status_line.py asserts: "AC-9, AC-16" expected: PASS # --- Группа C: кликабельный номер в карточке (AC-10..AC-11) --- - id: TC-10 type: unit description: > При полных данных (plane_web_url не loopback, workspace, project_id по repo, plane_issue_id) карточка содержит ORCH-NNN с корректным URL. module: tests/test_tracker_issue_link.py asserts: "AC-10" expected: PASS - id: TC-11 type: unit description: > Fail-safe ссылки в карточке: при отсутствии любого из (web_base/не-loopback, workspace, project_id, plane_issue_id) номер выводится html.escape без , рендер не падает. Параметризовать по каждому отсутствующему полю. module: tests/test_tracker_issue_link.py asserts: "AC-11" expected: PASS # --- Группа D: единый хелпер и уведомления (AC-12..AC-14) --- - id: TC-12 type: unit description: > plane_issue_link(...) возвращает HTML-ссылку при достаточных данных и html.escape(work_item_id) при недостаточных; никогда не бросает (в т.ч. на None-аргументах и loopback-базе). module: tests/test_plane_issue_link.py asserts: "AC-12" expected: PASS - id: TC-13 type: unit description: > notify_approve_requested: номер задачи кликабелен (ведёт на страницу Plane), сохранён call-to-action 'Approved', ровно одно notifying-сообщение. module: tests/test_notify_issue_links.py asserts: "AC-13" expected: PASS - id: TC-14 type: unit description: > notify_error: номер задачи кликабелен при наличии данных, деградирует на сырой номер без падения при их отсутствии. module: tests/test_notify_issue_links.py asserts: "AC-13, AC-12" expected: PASS - id: TC-15 type: integration description: > Точки send_telegram в stage_engine/launcher/merge_gate/job_reaper/ security_gate/reconciler/main, где есть work_item_id, используют plane_issue_link (или эквивалент) — номер кликабелен. Проверка рекордером send_telegram на представительных alert-путях (deploy fail, agent fail, QG fail, прод-деплой). module: tests/test_notify_issue_links.py asserts: "AC-13" expected: PASS - id: TC-16 type: unit description: > HTML-экранирование: title с ''/'&'/'>' экранируется, -разметка остаётся валидной, сообщение не ломается под parse_mode=HTML (карточка и уведомления). module: tests/test_tracker_issue_link.py asserts: "AC-14" expected: PASS # --- Группа E: нерегресс (AC-15..AC-18) --- - id: TC-17 type: integration description: > Инварианты: карточка отправляется с disable_notification=True; одна карточка на задачу; транспорт send/edit/delete не изменён по семантике. module: tests/test_tracker_bump_default.py asserts: "AC-15" expected: PASS - id: TC-18 type: integration description: > Нерегресс существующих тестов нотификаций (test_notify_approve_links.py, test_notify_done_regression.py) и корректная деградация карточки для enduro-trails без новых Plane-статусов. module: tests/test_notify_done_regression.py asserts: "AC-16, AC-17" expected: PASS