test_wechat_login_resolve.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. from types import SimpleNamespace
  2. from unittest.mock import MagicMock, patch
  3. from app.services.wechat_login_service import resolve_wechat_login_user
  4. def test_openid_bound_phone_mismatch_rejects():
  5. bound = SimpleNamespace(id="u1", phone_no="13800138000", wx_openid="oid-a")
  6. db = MagicMock()
  7. with patch(
  8. "app.services.wechat_login_service.user_crud.get_by_wx_openid",
  9. return_value=bound,
  10. ):
  11. user, err, code = resolve_wechat_login_user(
  12. db, openid="oid-a", phone="13900139000"
  13. )
  14. assert user is None
  15. assert code == 401
  16. assert "不一致" in err or "不匹配" in err
  17. def test_openid_bound_phone_match_ok():
  18. bound = SimpleNamespace(id="u1", phone_no="13800138000", wx_openid="oid-a")
  19. db = MagicMock()
  20. with patch(
  21. "app.services.wechat_login_service.user_crud.get_by_wx_openid",
  22. return_value=bound,
  23. ):
  24. user, err, code = resolve_wechat_login_user(
  25. db, openid="oid-a", phone="+8613800138000"
  26. )
  27. assert user is bound
  28. assert err is None
  29. assert code is None
  30. def test_unbound_no_user_rejects():
  31. db = MagicMock()
  32. with patch(
  33. "app.services.wechat_login_service.user_crud.get_by_wx_openid",
  34. return_value=None,
  35. ), patch(
  36. "app.services.wechat_login_service.user_crud.list_active_by_phone_no",
  37. return_value=[],
  38. ):
  39. user, err, code = resolve_wechat_login_user(
  40. db, openid="oid-new", phone="13800138000"
  41. )
  42. assert user is None
  43. assert code == 401
  44. def test_unbound_multi_user_rejects():
  45. db = MagicMock()
  46. u1 = SimpleNamespace(id="a", phone_no="13800138000", wx_openid=None)
  47. u2 = SimpleNamespace(id="b", phone_no="13800138000", wx_openid=None)
  48. with patch(
  49. "app.services.wechat_login_service.user_crud.get_by_wx_openid",
  50. return_value=None,
  51. ), patch(
  52. "app.services.wechat_login_service.user_crud.list_active_by_phone_no",
  53. return_value=[u1, u2],
  54. ):
  55. user, err, code = resolve_wechat_login_user(
  56. db, openid="oid-new", phone="13800138000"
  57. )
  58. assert user is None
  59. assert code == 400
  60. assert "多个" in err
  61. def test_unbound_unique_binds_openid():
  62. db = MagicMock()
  63. u = SimpleNamespace(id="a", phone_no="13800138000", wx_openid=None, update_time=None)
  64. with patch(
  65. "app.services.wechat_login_service.user_crud.get_by_wx_openid",
  66. side_effect=[None, None],
  67. ), patch(
  68. "app.services.wechat_login_service.user_crud.list_active_by_phone_no",
  69. return_value=[u],
  70. ):
  71. user, err, code = resolve_wechat_login_user(
  72. db, openid="oid-new", phone="13800138000"
  73. )
  74. assert err is None
  75. assert user is u
  76. assert u.wx_openid == "oid-new"
  77. db.commit.assert_called()