#!/usr/bin/env python3
"""
Test tool listing to verify invalid field names are skipped.
"""
import asyncio
import logging
from config import AppConfig
from form_schema_client import FormSchemaClient
from dynamic_tool_manager import DynamicToolManager
from tool_function_factory import extract_parameters_from_schema
# Setup logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
async def test_tool_listing():
"""Test that tool listing works and skips invalid field names."""
logger.info("=" * 80)
logger.info("Testing Tool Listing with Invalid Field Names")
logger.info("=" * 80)
# Initialize components
config = AppConfig.load()
# Create schema client
schema_client = FormSchemaClient(
base_url=config.main_server.base_url,
client_id=config.main_server.client_id,
client_secret=config.main_server.client_secret
)
# Create tool manager
tool_manager = DynamicToolManager(schema_client=schema_client)
# Test with a sample auth token
test_token = "test_token_12345"
logger.info(f"\nFetching schema for token: {test_token[:20]}...")
try:
# Get schema
schema = await schema_client.get_form_schema(
module="request",
auth_token=test_token
)
logger.info(f"✅ Schema fetched successfully")
logger.info(f"Schema has {len(schema.get('properties', {}))} total fields")
# Extract parameters
logger.info("\nExtracting parameters from schema...")
params = extract_parameters_from_schema(schema)
logger.info(f"✅ Extracted {len(params)} valid parameters")
# Show some parameter names
logger.info("\nSample valid parameter names:")
for param in params[:10]:
logger.info(f" - {param['name']} ({param['type'].__name__})")
# Generate tools
logger.info("\nGenerating dynamic tools...")
tools = await tool_manager.generate_tools_for_user(test_token)
logger.info(f"✅ Generated {len(tools)} tools successfully")
for tool in tools:
logger.info(f"\nTool: {tool.name}")
logger.info(f" Description: {tool.description[:100]}...")
logger.info(f" Parameters: {len(tool.input_schema.get('properties', {}))} fields")
logger.info("\n" + "=" * 80)
logger.info("✅ TEST PASSED: Tool listing works correctly")
logger.info("=" * 80)
return True
except Exception as e:
logger.error(f"❌ TEST FAILED: {e}", exc_info=True)
return False
if __name__ == "__main__":
success = asyncio.run(test_tool_listing())
exit(0 if success else 1)