"""优质老年作者入池:纯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 == []