From 3bc4a36c599a96481227d44789e55cd7e5a1458f Mon Sep 17 00:00:00 2001 From: Stream Date: Thu, 4 Jun 2026 22:40:01 +0300 Subject: [PATCH] auto-sync: 2026-06-04 22:40:01 --- tasks/orchestrator/DEV_TASK_FIX_SEQ_TEST.md | 47 +++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 tasks/orchestrator/DEV_TASK_FIX_SEQ_TEST.md diff --git a/tasks/orchestrator/DEV_TASK_FIX_SEQ_TEST.md b/tasks/orchestrator/DEV_TASK_FIX_SEQ_TEST.md new file mode 100644 index 0000000..80bb903 --- /dev/null +++ b/tasks/orchestrator/DEV_TASK_FIX_SEQ_TEST.md @@ -0,0 +1,47 @@ +# DEV TASK — добить test_plane_webhook_generates_sequential_ids (последний красный тест) + +**Проект:** orchestrator | **Сервер:** slin@82.22.50.71 (pw motoZ@yaz2010) | **Репо:** /home/slin/repos/orchestrator | **Контейнер:** orchestrator +**Ветка УЖЕ существует:** `fix/isolate-webhook-tests-from-plane` (коммит `7bbab9c`). **Работать в ней же, добавить НОВЫЙ коммит сверху.** `git fetch origin && git checkout fix/isolate-webhook-tests-from-plane && git pull --ff-only`. + +## Контекст +В предыдущем заходе ты починил 3 целевых теста (коммит 7bbab9c, они зелёные). Но всплыл 1 сосед: `test_plane_webhook_generates_sequential_ids` (tests/test_webhooks.py:~84) теперь **красный** (`IndexError: list index out of range` на `assert ids[0] == "ET-001"`). + +**Причина (проверена, это НЕ баг моков, а УСТАРЕВШИЙ ТЕСТ):** +- Код намеренно изменён (Feature 1, см. `handle_work_item_created` в src/webhooks/plane.py:334): событие `work_item.created` **БОЛЬШЕ НЕ создаёт задачу** — только soft QG-0 лог («awaiting In Progress»). Ни branch, ни docs, ни task row. +- Задача создаётся только при переходе issue В **In Progress** (событие `issue/updated` со `state.group=="started"` → `start_pipeline`). +- Поэтому ты в коммите 7bbab9c правильно переписал `test_plane_webhook_creates_task` на путь `issue/updated` + 4 мока через ИСТОЧНИК (`src.plane_sync.fetch_issue_sequence_id`, `fetch_issue_fields`, `add_comment`). +- А `test_plane_webhook_generates_sequential_ids` остался на МЁРТВОМ пути `work_item.created` без моков → задачи не создаются → список пуст → IndexError. + +## Что сделать — ТОЛЬКО этот один тест +Привести `test_plane_webhook_generates_sequential_ids` к НОВОМУ контракту, по образцу уже починенного `test_plane_webhook_creates_task` (коммит 7bbab9c, строки 57-80 — изучи его как эталон): +1. Оба POST'а переделать с `event: work_item.created` на путь перевода в In Progress — формат payload идентичен тому, что в `test_plane_webhook_creates_task`: + ```python + {"event": "issue", "action": "updated", + "data": {"id": "item-1", "name": "First task", "project": "proj-1", + "state": {"id": "", "name": "In Progress", "group": "started"}}} + ``` + (state id возьми ТОТ ЖЕ, что использован в test_plane_webhook_creates_task: `b873d9eb-993c-48cd-97ac-99a9b1623967`). +2. Навесить ТЕ ЖЕ моки-декораторы, что на починенном тесте: + `@patch("src.plane_sync.add_comment")`, `@patch("src.plane_sync.fetch_issue_sequence_id", ...)`, `@patch("src.plane_sync.fetch_issue_fields", return_value=(...))`, `@patch("src.webhooks.plane._create_gitea_branch", new_callable=AsyncMock)`, `@patch("src.webhooks.plane._create_initial_docs", new_callable=AsyncMock)`. + - ⚠️ НЮАНС про `fetch_issue_sequence_id`: в одиночном тесте мок возвращает `None` (fallback на DB-инкремент). Здесь нужны ПОСЛЕДОВАТЕЛЬНЫЕ id (ET-001, ET-002). Если `return_value=None` для обоих вызовов → DB-инкремент даст ET-001, ET-002 (то что нужно — проверь!). Если же тест требует точные seq из Plane — используй `side_effect=[1, 2]` (или [None, None] если полагаемся на DB). Подбери так, чтобы `ids == ["ET-001","ET-002"]` выполнялось ЧЕСТНО, не подгоняя assert. НЕ меняй сам assert, если можно добиться правильным моком. +3. Убедись, что `name` достаточно длинный для QG-0 (>= 5 символов; "First task"/"Second task" — ок), а repo резолвится в enduro-trails (prefix ET) как в соседнем тесте. + +## ЗАПРЕТЫ +- Менять ТОЛЬКО `tests/test_webhooks.py`, ТОЛЬКО этот один тест. НЕ трогать src/, workflow ci.yml, conftest, другие тесты. +- НЕ добавлять X-Gitea-Delivery заголовки и НЕ лезть в дедупликацию — это вне задачи (в прошлый раз ты на этом завис, я откатила тот хвост). +- ⚠️ НЕ регистрировать раннеров, НЕ запускать nohup. Раннер `mva154-runner-orch` уже есть. +- PR push в main ЗАПРЕЩЁН. НЕ мержить — мержит ревьюер. + +## Проверка (приложить пруф) +1. Чистое окружение (read-only, без .env): + ``` + docker run --rm -v /home/slin/repos/orchestrator:/code:ro -w /code -e PYTHONPATH=/code \ + --entrypoint python3 $(docker inspect orchestrator --format '{{.Config.Image}}') \ + -m pytest tests/test_webhooks.py -q + ``` + — должно быть **0 failed** по всему test_webhooks.py (был 1 failed). Приложи итоговую строку (X passed). +2. Push (новый коммит в ту же ветку) → workflow прогнался, job test → **success** (`/api/v1/repos/admin/orchestrator/actions/tasks`, токен `docker exec orchestrator printenv ORCH_GITEA_TOKEN`). ⚠️ Раньше CI был красный ИМЕННО из-за этого теста — теперь должен позеленеть. Если ещё что-то красное — отчёт, СТОП. +3. `git log --oneline origin/main..origin/fix/isolate-webhook-tests-from-plane` показывает оба коммита (7bbab9c + твой новый). + +## Результат +- Новый коммит в ветке `fix/isolate-webhook-tests-from-plane`, весь test_webhooks.py зелёный в чистом окружении, CI job test = success. PR #27 (уже существует на эту ветку) станет зелёным. Отчёт с пруфом → `tasks/orchestrator/reports/dev-2026-06-04-fix-seq-test.md`. Коммит: `test: migrate sequential_ids test to In Progress contract`.