| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- import unittest
- from unittest.mock import patch
- from app import GatewayApp
- from services.api_client import ApiClient, JsonTransport
- from services.token_store import InMemoryTokenStore
- from tools.query_order import QueryOrderTool
- class DummyTransport:
- def __init__(self):
- self.calls = []
- def post_json(self, url, payload, headers, timeout):
- self.calls.append(
- {
- 'url': url,
- 'payload': payload,
- 'headers': headers,
- 'timeout': timeout,
- }
- )
- if url.endswith('/mcp/tools/listEnabledTools'):
- return {
- 'code': 'MCP_0000',
- 'msg': 'success',
- 'data': {
- 'tool_codes': [
- 'query_order',
- 'query_track',
- 'query_order_exact',
- 'list_order_filter_options',
- ],
- },
- }
- return {
- 'code': 'MCP_0000',
- 'msg': 'success',
- 'data': {
- 'summary': 'ok',
- 'records': [],
- 'tips': [],
- },
- 'meta': {
- 'request_id': headers.get('X-Request-Id', ''),
- },
- }
- class BomHttpResponse:
- def __init__(self, body):
- self.body = body
- def __enter__(self):
- return self
- def __exit__(self, exc_type, exc_value, traceback):
- return False
- def read(self):
- return self.body
- class GatewayQueryOrderTest(unittest.TestCase):
- def test_gateway_lists_query_order_tool(self):
- store = InMemoryTokenStore(refresh_skew_seconds=60)
- store.save('MT_demo', '2099-01-01T00:00:00')
- app = GatewayApp(api_client=ApiClient(
- base_url='http://tools.example.test',
- token_store=store,
- transport=DummyTransport(),
- ))
- tools = app.list_tools()
- by_name = {tool['name']: tool for tool in tools}
- self.assertIn('query_order', by_name)
- self.assertIn('query_order_exact', by_name)
- self.assertIn('list_order_filter_options', by_name)
- self.assertIn('keyword', by_name['query_order']['input_schema']['required'])
- def test_json_transport_accepts_utf8_bom_response(self):
- transport = JsonTransport()
- body = b'\xef\xbb\xbf{"code":"MCP_0000","data":{"summary":"ok"}}'
- with patch('urllib.request.urlopen', return_value=BomHttpResponse(body)):
- response = transport.post_json(
- 'http://tools.example.test/mcp/tools/queryOrder',
- {'keyword': 'SO20260706001'},
- {},
- 8,
- )
- self.assertEqual('MCP_0000', response['code'])
- self.assertEqual('ok', response['data']['summary'])
- def test_api_client_adds_mcp_headers_when_calling_tool(self):
- transport = DummyTransport()
- store = InMemoryTokenStore(refresh_skew_seconds=60)
- store.save('MT_demo', '2099-01-01T00:00:00')
- client = ApiClient(
- base_url='http://tools.example.test',
- token_store=store,
- transport=transport,
- timeout=8,
- )
- response = client.call_tool(
- tool_code='query_order',
- route_path='/mcp/tools/queryOrder',
- payload={'keyword': 'SO20260706001', 'page': 1, 'limit': 20},
- request_id='rq_demo',
- )
- self.assertEqual('MCP_0000', response['code'])
- self.assertEqual(1, len(transport.calls))
- self.assertEqual('Bearer MT_demo', transport.calls[0]['headers']['Authorization'])
- self.assertEqual('query_order', transport.calls[0]['headers']['X-MCP-Tool-Code'])
- self.assertEqual('rq_demo', transport.calls[0]['headers']['X-Request-Id'])
- self.assertEqual('http://tools.example.test/mcp/tools/queryOrder', transport.calls[0]['url'])
- def test_api_client_lists_enabled_tools_without_tool_headers(self):
- transport = DummyTransport()
- store = InMemoryTokenStore(refresh_skew_seconds=60)
- store.save('MT_demo', '2099-01-01T00:00:00')
- client = ApiClient(
- base_url='http://tools.example.test',
- token_store=store,
- transport=transport,
- timeout=8,
- )
- response = client.list_enabled_tools()
- self.assertEqual('MCP_0000', response['code'])
- self.assertEqual(
- 'http://tools.example.test/mcp/tools/listEnabledTools',
- transport.calls[0]['url'],
- )
- self.assertEqual({}, transport.calls[0]['payload'])
- self.assertEqual(
- {'Authorization': 'Bearer MT_demo'},
- transport.calls[0]['headers'],
- )
- def test_query_order_tool_normalizes_input_before_forwarding(self):
- transport = DummyTransport()
- store = InMemoryTokenStore(refresh_skew_seconds=60)
- store.save('MT_demo', '2099-01-01T00:00:00')
- client = ApiClient(
- base_url='http://tools.example.test',
- token_store=store,
- transport=transport,
- timeout=8,
- )
- tool = QueryOrderTool(api_client=client)
- tool.call(keyword=' SO20260706001 ', page=2, limit=15, request_id='rq_tool')
- self.assertEqual(
- {
- 'keyword': 'SO20260706001',
- 'page': 2,
- 'limit': 15,
- },
- transport.calls[0]['payload'],
- )
- self.assertEqual('http://tools.example.test/mcp/tools/queryOrder', transport.calls[0]['url'])
- if __name__ == '__main__':
- unittest.main()
|