修复:领券单券成功率按任务独立统计
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
"""逐次单券事件不能被同设备同日的每日去重记录串场。"""
|
||||
|
||||
from sqlalchemy import delete, select
|
||||
|
||||
from app.admin.repositories.coupon_data import _point_scores_by_trace, coupon_point_details
|
||||
from app.db.session import SessionLocal
|
||||
from app.models.coupon_state import CouponClaimEvent, CouponClaimRecord
|
||||
from app.repositories.coupon_state import record_claims
|
||||
|
||||
|
||||
def test_same_device_same_day_keeps_scores_for_each_trace() -> None:
|
||||
db = SessionLocal()
|
||||
device = "event-repeat-device"
|
||||
first_trace = "event-repeat-first"
|
||||
second_trace = "event-repeat-second"
|
||||
first_results = [
|
||||
{"coupon_id": "mt-repeat", "name": "美团测试券", "status": "success"},
|
||||
{"coupon_id": "tb-repeat", "name": "淘宝测试券", "status": "failed"},
|
||||
]
|
||||
second_results = [
|
||||
{"coupon_id": "mt-repeat", "name": "美团测试券", "status": "already_claimed"},
|
||||
{"coupon_id": "tb-repeat", "name": "淘宝测试券", "status": "success"},
|
||||
]
|
||||
try:
|
||||
record_claims(
|
||||
db, device, None, first_trace, first_results, app_env="dev"
|
||||
)
|
||||
record_claims(
|
||||
db, device, None, second_trace, second_results, app_env="prod"
|
||||
)
|
||||
|
||||
assets = db.execute(
|
||||
select(CouponClaimRecord).where(CouponClaimRecord.device_id == device)
|
||||
).scalars().all()
|
||||
assert len(assets) == 2
|
||||
assert {row.trace_id for row in assets} == {first_trace}
|
||||
|
||||
events = db.execute(
|
||||
select(CouponClaimEvent).where(CouponClaimEvent.device_id == device)
|
||||
).scalars().all()
|
||||
assert len(events) == 4
|
||||
assert {row.trace_id for row in events} == {first_trace, second_trace}
|
||||
|
||||
scores = _point_scores_by_trace(db, [first_trace, second_trace])
|
||||
assert scores[first_trace] == {"succeeded": 1, "tried": 2}
|
||||
assert scores[second_trace] == {"succeeded": 2, "tried": 2}
|
||||
assert [row["status"] for row in coupon_point_details(
|
||||
db, trace_id=second_trace
|
||||
)] == ["already_claimed", "success"]
|
||||
finally:
|
||||
db.execute(delete(CouponClaimEvent).where(CouponClaimEvent.device_id == device))
|
||||
db.execute(delete(CouponClaimRecord).where(CouponClaimRecord.device_id == device))
|
||||
db.commit()
|
||||
db.close()
|
||||
@@ -13,7 +13,7 @@ from app.admin.repositories.coupon_data import (
|
||||
)
|
||||
from app.admin.security import create_admin_token
|
||||
from app.db.session import SessionLocal
|
||||
from app.models.coupon_state import CouponClaimRecord, CouponSession
|
||||
from app.models.coupon_state import CouponClaimEvent, CouponSession
|
||||
|
||||
|
||||
def test_point_scores_by_trace() -> None:
|
||||
@@ -22,14 +22,14 @@ def test_point_scores_by_trace() -> None:
|
||||
trace = "point-score-trace"
|
||||
try:
|
||||
db.add_all([
|
||||
CouponClaimRecord(
|
||||
CouponClaimEvent(
|
||||
trace_id=trace,
|
||||
device_id="score-device",
|
||||
coupon_id=f"mt-score-{status}",
|
||||
claim_date=date(2020, 1, 2),
|
||||
status=status,
|
||||
coupon_name=f"测试点位-{status}",
|
||||
reason="测试失败" if status == "failed" else None,
|
||||
trace_id=trace,
|
||||
)
|
||||
for status in ("success", "already_claimed", "failed", "skipped")
|
||||
])
|
||||
@@ -53,12 +53,12 @@ def test_skipped_detail_does_not_create_a_score() -> None:
|
||||
db = SessionLocal()
|
||||
trace = "point-score-skipped"
|
||||
try:
|
||||
db.add(CouponClaimRecord(
|
||||
db.add(CouponClaimEvent(
|
||||
trace_id=trace,
|
||||
device_id="score-device-skipped",
|
||||
coupon_id="mt-score-skipped-only",
|
||||
claim_date=date(2020, 1, 2),
|
||||
status="skipped",
|
||||
trace_id=trace,
|
||||
))
|
||||
db.flush()
|
||||
|
||||
@@ -87,12 +87,12 @@ def test_coupon_data_report_returns_scores_without_embedding_details() -> None:
|
||||
started_date=report_date,
|
||||
))
|
||||
db.add_all([
|
||||
CouponClaimRecord(
|
||||
CouponClaimEvent(
|
||||
trace_id=trace,
|
||||
device_id="score-report-device",
|
||||
coupon_id=f"mt-report-{status}",
|
||||
claim_date=report_date,
|
||||
status=status,
|
||||
trace_id=trace,
|
||||
)
|
||||
for status in ("success", "failed")
|
||||
])
|
||||
@@ -128,14 +128,14 @@ def test_coupon_point_details_endpoint() -> None:
|
||||
role="super_admin",
|
||||
)
|
||||
token, _expires_at = create_admin_token(admin_id=admin.id, role=admin.role)
|
||||
db.add(CouponClaimRecord(
|
||||
db.add(CouponClaimEvent(
|
||||
trace_id=trace,
|
||||
device_id="point-details-endpoint-device",
|
||||
coupon_id="mt-point-details-endpoint",
|
||||
coupon_name="接口测试券",
|
||||
claim_date=date(2020, 1, 5),
|
||||
status="failed",
|
||||
reason="接口测试失败",
|
||||
trace_id=trace,
|
||||
))
|
||||
db.commit()
|
||||
|
||||
@@ -156,6 +156,6 @@ def test_coupon_point_details_endpoint() -> None:
|
||||
}
|
||||
finally:
|
||||
db.rollback()
|
||||
db.execute(delete(CouponClaimRecord).where(CouponClaimRecord.trace_id == trace))
|
||||
db.execute(delete(CouponClaimEvent).where(CouponClaimEvent.trace_id == trace))
|
||||
db.commit()
|
||||
db.close()
|
||||
|
||||
@@ -7,7 +7,7 @@ from sqlalchemy import delete, select
|
||||
|
||||
from app.admin.repositories.coupon_data import coupon_slot_report
|
||||
from app.db.session import SessionLocal
|
||||
from app.models.coupon_state import CouponClaimRecord, CouponSession
|
||||
from app.models.coupon_state import CouponClaimEvent, CouponClaimRecord, CouponSession
|
||||
from app.repositories.coupon_state import record_claims, session_app_env
|
||||
|
||||
|
||||
@@ -49,6 +49,7 @@ def test_record_claims_stamps_app_env() -> None:
|
||||
assert row.app_env == "prod"
|
||||
assert row.status == "already_claimed"
|
||||
finally:
|
||||
db.execute(delete(CouponClaimEvent).where(CouponClaimEvent.trace_id == "t-stamp"))
|
||||
db.execute(delete(CouponClaimRecord).where(CouponClaimRecord.device_id == dev))
|
||||
db.commit()
|
||||
db.close()
|
||||
|
||||
Reference in New Issue
Block a user