diff --git a/docs/work-items/ORCH-069/13-test-report.md b/docs/work-items/ORCH-069/13-test-report.md index 9919513..f440e91 100644 --- a/docs/work-items/ORCH-069/13-test-report.md +++ b/docs/work-items/ORCH-069/13-test-report.md @@ -6,75 +6,93 @@ result: PASS # Test Report — ORCH-069 -QG-0 title-лимит → конфигурируемый параметр `ORCH_QG0_TITLE_MAX` (дефолт 200). +QG-0 title-лимит → параметр `ORCH_QG0_TITLE_MAX` (дефолт 200) ## Окружение - Python: 3.12.13 -- pytest: 8.3.3 +- pytest: 8.3.3 (plugins: anyio-4.13.0, asyncio-0.23.8; asyncio mode=auto) - Ветка: `feature/ORCH-069-qg-0-title-orch-qg0-title-max-` +- Worktree: `/repos/_wt/orchestrator/feature_ORCH-069-qg-0-title-orch-qg0-title-max-` +- Prod-health (8500): `{"status":"ok","service":"orchestrator"}` — не трогался (self-hosting safety) - Дата: 2026-06-08 -## Smoke test API (prod, read-only) -| Endpoint | Результат | -|----------|-----------| -| `GET /health` | PASS — `{"status":"ok","service":"orchestrator"}` | -| `GET /status` | PASS — отдаёт активные задачи (ORCH-069 виден, stage=testing) | -| `GET /queue` | PASS — counts/resilience/reconcile/reaper/post_deploy в норме (breaker closed, preflight_ok) | +## Предусловия +- Review-вердикт `12-review.md`: **APPROVED** (version 3) ✓ +- Изменения изолированы: `src/config.py`, `src/webhooks/plane.py` (+ тесты, + документация) -## Результаты (по test-plan 04-test-plan.yaml) +## Результаты по тест-плану (04-test-plan.yaml) | TC ID | Описание | Покрывает | Результат | |-------|----------|-----------|-----------| -| TC-01 | Дефолт 200: заголовок 200 символов → нет ошибки длины (граница PASS) | AC-1 | PASS | -| TC-02 | Дефолт 200: заголовок 201 → ошибка длины, текст упоминает «200» | AC-1 | PASS | -| TC-03 | Лимит 120: заголовок 120 → нет ошибки длины | AC-2 | PASS | -| TC-04 | Лимит 120: заголовок 121 → ошибка длины, текст «120» (не «80») | AC-2 | PASS | -| TC-05 | Graceful: `ORCH_QG0_TITLE_MAX=abc` → Settings() не падает, лимит 200 | AC-3 | PASS | -| TC-06 | Graceful: пустая строка env → дефолт 200 без исключения | AC-3 | PASS | -| TC-07 | Корректное env `150` → применяется значение 150 (sanity) | AC-2, AC-3 | PASS | -| TC-08 | Нижний лимит title не сломан: < 5 символов → «Title слишком короткий» | AC-4 | PASS | -| TC-09 | Лимит description не сломан: < 20 символов → «Description слишком короткий» | AC-4 | PASS | -| TC-10 | Обратная совместимость: заголовок 81–200 проходит при дефолте | AC-7 | PASS | -| TC-11 | Полный набор тестов зелёный (регрессия не внесена) | AC-5 | PASS | +| TC-01 | Дефолт 200: title=200 → нет ошибки длины (граница PASS) | AC-1 | PASS | +| TC-02 | Дефолт 200: title=201 → ошибка длины, текст упоминает «200» | AC-1 | PASS | +| TC-03 | Лимит 120: title=120 → нет ошибки длины | AC-2 | PASS | +| TC-04 | Лимит 120: title=121 → ошибка, текст «120» (не «80») | AC-2 | PASS | +| TC-05 | Graceful: env `abc` → дефолт 200, без краха `Settings()` | AC-3 | PASS | +| TC-06 | Graceful: пустой env `""` → дефолт 200, без исключения | AC-3 | PASS | +| TC-07 | Валидный env `150` → применяется 150 (позитивный путь) | AC-2, AC-3 | PASS | +| TC-08 | Нижний лимит title < 5 не сломан | AC-4 | PASS | +| TC-09 | Лимит description < 20 не сломан | AC-4 | PASS | +| TC-10 | Обратная совместимость: title 81–200 проходит при дефолте | AC-7 | PASS | +| TC-11 | Полный набор тестов зелёный (нет регрессии) | AC-5 | PASS | ## Сопоставление с критериями приёмки (03-acceptance-criteria.md) -- AC-1 (дефолт 200, граница 201, текст «200») — TC-01/TC-02 — PASS -- AC-2 (лимит 120, граница 121, текст «120») — TC-03/TC-04/TC-07 — PASS -- AC-3 (graceful пустое/нечисловое → 200 без краха) — TC-05/TC-06/TC-07 — PASS -- AC-4 (нижние лимиты title<5 / desc<20) — TC-08/TC-09 — PASS -- AC-5 (pytest зелёный) — TC-11 (757 passed) — PASS -- AC-6 (документация в том же PR) — подтверждено reviewer (`12-review.md` APPROVED) — PASS -- AC-7 (обратная совместимость ≤80) — TC-10 — PASS -- AC-8 (изоляция изменений: STAGE_TRANSITIONS/QG_CHECKS/БД/slug не тронуты) — подтверждено reviewer — PASS -## Вывод pytest +| AC | Критерий | Статус | +|----|----------|--------| +| AC-1 | Дефолт 200, граница на 201, текст упоминает 200 | PASS (TC-01/02) | +| AC-2 | Настраиваемый лимит 120, граница 121, текст 120 | PASS (TC-03/04/07) | +| AC-3 | Graceful при пустом/нечисловом значении → 200 | PASS (TC-05/06) | +| AC-4 | Нижние лимиты title<5 / description<20 не сломаны | PASS (TC-08/09) | +| AC-5 | Юнит-тесты зелёные (весь набор) | PASS (863 passed) | +| AC-6 | Документация в том же PR (.env.example, .env.staging.example, CHANGELOG, README) | PASS (подтверждено review) | +| AC-7 | Обратная совместимость (≤80 проходит при 200) | PASS (TC-10) | +| AC-8 | Изоляция: slug `[:30]`, БД, STAGE_TRANSITIONS/QG_CHECKS, handle_* не тронуты | PASS (diff = 2 файла src/) | -Целевой набор ORCH-069 (`tests/test_qg0_title_limit.py`): +## Smoke test API (prod 8500, read-only) +- `GET /health` → `{"status":"ok","service":"orchestrator"}` — OK +- `GET /status` → отдаёт активные задачи (ORCH-069 в стадии `testing`) — OK +- `GET /queue` → `counts: queued=0 running=1 done=459 failed=4 cancelled=1`; breaker `closed`, preflight ok — OK + +## Целевой прогон ORCH-069 (tests/test_qg0_title_limit.py) ``` collected 10 items -tests/test_qg0_title_limit.py::test_tc01_default_limit_200_boundary_pass PASSED [ 10%] -tests/test_qg0_title_limit.py::test_tc02_default_limit_200_boundary_fail PASSED [ 20%] -tests/test_qg0_title_limit.py::test_tc03_custom_limit_120_boundary_pass PASSED [ 30%] -tests/test_qg0_title_limit.py::test_tc04_custom_limit_120_boundary_fail PASSED [ 40%] -tests/test_qg0_title_limit.py::test_tc05_graceful_non_numeric_env PASSED [ 50%] -tests/test_qg0_title_limit.py::test_tc06_graceful_empty_env PASSED [ 60%] -tests/test_qg0_title_limit.py::test_tc07_valid_numeric_env PASSED [ 70%] -tests/test_qg0_title_limit.py::test_tc08_short_title_still_errors PASSED [ 80%] -tests/test_qg0_title_limit.py::test_tc09_short_description_still_errors PASSED [ 90%] -tests/test_qg0_title_limit.py::test_tc10_backward_compat_titles_81_to_200 PASSED [100%] +tests/test_qg0_title_limit.py::test_tc01_default_limit_200_boundary_pass PASSED +tests/test_qg0_title_limit.py::test_tc02_default_limit_200_boundary_fail PASSED +tests/test_qg0_title_limit.py::test_tc03_custom_limit_120_boundary_pass PASSED +tests/test_qg0_title_limit.py::test_tc04_custom_limit_120_boundary_fail PASSED +tests/test_qg0_title_limit.py::test_tc05_graceful_non_numeric_env PASSED +tests/test_qg0_title_limit.py::test_tc06_graceful_empty_env PASSED +tests/test_qg0_title_limit.py::test_tc07_valid_numeric_env PASSED +tests/test_qg0_title_limit.py::test_tc08_short_title_still_errors PASSED +tests/test_qg0_title_limit.py::test_tc09_short_description_still_errors PASSED +tests/test_qg0_title_limit.py::test_tc10_backward_compat_titles_81_to_200 PASSED -======================== 10 passed, 1 warning in 0.32s ========================= +======================== 10 passed, 1 warning in 0.31s ========================= ``` -Полный регресс (`pytest tests/ -q`): +## Полный прогон (pytest tests/ -q) ``` -757 passed, 1 warning in 15.37s +........................................................................ [ 8%] +........................................................................ [ 16%] +........................................................................ [ 25%] +........................................................................ [ 33%] +........................................................................ [ 41%] +........................................................................ [ 50%] +........................................................................ [ 58%] +........................................................................ [ 66%] +........................................................................ [ 75%] +........................................................................ [ 83%] +........................................................................ [ 91%] +....................................................................... [100%] +863 passed, 1 warning in 21.49s ``` -(Единственный warning — PydanticDeprecatedSince20 о class-based config в `src/config.py`, -предсуществующий, не связан с ORCH-069, на результат не влияет.) +(Единственный warning — PydanticDeprecatedSince20 в `src/config.py:5`, существующий +class-based config; к ORCH-069 не относится, не является ошибкой.) ## Итог -**PASS** — все 11 тест-кейсов зелёные (757 passed в полном наборе), smoke API в норме, -все критерии приёмки AC-1…AC-8 покрыты. Задача готова к стадии deploy-staging. +**PASS** — все 11 TC из тест-плана пройдены, все 8 критериев приёмки выполнены, +полный регресс зелёный (863 passed), smoke-тесты API OK. Регрессии не внесены. +Задача готова к переходу на стадию `deploy-staging`.