"""50+ 子分公式——band 纯50+(仅 50- 桶,41-50 已忽略)、TGI 200 满分、TGI 6 成 + 占比 4 成、缺字段 incomplete。""" from content_agent.business_modules.content_discovery.fifty_plus import fifty_plus_score _OLD = { # 广场舞健身号:41-50 应被忽略,只算 50- 桶 "41-50": {"percentage": "31.73%", "preference": "210.02"}, "50-": {"percentage": "29.76%", "preference": "130.53"}, } _YOUNG = { # 原神号(年轻向) "41-50": {"percentage": "5.74%", "preference": "27"}, "50-": {"percentage": "5.50%", "preference": "17"}, } def test_score_separates_old_from_young(): old = fifty_plus_score(_OLD) young = fifty_plus_score(_YOUNG) assert old["status"] == "ok" and young["status"] == "ok" assert old["band"] == "50+" # 纯 50+ 口径:只算 50- 桶(29.76% / TGI 130.53)→ 0.6*65.27+0.4*29.76 ≈ 51.06 assert old["band_percent"] == 29.76 assert 50 <= old["score"] <= 52 assert 6 <= young["score"] <= 8 # 仅 50-=5.5%/17 → ≈7.3 assert old["score"] > young["score"] def test_tgi_200_is_full_marks_and_60_40_split(): # 单桶:占比 50%、TGI 200 → tgi_score=100、percent_score=50 → 0.6*100+0.4*50=80。 result = fifty_plus_score({"50-": {"percentage": "50%", "preference": "200"}}) assert result["tgi_score"] == 100.0 assert result["percent_score"] == 50.0 assert result["score"] == 80.0 def test_incomplete_when_band_missing_or_fields_missing(): assert fifty_plus_score({})["status"] == "incomplete" assert fifty_plus_score(None)["status"] == "incomplete" assert fifty_plus_score({"18-23": {"percentage": "60%", "preference": "300"}})["status"] == "incomplete" assert fifty_plus_score({"50-": {"percentage": "30%"}})["status"] == "incomplete" # 缺 preference