55 lines
2.2 KiB
Python
55 lines
2.2 KiB
Python
"""逐次单券事件不能被同设备同日的每日去重记录串场。"""
|
|
|
|
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()
|