Skip to main content
Glama
validate_all_fixes.py9.71 kB
#!/usr/bin/env python3 """ Comprehensive FreeCAD AI Fix Validation Test This script validates all the fixes we've implemented for the FreeCAD AI system: 1. Document creation crash fix 2. Agent manager initialization 3. Provider service availability 4. Tools registry functionality """ import os import sys import datetime import traceback import importlib # Add paths to sys.path script_dir = os.path.dirname(os.path.abspath(__file__)) freecad_ai_dir = os.path.join(script_dir, 'freecad-ai') if freecad_ai_dir not in sys.path: sys.path.insert(0, freecad_ai_dir) def log_test_result(test_name: str, success: bool, message: str = ""): """Log a test result with formatting.""" status = "✅ PASS" if success else "❌ FAIL" print(f"{status} {test_name}") if message: print(f" {message}") def test_document_creation_fix(): """Test the document creation crash fix.""" print("\n=== Testing Document Creation Fix ===") try: # Test 1: Check if FreeCAD bridge has headless wrapper from src.mcp_freecad.connections.freecad_connection_bridge import FreeCADBridge bridge = FreeCADBridge() # Check if the method exists has_headless_wrapper = hasattr(bridge, '_wrap_script_for_headless') log_test_result("Bridge has headless wrapper", has_headless_wrapper) # Test 2: Check if bridge is available is_available = bridge.is_available() log_test_result("Bridge is available", is_available, f"Available: {is_available}") return True except Exception as e: log_test_result("Document creation fix", False, f"Error: {e}") return False def test_primitives_tool_fix(): """Test the primitives tool document handling fix.""" print("\n=== Testing Primitives Tool Fix ===") try: # Test if primitives tool has the helper method from tools.primitives import PrimitivesTool primitives = PrimitivesTool() has_helper_method = hasattr(primitives, '_ensure_document_exists') log_test_result("PrimitivesTool has _ensure_document_exists", has_helper_method) # Test advanced primitives too from tools.advanced_primitives import AdvancedPrimitivesTool adv_primitives = AdvancedPrimitivesTool() has_adv_helper_method = hasattr(adv_primitives, '_ensure_document_exists') log_test_result("AdvancedPrimitivesTool has _ensure_document_exists", has_adv_helper_method) return has_helper_method and has_adv_helper_method except Exception as e: log_test_result("Primitives tool fix", False, f"Error: {e}") return False def test_agent_manager_fix(): """Test the agent manager naming fix.""" print("\n=== Testing Agent Manager Fix ===") try: # Test 1: Check if agent_manager.py exists (symbolic link) agent_manager_path = os.path.join(freecad_ai_dir, "ai", "agent_manager.py") file_exists = os.path.exists(agent_manager_path) log_test_result("agent_manager.py file exists", file_exists, f"Path: {agent_manager_path}") # Test 2: Try importing as agent_manager try: from ai.agent_manager import AIManager log_test_result("Import ai.agent_manager.AIManager", True) # Test 3: Try creating instance try: ai_manager = AIManager() log_test_result("Create AIManager instance", True) # Test basic functionality has_add_provider = hasattr(ai_manager, 'add_provider') log_test_result("AIManager has add_provider method", has_add_provider) return True except Exception as e: log_test_result("Create AIManager instance", False, f"Error: {e}") return False except ImportError as e: log_test_result("Import ai.agent_manager.AIManager", False, f"Import error: {e}") return False except Exception as e: log_test_result("Agent manager fix", False, f"Error: {e}") return False def test_provider_service_fix(): """Test the provider service implementation.""" print("\n=== Testing Provider Service Fix ===") try: # Test 1: Check if provider_service.py exists provider_service_path = os.path.join(freecad_ai_dir, "api", "provider_service.py") file_exists = os.path.exists(provider_service_path) log_test_result("provider_service.py file exists", file_exists, f"Path: {provider_service_path}") # Test 2: Try importing ProviderService try: from api.provider_service import ProviderService, get_provider_service log_test_result("Import api.provider_service", True) # Test 3: Try creating instance try: provider_service = ProviderService() log_test_result("Create ProviderService instance", True) # Test basic functionality is_available = provider_service.is_available() log_test_result("ProviderService is available", is_available) # Test global instance global_service = get_provider_service() log_test_result("Get global ProviderService", global_service is not None) return True except Exception as e: log_test_result("Create ProviderService instance", False, f"Error: {e}") return False except ImportError as e: log_test_result("Import api.provider_service", False, f"Import error: {e}") return False except Exception as e: log_test_result("Provider service fix", False, f"Error: {e}") return False def test_file_structure(): """Test that all expected files and links are in place.""" print("\n=== Testing File Structure ===") expected_files = [ ("freecad-ai/__init__.py", "FreeCAD AI main init"), ("freecad-ai/ai/__init__.py", "AI module init"), ("freecad-ai/ai/ai_manager.py", "AI Manager implementation"), ("freecad-ai/ai/agent_manager.py", "Agent Manager link"), ("freecad-ai/api/__init__.py", "API module init"), ("freecad-ai/api/provider_service.py", "Provider Service implementation"), ("freecad-ai/tools/__init__.py", "Tools module init"), ("freecad-ai/tools/primitives.py", "Primitives tool"), ("freecad-ai/tools/advanced_primitives.py", "Advanced primitives tool"), ] all_exist = True for relative_path, description in expected_files: full_path = os.path.join(script_dir, relative_path) exists = os.path.exists(full_path) log_test_result(f"{description} exists", exists, f"Path: {relative_path}") if not exists: all_exist = False return all_exist def test_import_compatibility(): """Test that imports work as expected after fixes.""" print("\n=== Testing Import Compatibility ===") import_tests = [ ("tools.primitives", "PrimitivesTool"), ("tools.advanced_primitives", "AdvancedPrimitivesTool"), ("ai.ai_manager", "AIManager"), ("ai.agent_manager", "AIManager"), ("api.provider_service", "ProviderService"), ] all_imports_work = True for module_name, class_name in import_tests: try: module = importlib.import_module(module_name) has_class = hasattr(module, class_name) log_test_result(f"Import {module_name}.{class_name}", has_class) if not has_class: all_imports_work = False except ImportError as e: log_test_result(f"Import {module_name}.{class_name}", False, f"Import error: {e}") all_imports_work = False except Exception as e: log_test_result(f"Import {module_name}.{class_name}", False, f"Error: {e}") all_imports_work = False return all_imports_work def main(): """Run all validation tests.""" print("=" * 60) print("FreeCAD AI Complete Fix Validation") print(f"Started: {datetime.datetime.now().isoformat()}") print("=" * 60) # Run all tests test_results = { "Document Creation Fix": test_document_creation_fix(), "Primitives Tool Fix": test_primitives_tool_fix(), "Agent Manager Fix": test_agent_manager_fix(), "Provider Service Fix": test_provider_service_fix(), "File Structure": test_file_structure(), "Import Compatibility": test_import_compatibility(), } # Summary print("\n" + "=" * 60) print("VALIDATION SUMMARY") print("=" * 60) passed = 0 total = len(test_results) for test_name, result in test_results.items(): status = "✅ PASS" if result else "❌ FAIL" print(f"{status} {test_name}") if result: passed += 1 print(f"\nOverall: {passed}/{total} tests passed") if passed == total: print("🎉 ALL FIXES VALIDATED SUCCESSFULLY!") print("The FreeCAD AI system should now work without crashes.") else: print("⚠️ Some fixes need attention.") print("Check the individual test results above.") print(f"\nCompleted: {datetime.datetime.now().isoformat()}") if __name__ == "__main__": main()

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jango-blockchained/mcp-freecad'

If you have feedback or need assistance with the MCP directory API, please join our Discord server