From 6d8d48cb3b2c5bde22c29446ea18ff9bc5c05129 Mon Sep 17 00:00:00 2001 From: Stream Date: Fri, 5 Jun 2026 17:00:02 +0300 Subject: [PATCH] auto-sync: 2026-06-05 17:00:01 --- .../dev-2026-06-05-orch39-webhook-tests.md | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 tasks/orchestrator/reports/dev-2026-06-05-orch39-webhook-tests.md diff --git a/tasks/orchestrator/reports/dev-2026-06-05-orch39-webhook-tests.md b/tasks/orchestrator/reports/dev-2026-06-05-orch39-webhook-tests.md new file mode 100644 index 0000000..4a0aa31 --- /dev/null +++ b/tasks/orchestrator/reports/dev-2026-06-05-orch39-webhook-tests.md @@ -0,0 +1,90 @@ +# Dev Report: ORCH-39 — Fix lagging webhook tests + close CI hole +Дата: 2026-06-05 +Статус: DONE + +## Задача +Починить 4 webhook-теста, отставших после ORCH-10 (per-project резолвинг +состояний Plane), и закрыть дыру CI. Чинить ТОЛЬКО `tests/` + `.gitea/workflows/ci.yml` +(+ инфра deps), `src/` не трогать. PR в `main`, НЕ мержить. + +Репо: Gitea `admin/orchestrator`, сервер `slin@82.22.50.71`. +Ветка: `fix/ORCH-39-webhook-tests` от `main` (053ea3b). + +## Корень проблемы +После ORCH-10 `src/webhooks/plane.py::handle_issue_updated` резолвит ожидаемый +in_progress UUID через `get_project_states(project_id)` (импорт локальный из +`..plane_sync`). Тесты хардкодили **ET**-UUID `b873d9eb` в payload `state.id` +даже для запросов по **ORCH**-проекту → UUID не совпадал с +`get_project_states(ORCH)["in_progress"] = e331bfb3` → pipeline не стартовал → +`assert task is not None` падал. + +Падали: +- `test_m6_sequence.py::test_created_uses_plane_sequence_id` +- `test_m6_sequence.py::test_created_falls_back_to_db_when_plane_down` +- `test_plane_webhook.py::test_orchestrator_project_routes_to_orchestrator_repo` +- `test_plane_webhook.py::test_prefixes_independent_per_project` + +## Дыра CI (найдена при аудите) +`requirements.txt` НЕ содержал `pytest-asyncio` → 6 тестов +`@pytest.mark.asyncio` в `test_orch10_states.py` **молча SKIP-ались** +(`async def function and no async plugin installed`). CI был зелёный, хотя +async-пути ORCH-10 webhook вообще не выполнялись. Это и есть "CI green while +broken": сломанный async-handler прошёл бы CI. + +## Сделано +- [x] Замокал `get_project_states` (patch `src.plane_sync.get_project_states`, + т.к. plane.py импортит её локально из `..plane_sync`) детерминированной + per-project картой ET/ORCH (без сети) в обоих тест-файлах. +- [x] Сброс `_STATES_CACHE` через `plane_sync.reload_project_states()` в + autouse-фикстуре (setup и teardown) — нет протечки между файлами. +- [x] Каждый `_post`/`_post_created` теперь шлёт `state.id` = in_progress UUID, + соответствующий своему проекту (derive из той же карты). +- [x] Добавил `pytest-asyncio==0.23.8` в `requirements.txt`. +- [x] Создал `pytest.ini`: `asyncio_mode = auto` (async-тесты реально гоняются), + `markers = asyncio`, `testpaths = tests`. +- [x] Захардил `.gitea/workflows/ci.yml`: `set -euo pipefail` в обоих шагах, + `python3 -m pytest tests/ -q -p no:cacheprovider --strict-markers` — + любой fail/неизвестный маркер краснит сборку, гоняется весь набор. +- [x] Закоммитил, запушил, создал PR #35. src/ не тронут. + +## Изменённые файлы +- `tests/test_m6_sequence.py` — мок get_project_states + per-project карта + сброс кэша + project-aware UUID в `_post` +- `tests/test_plane_webhook.py` — то же + per-project UUID в `_post_created` +- `requirements.txt` — `+pytest-asyncio==0.23.8` +- `pytest.ini` — NEW: asyncio_mode=auto, strict markers, testpaths +- `.gitea/workflows/ci.yml` — set -euo pipefail, --strict-markers, no:cacheprovider + +## Результат / Проверка +Прогон в окружении прод-образа орка (host-репо смонтирован в контейнер +`orchestrator` как `/repos/orchestrator`), из клона ветки, как сделает CI: + +``` +docker exec -w /repos/orchestrator -e PYTHONPATH=/repos/orchestrator orchestrator \ + python3 -m pytest tests/ -q -p no:cacheprovider --strict-markers +... +342 passed, 1 warning in 7.65s +``` + +- 4 целевых теста: зелёные (11 passed в двух файлах). +- 6 ранее SKIP-авшихся async-тестов в test_orch10_states.py теперь **PASSED** + (23 passed в файле вместо 17 passed + 6 skipped). +- Итог: **342 passed, 0 skipped, 0 failed** (до фикса было 336 passed / 6 skipped + / 4 failed в целевых). + +Коммит на origin (проверено): +``` +git log origin/main..origin/fix/ORCH-39-webhook-tests +5f93cba fix(tests): per-project Plane states in webhook tests + close CI hole (ORCH-39) +``` + +PR: **#35** → https://git.mva154.duckdns.org/admin/orchestrator/pulls/35 (НЕ смержен) + +## Проблемы и решения +- scp недоступен в sandbox → файлы переносил через `ssh cat` (read/edit локально, push обратно). +- pytest-asyncio отсутствовал в прод-образе → поставил эфемерно в работающий + контейнер ТОЛЬКО для валидации (не персистит в образ, не влияет на прод-рантайм + — сервис тесты не гоняет; пропадёт при рестарте). В CI ставится через requirements.txt. + +## Следующий шаг +Ревьюер мержит PR #35 после проверки. После мержа CI на main будет краснеть на +любом падении и реально гонять async-тесты.