Files
web-page-backend/insta-lab/tests/test_selection.py
2026-06-11 02:19:32 +09:00

48 lines
1.9 KiB
Python

from app.selection import score_candidates
NOW = "2026-06-11T00:00:00Z"
def _cand(kid, kw, cat, score, suggested_at):
return {"id": kid, "keyword": kw, "category": cat, "score": score, "suggested_at": suggested_at}
def test_dedup_excludes_recent_issued():
cands = [_cand(1, "금리", "economy", 0.9, "2026-06-11T00:00:00Z")]
issued = [{"keyword": "금리", "category": "economy"}]
out = score_candidates(cands, issued, prefs={}, claude_scores=None, threshold=0.0, now_iso=NOW)
assert out[0]["eligible"] is False
def test_freshness_recent_higher():
fresh = _cand(1, "A", "economy", 0.5, "2026-06-11T00:00:00Z")
stale = _cand(2, "B", "economy", 0.5, "2026-06-04T00:00:00Z")
out = {c["id"]: c for c in score_candidates([fresh, stale], [], {}, None, threshold=0.0, now_iso=NOW)}
assert out[1]["breakdown"]["freshness"] > out[2]["breakdown"]["freshness"]
def test_account_fit_uses_weight():
cands = [_cand(1, "A", "economy", 0.8, NOW), _cand(2, "B", "psychology", 0.8, NOW)]
prefs = {"economy": 2.0, "psychology": 1.0}
out = {c["id"]: c for c in score_candidates(cands, [], prefs, None, threshold=0.0, now_iso=NOW)}
assert out[1]["breakdown"]["account_fit"] > out[2]["breakdown"]["account_fit"]
def test_threshold_gate():
cands = [_cand(1, "A", "economy", 0.1, "2026-06-01T00:00:00Z")]
out = score_candidates(cands, [], {}, None, threshold=0.6, now_iso=NOW)
assert out[0]["eligible"] is False
def test_claude_missing_renormalizes():
cands = [_cand(1, "A", "economy", 1.0, NOW)]
out = score_candidates(cands, [], {"economy": 1.0}, None, threshold=0.0, now_iso=NOW)
assert out[0]["breakdown"]["claude"] is None
assert 0.0 <= out[0]["final_score"] <= 1.0
def test_claude_included_when_provided():
cands = [_cand(1, "A", "economy", 0.5, NOW)]
out = score_candidates(cands, [], {"economy": 1.0}, {1: 1.0}, threshold=0.0, now_iso=NOW)
assert out[0]["breakdown"]["claude"] == 1.0