fix(tradein): молча задеселекченный тест починен, deselect снят (#2722)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI / changes (pull_request) Successful in 8s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Successful in 47s
CI Trade-In / frontend-checks (pull_request) Successful in 1m9s
CI Trade-In / backend-tests (pull_request) Successful in 3m12s
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI / changes (pull_request) Successful in 8s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Successful in 47s
CI Trade-In / frontend-checks (pull_request) Successful in 1m9s
CI Trade-In / backend-tests (pull_request) Successful in 3m12s
test_search_cache_hit был исключён из обоих пайплайнов с пояснением «падает ТОЛЬКО в whole-suite ordering (401 vs 200; в изоляции проходит) — global-state leak из другого test-модуля». Замер в полностью установленном окружении опровергает обе половины: тест падает и в изоляции тоже — прогон одного этого узла даёт 1 failed, тот же 401. Причина не в порядке, а в самом тесте: он единственный в своём файле ходит по HTTP и делает POST /api/v1/search БЕЗ заголовка X-Authenticated-User, а RBAC-гард на запрос без него отвечает 401 — ровно тот инвариант, который отдельно зафиксирован в tests/test_estimate_idor.py («No X-Authenticated-User header → 401»). Правка — один заголовок по идиоме самого репозитория; продуктовый код и конфигурация авторизации не тронуты. После этого deselect не нужен: полный прогон tradein-backend без единого исключения даёт 3750 passed, 9 skipped, 0 failed. Почему это часть #2722, а не отдельная уборка: задеселекченный тест — тот же класс дефекта, что каталог вне пайплайна. Чек зелёный, знание о выключенной проверке живёт в YAML, а не рядом с тестом, и следующий читатель наследует неверное объяснение вместо симптома. В шаге pytest оставлено явное правило на будущее: не deselect'ить молча — чинить или помечать xfail с причиной в коде. Экземпляр того же deselect'а в deploy-tradein.yml не тронут: тот файл правит открытый #2680. Расхождение безвредно — pre-merge гейт тест теперь гоняет. Refs #2722
This commit is contained in:
parent
3527d2b608
commit
b8e33d981d
2 changed files with 20 additions and 10 deletions
|
|
@ -103,15 +103,25 @@ jobs:
|
|||
run: uv sync --frozen
|
||||
|
||||
- name: Run pytest (tradein-mvp/backend)
|
||||
# DESELECT (актуализировано 2026-07-02, #2208): test_search_cache_hit падает
|
||||
# ТОЛЬКО в whole-suite ordering (401 vs 200; в изоляции проходит) — global-state
|
||||
# leak из другого test-модуля, pre-existing. Второй исторический deselect
|
||||
# (test_cian_valuation::test_cache_hit_returns_cached) убран — проходит в
|
||||
# полном прогоне (проверено локально: 2947 passed / 1 failed). Список обязан
|
||||
# совпадать с test-job в deploy-tradein.yml.
|
||||
run: |
|
||||
uv run pytest -q \
|
||||
--deselect "tests/test_search_api.py::test_search_cache_hit"
|
||||
# БЕЗ deselect'ов — сьют гоняется целиком (#2722).
|
||||
#
|
||||
# Здесь два года жил `--deselect tests/test_search_api.py::test_search_cache_hit`
|
||||
# с объяснением «падает ТОЛЬКО в whole-suite ordering, в изоляции проходит —
|
||||
# global-state leak из другого модуля». Объяснение было неверным в обеих
|
||||
# половинах: тест падал и в изоляции тоже (401 vs 200), потому что он —
|
||||
# единственный HTTP-тест в своём файле — ходил в /api/v1/search БЕЗ заголовка
|
||||
# X-Authenticated-User, а RBAC-гард отвечает на такое 401 (ровно то, что
|
||||
# фиксирует tests/test_estimate_idor.py). Причина была в тесте, а не в порядке;
|
||||
# заголовок добавлен, deselect снят, полный прогон зелёный.
|
||||
#
|
||||
# Не добавлять сюда новые deselect'ы: молча выключенный тест — это тот же
|
||||
# класс дефекта, что каталог вне пайплайна (#2722). Тест либо чинится, либо
|
||||
# помечается xfail с причиной В КОДЕ, где её видно рядом с самим тестом.
|
||||
#
|
||||
# NB: в deploy-tradein.yml (post-merge test-job) свой экземпляр этого
|
||||
# deselect'а — он остаётся до #2680, который правит тот файл. Расхождение
|
||||
# безвредно: pre-merge гейт тест гоняет, post-merge просто пропустит зелёный.
|
||||
run: uv run pytest -q
|
||||
|
||||
# Тесты браузерного сайдкара (#2722). До этого job'а они не бежали НИГДЕ:
|
||||
# ci-tradein гейтил только backend/frontend, deploy-tradein — тоже, а каталог
|
||||
|
|
|
|||
|
|
@ -164,7 +164,7 @@ def test_search_cache_hit(_reset_cache_singleton):
|
|||
}
|
||||
_reset_cache_singleton.get = AsyncMock(return_value=cached_payload)
|
||||
client = TestClient(app)
|
||||
r = client.post("/api/v1/search", json={"rooms": 2})
|
||||
r = client.post("/api/v1/search", json={"rooms": 2}, headers={"X-Authenticated-User": "admin"})
|
||||
assert r.status_code == 200
|
||||
assert r.json()["cache_hit"] is True
|
||||
_reset_cache_singleton.set.assert_not_awaited()
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue