From 946efe7d64a7ee096efa9c0f706847caa459dc29 Mon Sep 17 00:00:00 2001 From: guke Date: Fri, 24 Jul 2026 16:12:25 +0800 Subject: [PATCH] =?UTF-8?q?test(withdraw):=20=E8=A1=A5=20invite=5Fcash=20?= =?UTF-8?q?=E5=B9=B6=E5=8F=91=E5=9C=A8=E9=80=94=E7=94=A8=E4=BE=8B=20+=20?= =?UTF-8?q?=E6=B8=85=E7=90=86=E8=BF=87=E6=9C=9F=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 审查发现:取消「一人一单」后,create_withdraw 的档位闸注释与 test_invite_cash_withdraw 中若干注释仍引用已删除的「在途互斥」。 - create_withdraw 注释去掉「在途互斥」措辞 - test_two_accounts_withdraw_independent 文案修正;source_filter 用例移除已非必需的 reject(断言不变) - 新增 test_invite_cash_multiple_in_flight_allowed:两笔 invite_cash 在途并存、各扣邀请奖励金、不串金币现金 Co-Authored-By: Claude Opus 4.8 --- app/repositories/wallet.py | 2 +- tests/test_invite_cash_withdraw.py | 41 ++++++++++++++++++++++++++---- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/app/repositories/wallet.py b/app/repositories/wallet.py index 66231c7..4337752 100644 --- a/app/repositories/wallet.py +++ b/app/repositories/wallet.py @@ -751,7 +751,7 @@ def create_withdraw( out_bill_no = uuid.uuid4().hex # 福利页档位闸(7-9):coin_cash 只能提预设档位,且该档今日可提(服务端权威口径,防绕过 - # 客户端刷)。放在幂等返回/在途互斥之后:同号重试仍原样返回旧单,不被档位闸误杀。 + # 客户端刷)。放在幂等返回之后:同号重试仍原样返回旧单,不被档位闸误杀。 # allow_sub_min(0.01 调试直发)保持原样放行,不受档位约束;invite_cash 本轮无档位概念不校验。 if source == "coin_cash" and not allow_sub_min: tier_state = next( diff --git a/tests/test_invite_cash_withdraw.py b/tests/test_invite_cash_withdraw.py index 5b83110..bfa5096 100644 --- a/tests/test_invite_cash_withdraw.py +++ b/tests/test_invite_cash_withdraw.py @@ -128,8 +128,7 @@ def test_invite_cash_reject_refunds_invite_account(client, monkeypatch) -> None: def test_two_accounts_withdraw_independent(client, monkeypatch) -> None: - """两账户各提各的不串:先提 invite_cash(拒绝结清),再提 cash,各扣各账户。 - 注:一个用户同一时间只能一个活跃提现单(跨账户),故第二笔需先结清第一笔。""" + """两账户各提各的不串:提 invite_cash(拒绝→验证退款回原账户),再提 cash,各扣各账户互不串。""" _patch_userinfo(monkeypatch, "openid_ic_3") token = _login(client, "13800004003") _seed_balances(client, token, "13800004003", cash=400, invite_cash=500) @@ -140,7 +139,7 @@ def test_two_accounts_withdraw_independent(client, monkeypatch) -> None: json={"amount_cents": 200, "source": "invite_cash"}, headers=_auth(token), ) - _reject(r1.json()["out_bill_no"]) # 退回 invite_cash + 结清活跃单 + _reject(r1.json()["out_bill_no"]) # 拒绝退回 invite_cash(验证退款回原账户) r2 = client.post( "/api/v1/wallet/withdraw", # 50 分 = 0.5 元档(7-9 起 coin_cash 只能提预设档位) @@ -154,6 +153,39 @@ def test_two_accounts_withdraw_independent(client, monkeypatch) -> None: assert cash == 350 # 扣了 cash 50 +def test_invite_cash_multiple_in_flight_allowed(client, monkeypatch) -> None: + """取消「同时仅一单」:invite_cash 无档位上限,已有在途时仍可继续提交,多笔并存各扣 invite_cash。""" + _patch_userinfo(monkeypatch, "openid_ic_multi") + token = _login(client, "13800004006") + _seed_balances(client, token, "13800004006", cash=0, invite_cash=500) + client.post("/api/v1/wallet/bind-wechat", json={"code": "c"}, headers=_auth(token)) + + r1 = client.post( + "/api/v1/wallet/withdraw", + json={"amount_cents": 200, "source": "invite_cash", "out_bill_no": "billicflight0001"}, + headers=_auth(token), + ) + assert r1.status_code == 200, r1.text + assert r1.json()["status"] == "reviewing" + + r2 = client.post( + "/api/v1/wallet/withdraw", + json={"amount_cents": 200, "source": "invite_cash", "out_bill_no": "billicflight0002"}, + headers=_auth(token), + ) + assert r2.status_code == 200, r2.text + assert r2.json()["status"] == "reviewing" + + # 两笔 invite_cash 在途并存,共扣 400(500→100),金币现金不动 + cash, invite_cash = _balances(client, token) + assert invite_cash == 100 and cash == 0 + orders = client.get( + "/api/v1/wallet/withdraw-orders", params={"source": "invite_cash"}, headers=_auth(token) + ).json()["items"] + reviewing = [o for o in orders if o["status"] == "reviewing"] + assert len(reviewing) == 2 + + def test_invite_me_returns_reward_stats(client) -> None: """/invite/me 返回 reward_balance_cents(可提现奖励金)。""" token = _login(client, "13800004004") @@ -170,12 +202,11 @@ def test_withdraw_orders_source_filter(client, monkeypatch) -> None: _seed_balances(client, token, "13800004005", cash=400, invite_cash=500) client.post("/api/v1/wallet/bind-wechat", json={"code": "c"}, headers=_auth(token)) - r1 = client.post( + client.post( "/api/v1/wallet/withdraw", json={"amount_cents": 200, "source": "invite_cash"}, headers=_auth(token), ) - _reject(r1.json()["out_bill_no"]) # 结清,才能提第二笔 client.post( "/api/v1/wallet/withdraw", # 50 分 = 0.5 元档(7-9 起 coin_cash 只能提预设档位)