Files
wiki/tasks/orchestrator/DEV_TASK_FIX_SEQ_TEST.md
2026-06-04 22:40:01 +03:00

6.5 KiB
Raw Permalink Blame History

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:
    {"event": "issue", "action": "updated",
     "data": {"id": "item-1", "name": "First task", "project": "proj-1",
              "state": {"id": "<In Progress 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.