From 228c5f58f9c28c2889798c96cfd6fb2c2e9f92ee Mon Sep 17 00:00:00 2001 From: bot-backend Date: Thu, 17 Sep 2026 13:57:05 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=95=D0=A0=D0=90:=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=20=D1=8F=D0=BA=D0=BE=D1=80=D1=8F=20=C2=AB=D1=82=D0=BE?= =?UTF-8?q?=D1=82=20=D0=B6=D0=B5=20=D0=B4=D0=BE=D0=BC=C2=BB=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B5=D1=80=D1=8F=D0=B5=D1=82=20=D0=B2=D0=B5=D1=81?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B0=20=D0=BC=D0=B5=D1=81=D1=82=D0=B5=20=D0=B2?= =?UTF-8?q?=D1=8B=D0=B7=D0=BE=D0=B2=D0=B0=20(#2381)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ревью #3556: подмена rooms_boost=1.0 на месте вызова _compute_same_building_anchor проходила весь сьют — тест значений держит только число в константе. Новый тест оборачивает расчёт якоря и требует боевые sigma/rooms_boost/floor_sigma/min_comps/ mad_k (прод 17.09.2026). SB_GUARDRAIL_TOL, FSD_K, SB_GATE_MAX_FSD и сдвиг ANCHOR_TIER_C_CORRIDOR_MULT вниз по-прежнему без поведенческих тестов. Co-Authored-By: Claude Opus 5 --- .../tests/test_same_building_anchor.py | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tradein-mvp/backend/tests/test_same_building_anchor.py b/tradein-mvp/backend/tests/test_same_building_anchor.py index f2d8eba8..268adbbd 100644 --- a/tradein-mvp/backend/tests/test_same_building_anchor.py +++ b/tradein-mvp/backend/tests/test_same_building_anchor.py @@ -501,6 +501,29 @@ def test_estimate_premium_lift_real_in_range() -> None: assert est.range_high_rub >= int(real * 0.9) +def test_estimate_anchor_gets_prod_weights() -> None: + """#2381: веса якоря доходят до расчёта боевыми (прод 17.09.2026). + + Тест значений констант держит только число в estimator.py. Подмена + rooms_boost/floor_sigma на месте вызова (например, 1.0) проходила весь сьют: + веса сдвигают headline внутри тех же допусков, что проверяют тесты выше. + """ + with patch( + "app.services.estimator._compute_same_building_anchor", + wraps=_compute_same_building_anchor, + ) as spy: + est = _run_estimate(anchor_comps=_SB_COMPS_PREMIUM, anchor_tier="A") + assert est.median_price_per_m2 >= 450_000 # якорь сработал, а не радиус + kw = spy.call_args.kwargs + assert {k: kw[k] for k in ("sigma", "rooms_boost", "floor_sigma", "min_comps", "mad_k")} == { + "sigma": 0.18, + "rooms_boost": 1.6, + "floor_sigma": 0.25, + "min_comps": 4, + "mad_k": 3.5, + } + + def test_estimate_anchor_fires_without_radius_analogs() -> None: """#691: радиусных аналогов НЕТ (median=0, прод-кейс провала ST_DWithin), но same-building комплы есть → якорь обязан сработать и дать median>0.