fix(site-finder): разгейтить geoportal зон-резолвер от gappy NSPD-дампа — починить видимость финмодели (#1881) #1891

Merged
bot-backend merged 3 commits from fix/zoning-resolution-decouple into main 2026-06-23 23:55:53 +00:00
Showing only changes of commit 2e53f0a1c4 - Show all commits

View file

@ -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