test_wx_qr_api.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. """web wx-qr create/status API。"""
  2. from types import SimpleNamespace
  3. from unittest.mock import patch
  4. import pytest
  5. from fastapi.testclient import TestClient
  6. from app.main import app
  7. from app.services import wx_qr_session
  8. client = TestClient(app)
  9. @pytest.fixture(autouse=True)
  10. def force_memory_backend(monkeypatch):
  11. monkeypatch.setattr(wx_qr_session, "_redis", lambda: None)
  12. wx_qr_session._memory_clear_for_tests()
  13. def test_wx_qr_create_and_poll_pending():
  14. with patch(
  15. "app.api.public.get_unlimited_wxacode",
  16. return_value=b"\x89PNG\r\n\x1a\n",
  17. ):
  18. r = client.post("/api/web/auth/wx-qr/create")
  19. assert r.status_code == 200
  20. body = r.json()
  21. assert body.get("code") == 200
  22. data = body["data"]
  23. sid = data["sessionId"]
  24. assert data["qrImageBase64"].startswith("data:image/")
  25. st = client.get("/api/web/auth/wx-qr/status", params={"sessionId": sid})
  26. assert st.status_code == 200
  27. assert st.json()["data"]["status"] == "pending"
  28. def test_web_qr_confirm_success_sets_session():
  29. fake_user = SimpleNamespace(
  30. id="u1", phone_no="13800138000", wx_openid=None, wx_unionid=None, status="1"
  31. )
  32. tokens = {
  33. "token": "access",
  34. "refreshToken": "refresh",
  35. "expiresIn": 3600,
  36. "userInfo": {"id": "u1"},
  37. }
  38. sid, _short = wx_qr_session.create_session(ttl_sec=60)
  39. with patch(
  40. "app.api.mini_auth.code2session",
  41. return_value={"openid": "oid1", "unionid": ""},
  42. ), patch(
  43. "app.api.mini_auth.get_phone_number", return_value="13800138000"
  44. ), patch(
  45. "app.api.mini_auth.resolve_wechat_login_user",
  46. return_value=(fake_user, None, None),
  47. ), patch(
  48. "app.api.mini_auth.issue_web_login_tokens", return_value=tokens
  49. ):
  50. r = client.post(
  51. "/api/mini/auth/web-qr-confirm",
  52. json={"sessionId": sid, "loginCode": "lc", "phoneCode": "pc"},
  53. )
  54. assert r.status_code == 200
  55. body = r.json()
  56. assert body.get("code") == 200
  57. assert body["data"].get("ok") is True
  58. assert "token" not in (body.get("data") or {})
  59. consumed = wx_qr_session.consume_success(sid)
  60. assert consumed and consumed["token"] == "access"