test_fuel_rate_tools.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. import unittest
  2. from tools.query_fuel_rate_list import QueryFuelRateListTool
  3. from tools.save_fuel_rate import SaveFuelRateTool
  4. from tools.enable_fuel_rate import EnableFuelRateTool
  5. from app import GatewayApp
  6. from public_gateway import PublicGatewayApp
  7. from services.output_presenter import OutputPresenter
  8. class FuelRateToolTest(unittest.TestCase):
  9. def test_tools_are_registered_on_base_backend(self):
  10. local = GatewayApp().registered_tool_names()
  11. public = PublicGatewayApp(None, None).registered_tool_names()
  12. self.assertEqual(local, public)
  13. self.assertIn('query_fuel_rate_list', local)
  14. self.assertIn('save_fuel_rate', local)
  15. self.assertIn('enable_fuel_rate', local)
  16. self.assertEqual('base', QueryFuelRateListTool.backend)
  17. self.assertEqual('base', SaveFuelRateTool.backend)
  18. self.assertEqual('base', EnableFuelRateTool.backend)
  19. def test_query_posts_exact_filters(self):
  20. client = FakeClient()
  21. QueryFuelRateListTool(api_client=client).call(
  22. fuel_no=' RY12 ',
  23. product='美国专线',
  24. price_type='销售燃油',
  25. status=3,
  26. start_date='2026-10-21',
  27. page=2,
  28. limit=20,
  29. request_id='rq_fuel_list',
  30. )
  31. self.assertEqual('query_fuel_rate_list', client.calls[0][0])
  32. self.assertEqual('/mcp/tools/queryFuelRateList', client.calls[0][1])
  33. self.assertEqual({
  34. 'page': 2,
  35. 'limit': 20,
  36. 'fuel_no': 'RY12',
  37. 'product': '美国专线',
  38. 'price_type': '销售燃油',
  39. 'status': '3',
  40. 'start_date': '2026-10-21',
  41. }, client.calls[0][2])
  42. def test_save_posts_condition_item(self):
  43. client = FakeClient()
  44. SaveFuelRateTool(api_client=client).call(
  45. price_type=1,
  46. start_date='2026-10-21',
  47. items=[{
  48. 'fuel_ratio': 0.15,
  49. 'conditions': [{
  50. 'condition': '物流产品',
  51. 'group': '1',
  52. 'condition_value': '美国专线',
  53. }],
  54. }],
  55. request_id='rq_fuel_save',
  56. )
  57. self.assertEqual('/mcp/tools/saveFuelRate', client.calls[0][1])
  58. self.assertEqual({
  59. 'price_type': '1',
  60. 'start_date': '2026-10-21',
  61. 'items': [{
  62. 'fuel_ratio': '0.1500',
  63. 'conditions': [{
  64. 'condition': '物流产品',
  65. 'group': '1',
  66. 'condition_value': '美国专线',
  67. }],
  68. }],
  69. }, client.calls[0][2])
  70. def test_save_edit_posts_fuel_no(self):
  71. client = FakeClient()
  72. SaveFuelRateTool(api_client=client).call(
  73. fuel_no=' RY12 ',
  74. price_type='销售燃油',
  75. start_date='2026-10-22',
  76. items=[{
  77. 'fuel_ratio': '0.2000',
  78. 'conditions': [{
  79. 'condition': '物流产品',
  80. 'group': '1',
  81. 'condition_value': '美国专线',
  82. }],
  83. }],
  84. )
  85. self.assertEqual('RY12', client.calls[0][2]['fuel_no'])
  86. self.assertEqual('销售燃油', client.calls[0][2]['price_type'])
  87. self.assertEqual(1, len(client.calls[0][2]['items']))
  88. def test_save_edit_rejects_multiple_items(self):
  89. tool = SaveFuelRateTool(api_client=FakeClient())
  90. item = {
  91. 'fuel_ratio': '0.2000',
  92. 'conditions': [{
  93. 'condition': '物流产品',
  94. 'group': '1',
  95. 'condition_value': '美国专线',
  96. }],
  97. }
  98. with self.assertRaises(ValueError):
  99. tool.call(
  100. fuel_no='RY12',
  101. price_type=1,
  102. start_date='2026-10-22',
  103. items=[item, item],
  104. )
  105. def test_presenter_keeps_missing_condition_message(self):
  106. result = OutputPresenter().present('save_fuel_rate', {
  107. 'code': 'MCP_1401',
  108. 'msg': '第1条物流产品条件值[美国专线]不存在或未启用',
  109. 'data': {},
  110. 'meta': {'request_id': 'rq_fuel_save'},
  111. })
  112. self.assertIn('不存在或未启用', str(result))
  113. def test_presenter_shows_fuel_list(self):
  114. columns = [
  115. {'key': key, 'name': name}
  116. for key, name in (
  117. ('fuel_no', '燃油代码'),
  118. ('price_type_name', '燃油类型'),
  119. ('status_name', '状态'),
  120. ('source', '来源'),
  121. )
  122. ]
  123. result = OutputPresenter().present('query_fuel_rate_list', {
  124. 'code': 'MCP_0000',
  125. 'msg': 'success',
  126. 'data': {
  127. 'summary': '共查询到 1 条燃油系数',
  128. 'columns': columns,
  129. 'records': [{
  130. 'fuel_no': 'RY12',
  131. 'price_type_name': '销售燃油',
  132. 'status_name': '启用',
  133. 'source': 'MCP',
  134. }],
  135. 'tips': [],
  136. },
  137. 'meta': {'request_id': 'rq_fuel_list', 'page': 1, 'limit': 20, 'total': 1},
  138. })
  139. rendered = str(result)
  140. self.assertIn('RY12', rendered)
  141. self.assertIn('MCP', rendered)
  142. def test_enable_posts_fuel_numbers(self):
  143. client = FakeClient()
  144. EnableFuelRateTool(api_client=client).call(fuel_no=[' RY12 ', 'RY13', 'RY12'])
  145. self.assertEqual('enable_fuel_rate', client.calls[0][0])
  146. self.assertEqual('/mcp/tools/enableFuelRate', client.calls[0][1])
  147. self.assertEqual(['RY12', 'RY13'], client.calls[0][2]['fuel_no'])
  148. def test_enable_rejects_empty_list(self):
  149. with self.assertRaises(ValueError):
  150. EnableFuelRateTool(api_client=FakeClient()).call(fuel_no=[])
  151. def test_presenter_keeps_already_enabled_message(self):
  152. result = OutputPresenter().present('enable_fuel_rate', {
  153. 'code': 'MCP_1401',
  154. 'msg': '燃油系数RY12已启用',
  155. 'data': {},
  156. 'meta': {'request_id': 'rq_fuel_enable'},
  157. })
  158. self.assertIn('已启用', str(result))
  159. def test_presenter_shows_enabled_fuel(self):
  160. result = OutputPresenter().present('enable_fuel_rate', {
  161. 'code': 'MCP_0000',
  162. 'msg': 'success',
  163. 'data': {
  164. 'summary': '已启用 1 条燃油系数',
  165. 'columns': [
  166. {'key': 'fuel_no', 'name': '燃油代码'},
  167. {'key': 'status_text', 'name': '状态'},
  168. ],
  169. 'records': [{'fuel_no': 'RY12', 'status_text': '启用'}],
  170. 'tips': [],
  171. },
  172. 'meta': {'request_id': 'rq_fuel_enable'},
  173. })
  174. rendered = str(result)
  175. self.assertIn('RY12', rendered)
  176. self.assertIn('启用', rendered)
  177. class FakeClient:
  178. def __init__(self):
  179. self.calls = []
  180. def call_tool(self, name, route, payload, request_id):
  181. self.calls.append((name, route, payload, request_id))
  182. return {'ok': True}
  183. if __name__ == '__main__':
  184. unittest.main()