diff --git a/app/api/v1/auth.py b/app/api/v1/auth.py index a8c3141..5627cdf 100644 --- a/app/api/v1/auth.py +++ b/app/api/v1/auth.py @@ -207,7 +207,8 @@ def sms_send(req: SmsSendRequest, request: Request, db: DbSession) -> SmsSendRes check_rate_limits(request, subject=req.device_id, rules=send_rules) try: - cooldown = send_code(req.phone) + send_result = send_code(req.phone) + cooldown = send_result.cooldown_sec except SmsError as e: risk_repo.record_behavior_event( db, @@ -238,7 +239,9 @@ def sms_send(req: SmsSendRequest, request: Request, db: DbSession) -> SmsSendRes phone=req.phone, client_ip=_client_ip(request), outcome="success", - details={"mock": settings.SMS_MOCK}, + details={"mock": settings.SMS_MOCK, + "provider": send_result.provider, + "fallback": send_result.fallback}, evaluate_rule=risk_repo.RULE_SMS_HOURLY, ) diff --git a/tests/test_auth.py b/tests/test_auth.py index 42d9add..bdf068c 100644 --- a/tests/test_auth.py +++ b/tests/test_auth.py @@ -68,6 +68,29 @@ def test_sms_login_and_me_flow(client) -> None: assert r.json()["ok"] is True +def test_sms_send_records_provider_and_fallback_in_details(client, monkeypatch) -> None: + """批次3(Task 6):sms_send 成功后风控流水 details 带 provider/fallback。 + mock 默认走极光主(SMS_FALLBACK_PROVIDER 空)→ provider=jiguang、fallback=False。 + (回归:修复前 send_code 返回 SendResult 被塞进 cooldown_sec:int → 500,此处 200 断言即挡住。)""" + from app.repositories import risk as risk_repo + + captured: dict = {} + orig = risk_repo.record_behavior_event + + def _spy(db, **kw): + if kw.get("event_type") == risk_repo.EVENT_SMS_SEND and kw.get("outcome") == "success": + captured.update(kw.get("details") or {}) + return orig(db, **kw) + + monkeypatch.setattr(risk_repo, "record_behavior_event", _spy) + + r = client.post("/api/v1/auth/sms/send", + json={"phone": "13800009999", "device_id": "dev-provider-test"}) + assert r.status_code == 200, r.text + assert captured.get("provider") == "jiguang" + assert captured.get("fallback") is False + + def test_sms_send_too_frequent(client) -> None: phone = "13900139000" assert client.post("/api/v1/auth/sms/send", json={"phone": phone}).status_code == 200