diff --git a/backend/tests/api/v1/conftest.py b/backend/tests/api/v1/conftest.py new file mode 100644 index 00000000..463d56ea --- /dev/null +++ b/backend/tests/api/v1/conftest.py @@ -0,0 +1,39 @@ +"""Общие фикстуры для api/v1 analyze-тестов. + +PR-A (#1891) сделал geoportal зон-резолвер (``get_or_fetch_zone_regulation``) +БЕЗУСЛОВНЫМ в ``analyze_parcel`` — раньше он был gated за наличием dump-зоны +(``_nspd_zoning is not None``), теперь вызывается для любого ЕКБ-участка с centroid. + +Analyze-тесты с ПОЗИЦИОННЫМ DB-моком (``_make_db_for_analyze`` + ``call_idx``/ +``responses[...]``) НЕ мокали резолвер (до PR-A он не вызывался). Новый безусловный +вызов добавляет ``db.execute`` (get_cached) → сдвигает последовательность ответов +мока → последующие запросы (напр. ``parcel_meta``) получают чужой/пустой ответ и +становятся ``None``. Локально проходило (резолвер мог не разрезолвить точку), в CI +падало (``test_parcel_meta_found_in_cad_parcels``). + +Авто-фикстура по умолчанию глушит резолвер в no-op (``return None``) для ВСЕХ тестов +в этом каталоге → блок 9e-bis ничего не синтезирует и не трогает БД (поведение +идентично до-PR-A). Тесты, которые проверяют САМ резолвер +(``test_analyze_zoning_regulation.py``), переопределяют этот же target своим +per-test ``patch`` — он применяется ПОВЕРХ авто-фикстуры (вложенный mock-scope), так +что их ожидаемые значения резолвера сохраняются. +""" + +from __future__ import annotations + +from collections.abc import Iterator +from unittest.mock import patch + +import pytest + + +@pytest.fixture(autouse=True) +def _stub_zone_regulation_resolver() -> Iterator[None]: + """No-op geoportal зон-резолвер по умолчанию (без сети, без desync DB-мока). + + ``return None`` → ``analyze`` не синтезирует ``nspd_zoning`` и не делает лишних + ``db.execute``. Тесты резолвера переопределяют ``get_or_fetch_zone_regulation`` + своим ``patch`` per-test. + """ + with patch("app.api.v1.parcels.get_or_fetch_zone_regulation", return_value=None): + yield