#!/usr/bin/env python3
"""
Test that invalid field names are properly skipped.
"""
import logging
from tool_function_factory import is_valid_parameter_name, extract_parameters_from_schema
# Setup logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
def test_is_valid_parameter_name():
"""Test the is_valid_parameter_name function."""
logger.info("=" * 80)
logger.info("Testing is_valid_parameter_name()")
logger.info("=" * 80)
test_cases = [
# (name, expected_result)
("field_name", True),
("fieldName", True),
("field123", True),
("_private", True),
("__dunder__", True),
("is_process_legitimated_?", False), # The problematic field
("user-name", False),
("field name", False),
("123field", False),
("field.name", False),
("field@name", False),
("field$name", False),
]
passed = 0
failed = 0
for name, expected in test_cases:
result = is_valid_parameter_name(name)
status = "✅" if result == expected else "❌"
if result == expected:
passed += 1
else:
failed += 1
logger.info(f"{status} '{name}' -> {result} (expected {expected})")
logger.info(f"\nResults: {passed} passed, {failed} failed")
return failed == 0
def test_extract_parameters_with_invalid_names():
"""Test that extract_parameters_from_schema skips invalid field names."""
logger.info("\n" + "=" * 80)
logger.info("Testing extract_parameters_from_schema() with invalid names")
logger.info("=" * 80)
# Sample schema with both valid and invalid field names
schema = {
"type": "object",
"properties": {
"subject": {
"type": "string",
"description": "Request subject"
},
"description": {
"type": "string",
"description": "Request description"
},
"is_process_legitimated_?": { # Invalid name
"type": "boolean",
"description": "Process legitimation flag"
},
"user-name": { # Invalid name
"type": "string",
"description": "User name"
},
"priority": {
"type": "string",
"description": "Priority level"
},
"field.with.dots": { # Invalid name
"type": "string",
"description": "Field with dots"
},
"valid_field": {
"type": "string",
"description": "Valid field"
}
},
"required": ["subject"]
}
logger.info(f"Schema has {len(schema['properties'])} total fields")
# Extract parameters
params = extract_parameters_from_schema(schema)
logger.info(f"\nExtracted {len(params)} valid parameters:")
for param in params:
logger.info(f" ✅ {param['name']} ({param['type'].__name__})")
# Check that invalid fields were skipped
param_names = [p['name'] for p in params]
expected_valid = ["subject", "description", "priority", "valid_field"]
expected_invalid = ["is_process_legitimated_?", "user-name", "field.with.dots"]
logger.info(f"\nValidation:")
all_valid_included = all(name in param_names for name in expected_valid)
no_invalid_included = all(name not in param_names for name in expected_invalid)
if all_valid_included:
logger.info(f" ✅ All valid fields included")
else:
logger.error(f" ❌ Some valid fields missing")
if no_invalid_included:
logger.info(f" ✅ All invalid fields skipped")
else:
logger.error(f" ❌ Some invalid fields were not skipped")
return all_valid_included and no_invalid_included
if __name__ == "__main__":
logger.info("\n" + "=" * 80)
logger.info("INVALID FIELD NAME HANDLING TEST")
logger.info("=" * 80 + "\n")
test1_passed = test_is_valid_parameter_name()
test2_passed = test_extract_parameters_with_invalid_names()
logger.info("\n" + "=" * 80)
logger.info("TEST SUMMARY")
logger.info("=" * 80)
if test1_passed:
logger.info("✅ is_valid_parameter_name() test PASSED")
else:
logger.error("❌ is_valid_parameter_name() test FAILED")
if test2_passed:
logger.info("✅ extract_parameters_from_schema() test PASSED")
else:
logger.error("❌ extract_parameters_from_schema() test FAILED")
if test1_passed and test2_passed:
logger.info("\n🎉 All tests PASSED!")
exit(0)
else:
logger.error("\n❌ Some tests FAILED")
exit(1)