test_gateway_runtime.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import unittest
  2. from datetime import datetime, timedelta
  3. from app import GatewayApp
  4. from services.token_store import InMemoryTokenStore
  5. class DummyAuthClient:
  6. def __init__(self, token_store):
  7. self.token_store = token_store
  8. self.exchange_calls = []
  9. self.refresh_calls = []
  10. def exchange(self, auth_code):
  11. self.exchange_calls.append(auth_code)
  12. self.token_store.save('MT_exchange', '2099-01-01T00:00:00')
  13. return {
  14. 'code': 'MCP_0000',
  15. 'msg': 'success',
  16. 'data': {
  17. 'mcp_token': 'MT_exchange',
  18. 'expire_time': '2099-01-01T00:00:00',
  19. },
  20. }
  21. def refresh(self, mcp_token):
  22. self.refresh_calls.append(mcp_token)
  23. self.token_store.save('MT_refresh', '2099-01-02T00:00:00')
  24. return {
  25. 'code': 'MCP_0000',
  26. 'msg': 'success',
  27. 'data': {
  28. 'mcp_token': 'MT_refresh',
  29. 'expire_time': '2099-01-02T00:00:00',
  30. },
  31. }
  32. class DummyApiClient:
  33. def __init__(self):
  34. self.calls = []
  35. def call_tool(self, tool_code, route_path, payload, request_id):
  36. self.calls.append(
  37. {
  38. 'tool_code': tool_code,
  39. 'route_path': route_path,
  40. 'payload': payload,
  41. 'request_id': request_id,
  42. }
  43. )
  44. return {
  45. 'code': 'MCP_0000',
  46. 'msg': 'success',
  47. 'data': {
  48. 'summary': 'ok',
  49. 'records': [],
  50. 'tips': [],
  51. },
  52. 'meta': {
  53. 'request_id': request_id,
  54. },
  55. }
  56. class GatewayRuntimeTest(unittest.TestCase):
  57. def test_bind_exchanges_auth_code_and_persists_token(self):
  58. store = InMemoryTokenStore(refresh_skew_seconds=60)
  59. app = GatewayApp(
  60. auth_client=DummyAuthClient(store),
  61. api_client=DummyApiClient(),
  62. token_store=store,
  63. )
  64. response = app.bind('AUTH123')
  65. self.assertEqual('MCP_0000', response['code'])
  66. self.assertEqual('MT_exchange', store.get()['token'])
  67. def test_call_tool_refreshes_expiring_token_and_generates_request_id(self):
  68. store = InMemoryTokenStore(refresh_skew_seconds=60)
  69. expiring_time = (datetime.now() + timedelta(seconds=10)).isoformat(timespec='seconds')
  70. store.save('MT_old', expiring_time)
  71. auth_client = DummyAuthClient(store)
  72. api_client = DummyApiClient()
  73. app = GatewayApp(
  74. auth_client=auth_client,
  75. api_client=api_client,
  76. token_store=store,
  77. )
  78. response = app.call_tool('query_order', {'keyword': 'SO20260706001'})
  79. self.assertEqual(['MT_old'], auth_client.refresh_calls)
  80. self.assertEqual('MT_refresh', store.get()['token'])
  81. self.assertEqual('query_order', api_client.calls[0]['tool_code'])
  82. self.assertTrue(api_client.calls[0]['request_id'].startswith('rq_'))
  83. self.assertEqual(api_client.calls[0]['request_id'], response['meta']['request_id'])
  84. if __name__ == '__main__':
  85. unittest.main()