diff --git a/docs/work-items/ORCH-036/13-test-report.md b/docs/work-items/ORCH-036/13-test-report.md new file mode 100644 index 0000000..d4b5341 --- /dev/null +++ b/docs/work-items/ORCH-036/13-test-report.md @@ -0,0 +1,90 @@ +--- +type: test-report +work_item_id: ORCH-036 +result: PASS +--- + +# Test Report — ORCH-036 + +Исполняемый самодеплой стадии `deploy` (Вариант B) — дёргает хост-хук +`scripts/orchestrator-deploy-hook.sh`, три фазы (A/B/C), условность по self-hosting репо. + +## Окружение +- Python: 3.12.13 +- pytest: 8.3.3 (pluggy 1.6.0, anyio 4.13.0, asyncio 0.23.8 — mode AUTO) +- Worktree: `feature/ORCH-036-orch-36-deploy-b` +- Дата: 2026-06-06 +- Prod (8500) во время тестов НЕ тронут: вся проверка изолированная (моки subprocess/ssh/хука). + Smoke выполнялся read-only GET-запросами. + +## Smoke test API (prod 8500, read-only) +| Endpoint | Результат | +|----------|-----------| +| GET /health | `{"status":"ok","service":"orchestrator"}` — OK | +| GET /status | OK (отдаёт активные задачи) | +| GET /queue | OK (counts/max_concurrency/resilience; breaker=closed, preflight_ok=true) | + +`curl` в окружении отсутствует — smoke выполнен через `urllib.request` (эквивалент GET). + +## Результаты по тест-плану (04-test-plan.yaml) + +| TC ID | Описание | Тест | Результат | +|-------|----------|------|-----------| +| TC-01 | exit 0 → deploy_status: SUCCESS | test_tc01_exit0_maps_to_success | PASS | +| TC-02 | exit 1 (rolled back) → FAILED | test_tc02_exit1_rolled_back_maps_to_failed | PASS | +| TC-03 | exit 2 (rollback тоже упал) → FAILED | test_tc03_exit2_rollback_also_failed_maps_to_failed | PASS | +| TC-04 | DEPLOY_REQUIRE_MANUAL_APPROVE дефолт == true | test_tc04_manual_approve_default_true | PASS | +| TC-05 | true и нет approve → прод-хук НЕ вызван | test_tc05_no_approve_does_not_call_prod_hook | PASS | +| TC-06 | true и approve → прод-хук вызван ровно 1 раз | test_tc06_approved_calls_prod_hook_exactly_once | PASS | +| TC-07 | is_self_hosting_repo: только orchestrator True | test_tc07_is_self_hosting_repo_only_orchestrator | PASS | +| TC-08 | self-репо: рестарт detached host-процессом | test_tc08_self_repo_launches_detached_host_process | PASS | +| TC-09 | не-self репо: прежний ssh-путь | test_tc09_non_self_repo_uses_legacy_path | PASS | +| TC-10 | FAILED → откат deploy→development, blocked, release lease | test_tc10_failed_deploy_rolls_back_to_development | PASS | +| TC-11 | staging_status FAILED → до deploy не доходит | test_tc11_staging_failed_never_reaches_deploy | PASS | +| TC-12 | успех → Plane-коммент + Telegram | test_tc12_success_notifies_plane_and_telegram | PASS | +| TC-13 | откат → Plane-коммент + Telegram | test_tc13_rollback_notifies_plane_and_telegram | PASS | +| TC-14 | build-once: retag staging-образа, без build | test_tc14_deploy_command_retags_staging_image_no_build | PASS | +| TC-15 | _parse_deploy_status контракт цел (проза не проходит) | test_qg_checks::test_tc15_* (5 кейсов) | PASS | +| TC-16 | STAGE_TRANSITIONS deploy/deploy-staging не изменены | test_stages::test_tc16_* | PASS | +| TC-17 | terminal-sync deploy→done сохранён | test_tc17_success_deploy_syncs_terminal_done | PASS | +| TC-18 | merge-gate (ORCH-43) на ребре не затронут | test_merge_gate (14 кейсов) | PASS | +| TC-19 | симуляция битого деплоя: авто-rollback → healthy, exit 1 | test_tc19_unhealthy_deploy_auto_rolls_back_exit1 | PASS | + +Доп. регрессионные тесты (review-fix): `test_clear_state_removes_all_markers_and_is_idempotent`, +`test_tc11_re_deploy_after_rollback_not_wedged` — оба PASS (stale deploy-state очищается, повторный +заход на deploy после отката не зависает). + +## Покрытие критериев приёмки + +| AC | Покрыт тестами | Статус | +|----|----------------|--------| +| AC-1 реальный деплой (не бумажный) | TC-01..03, TC-14, TC-19 | PASS | +| AC-2 self-репо рестарт detached, агент себя не убивает | TC-08 | PASS | +| AC-3 deploy_status из exit-code | TC-01..03 | PASS | +| AC-4 FAILED → откат на development | TC-10 | PASS | +| AC-5 ручной approve реально тормозит прод | TC-05, TC-06 | PASS | +| AC-6 уведомления о промоуте и откате | TC-12, TC-13 | PASS | +| AC-7 build-once (образ из staging) | TC-14 | PASS | +| AC-8 staging-гейт обязателен | TC-11 | PASS | +| AC-9 авто-rollback восстанавливает прод (MTTR<60с) | TC-19 | PASS | +| AC-10 инварианты не сломаны | TC-15..18 + полный регресс | PASS | +| AC-11 условность по репо (не-self не ломается) | TC-07, TC-09 | PASS | +| AC-12 флаг авто НЕ выключен (остаётся true) | TC-04 | PASS | +| AC-13 документация обновлена | проверено reviewer (12-review.md, APPROVED) | PASS | + +## Вывод pytest + +Полный регресс: +``` +======================= 568 passed, 1 warning in 15.25s ======================== +``` +(единственный warning — PydanticDeprecatedSince20 в `src/config.py`, не связан с задачей) + +Целевые модули тест-плана: +``` +======================== 46 passed, 1 warning in 2.17s ========================= +``` + +## Итог +**PASS** — все 19 TC зелёные, все критерии приёмки AC-1…AC-13 покрыты, полный регресс +568/568 passed, smoke API OK, прод (8500) не тронут. Задача готова к стадии deploy-staging.