test_mp_webview_ticket.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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 eval(self, script, numkeys, *keys_and_args):
  17. key = keys_and_args[0]
  18. val = self.data.get(key)
  19. if val is not None:
  20. self.data.pop(key, None)
  21. return val
  22. def test_issue_and_consume_signed():
  23. ticket = svc.issue_ticket("u1", "sid-1", "rj-1")
  24. assert ticket.startswith(svc.SIGNED_PREFIX)
  25. payload = svc.consume_ticket(ticket)
  26. assert payload["userId"] == "u1"
  27. assert payload["sessionId"] == "sid-1"
  28. assert payload["refreshJti"] == "rj-1"
  29. # 签名票在 TTL 内可再次兑换(兼容 web-view 二次加载)
  30. assert svc.consume_ticket(ticket)["userId"] == "u1"
  31. def test_consume_unknown_uuid_returns_none():
  32. fake = FakeRedis()
  33. with patch.object(svc, "get_sync_redis_client", return_value=fake):
  34. assert svc.consume_ticket("missing") is None
  35. def test_issue_without_redis_still_signed():
  36. with patch.object(svc, "get_sync_redis_client", return_value=None):
  37. ticket = svc.issue_ticket("u1", "sid-1", "rj-1")
  38. assert ticket.startswith(svc.SIGNED_PREFIX)
  39. payload = svc.consume_ticket(ticket)
  40. assert payload["userId"] == "u1"
  41. assert payload["sessionId"] == "sid-1"
  42. def test_consume_legacy_uuid_from_redis():
  43. fake = FakeRedis()
  44. tid = "AABBCCDDEEFF00112233445566778899"
  45. fake.set(
  46. svc._key(tid),
  47. '{"userId":"u1","sessionId":"sid-1","refreshJti":"rj-1"}',
  48. ex=60,
  49. nx=True,
  50. )
  51. with patch.object(svc, "get_sync_redis_client", return_value=fake):
  52. payload = svc.consume_ticket(tid)
  53. assert payload["userId"] == "u1"
  54. assert svc.consume_ticket(tid) is None
  55. def test_consume_uuid_without_redis_raises():
  56. with patch.object(svc, "get_sync_redis_client", return_value=None):
  57. with pytest.raises(RuntimeError, match="Redis"):
  58. svc.consume_ticket("AABBCCDDEEFF00112233445566778899")