auto-sync: 2026-06-05 00:10:01
This commit is contained in:
@@ -3,9 +3,9 @@
|
||||
"email": null,
|
||||
"calendar": null,
|
||||
"weather": null,
|
||||
"orchestrator_health": "2026-06-03T21:04:00Z",
|
||||
"orchestrator_health": "2026-06-04T00:00:00Z",
|
||||
"open_prs": ["PR #10 pipeline-ux (merged 03.06)", "PR #19 enduro-trails", "PR #1 orchestrator worktree", "PR #2 orchestrator multi-repo"]
|
||||
},
|
||||
"lastHeartbeat": "2026-06-03T21:04:00Z",
|
||||
"note": "Heartbeat 03.06 — orchestrator UX merged+shipped, ET-006 bugs cleaned, first real ticket processed. Pipeline maturing."
|
||||
"lastHeartbeat": "2026-06-04T00:00:00Z",
|
||||
"note": "Heartbeat 04.06 — ORCH-30 analysis done, staging env design approved (ORCH-31..35 in Backlog). Pipeline UX live on prod. No urgent items."
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
# Dev Report: fix-webhook-secret-isolation
|
||||
Дата: 2026-06-04
|
||||
Статус: DONE
|
||||
|
||||
## Задача
|
||||
Исправить кросс-файловую утечку webhook-секрета через синглтон settings (Pydantic).
|
||||
pytest tests/ давал 10 failed/284 passed (assert 401==200). Нужно: 0 failed.
|
||||
Работать в ветке `fix/isolate-webhook-tests-from-plane`, добавить коммит поверх 7bbab9c, e856e09.
|
||||
|
||||
## Сделано
|
||||
- [x] Прочитал ТЗ полностью
|
||||
- [x] Подключился к серверу slin@82.22.50.71, перешёл на ветку
|
||||
- [x] Изучил текущий conftest.py и образец из test_webhook_dedup.py:80-81
|
||||
- [x] Добавил autouse-фикстуру `_reset_webhook_secrets` в tests/conftest.py
|
||||
- [x] Обнаружил вторую скрытую проблему (db_path тоже протекает)
|
||||
- [x] Расширил фикстуру — добавил изоляцию db_path
|
||||
- [x] Прогнал полный pytest tests/ = **294 passed, 0 failed**
|
||||
- [x] Проверил dedup тесты отдельно = 9 passed (HMAC/401 живы)
|
||||
- [x] Проверил test_webhooks.py отдельно = 16 passed
|
||||
- [x] git commit + push в ветку
|
||||
- [x] CI job = success ✅
|
||||
|
||||
## Изменённые файлы
|
||||
- `tests/conftest.py` — добавлена autouse-фикстура `_reset_webhook_secrets`
|
||||
|
||||
## Результат
|
||||
```
|
||||
294 passed, 4 warnings in 6.03s (было: 10 failed, 284 passed)
|
||||
```
|
||||
|
||||
HMAC/dedup тесты:
|
||||
```
|
||||
tests/test_webhook_dedup.py: 9 passed (включая 401-тесты на строках 268, 278)
|
||||
```
|
||||
|
||||
test_webhooks.py:
|
||||
```
|
||||
16 passed
|
||||
```
|
||||
|
||||
CI job: **success** (2026-06-05T00:00:38+03:00, было failures с 2026-06-04)
|
||||
|
||||
git log:
|
||||
```
|
||||
1baae81 test: reset webhook secret per-test to fix cross-file isolation (CI green)
|
||||
e856e09 test: migrate sequential_ids test to In Progress contract
|
||||
7bbab9c test: isolate webhook tests from live Plane API (fix CI)
|
||||
```
|
||||
|
||||
## Проблемы и решения
|
||||
|
||||
### Проблема 1 (ожидаемая): webhook-секрет
|
||||
**Причина:** settings (Pydantic синглтон) создаётся при первом import src.config. Порядок
|
||||
импорта тестов — алфавитный. test_webhook_dedup.py импортируется первым и не устанавливает
|
||||
`ORCH_*_WEBHOOK_SECRET=""` жёстко (устанавливает через `os.environ.setdefault`). В итоге
|
||||
если в среде есть реальный секрет — settings.{gitea,plane}_webhook_secret ≠ "" и HMAC включается.
|
||||
|
||||
**Решение:** monkeypatch.setattr перед каждым тестом сбрасывает оба секрета в "".
|
||||
Тесты 268,278 в test_webhook_dedup.py перекрывают это своим monkeypatch внутри теста —
|
||||
порядок: autouse conftest → autouse модульные → тест-код; monkeypatch стекируется.
|
||||
|
||||
### Проблема 2 (обнаружена в процессе): db_path
|
||||
**Причина:** Аналогичная утечка через settings.db_path. test_webhook_dedup.py импортируется
|
||||
первым, устанавливает `os.environ["ORCH_DB_PATH"] = "/tmp/test_orchestrator_dedup.db"`,
|
||||
settings создаётся с этим значением. test_webhooks.py импортируется позже и устанавливает
|
||||
env в `/tmp/test_orchestrator.db` — НО settings уже создан, поэтому settings.db_path
|
||||
остаётся = dedup.db.
|
||||
|
||||
Следствие: setup_db в test_webhooks.py удаляет `_test_db_webhooks` (которого нет),
|
||||
а фактическая БД — dedup.db — не очищается между тестами. Два теста подряд используют
|
||||
ветку `feature/ET-011-test`, в БД остаётся задача со стадией review после первого теста,
|
||||
второй тест вставляет новую задачу но `get_task_by_repo_branch()` без ORDER BY может
|
||||
вернуть старую задачу → `current_stage != "development"` → `notify_qg_failure` не
|
||||
вызывается → тест test_gitea_ci_failure_on_development_notifies_qg_failure падает.
|
||||
|
||||
Это было скрыто за assert 401==200 (первый assert в тесте не проходил). Стало видно
|
||||
после устранения первой проблемы.
|
||||
|
||||
**Решение:** В той же autouse фикстуре добавляем:
|
||||
```python
|
||||
db_path_env = os.environ.get("ORCH_DB_PATH", "")
|
||||
if db_path_env:
|
||||
monkeypatch.setattr(db_mod.settings, "db_path", db_path_env, raising=False)
|
||||
```
|
||||
`os.environ["ORCH_DB_PATH"]` = последнее присвоенное значение после всех импортов =
|
||||
`/tmp/test_orchestrator.db` (test_webhooks.py импортируется последним алфавитно). Тесты
|
||||
dedup перекрывают это своим monkeypatch.setattr в их `setup_db` фикстуре — работает корректно.
|
||||
|
||||
### Почему не нарушаются 401/HMAC тесты
|
||||
Монопатч conftest autouse (`_reset_webhook_secrets`) применяется ПЕРЕД `setup_db` из
|
||||
test_webhook_dedup. В тестах 268,278 monkeypatch.setattr вызывается ВНУТРИ теста
|
||||
(после setup). monkeypatch стекирует патчи — последний выигрывает. После теста —
|
||||
все откатываются в обратном порядке. autouse фикстура conftest повторно применяется
|
||||
перед следующим тестом.
|
||||
|
||||
## Следующий шаг
|
||||
PR #27 готов к ревью координатором (Стримом). НЕ мержить самостоятельно.
|
||||
Reference in New Issue
Block a user