From 49bcfdacd69fa593b6217bcc621f258d84073ecb Mon Sep 17 00:00:00 2001 From: bot-backend Date: Thu, 17 Sep 2026 13:42:57 +0500 Subject: [PATCH] =?UTF-8?q?test(tradein):=20=D0=B3=D1=80=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=86=D0=B0=20radius-floor=20=D0=BF=D1=80=D0=B8=20n=20=3D=3D?= =?UTF-8?q?=20=D0=BF=D0=BE=D1=80=D0=BE=D0=B3=D1=83=20=D1=81=D1=82=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B6=D1=91=D1=82=D1=81=D1=8F=20(#3466)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ревью #3554: замена `>=` на `>` в гейте radius-floor оставляла test_estimator_radius_floor.py зелёным — в тестах были только count=15 и count=min_n−1. При n == min_n витрина не пишет «справочно» (advisory_only=False), значит floor обязан поднять цену. Новый тест: n = estimate_corridor_clamp_min_n, медиана 80k → ровно 120k, плюс проверка, что DkpCorridor на той же границе не справочный. Мутант `>` краснеет: «коридор из 10 сделок (ровно порог) должен поднять цену ровно до floor=120000». Co-Authored-By: Claude Opus 5 --- .../tests/test_estimator_radius_floor.py | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tradein-mvp/backend/tests/test_estimator_radius_floor.py b/tradein-mvp/backend/tests/test_estimator_radius_floor.py index aeaaf95d..ad965bc5 100644 --- a/tradein-mvp/backend/tests/test_estimator_radius_floor.py +++ b/tradein-mvp/backend/tests/test_estimator_radius_floor.py @@ -9,6 +9,7 @@ - dkp_raw is None → no-op (нет базы для floor) - anchor-путь (anchor_tier != None) → не затронут floor'ом - коридор ниже estimate_corridor_clamp_min_n → floor не применяется (#3466) +- коридор ровно estimate_corridor_clamp_min_n → floor применяется (#3466) """ from __future__ import annotations @@ -219,3 +220,35 @@ def test_floor_not_applied_below_clamp_min_n() -> None: f"median_ppm2={est.median_price_per_m2}: коридор из " f"{dkp_raw['count']} сделок ниже порога не должен поднимать цену до floor=120000" ) + + +# ── тест 5: ровно на пороге floor уже работает (#3466) ────────────────────── + + +def test_floor_applied_at_exactly_clamp_min_n() -> None: + """n = estimate_corridor_clamp_min_n: advisory_only=False → floor обязан поднять. + + Тест 4 стережёт «ниже порога — нет», тест 1 — «15 сделок — да». Граница между + ними (`>=` против `>`) не стереглась: при n == min_n витрина не пишет подпись + «справочно», значит коридор обязан войти в цену. + """ + from app.core.config import settings + from app.schemas.trade_in import DkpCorridor + + analogs = _six(80_000.0) + dkp_raw = { + "count": settings.estimate_corridor_clamp_min_n, + "low_ppm2": 150_000, + "median_ppm2": 180_000, + "high_ppm2": 220_000, + "period_months": 12, + } + # Та же граница с другой стороны: на ней коридор уже не справочный. + assert DkpCorridor(**dkp_raw).advisory_only is False + + est = _run_estimate(analogs, dkp_raw, radius_floor_factor=0.8) + + assert est.median_price_per_m2 == 150_000 * 0.8, ( + f"median_ppm2={est.median_price_per_m2}: коридор из {dkp_raw['count']} сделок " + "(ровно порог) должен поднять цену ровно до floor=120000" + )