test_gateway_session_store.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import unittest
  2. from services.gateway_session_store import GatewaySessionStore
  3. class FakeRedis:
  4. def __init__(self):
  5. self.values = {}
  6. self.deleted = []
  7. def set(self, key, value, ex=None):
  8. self.values[key] = {'value': value, 'ex': ex}
  9. return True
  10. def get(self, key):
  11. item = self.values.get(key)
  12. return None if item is None else item['value']
  13. def delete(self, key):
  14. self.deleted.append(key)
  15. self.values.pop(key, None)
  16. return 1
  17. class GatewaySessionStoreTest(unittest.TestCase):
  18. def test_save_and_get_session_by_hashed_gateway_session_id(self):
  19. redis = FakeRedis()
  20. store = GatewaySessionStore(redis, prefix='fms:mcp:gateway:', ttl_seconds=3600)
  21. store.save('GWS_employee_a', {
  22. 'mcp_token': 'MT_A',
  23. 'admin_id': 1,
  24. 'company_id': 10,
  25. })
  26. session = store.get('GWS_employee_a')
  27. self.assertEqual('MT_A', session['mcp_token'])
  28. self.assertEqual(1, session['admin_id'])
  29. self.assertNotIn('GWS_employee_a', list(redis.values.keys())[0])
  30. self.assertEqual(3600, list(redis.values.values())[0]['ex'])
  31. def test_two_gateway_sessions_do_not_overlap(self):
  32. redis = FakeRedis()
  33. store = GatewaySessionStore(redis, prefix='fms:mcp:gateway:', ttl_seconds=3600)
  34. store.save('GWS_employee_a', {'mcp_token': 'MT_A'})
  35. store.save('GWS_employee_b', {'mcp_token': 'MT_B'})
  36. self.assertEqual('MT_A', store.get('GWS_employee_a')['mcp_token'])
  37. self.assertEqual('MT_B', store.get('GWS_employee_b')['mcp_token'])
  38. def test_delete_removes_only_current_session(self):
  39. redis = FakeRedis()
  40. store = GatewaySessionStore(redis, prefix='fms:mcp:gateway:', ttl_seconds=3600)
  41. store.save('GWS_employee_a', {'mcp_token': 'MT_A'})
  42. store.save('GWS_employee_b', {'mcp_token': 'MT_B'})
  43. store.delete('GWS_employee_a')
  44. self.assertIsNone(store.get('GWS_employee_a'))
  45. self.assertEqual('MT_B', store.get('GWS_employee_b')['mcp_token'])
  46. def test_touch_session_updates_last_access_time(self):
  47. redis = FakeRedis()
  48. store = GatewaySessionStore(redis, prefix='fms:mcp:gateway:', ttl_seconds=3600)
  49. store.save('GWS_employee_a', {'mcp_token': 'MT_A'})
  50. touched = store.touch_session('GWS_employee_a')
  51. self.assertIsNotNone(touched)
  52. self.assertIn('last_access_time', touched)
  53. self.assertTrue(touched['last_access_time'].endswith('Z'))
  54. self.assertEqual(touched['last_access_time'], store.get('GWS_employee_a')['last_access_time'])
  55. if __name__ == '__main__':
  56. unittest.main()