| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- """优质老年作者入池:纯50+占比>30% 且 TGI>120 才收;填 elderly_ratio/tgi;非抖音/不达标不收。"""
- from content_agent.business_modules.result_source_lookup import _build_author_assets
- def _item(author_id, content_id, platform="douyin"):
- return {
- "platform": platform,
- "platform_author_id": author_id,
- "platform_content_id": content_id,
- "content_discovery_id": f"cd_{content_id}",
- "author_display_name": f"作者{author_id}",
- "tags": ["历史"],
- }
- def _decision(content_id, fifty_status=None, band_percent=None, band_tgi=None):
- scorecard = {"total_score": 73, "query_relevance_score": 90, "platform_performance_score": 70}
- if fifty_status is not None:
- scorecard["fifty_plus_status"] = fifty_status
- if fifty_status == "ok":
- scorecard["fifty_plus_components"] = {"band": "50+", "band_percent": band_percent, "band_tgi": band_tgi}
- return {
- "decision_id": f"dec_{content_id}",
- "decision_target_id": content_id,
- "decision_action": "ADD_TO_CONTENT_POOL",
- "scorecard": scorecard,
- }
- def _run(items, decisions):
- decision_by_target_id = {d["decision_target_id"]: d for d in decisions}
- paths = {it["platform_content_id"]: [] for it in items}
- return _build_author_assets("run", "policy_run", items, decision_by_target_id, paths)
- def test_eligible_author_pooled_with_elderly_fields():
- items = [_item("A", "c_a")]
- decisions = [_decision("c_a", "ok", band_percent=36.86, band_tgi=155.72)]
- _summaries, asset_rows, role_rows = _run(items, decisions)
- assert len(asset_rows) == 1
- row = asset_rows[0]
- assert row["platform_author_id"] == "A"
- assert row["elderly_ratio"] == 36.86
- assert row["elderly_tgi"] == 155.72
- assert row["eligible_as_source"] == 1
- assert "high_50plus_profile" in _summaries[0]["roles"]
- assert any(r["role"] == "high_50plus_profile" for r in role_rows)
- def test_ratio_below_30_rejected():
- items = [_item("B", "c_b")]
- decisions = [_decision("c_b", "ok", band_percent=22.21, band_tgi=140)] # 占比<30
- _s, asset_rows, _r = _run(items, decisions)
- assert asset_rows == []
- def test_tgi_below_120_rejected():
- items = [_item("C", "c_c")]
- decisions = [_decision("c_c", "ok", band_percent=40, band_tgi=100)] # TGI<120
- _s, asset_rows, _r = _run(items, decisions)
- assert asset_rows == []
- def test_non_douyin_no_portrait_rejected():
- items = [_item("D", "c_d", platform="kuaishou")]
- decisions = [_decision("c_d", fifty_status=None)] # 无 fifty_plus → 不收
- _s, asset_rows, _r = _run(items, decisions)
- assert asset_rows == []
- def test_boundary_exactly_30_and_120_excluded():
- # 严格大于:占比=30、TGI=120 都不算达标。
- items = [_item("E", "c_e")]
- decisions = [_decision("c_e", "ok", band_percent=30, band_tgi=120)]
- _s, asset_rows, _r = _run(items, decisions)
- assert asset_rows == []
|