From 02b256288db669e75ee4e674d0bd10212c36a8b8 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Thu, 6 Aug 2026 11:30:42 +0000 Subject: [PATCH] =?UTF-8?q?fix(tradein):=20=D0=BC=D0=BE=D0=BB=D1=87=D0=B0?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=B4=D0=B5=D1=81=D0=B5=D0=BB=D0=B5=D0=BA=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D1=8B=D0=B9=20=D1=82=D0=B5=D1=81=D1=82=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=87=D0=B8=D0=BD=D0=B5=D0=BD,=20deselect=20=D1=81?= =?UTF-8?q?=D0=BD=D1=8F=D1=82=20(#2722)=20(#2729)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .forgejo/workflows/ci-tradein.yml | 28 +++++++++++++------- tradein-mvp/backend/tests/test_search_api.py | 2 +- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/.forgejo/workflows/ci-tradein.yml b/.forgejo/workflows/ci-tradein.yml index c74ceca6..c3f6bcda 100644 --- a/.forgejo/workflows/ci-tradein.yml +++ b/.forgejo/workflows/ci-tradein.yml @@ -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 — тоже, а каталог diff --git a/tradein-mvp/backend/tests/test_search_api.py b/tradein-mvp/backend/tests/test_search_api.py index 5ba489bd..e6c6c1ad 100644 --- a/tradein-mvp/backend/tests/test_search_api.py +++ b/tradein-mvp/backend/tests/test_search_api.py @@ -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()