Files
baiyue-logistics-chat/tests/test_tool_validation.py
T

48 lines
2.1 KiB
Python

"""Malformed model numbers must become rejected arguments, not stream errors."""
import json
import unittest
from logistics_chat.chat_tools import validate_calls, validate_value
class ToolValidationTests(unittest.TestCase):
def test_huge_json_integers_are_rejected_without_float_conversion(self):
for number in (10 ** 400, -(10 ** 400)):
with self.subTest(sign=number > 0):
with self.assertRaisesRegex(ValueError, 'Invalid tool number'):
validate_value(number, {'type': 'number'})
def test_nonfinite_floats_are_rejected(self):
for number in (float('nan'), float('inf'), float('-inf')):
with self.subTest(number=number):
with self.assertRaisesRegex(ValueError, 'Invalid tool number'):
validate_value(number, {'type': 'number'})
def test_numeric_boundaries_keep_accepting_valid_ints_and_floats(self):
schema = {'type': 'number', 'minimum': -10, 'maximum': 10}
for number in (-10, 0, 10, -9.5, 9.5):
with self.subTest(number=number):
validate_value(number, schema)
for number in (-11, 11, -10.5, 10.5):
with self.subTest(number=number):
with self.assertRaisesRegex(ValueError, 'Invalid tool number'):
validate_value(number, schema)
def test_boolean_is_not_a_numeric_tool_argument(self):
with self.assertRaisesRegex(ValueError, 'Invalid tool value type'):
validate_value(True, {'type': 'number'})
def test_quote_tool_rejects_huge_weight_as_a_validation_error(self):
arguments = {'question': '美国货物报价', 'request': 'quote', 'selection': 'current',
'services': [], 'policy_topic': 'auto',
'shipment': {'total_weight_kg': 10 ** 400}}
message = {'tool_calls': [{'id': 'synthetic_call', 'type': 'function',
'function': {'name': 'quote_shipping', 'arguments': json.dumps(arguments)}}]}
with self.assertRaises(ValueError):
validate_calls(message)
if __name__ == '__main__':
unittest.main()