From 7a5997b059465f29224773f3ff7718b0e6d21b9b Mon Sep 17 00:00:00 2001 From: bot-backend Date: Wed, 26 Aug 2026 18:25:54 +0500 Subject: [PATCH] =?UTF-8?q?test(2656):=20=D0=BA=D1=80=D0=B0=D1=81=D0=BD?= =?UTF-8?q?=D0=BE=D1=82=D0=B0=20=D0=BD=D0=B0=20main=20=E2=80=94=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D1=8E,=20?= =?UTF-8?q?=D0=BD=D0=B5=20ImportError?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit getattr вместо прямого импорта LISTINGS_FRESH_DAYS из config: на origin/main константы там ещё нет, и тест умирал ImportError'ом на сборке модуля — «возможности нет» вместо «значение неверно». Теперь на main: 5 красных ассертами (предикат отсутствует/окно None/протухшие комплы в пуле), 3 зелёных (сброс anchor_tier уже влит отдельно). Co-Authored-By: Claude Opus 5 --- .../tests/test_freshness_filter_2656.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/tradein-mvp/backend/tests/test_freshness_filter_2656.py b/tradein-mvp/backend/tests/test_freshness_filter_2656.py index 3d50216a..999f2ffd 100644 --- a/tradein-mvp/backend/tests/test_freshness_filter_2656.py +++ b/tradein-mvp/backend/tests/test_freshness_filter_2656.py @@ -37,12 +37,17 @@ from unittest.mock import MagicMock # Settings требует DATABASE_URL при инициализации (fail-fast, C-3). os.environ.setdefault("DATABASE_URL", "postgresql+psycopg://test:test@localhost:5432/test") -from app.core.config import LISTINGS_FRESH_DAYS +from app.core import config as core_config from app.services import estimator as est_mod from app.services.estimator import _fetch_analogs, _fetch_anchor_comps, _price_from_inputs from app.services.geocoder import GeocodeResult from app.tasks import asking_to_sold_ratio as ratio_mod +# getattr, а не прямой импорт: на origin/main константы в config ещё нет — тест +# обязан падать ассертом О ЗНАЧЕНИИ (None != 14 / предикат отсутствует), а не +# ImportError'ом на сборке модуля (красное должно значить «значение неверно»). +LISTINGS_FRESH_DAYS = getattr(core_config, "LISTINGS_FRESH_DAYS", None) + # Ровно тот предикат, что стоит в _COMMON_WHERE радиусного пути. Сверяем ПОДСТРОКОЙ, # а не регуляркой: цель — чтобы во всех местах стоял ОДИН И ТОТ ЖЕ текст, а не пять # похожих вариантов, которые потом разъедутся по смыслу. @@ -103,12 +108,12 @@ def test_freshness_window_lives_in_one_place() -> None: assert LISTINGS_FRESH_DAYS == 14 # текущее значение; меняется в одном месте for mod in (est_mod, ratio_mod): src = inspect.getsource(mod) - assert re.search( - r"from app\.core\.config import [^\n]*LISTINGS_FRESH_DAYS", src - ), f"{mod.__name__}: LISTINGS_FRESH_DAYS не импортирован из app.core.config" - assert not re.search( - r"^LISTINGS_FRESH_DAYS\s*=", src, re.M - ), f"{mod.__name__}: локальная копия константы — значение разъедется" + assert re.search(r"from app\.core\.config import [^\n]*LISTINGS_FRESH_DAYS", src), ( + f"{mod.__name__}: LISTINGS_FRESH_DAYS не импортирован из app.core.config" + ) + assert not re.search(r"^LISTINGS_FRESH_DAYS\s*=", src, re.M), ( + f"{mod.__name__}: локальная копия константы — значение разъедется" + ) assert "'14 days'" not in _REDERIVE_SQL assert "'14 days'" not in _ANCHOR_SRC