#!/usr/bin/env python3
"""
MCP工具本地测试
测试MCP服务器的各种工具功能
"""

import sys
import unittest
from pathlib import Path

# 添加测试工具路径
sys.path.insert(0, str(Path(__file__).parent.parent / 'utils'))
from test_helpers import BaseTestCase, create_test_server_config, create_test_docker_config

class TestMCPTools(BaseTestCase):
    """测试MCP工具功能"""
    
    def test_mcp_server_import(self):
        """测试MCP服务器模块导入"""
        try:
            import mcp_server
            # 检查关键函数是否存在
            self.assertTrue(hasattr(mcp_server, 'create_tools_list'), "MCP服务器应该有create_tools_list函数")
            self.assertTrue(hasattr(mcp_server, 'handle_request'), "MCP服务器应该有handle_request函数")
            self.assertTrue(True, "MCP服务器模块导入成功")
        except ImportError as e:
            self.fail(f"MCP服务器模块导入失败: {e}")
    
    def test_config_manager_tools(self):
        """测试配置管理工具"""
        from config_manager.main import EnhancedConfigManager
        
        # 使用临时配置目录
        config_manager = EnhancedConfigManager()
        
        # 测试关键方法存在
        critical_methods = [
            'quick_setup',
            'guided_setup', 
            'get_existing_servers',
            'preview_docker_wizard_command'
        ]
        
        for method_name in critical_methods:
            self.assert_method_exists(config_manager, method_name)
    
    def test_docker_config_tools(self):
        """测试Docker配置工具"""
        from docker_config_manager import DockerConfigManager
        
        docker_manager = DockerConfigManager()
        
        # 测试关键方法存在
        critical_methods = [
            'create_from_template',
            'create_default_templates'
        ]
        
        for method_name in critical_methods:
            self.assert_method_exists(docker_manager, method_name)
    
    def test_server_config_creation(self):
        """测试服务器配置创建"""
        from config_manager.main import EnhancedConfigManager
        
        config_manager = EnhancedConfigManager()
        
        # 创建测试配置
        test_config = {
            'name': 'test-server',
            'host': '192.168.1.100',
            'username': 'testuser',
            'port': 22,
            'connection_type': 'ssh'
        }
        
        try:
            # 测试获取现有服务器配置不抛出异常
            result = config_manager.get_existing_servers()
            self.assertIsNotNone(result, "获取服务器配置应该返回结果")
        except Exception as e:
            self.fail(f"获取服务器配置失败: {e}")
    
    def test_docker_command_generation(self):
        """测试Docker命令生成"""
        from config_manager.main import EnhancedConfigManager
        
        config_manager = EnhancedConfigManager()
        test_config = create_test_docker_config()
        
        try:
            # 这个方法会打印Docker命令，我们只需要确保它不抛出异常
            config_manager.preview_docker_wizard_command(test_config)
            self.assertTrue(True, "Docker命令生成正常执行")
        except Exception as e:
            self.fail(f"Docker命令生成失败: {e}")
    
    def test_config_file_operations(self):
        """测试配置文件操作"""
        from config_manager.main import EnhancedConfigManager
        
        config_manager = EnhancedConfigManager()
        
        # 测试配置文件路径
        config_path = config_manager.config_path
        self.assertTrue(str(config_path).endswith('.remote-terminal/config.yaml'),
                       "配置文件路径应该使用.remote-terminal目录")
    
    def test_mcp_tool_availability(self):
        """测试MCP工具的可用性"""
        try:
            import mcp_server
            
            # 获取工具列表
            tools = mcp_server.create_tools_list()
            
            # 检查关键工具是否注册
            expected_tools = [
                'list_servers',
                'connect_server', 
                'execute_command',
                'create_server_config',
                'update_server_config'
            ]
            
            tool_names = [tool['name'] for tool in tools]
            
            for expected_tool in expected_tools:
                self.assertIn(expected_tool, tool_names, 
                             f"MCP工具列表应该包含{expected_tool}")
            
            self.assertTrue(True, "MCP工具可用性检查成功")
            
        except Exception as e:
            self.fail(f"MCP工具可用性检查失败: {e}")

class TestConfigurationConsistency(BaseTestCase):
    """测试配置一致性"""
    
    def test_config_directory_consistency(self):
        """测试配置目录一致性"""
        from config_manager.main import EnhancedConfigManager
        from docker_config_manager import DockerConfigManager
        
        enhanced_manager = EnhancedConfigManager()
        docker_manager = DockerConfigManager()
        
        # 检查两个管理器使用相同的配置目录
        enhanced_config_dir = enhanced_manager.config_path.parent
        docker_config_dir = docker_manager.config_dir
        
        self.assertEqual(enhanced_config_dir.name, docker_config_dir.name,
                        "所有配置管理器应该使用相同的配置目录名称")
        
        # 确保都使用.remote-terminal目录
        self.assertEqual(enhanced_config_dir.name, '.remote-terminal',
                        "配置目录应该是.remote-terminal")
        self.assertEqual(docker_config_dir.name, '.remote-terminal',
                        "Docker配置目录应该是.remote-terminal")

if __name__ == '__main__':
    # 运行测试
    unittest.main(verbosity=2) 