fix(tradein/estimate): фильтр свежести в якоре дома и знаменателе коэффициента выкупа (#2656) #2661

Merged
bot-backend merged 7 commits from fix/2656-anchor-ratio-freshness into main 2026-08-26 13:31:53 +00:00
Showing only changes of commit 7a5997b059 - Show all commits

View file

@ -37,12 +37,17 @@ from unittest.mock import MagicMock
# Settings требует DATABASE_URL при инициализации (fail-fast, C-3). # Settings требует DATABASE_URL при инициализации (fail-fast, C-3).
os.environ.setdefault("DATABASE_URL", "postgresql+psycopg://test:test@localhost:5432/test") 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 import estimator as est_mod
from app.services.estimator import _fetch_analogs, _fetch_anchor_comps, _price_from_inputs from app.services.estimator import _fetch_analogs, _fetch_anchor_comps, _price_from_inputs
from app.services.geocoder import GeocodeResult from app.services.geocoder import GeocodeResult
from app.tasks import asking_to_sold_ratio as ratio_mod 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 радиусного пути. Сверяем ПОДСТРОКОЙ, # Ровно тот предикат, что стоит в _COMMON_WHERE радиусного пути. Сверяем ПОДСТРОКОЙ,
# а не регуляркой: цель — чтобы во всех местах стоял ОДИН И ТОТ ЖЕ текст, а не пять # а не регуляркой: цель — чтобы во всех местах стоял ОДИН И ТОТ ЖЕ текст, а не пять
# похожих вариантов, которые потом разъедутся по смыслу. # похожих вариантов, которые потом разъедутся по смыслу.
@ -103,12 +108,12 @@ def test_freshness_window_lives_in_one_place() -> None:
assert LISTINGS_FRESH_DAYS == 14 # текущее значение; меняется в одном месте assert LISTINGS_FRESH_DAYS == 14 # текущее значение; меняется в одном месте
for mod in (est_mod, ratio_mod): for mod in (est_mod, ratio_mod):
src = inspect.getsource(mod) src = inspect.getsource(mod)
assert re.search( assert re.search(r"from app\.core\.config import [^\n]*LISTINGS_FRESH_DAYS", src), (
r"from app\.core\.config import [^\n]*LISTINGS_FRESH_DAYS", src f"{mod.__name__}: LISTINGS_FRESH_DAYS не импортирован из app.core.config"
), f"{mod.__name__}: LISTINGS_FRESH_DAYS не импортирован из app.core.config" )
assert not re.search( assert not re.search(r"^LISTINGS_FRESH_DAYS\s*=", src, re.M), (
r"^LISTINGS_FRESH_DAYS\s*=", src, re.M f"{mod.__name__}: локальная копия константы — значение разъедется"
), f"{mod.__name__}: локальная копия константы — значение разъедется" )
assert "'14 days'" not in _REDERIVE_SQL assert "'14 days'" not in _REDERIVE_SQL
assert "'14 days'" not in _ANCHOR_SRC assert "'14 days'" not in _ANCHOR_SRC