From 464e9e1c67f68777a27f25797d8cd04e7ef6b24b Mon Sep 17 00:00:00 2001 From: bot-backend Date: Sat, 12 Sep 2026 17:01:22 +0300 Subject: [PATCH] =?UTF-8?q?perf(tests):=20=D1=81=D1=85=D0=BB=D0=BE=D0=BF?= =?UTF-8?q?=D0=BD=D1=83=D1=82=D1=8C=20inline-=D0=BE=D0=B6=D0=B8=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20NSPD-=D1=84=D0=B5=D1=82=D1=87=D0=B0?= =?UTF-8?q?=20=D0=B2=20analyze-=D1=82=D0=B5=D1=81=D1=82=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Два теста (`test_market_price_invalid_cad_returns_404`, `test_recent_permits_invalid_cad_no_regression`) спали ровно по 16с: ветка «участка нет в БД» в `analyze_parcel` ждёт появления геометрии циклом `sleep(_INLINE_FETCH_POLL_INTERVAL_S)` до `_INLINE_FETCH_WAIT_S` (15с), а в тестах фетч замокан и геометрия не появляется никогда. Autouse-фикстура каталога ужимает окно до 0.05с при шаге опроса 0.01с. Цикл остаётся рабочим (несколько итераций), а не выключается нулём — тесты fast-path'а продолжают видеть опросы; тесты с собственным patch того же имени переопределяют фикстуру поверх. tests/api/v1 целиком: 898с → 7.7с, 377 passed. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG --- backend/tests/api/v1/conftest.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/backend/tests/api/v1/conftest.py b/backend/tests/api/v1/conftest.py index f5741b19..33df9426 100644 --- a/backend/tests/api/v1/conftest.py +++ b/backend/tests/api/v1/conftest.py @@ -59,3 +59,22 @@ def _stub_forecast_enqueue() -> Iterator[None]: """ with patch("app.workers.tasks.forecast.forecast_site_finder_report.delay", MagicMock()): yield + + +@pytest.fixture(autouse=True) +def _fast_inline_fetch_wait(monkeypatch: pytest.MonkeyPatch) -> None: + """Схлопнуть inline-ожидание NSPD-фетча (#93 graceful fallback) до миллисекунд. + + В ``analyze_parcel`` ветка «участка нет в БД» ждёт появления геометрии циклом + ``sleep(_INLINE_FETCH_POLL_INTERVAL_S)`` до ``_INLINE_FETCH_WAIT_S`` (15с прод- + значение). В тестах фетч замокан и геометрия не появится никогда → каждый такой + тест честно спал 16с (``test_market_price_invalid_cad_returns_404``, + ``test_recent_permits_invalid_cad_no_regression``). + + Оставляем цикл РАБОЧИМ (несколько итераций по 10мс), а не выключаем его нулём: + тесты, проверяющие сам fast-path «строка появилась на N-м опросе», продолжают + видеть опросы. Тесты с собственным ``patch`` того же имени (напр. + ``test_run_history_and_response_contract.py``) переопределяют это поверх. + """ + monkeypatch.setattr("app.api.v1.parcels._INLINE_FETCH_WAIT_S", 0.05) + monkeypatch.setattr("app.api.v1.parcels._INLINE_FETCH_POLL_INTERVAL_S", 0.01)