feat(invite): 好友列表已比价状态 + DEV 造虚拟好友接口; fix(deploy): 每日兑换定时器锁北京时区 (#104)
## 改动概述 本 PR 含两个主题(关联 7-1 邀请页 / 兑换时区工作)。 ### 1. 邀请好友列表「已比价」状态 - `get_invitees` 返回新增 `is_compared` 字段(= `compare_reward_granted`)。 客户端据此区分好友列表「去提醒 / 邀请成功」、在途列表只取未比价、算在途好友数与在途收益。 - 新增开发接口 `POST/DELETE /invite/seed-fake`(仅非生产, `is_prod` 挡 404): 造未比价 + 已比价虚拟好友, 已比价者走真实入账发 2 元邀请奖励金, 方便真机联调在途 / 好友列表 UI; 清理时原路退回, 不留脏账。 ### 2. 每日兑换定时器时区修复 - `deploy/daily-exchange.service` / `.timer` 锁定 `Asia/Shanghai`, 避免按服务器本地时区在错误时刻触发每日兑换(此前隐患: worker 已用 cn_today, 但 systemd timer 仍按服务器本地时区)。 - 新增 `test_daily_exchange_timezone` 覆盖同一北京日内幂等。 ## 测试 - 邀请 + 兑换时区相关用例全过(`28 passed`)。 - 说明: 仓库预存的 3 个 proxy 转发测试(`test_compare_proxy` / `test_coupon_proxy`)失败, 已在干净 HEAD 上复现确认与本改动无关, 不在本 PR 处理范围。 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: no_gen_mu <liujianhishen@gmail.com> Reviewed-on: #104 Co-authored-by: liujiahui <liujiahui@wonderable.ai> Co-committed-by: liujiahui <liujiahui@wonderable.ai>
This commit was merged in pull request #104.
This commit is contained in:
@@ -73,9 +73,11 @@ def test_bind_flow_no_coins_either_side(client) -> None:
|
||||
assert _coin_balance(client, b) == 0
|
||||
assert _coin_balance(client, a) == 0
|
||||
|
||||
# A 的战绩:已邀 1 人;金币口径收益恒 0(邀请人收益走邀请奖励金,见 try_reward_on_compare)
|
||||
# A 的战绩:此时 invited_count=0 —— 口径 = "完成过一次比价的好友数"(compare_reward_granted=True),
|
||||
# 仅绑定未比价不计入(否则会出现"已邀 1、可提现余额 0",与产品口径"已邀×2=累计提现+余额"对不上;
|
||||
# 见 get_stats 注释 + 需求 spec"邀请好友人数=邀请的完成一次比价的新用户数量")。金币口径收益恒 0。
|
||||
r = client.get("/api/v1/invite/me", headers=_auth(a))
|
||||
assert r.json()["invited_count"] == 1
|
||||
assert r.json()["invited_count"] == 0
|
||||
assert r.json()["coins_earned"] == 0
|
||||
|
||||
|
||||
@@ -322,6 +324,8 @@ def test_invitees_basic(client) -> None:
|
||||
assert all(it["avatar_url"] is None for it in body["items"])
|
||||
# v2:绑定时邀请人那份为 0(收益改"好友比价才发奖"),故每条 coins 字段=0
|
||||
assert all(it["coins"] == 0 for it in body["items"])
|
||||
# 刚绑定还没比价 → is_compared 全 False(客户端据此:在途列表取这些、好友列表按钮"去提醒")
|
||||
assert all(it["is_compared"] is False for it in body["items"])
|
||||
|
||||
|
||||
def test_invitees_order_desc(client) -> None:
|
||||
|
||||
Reference in New Issue
Block a user