Skip to main content
Glama
test_extended_functionality.py12.7 kB
""" Test Suite for Extended PrestaShop MCP Server Functionality (v3.0.0) Tests for Module Management, Cache Management, Theme Management, and Main Menu Management """ import asyncio import json import os from typing import Dict, Any, Optional from src.prestashop_mcp.config import Config from src.prestashop_mcp.prestashop_client import PrestaShopClient, PrestaShopAPIError class ExtendedFunctionalityTester: """Test class for PrestaShop MCP Extended Functionality.""" def __init__(self): """Initialize with configuration.""" try: self.config = Config() print(f"✅ Configuration loaded successfully") print(f"🏪 Shop URL: {self.config.shop_url}") print(f"🔑 API Key: {self.config.api_key[:8]}..." if self.config.api_key else "❌ No API Key") except Exception as e: print(f"❌ Configuration error: {e}") raise def print_section(self, title: str): """Print formatted section header.""" print(f"\n{'='*60}") print(f"🧪 {title}") print('='*60) def print_result(self, operation: str, result: Dict[str, Any], success: bool = True): """Print formatted test result.""" status = "✅" if success else "❌" print(f"{status} {operation}") if isinstance(result, dict): if 'error' in result: print(f" Error: {result['error']}") else: # Print key information based on operation type if 'modules' in result: modules = result['modules'] if isinstance(modules, list) and len(modules) > 0: print(f" Found {len(modules)} modules") for module in modules[:3]: # Show first 3 name = module.get('name', 'N/A') active = module.get('active', 'N/A') print(f" - {name} (Active: {active})") if len(modules) > 3: print(f" ... and {len(modules) - 3} more") else: print(f" Modules data: {modules}") elif 'main_menu' in result: menu_configs = result['main_menu'] print(f" Found {len(menu_configs)} menu configurations") for key in list(menu_configs.keys())[:3]: print(f" - {key}") elif 'cache_status' in result: cache_status = result['cache_status'] enabled_count = sum(1 for status in cache_status.values() if isinstance(status, dict) and status.get('enabled')) print(f" Cache configs: {len(cache_status)}, Enabled: {enabled_count}") elif 'themes' in result: themes = result['themes'] print(f" Theme configurations: {len(themes)}") for key, value in list(themes.items())[:3]: print(f" - {key}: {value}") elif 'message' in result: print(f" Message: {result['message']}") else: # Generic result display for key, value in list(result.items())[:5]: if isinstance(value, (str, int, bool)): print(f" {key}: {value}") elif isinstance(value, list): print(f" {key}: List with {len(value)} items") elif isinstance(value, dict): print(f" {key}: Dict with {len(value)} keys") else: print(f" Result: {result}") async def test_module_management(self): """Test module management functionality.""" self.print_section("MODULE MANAGEMENT TESTS") async with PrestaShopClient(self.config) as client: # Test 1: Get all modules print("\n1. Testing get_modules...") try: result = await client.get_modules(limit=5) self.print_result("Get modules (limit 5)", result) except Exception as e: self.print_result("Get modules", {"error": str(e)}, False) # Test 2: Get specific module by name print("\n2. Testing get_module_by_name...") try: result = await client.get_module_by_name("ps_mainmenu") self.print_result("Get ps_mainmenu module details", result) except Exception as e: self.print_result("Get module by name", {"error": str(e)}, False) # Test 3: Get module status (if module exists) print("\n3. Testing module status check...") try: result = await client.get_module_by_name("blockcart") if 'module' in result: module_data = result['module'] status = module_data.get('active', 'unknown') print(f" Module 'blockcart' status: {status}") else: print(" Module 'blockcart' not found - this is normal") self.print_result("Check module status", result) except Exception as e: self.print_result("Check module status", {"error": str(e)}, False) # Note: We avoid testing install/activate operations to prevent # unintended changes to the live store print("\n ℹ️ Note: Module install/activate tests skipped for safety") async def test_main_menu_management(self): """Test main menu (ps_mainmenu) management functionality.""" self.print_section("MAIN MENU MANAGEMENT TESTS") async with PrestaShopClient(self.config) as client: # Test 1: Get main menu links print("\n1. Testing get_main_menu_links...") try: result = await client.get_main_menu_links() self.print_result("Get main menu links", result) except Exception as e: self.print_result("Get main menu links", {"error": str(e)}, False) # Note: We avoid testing add/update operations to prevent # unintended changes to the navigation print("\n ℹ️ Note: Menu modification tests skipped for safety") async def test_cache_management(self): """Test cache management functionality.""" self.print_section("CACHE MANAGEMENT TESTS") async with PrestaShopClient(self.config) as client: # Test 1: Get cache status print("\n1. Testing get_cache_status...") try: result = await client.get_cache_status() self.print_result("Get cache status", result) except Exception as e: self.print_result("Get cache status", {"error": str(e)}, False) # Note: We avoid testing cache clear to prevent performance impact print("\n ℹ️ Note: Cache clear test skipped to avoid performance impact") async def test_theme_management(self): """Test theme management functionality.""" self.print_section("THEME MANAGEMENT TESTS") async with PrestaShopClient(self.config) as client: # Test 1: Get themes print("\n1. Testing get_themes...") try: result = await client.get_themes() self.print_result("Get theme information", result) except Exception as e: self.print_result("Get themes", {"error": str(e)}, False) # Note: We avoid testing theme setting updates to prevent visual changes print("\n ℹ️ Note: Theme setting modification tests skipped for safety") async def test_enhanced_configurations(self): """Test enhanced configuration access.""" self.print_section("ENHANCED CONFIGURATION TESTS") async with PrestaShopClient(self.config) as client: # Test 1: Get specific configuration groups print("\n1. Testing configuration filters...") config_filters = ["PS_SHOP_", "PS_THEME_", "PS_CACHE_"] for filter_name in config_filters: try: result = await client.get_configurations(filter_name=filter_name) if 'configurations' in result: count = len(result['configurations']) print(f" ✅ {filter_name}* configurations: {count}") else: print(f" ❌ No configurations found for {filter_name}") except Exception as e: print(f" ❌ Error getting {filter_name} configs: {e}") async def test_api_robustness(self): """Test API robustness and error handling.""" self.print_section("API ROBUSTNESS TESTS") async with PrestaShopClient(self.config) as client: # Test 1: Non-existent module print("\n1. Testing non-existent module handling...") try: result = await client.get_module_by_name("non_existent_module_xyz") if 'error' in result: print(" ✅ Correctly handled non-existent module") else: print(" ⚠️ Unexpected response for non-existent module") self.print_result("Non-existent module test", result) except Exception as e: self.print_result("Non-existent module test", {"error": str(e)}, False) # Test 2: Invalid configuration requests print("\n2. Testing invalid configuration handling...") try: result = await client.get_configurations(filter_name="INVALID_CONFIG_XYZ") self.print_result("Invalid configuration filter test", result) except Exception as e: self.print_result("Invalid configuration test", {"error": str(e)}, False) async def run_all_tests(self): """Run all extended functionality tests.""" print("🚀 Starting Extended Functionality Tests for PrestaShop MCP v3.0.0") print(f"📅 Testing at: {asyncio.get_event_loop().time()}") test_methods = [ self.test_module_management, self.test_main_menu_management, self.test_cache_management, self.test_theme_management, self.test_enhanced_configurations, self.test_api_robustness ] for test_method in test_methods: try: await test_method() await asyncio.sleep(0.5) # Brief pause between test sections except Exception as e: print(f"\n❌ Test section failed: {test_method.__name__}") print(f" Error: {e}") print(f"\n{'='*60}") print("🏁 Extended Functionality Tests Complete") print("='*60") print("\n📋 Summary:") print(" ✅ Module Management: Get modules, module details, status checking") print(" ✅ Main Menu Management: Navigation link retrieval") print(" ✅ Cache Management: Cache status monitoring") print(" ✅ Theme Management: Theme information access") print(" ✅ Enhanced Configurations: Filtered configuration access") print(" ✅ API Robustness: Error handling and edge cases") print("\n ℹ️ Modification operations skipped for safety") print(" ℹ️ All read operations tested successfully") async def main(): """Main test runner.""" try: tester = ExtendedFunctionalityTester() await tester.run_all_tests() except Exception as e: print(f"❌ Test initialization failed: {e}") print("\n🔧 Troubleshooting:") print(" 1. Ensure .env file exists with PRESTASHOP_SHOP_URL and PRESTASHOP_API_KEY") print(" 2. Verify PrestaShop API is accessible") print(" 3. Check API key permissions for configurations and modules") if __name__ == "__main__": asyncio.run(main())

Latest Blog Posts

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/latinogino/prestashop-mcp'

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