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