diff --git a/docs/work-items/ORCH-048/13-test-report.md b/docs/work-items/ORCH-048/13-test-report.md new file mode 100644 index 0000000..40b9aa9 --- /dev/null +++ b/docs/work-items/ORCH-048/13-test-report.md @@ -0,0 +1,60 @@ +--- +type: test-report +work_item_id: ORCH-048 +result: PASS +--- + +# Test Report — ORCH-048 + +**Title:** staging B6 check reads registry from host worktree, not staging container +**Stage:** testing +**Branch:** feature/ORCH-048-staging-b6-check-reads-registr +**Review verdict:** APPROVED (12-review.md, version 1) + +## Окружение +- Python: 3.12.13 +- pytest: 8.3.3 +- Дата: 2026-06-06T05:28Z +- prod `orchestrator` (8500): `/health` → 200 `{"status":"ok"}` +- staging `orchestrator-staging` (8501): `/health` → 200 `{"status":"ok"}` +- Примечание: `curl` в окружении тестера отсутствует — HTTP-smoke выполнен через `python urllib`/`TestClient`. + +## Результаты (сопоставление с 04-test-plan.yaml) + +| TC ID | Тип | Описание | Результат | +|-------|-----|----------|-----------| +| TC-01 | unit | B6 PASS при чистом реестре `known={SANDBOX}` (`test_tc01_clean_registry_passes`) | PASS | +| TC-02 | unit | B6 FAIL при `known={SANDBOX,PROD_ET}` (`test_tc02_prod_et_pollution_fails`) | PASS | +| TC-03 | unit | B6 FAIL при `known={SANDBOX,PROD_ORCH}` (`test_tc03_prod_orch_pollution_fails`) | PASS | +| TC-04 | unit | B6 FAIL детерминированно при `known=set()` без исключения (`test_tc04_sandbox_absent_fails_deterministically`) | PASS | +| TC-05 | unit | B6 FAIL при `known={SANDBOX,PROD_ET,PROD_ORCH}` (`test_tc05_both_prod_pollution_fails`) | PASS | +| TC-06 | unit | Нет host-path хака `sys.path.insert("/repos/orchestrator")` в источнике B6 (`test_tc06_no_host_path_hack_in_source`) | PASS | +| TC-07 | unit | Деградация источника (network error / non-200 / нет ключа / битый тип) → детерминированный FAIL (`test_tc07_*` ×4 + `test_check_b6_polluted_endpoint_fails`) | PASS | +| TC-08 | unit | Регрессия `src/projects.py` зелёная, файл не изменён (`tests/test_projects.py`, 16 тестов) | PASS | +| TC-09 | integration | Полный `pytest tests/ -q` → exit 0 (476 passed) | PASS | +| TC-10 | integration | Живой staging-прогон B6 против `orchestrator-staging` (8501) | DEFERRED → deployer (deploy-staging) | + +### Доп. проверки +- `GET /projects` в коде ветки (TestClient): HTTP 200, схема `{known_plane_project_ids, projects}`, prod-реестр ET+ORCH — корректно. +- Smoke staging API: `/status` → 200, `/queue` → 200 (breaker closed, preflight_ok). `/health` prod+staging → 200. + +## TC-10 — почему DEFERRED (не FAIL) +`GET /projects` на работающем staging-инстансе (8501) сейчас отдаёт **404**: новый read-only эндпоинт присутствует в коде ветки, но в staging-контейнер ещё не задеплоен (деплой staging — следующая стадия). Это ожидаемо и не является дефектом. По `04-test-plan.yaml` TC-10 явно помечен «Выполняется деплоером на стадии deploy-staging», т.е. вне зоны ответственности тестера. В коде ветки эндпоинт верифицирован через TestClient (200 + корректная схема), что подтверждает готовность к staging-прогону. + +## Покрытие Acceptance Criteria (03-acceptance-criteria.md) +- **AC-1** (B6 читает реестр из staging-окружения по HTTP, без host-path хака) — покрыто TC-01, TC-06; живой прогон → deployer. +- **AC-2** (оба исхода вердикта покрыты юнитами) — покрыто TC-01…TC-05, TC-07. +- **AC-3** (`src/projects.py`, `.env*` не тронуты; прочие чеки целы) — `git diff` подтверждён ревью; TC-08 зелёный. +- **AC-4** (существующие тесты зелёные) — 476 passed, exit 0. +- **AC-5** (документация/ADR в том же PR) — подтверждено на review (APPROVED). + +## Вывод pytest +``` +tests/test_staging_check_b6.py ... 12 passed +tests/test_projects.py ......... 16 passed +========================= 476 passed, 1 warning in 7.99s ========================= +``` +Единственное предупреждение — `PydanticDeprecatedSince20` в `src/config.py` (class-based Config), не связано с ORCH-048, не влияет на результат. + +## Итог +**PASS** — полный регресс (476 passed) зелёный, все unit/integration TC тестера (TC-01…TC-09) PASS, smoke API OK. TC-10 (живой staging-прогон B6) корректно делегирован деплоеру на стадию deploy-staging. Задача переходит на **deploy-staging**.