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) карточка содержит <a href=".../issues/<id>/">ORCH-NNN</a>
      с корректным 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 без <a>,
      рендер не падает. Параметризовать по каждому отсутствующему полю.
    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 с '<b>'/'&'/'>' экранируется, <a>-разметка
      остаётся валидной, сообщение не ломается под 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
