test_wx_qr_session.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. """wx_qr_session 状态机与一次性消费。"""
  2. import time
  3. from unittest.mock import patch
  4. from app.services import wx_qr_session as s
  5. _patcher = None
  6. def setup_function():
  7. global _patcher
  8. s._memory_clear_for_tests()
  9. _patcher = patch.object(s, "_redis", return_value=None)
  10. _patcher.start()
  11. def teardown_function():
  12. global _patcher
  13. if _patcher:
  14. _patcher.stop()
  15. _patcher = None
  16. def test_create_pending_and_get():
  17. sid, short = s.create_session(ttl_sec=60)
  18. assert sid and short and len(short) <= 32
  19. data = s.get_session(sid)
  20. assert data["status"] == "pending"
  21. assert s.resolve_session_id(short) == sid
  22. def test_mark_scanned():
  23. sid, _ = s.create_session(ttl_sec=60)
  24. assert s.mark_scanned(sid) is True
  25. assert s.get_session(sid)["status"] == "scanned"
  26. def test_mark_success_consume_once():
  27. sid, _ = s.create_session(ttl_sec=60)
  28. payload = {"token": "t", "refreshToken": "r", "expiresIn": 1, "userInfo": {}}
  29. assert s.mark_success(sid, payload) is True
  30. first = s.consume_success(sid)
  31. assert first["token"] == "t"
  32. assert s.consume_success(sid) is None
  33. assert s.get_session(sid)["status"] == "consumed"
  34. def test_mark_failed():
  35. sid, _ = s.create_session(ttl_sec=60)
  36. assert s.mark_failed(sid, "未找到员工") is True
  37. assert s.get_session(sid)["status"] == "failed"
  38. assert s.get_session(sid)["message"] == "未找到员工"
  39. def test_expire_old_session():
  40. sid, _ = s.create_session(ttl_sec=1)
  41. time.sleep(1.1)
  42. assert s.get_session(sid) is None or s.get_session(sid)["status"] == "expired"
  43. def test_invalidate():
  44. sid, _ = s.create_session(ttl_sec=60)
  45. s.invalidate(sid)
  46. data = s.get_session(sid)
  47. assert data is None or data["status"] == "expired"