Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EqCYBhvTcdeCTUDX3RhWx9
30 lines
1.7 KiB
Python
30 lines
1.7 KiB
Python
import statistics
|
|
def _deals(vals, key="deposit", dt="전세"):
|
|
return [{key: v, "deal_type": dt} for v in vals]
|
|
|
|
def test_compute_safety_tiers():
|
|
from app.listing_matcher import compute_safety
|
|
deals = _deals([40000, 42000, 44000, 43000]) # median ~42500
|
|
assert compute_safety(28000, "전세", deals)["tier"] == "안전" # 0.66
|
|
assert compute_safety(32000, "전세", deals)["tier"] == "주의" # 0.75
|
|
assert compute_safety(38000, "전세", deals)["tier"] == "위험" # 0.89
|
|
assert compute_safety(28000, "전세", _deals([40000, 41000]))["tier"] == "보류" # 표본<3
|
|
|
|
def test_compute_valuation_tiers():
|
|
from app.listing_matcher import compute_valuation
|
|
deals = _deals([80000, 88000, 90000, 87000], key="sale_amount", dt="매매") # median ~87500
|
|
assert compute_valuation(83000, deals)["tier"] == "저평가" # 0.95
|
|
assert compute_valuation(89000, deals)["tier"] == "시세" # 1.02
|
|
assert compute_valuation(95000, deals)["tier"] == "고가" # 1.09
|
|
|
|
def test_match_listing_rent_deposit_cap():
|
|
from app.listing_matcher import match_listing
|
|
crit = {"dongs": ["신대방동"], "deal_types": ["전세"], "max_deposit": 32000,
|
|
"min_area": 40.0, "house_types": ["아파트"]}
|
|
ok = match_listing(crit, {"deal_type": "전세", "deposit": 29000, "area_exclusive": 42.0,
|
|
"dong": "신대방동"}, budget={"max_deposit": 45000})
|
|
assert ok["passed"] is True
|
|
over = match_listing(crit, {"deal_type": "전세", "deposit": 40000, "area_exclusive": 42.0,
|
|
"dong": "신대방동"}, budget={"max_deposit": 45000})
|
|
assert over["passed"] is False
|