feat(user): username 对外展示 + 默认昵称 + 存量回填
代提工作区既有的他人在制品(非本次 CPS);CPS 迁移链 cps_tables 依赖其 b3f1a2c4d5e6 迁移,需一并提交。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -206,3 +206,40 @@ def test_sms_gc_purges_stale_only(monkeypatch) -> None:
|
||||
assert "stale" not in sms._codes and "fresh" in sms._codes
|
||||
assert "old" not in sms._last_sent and "recent" in sms._last_sent
|
||||
assert "yesterday" not in sms._daily_count and "today" in sms._daily_count
|
||||
|
||||
|
||||
# ============================ 用户名 / 默认昵称 ============================
|
||||
|
||||
def test_login_assigns_username_and_nickname(client) -> None:
|
||||
"""新用户创建即分配:11 位纯数字 username(首位非 0/1,与手机号天然区分)+ 9 位字母数字默认昵称。"""
|
||||
phone = "13600136000"
|
||||
client.post("/api/v1/auth/sms/send", json={"phone": phone})
|
||||
r = client.post("/api/v1/auth/sms/login", json={"phone": phone, "code": "123456"})
|
||||
assert r.status_code == 200, r.text
|
||||
user = r.json()["user"]
|
||||
|
||||
uname = user["username"]
|
||||
assert uname.isdigit() and len(uname) == 11 # 11 位纯数字
|
||||
assert uname[0] not in ("0", "1") # 无前导 0、与手机号(均以 1 开头)区分
|
||||
|
||||
nick = user["nickname"]
|
||||
assert nick and len(nick) == 9 and nick.isalnum() # 9 位字母+数字
|
||||
|
||||
|
||||
def test_username_stable_and_unique_on_relogin() -> None:
|
||||
"""同号重登 username 不变(不可变标识);不同号 username 不同(唯一)。
|
||||
直连 repository 绕开 HTTP 短信冷却。"""
|
||||
from app.db.session import SessionLocal
|
||||
from app.repositories import user as user_repo
|
||||
|
||||
db = SessionLocal()
|
||||
try:
|
||||
a1 = user_repo.upsert_user_for_login(db, phone="13522220001", register_channel="sms")
|
||||
uname_a, id_a = a1.username, a1.id
|
||||
a2 = user_repo.upsert_user_for_login(db, phone="13522220001", register_channel="sms")
|
||||
assert a2.id == id_a and a2.username == uname_a # 重登:同一行、username 稳定不变
|
||||
|
||||
b = user_repo.upsert_user_for_login(db, phone="13522220002", register_channel="sms")
|
||||
assert b.username != uname_a # 不同用户、username 唯一
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
Reference in New Issue
Block a user