|
|
@@ -0,0 +1,85 @@
|
|
|
+import unittest
|
|
|
+from unittest.mock import Mock
|
|
|
+
|
|
|
+from app import GatewayApp
|
|
|
+from public_gateway import PublicGatewayApp
|
|
|
+from services.output_presenter import OutputPresenter
|
|
|
+from tools.trial_goods_tax import TrialGoodsTaxTool
|
|
|
+
|
|
|
+
|
|
|
+class TrialGoodsTaxToolTest(unittest.TestCase):
|
|
|
+ def test_call_forwards_required_fields(self):
|
|
|
+ client = Mock()
|
|
|
+ client.call_tool.return_value = {'code': 'MCP_0000'}
|
|
|
+ TrialGoodsTaxTool(client).call(
|
|
|
+ sku=' SKU-1 ',
|
|
|
+ departure_country=' CN ',
|
|
|
+ destination_country='us',
|
|
|
+ price=10,
|
|
|
+ qty=2,
|
|
|
+ gross_weight=1.5,
|
|
|
+ box=1,
|
|
|
+ )
|
|
|
+ client.call_tool.assert_called_once_with(
|
|
|
+ 'trial_goods_tax',
|
|
|
+ '/mcp/tools/trialGoodsTax',
|
|
|
+ {
|
|
|
+ 'sku': 'SKU-1',
|
|
|
+ 'departure_country': 'CN',
|
|
|
+ 'destination_country': 'US',
|
|
|
+ 'price': 10,
|
|
|
+ 'qty': 2,
|
|
|
+ 'gross_weight': 1.5,
|
|
|
+ 'box': 1,
|
|
|
+ },
|
|
|
+ 'rq_trial_goods_tax',
|
|
|
+ )
|
|
|
+
|
|
|
+ def test_call_rejects_country_name(self):
|
|
|
+ tool = TrialGoodsTaxTool(api_client=Mock())
|
|
|
+ with self.assertRaises(ValueError):
|
|
|
+ tool.call(
|
|
|
+ sku='SKU-1', departure_country='中国', destination_country='US',
|
|
|
+ price=10, qty=1, gross_weight=1, box=1,
|
|
|
+ )
|
|
|
+
|
|
|
+ def test_call_rejects_zero_price(self):
|
|
|
+ tool = TrialGoodsTaxTool(api_client=Mock())
|
|
|
+ with self.assertRaises(ValueError):
|
|
|
+ tool.call(
|
|
|
+ sku='SKU-1', departure_country='CN', destination_country='US',
|
|
|
+ price=0, qty=1, gross_weight=1, box=1,
|
|
|
+ )
|
|
|
+
|
|
|
+ def test_registries_match(self):
|
|
|
+ local = GatewayApp().registered_tool_names()
|
|
|
+ public = PublicGatewayApp(None, None).registered_tool_names()
|
|
|
+ self.assertEqual(local, public)
|
|
|
+ self.assertIn('trial_goods_tax', local)
|
|
|
+ self.assertEqual(36, len(local))
|
|
|
+ self.assertIn('trial_goods_tax', OutputPresenter.SAFE_TOOLS)
|
|
|
+
|
|
|
+ def test_presenter_renders_amount(self):
|
|
|
+ result = OutputPresenter().present('trial_goods_tax', {
|
|
|
+ 'code': 'MCP_0000',
|
|
|
+ 'data': {
|
|
|
+ 'estimated_tax': 12.5,
|
|
|
+ 'sku': 'SKU-1',
|
|
|
+ 'departure_country': 'CN',
|
|
|
+ 'destination_country': 'US',
|
|
|
+ },
|
|
|
+ 'meta': {'request_id': 'rq1'},
|
|
|
+ })
|
|
|
+ self.assertFalse(result['is_error'])
|
|
|
+ self.assertEqual(12.5, result['structured_content']['estimated_tax'])
|
|
|
+ self.assertIn('预计关税金额', result['text'])
|
|
|
+
|
|
|
+ def test_presenter_keeps_safe_failure_message(self):
|
|
|
+ result = OutputPresenter().present('trial_goods_tax', {
|
|
|
+ 'code': 'MCP_1501',
|
|
|
+ 'msg': '未找到已审核商品',
|
|
|
+ 'data': [],
|
|
|
+ 'meta': {'request_id': 'rq1'},
|
|
|
+ })
|
|
|
+ self.assertTrue(result['is_error'])
|
|
|
+ self.assertEqual('未找到已审核商品', result['structured_content']['message'])
|