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" + )