From 2e53f0a1c4e026b93b95bf6726daa8cf67c48a85 Mon Sep 17 00:00:00 2001 From: Light1YT Date: Wed, 24 Jun 2026 04:33:17 +0500 Subject: [PATCH] =?UTF-8?q?test(analyze):=20=D0=B0=D0=B2=D1=82=D0=BE-?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D0=B1=20geoportal=20=D0=B7=D0=BE=D0=BD-?= =?UTF-8?q?=D1=80=D0=B5=D0=B7=D0=BE=D0=BB=D0=B2=D0=B5=D1=80=D0=B0=20=D0=B2?= =?UTF-8?q?=20api/v1=20=D1=82=D0=B5=D1=81=D1=82=D0=B0=D1=85=20(CI=20desync?= =?UTF-8?q?=20fix)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-A сделал get_or_fetch_zone_regulation БЕЗУСЛОВНЫМ в analyze. Analyze-тесты с позиционным DB-моком (_make_db_for_analyze + call_idx/responses[]) не мокали резолвер → новый безусловный вызов делает db.execute (get_cached) и сдвигает последовательность ответов мока → parcel_meta получает чужой ответ = None. Локально проходило (geoportal недоступен с dev-машины → резолвер возвращал None, без db-вызова), в CI падало (раннер на проде ДОСТАЁТ geoportal → зона резолвится → get_cached → desync): FAILED test_parcel_meta_found_in_cad_parcels. Fix: autouse-фикстура в tests/api/v1/conftest.py глушит резолвер в no-op (return None) для всех v1-тестов — блок 9e-bis ничего не синтезирует и не трогает БД (идентично до-PR-A). test_analyze_zoning_regulation.py переопределяет резолвер per-test (patch поверх autouse), поэтому его проверки сохранены. Verify: затронутые analyze-файлы + zoning-файл = 72 passed, 0 failed. ruff чисто. Refs #1891 Co-Authored-By: Claude Opus 4.8 --- backend/tests/api/v1/conftest.py | 39 ++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 backend/tests/api/v1/conftest.py 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