test_wx_qr_session.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. """wx_qr_session 状态机与一次性消费。"""
  2. import time
  3. import pytest
  4. from app.services import wx_qr_session as s
  5. @pytest.fixture(autouse=True)
  6. def force_memory_backend(monkeypatch):
  7. """本地 .env 常有 REDIS_HOST;单测强制走进程内存,避免连真实 Redis。"""
  8. monkeypatch.setattr(s, "_redis", lambda: None)
  9. s._memory_clear_for_tests()
  10. def test_create_pending_and_get():
  11. sid, short = s.create_session(ttl_sec=60)
  12. assert sid and short and len(short) <= 32
  13. data = s.get_session(sid)
  14. assert data["status"] == "pending"
  15. assert s.resolve_session_id(short) == sid
  16. def test_mark_scanned():
  17. sid, _ = s.create_session(ttl_sec=60)
  18. assert s.mark_scanned(sid) is True
  19. assert s.get_session(sid)["status"] == "scanned"
  20. def test_mark_success_consume_once():
  21. sid, _ = s.create_session(ttl_sec=60)
  22. payload = {"token": "t", "refreshToken": "r", "expiresIn": 1, "userInfo": {}}
  23. assert s.mark_success(sid, payload) is True
  24. first = s.consume_success(sid)
  25. assert first["token"] == "t"
  26. assert s.consume_success(sid) is None
  27. assert s.get_session(sid)["status"] == "consumed"
  28. def test_mark_failed():
  29. sid, _ = s.create_session(ttl_sec=60)
  30. assert s.mark_failed(sid, "未找到员工") is True
  31. assert s.get_session(sid)["status"] == "failed"
  32. assert s.get_session(sid)["message"] == "未找到员工"
  33. def test_expire_old_session():
  34. sid, _ = s.create_session(ttl_sec=1)
  35. time.sleep(1.1)
  36. data = s.get_session(sid)
  37. assert data is None or data["status"] == "expired"
  38. def test_invalidate():
  39. sid, _ = s.create_session(ttl_sec=60)
  40. s.invalidate(sid)
  41. data = s.get_session(sid)
  42. assert data is None or data["status"] == "expired"