From 3146224944dcd280cd2543b46eaac1ed71cd2c57 Mon Sep 17 00:00:00 2001 From: guke Date: Mon, 13 Jul 2026 15:31:46 +0800 Subject: [PATCH] =?UTF-8?q?test(auth):=20=E8=A1=A5=20jverify=20=E7=BB=91?= =?UTF-8?q?=E5=8F=B7=20401/502=20=E9=94=99=E8=AF=AF=E5=88=86=E6=94=AF?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- tests/test_wechat_login.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/tests/test_wechat_login.py b/tests/test_wechat_login.py index d98b768..84504c5 100644 --- a/tests/test_wechat_login.py +++ b/tests/test_wechat_login.py @@ -167,3 +167,32 @@ def test_wechat_bind_jverify_creates_account(client, monkeypatch) -> None: assert user["nickname"] == "极光用户" # 微信 userinfo 隐私脱敏 avatar=None → 头像为空(客户端兜底默认头像) assert user["avatar_url"] is None + + +def test_wechat_bind_jverify_expired_ticket_returns_401(client, monkeypatch) -> None: + """过期 bind_ticket → 401(极光绑号路径,decode 先于极光核验)。""" + monkeypatch.setattr(security.settings, "WECHAT_BIND_TICKET_EXPIRE_MINUTES", -1) + expired = security.create_bind_ticket(openid="openid_jv_exp", wechat_nickname="x", wechat_avatar_url=None) + r = client.post( + "/api/v1/auth/wechat/bind-phone/jverify", + json={"bind_ticket": expired, "login_token": "jgtoken", "device_id": "devE"}, + ) + assert r.status_code == 401, r.text + + +def test_wechat_bind_jverify_jiguang_error_returns_502(client, monkeypatch) -> None: + """极光核验失败(JiguangError)→ 502。""" + monkeypatch.setattr(wxpay, "code_to_userinfo", _fake_userinfo("openid_jv_err")) + + def _raise(token: str) -> str: + raise auth.JiguangError("mock jg failure") + + monkeypatch.setattr(auth, "verify_and_get_phone", _raise) + ticket = client.post( + "/api/v1/auth/wechat-login", json={"code": "c", "device_id": "devE"} + ).json()["bind_ticket"] + r = client.post( + "/api/v1/auth/wechat/bind-phone/jverify", + json={"bind_ticket": ticket, "login_token": "badtoken", "device_id": "devE"}, + ) + assert r.status_code == 502, r.text