test_fifty_plus_score_formula.py 1.8 KB

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