feat(invite): 发奖规则 v2 改 v3 — 绑定双方都不发钱

- 绑定不再给被邀请人发新人金币(去掉拉新即时激励); 双方绑定时都不发钱、只建归因关系
- 邀请人收益仍走"好友成功比价后发 2 元邀请奖励金"(不变, 见 try_reward_on_compare)
- 删 INVITE_INVITEE_COINS / INVITE_INVITER_COINS 常量; 绑定成功文案去掉"金币已到账"
- 跟进测试: test_invite 断言绑定双方金币=0; 修 test_welfare 账户接口补 invite_cash_balance_cents 断言
This commit is contained in:
xiebing
2026-06-26 20:47:14 +08:00
parent 5adf90dbff
commit 1efacddd8c
6 changed files with 46 additions and 43 deletions
+9 -10
View File
@@ -1,4 +1,4 @@
"""好友邀请测试:邀请码、绑定双方发金币、幂等、自邀/无效码屏蔽、指纹兜底归因。
"""好友邀请测试:邀请码、绑定(双方不发钱)、幂等、自邀/无效码屏蔽、指纹兜底归因。
用 sms mock 登录拿 token(同 test_welfare),再跑邀请闭环。
"""
@@ -10,7 +10,6 @@ from sqlalchemy import select
from app.core.rewards import (
INVITE_FP_WINDOW_DAYS,
INVITE_INVITEE_COINS,
INVITE_NEW_USER_WINDOW_HOURS,
)
from app.db.session import SessionLocal
@@ -55,8 +54,8 @@ def test_invite_me_returns_stable_code(client) -> None:
assert _my_code(client, token) == body["invite_code"]
def test_bind_flow_invitee_gets_coins(client) -> None:
"""v2:B 用 A 的码绑定 → 只有被邀请人 B 得新人金币;邀请人 A 绑定时不发(改比价发现金)。"""
def test_bind_flow_no_coins_either_side(client) -> None:
"""v3:B 用 A 的码绑定 → 双方都不发钱(被邀请人无奖励、邀请人改比价发现金)。"""
a = _login(client, "13800002002")
b = _login(client, "13800002003")
a_code = _my_code(client, a)
@@ -68,13 +67,13 @@ def test_bind_flow_invitee_gets_coins(client) -> None:
assert r.status_code == 200, r.text
res = r.json()
assert res["status"] == "success"
assert res["coins_awarded"] == INVITE_INVITEE_COINS
assert res["coins_awarded"] == 0
# 被邀请人金币到账;邀请人绑定时不发金币(v2 改"好友比价发 2 元邀请奖励金")
assert _coin_balance(client, b) == INVITE_INVITEE_COINS
# 绑定后双方金币都不增(邀请人收益改走"好友比价发 2 元邀请奖励金")
assert _coin_balance(client, b) == 0
assert _coin_balance(client, a) == 0
# A 的战绩:已邀 1 人;金币口径收益 0(邀请人收益走邀请奖励金,见 try_reward_on_compare)
# A 的战绩:已邀 1 人;金币口径收益 0(邀请人收益走邀请奖励金,见 try_reward_on_compare)
r = client.get("/api/v1/invite/me", headers=_auth(a))
assert r.json()["invited_count"] == 1
assert r.json()["coins_earned"] == 0
@@ -216,9 +215,9 @@ def test_bind_by_fingerprint_success(client) -> None:
)
assert r2.status_code == 200, r2.text
assert r2.json()["status"] == "success"
# v2:只被邀请人发新人金币;邀请人绑定不发(改比价发现金)
# v3:绑定双方都不发钱(被邀请人无奖励、邀请人改比价发现金)
assert _coin_balance(client, a) == 0
assert _coin_balance(client, b) == INVITE_INVITEE_COINS
assert _coin_balance(client, b) == 0
def test_bind_by_fingerprint_not_found(client) -> None:
+2 -2
View File
@@ -1,5 +1,5 @@
"""邀请 v2 比价发奖测试:好友完成成功比价 → 邀请人得邀请奖励金(独立账户),幂等只发一次,
账户隔离不串金币/现金。被邀请人保留"绑定即得新人金币"由 test_invite.py 覆盖。
"""邀请 v3 比价发奖测试:好友完成成功比价 → 邀请人得邀请奖励金(独立账户),幂等只发一次,
账户隔离不串金币/现金。被邀请人绑定不得任何奖励由 test_invite.py 覆盖。
"""
from __future__ import annotations
+6 -1
View File
@@ -46,7 +46,12 @@ def test_account_auto_created_empty(client) -> None:
r = client.get("/api/v1/wallet/account", headers=_auth(token))
assert r.status_code == 200, r.text
body = r.json()
assert body == {"coin_balance": 0, "cash_balance_cents": 0, "total_coin_earned": 0}
assert body == {
"coin_balance": 0,
"cash_balance_cents": 0,
"invite_cash_balance_cents": 0, # v2 账户隔离新增(邀请奖励金,与现金隔离)
"total_coin_earned": 0,
}
def test_signin_flow(client) -> None: