diff --git a/tests/test_ad_ecpm_trace_revenue.py b/tests/test_ad_ecpm_trace_revenue.py new file mode 100644 index 0000000..23f1d8e --- /dev/null +++ b/tests/test_ad_ecpm_trace_revenue.py @@ -0,0 +1,71 @@ +"""ad_ecpm_record.trace_id 落库 + 按 trace 聚合广告收益(元)。""" +from __future__ import annotations + +from datetime import UTC, datetime + +from sqlalchemy import delete + +from app.db.session import SessionLocal +from app.models.ad_ecpm import AdEcpmRecord +from app.repositories import ad_ecpm as crud_ecpm + + +def _ecpm(trace_id: str, ecpm_raw: str, session_id: str) -> AdEcpmRecord: + """构造一条 Draw 展示 eCPM(不 commit;ad_session_id 全局唯一,须各不相同)。""" + return AdEcpmRecord( + user_id=1, + ad_type="draw", + feed_scene="comparison", + ad_session_id=session_id, + ecpm_raw=ecpm_raw, + trace_id=trace_id, + report_date="2020-01-02", + created_at=datetime(2020, 1, 2, tzinfo=UTC), + ) + + +def test_revenue_yuan_by_trace_sums_and_clamps() -> None: + """同一 trace 多条展示求和;收益=min(eCPM元,¥500)/1000;无展示的 trace 不出现。 + + ecpm 200 分→2.0 元/千次→0.002 元/次;300 分→0.003;合计 0.005。 + """ + db = SessionLocal() + try: + db.add_all([ + _ecpm("t1", "200", "sess-t1-a"), + _ecpm("t1", "300", "sess-t1-b"), + _ecpm("t2", "0", "sess-t2-a"), + ]) + db.flush() + rev = crud_ecpm.revenue_yuan_by_trace(db, ["t1", "t2", "t3"]) + assert rev["t1"] == 0.005 + assert rev.get("t2", 0.0) == 0.0 + assert "t3" not in rev # 无展示的 trace 不出现在结果里 + finally: + db.rollback() + db.close() + + +def test_revenue_yuan_by_trace_empty() -> None: + """空 trace 列表直接返回 {}(避免 IN () 非法)。""" + db = SessionLocal() + try: + assert crud_ecpm.revenue_yuan_by_trace(db, []) == {} + finally: + db.close() + + +def test_create_ecpm_record_persists_trace_id() -> None: + """create_ecpm_record 落 trace_id。""" + db = SessionLocal() + try: + rec = crud_ecpm.create_ecpm_record( + db, 1, ad_type="draw", ecpm_raw="150", + ad_session_id="sess-trace-persist", feed_scene="coupon", + trace_id="trace-xyz", + ) + assert rec.trace_id == "trace-xyz" + finally: + db.execute(delete(AdEcpmRecord).where(AdEcpmRecord.ad_session_id == "sess-trace-persist")) + db.commit() + db.close()