diff --git a/docs/work-items/ORCH-017/13-test-report.md b/docs/work-items/ORCH-017/13-test-report.md new file mode 100644 index 0000000..913eb50 --- /dev/null +++ b/docs/work-items/ORCH-017/13-test-report.md @@ -0,0 +1,91 @@ +--- +type: test-report +work_item_id: ORCH-017 +result: PASS +--- + +# Test Report — ORCH-017 + +Прямые ссылки на BRD и Plane-таску в Telegram-уведомлении об апруве BRD. +Вердикт review (`12-review.md`): **APPROVED** ✔ — прогон регресса допущен. + +## Окружение +- Python: 3.12.13 +- pytest: 8.3.3 (pytest-asyncio 0.23.8, anyio 4.13.0) +- Дата: 2026-06-05 +- Ветка: `feature/ORCH-017-brd-plane-telegram` +- Прод-контейнер `orchestrator` (8500) НЕ перезапускался; smoke — только read-only GET. + +## Smoke test API (prod, read-only) +| Endpoint | HTTP | Результат | +|----------|------|-----------| +| `GET /health` | 200 | `{"status":"ok","service":"orchestrator"}` — PASS | +| `GET /status` | 200 | active_tasks содержит task #35 ORCH-017 (stage=testing) — PASS | +| `GET /queue` | 200 | counts running=1, failed=0, breaker=closed, preflight ok — PASS | + +> `curl` в окружении отсутствует — smoke выполнен через `urllib.request` (GET, без побочных эффектов). + +## Результаты по test-plan (04-test-plan.yaml) + +| TC ID | Описание | Тест | Результат | +|-------|----------|------|-----------| +| TC-01 | BRD-ссылка на `01-brd.md` (Gitea branch-view) | `test_notify_approve_links::test_tc01_brd_link_present` | PASS | +| TC-02 | Plane-ссылка (web-URL+workspace+project+issue_id) | `…::test_tc02_plane_link_present` | PASS | +| TC-03 | Фоллбэки URL (gitea_public_url→gitea_url, plane_web_url→plane_api_url) | `…::test_tc03_url_fallbacks` | PASS | +| TC-04 | Сохранён призыв «Approved» | `…::test_tc04_keeps_approved_call_to_action` | PASS | +| TC-05 | Ровно одно пингующее сообщение (не silent) | `…::test_tc05_single_notifying_message` | PASS | +| TC-06 | Graceful: branch/issue=None — без исключения | `…::test_tc06_graceful_missing_branch_and_issue` | PASS | +| TC-07 | Пустой Plane-base → Plane-ссылка опущена, BRD остаётся | `…::test_tc07_plane_base_empty_drops_plane_link_keeps_brd` | PASS | +| TC-07b | Loopback Plane-base отбрасывается (доп.) | `…::test_tc07b_loopback_plane_base_dropped` | PASS | +| TC-08 | parse_mode=HTML, html.escape, валидная разметка | `…::test_tc08_html_escaped_and_valid_markup` | PASS | +| TC-08b | send_telegram сохраняет parse_mode=HTML (доп.) | `…::test_tc08b_send_telegram_keeps_parse_mode_html` | PASS | +| TC-09 | Регрессия трекера (silent edit, без дублей) | `test_telegram_tracker.py` (полный набор) | PASS | +| TC-10 | Поток analysis-approved строит ссылки из БД | `test_analysis_approve_flow_links::test_tc10_approved_flow_builds_links_from_db` | PASS | +| TC-11 | (Условный) inline-кнопки | — | N/A — вариант кнопок отклонён (ADR-001 Р-1) | +| TC-12 | (Условный) обратная совместимость send_telegram c reply_markup | — | N/A — вариант кнопок отклонён (ADR-001 Р-1) | + +Все запланированные тесты (TC-01…TC-10) — PASS. Условные TC-11/TC-12 не применимы: +ADR-001 (Р-1) зафиксировал HTML-ссылки в тексте без изменения сигнатуры `send_telegram`. + +## Покрытие критериев приёмки (03-acceptance-criteria.md) +| AC | Покрывающие TC | Статус | +|----|----------------|--------| +| AC-1 | TC-01, TC-10 | PASS | +| AC-2 | TC-02, TC-10 | PASS | +| AC-3 | TC-01, TC-02, TC-03 | PASS | +| AC-4 | TC-04 | PASS | +| AC-5 | TC-05, TC-09 | PASS | +| AC-6 | TC-06, TC-07, TC-07b | PASS | +| AC-7 | TC-08, TC-08b | PASS | +| AC-8 | TC-09, TC-10 | PASS | +| AC-9 | проверено review (CHANGELOG/.env.example/INFRA.md/ADR) | PASS | +| AC-10 | полный регресс `pytest tests/` | PASS | + +## Вывод pytest + +### Целевые тесты ORCH-017 +``` +tests/test_notify_approve_links.py::test_tc01_brd_link_present PASSED +tests/test_notify_approve_links.py::test_tc02_plane_link_present PASSED +tests/test_notify_approve_links.py::test_tc03_url_fallbacks PASSED +tests/test_notify_approve_links.py::test_tc04_keeps_approved_call_to_action PASSED +tests/test_notify_approve_links.py::test_tc05_single_notifying_message PASSED +tests/test_notify_approve_links.py::test_tc06_graceful_missing_branch_and_issue PASSED +tests/test_notify_approve_links.py::test_tc07_plane_base_empty_drops_plane_link_keeps_brd PASSED +tests/test_notify_approve_links.py::test_tc07b_loopback_plane_base_dropped PASSED +tests/test_notify_approve_links.py::test_tc08_html_escaped_and_valid_markup PASSED +tests/test_notify_approve_links.py::test_tc08b_send_telegram_keeps_parse_mode_html PASSED +tests/test_analysis_approve_flow_links.py::test_tc10_approved_flow_builds_links_from_db PASSED +11 passed in 0.53s +``` + +### Полный регресс +``` +======================== 434 passed, 1 warning in 7.99s ======================== +``` +Единственное предупреждение — PydanticDeprecatedSince20 (`src/config.py:4`, class-based config), +предсуществующее, к ORCH-017 не относится, на результат не влияет. + +## Итог +**PASS** — 434/434 теста зелёные, целевые TC-01…TC-10 пройдены, все 10 критериев приёмки +покрыты, smoke API прод-инстанса OK. Задача готова к стадии **deploy-staging**.