test_mp_webview_ticket.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. from unittest.mock import patch
  2. import pytest
  3. from app.services import mp_webview_ticket as svc
  4. class FakeRedis:
  5. def __init__(self):
  6. self.data = {}
  7. def set(self, key, value, ex=None, nx=False):
  8. if nx and key in self.data:
  9. return False
  10. self.data[key] = value
  11. return True
  12. def get(self, key):
  13. return self.data.get(key)
  14. def delete(self, key):
  15. return 1 if self.data.pop(key, None) is not None else 0
  16. def getdel(self, key):
  17. return self.data.pop(key, None)
  18. def test_issue_and_consume_once():
  19. fake = FakeRedis()
  20. with patch.object(svc, "get_sync_redis_client", return_value=fake):
  21. ticket = svc.issue_ticket("u1", "sid-1", "rj-1")
  22. payload = svc.consume_ticket(ticket)
  23. assert payload["userId"] == "u1"
  24. assert payload["sessionId"] == "sid-1"
  25. assert payload["refreshJti"] == "rj-1"
  26. assert svc.consume_ticket(ticket) is None
  27. def test_consume_unknown_returns_none():
  28. fake = FakeRedis()
  29. with patch.object(svc, "get_sync_redis_client", return_value=fake):
  30. assert svc.consume_ticket("missing") is None
  31. def test_issue_without_redis_raises():
  32. with patch.object(svc, "get_sync_redis_client", return_value=None):
  33. with pytest.raises(RuntimeError, match="Redis"):
  34. svc.issue_ticket("u1", "sid-1")
  35. def test_consume_without_redis_raises():
  36. with patch.object(svc, "get_sync_redis_client", return_value=None):
  37. with pytest.raises(RuntimeError, match="Redis"):
  38. svc.consume_ticket("any-ticket")