test(wallet): 防残组测试补跨游标前置断言(游标须落在会话两成员 id 间)

否则 seeding 顺序若变,用例会退化成非跨游标却仍通过、失守护意义。
(code-review Task 5 的建议)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
guke
2026-08-07 16:10:02 +08:00
parent 36fb654f33
commit 4c1821363c
+8
View File
@@ -570,6 +570,11 @@ def test_coin_transactions_pagination_no_phantom_regroup(client) -> None:
_seed_coin(db, user.id, 40, "signin", remark="每日签到奖励") # id=n+3
_seed_coin(db, user.id, 4, "feed_ad_reward_comparison", trace_id="t1", ref_id="e2", remark="比价奖励") # id=n+4 = t1 的 rep
db.commit()
t1_ids = db.execute(
select(CoinTransaction.id)
.where(CoinTransaction.user_id == user.id, CoinTransaction.trace_id == "t1")
.order_by(CoinTransaction.id)
).scalars().all()
# 第 1 页(limit=2):按 rep 降序 = [t1(rep=n+4, 合计 9), signin(n+3, 40)]
p1 = client.get("/api/v1/wallet/coin-transactions?limit=2", headers=_auth(token)).json()
assert len(p1["items"]) == 2
@@ -577,6 +582,9 @@ def test_coin_transactions_pagination_no_phantom_regroup(client) -> None:
assert p1["items"][0]["amount"] == 9 and p1["items"][0]["merged_count"] == 2
assert p1["items"][1]["biz_type"] == "signin" and p1["items"][1]["amount"] == 40
assert p1["next_cursor"] is not None
# 前置条件:游标(第1页末条 rep)必须严格落在 t1 两成员 id 之间,才是真正的「跨游标」场景;
# 否则用例会退化成非跨游标、悄悄测错形状仍通过,失去回归守护意义。
assert t1_ids[0] < p1["next_cursor"] < t1_ids[-1]
# 第 2 页:只剩另一条 signin(30);t1 的 rep 在游标上,成员虽在游标下也不得成残组重复
p2 = client.get(
f"/api/v1/wallet/coin-transactions?limit=2&cursor={p1['next_cursor']}",