import pytest from pathlib import Path from unittest.mock import MagicMock, patch from setup.components.mcp import MCPComponent class TestMCPComponent: @patch("setup.components.mcp.MCPComponent._post_install", return_value=True) @patch( "setup.components.mcp.MCPComponent.validate_prerequisites", return_value=(True, []), ) @patch("setup.components.mcp.MCPComponent._install_mcp_server") def test_install_selected_servers_only( self, mock_install_mcp_server, mock_validate_prereqs, mock_post_install ): mock_install_mcp_server.return_value = True component = MCPComponent(install_dir=Path("/fake/dir")) component.installed_servers_in_session = [] # Simulate selecting only the 'magic' server config = {"selected_mcp_servers": ["magic"]} success = component._install(config) assert success is True assert component.installed_servers_in_session == ["magic"] # Assert that _install_mcp_server was called exactly once assert mock_install_mcp_server.call_count == 1 # Assert that it was called with the correct server info called_args, _ = mock_install_mcp_server.call_args server_info_arg = called_args[0] assert server_info_arg["name"] == "magic" assert server_info_arg["npm_package"] == "@21st-dev/magic" @patch("subprocess.run") def test_validate_installation_success(self, mock_subprocess_run): component = MCPComponent(install_dir=Path("/fake/dir")) # Mock settings manager component.settings_manager = MagicMock() component.settings_manager.is_component_installed.return_value = True component.settings_manager.get_component_version.return_value = ( component.get_metadata()["version"] ) component.settings_manager.get_metadata_setting.return_value = [ "magic", "playwright", ] # Mock `claude mcp list` output mock_subprocess_run.return_value.returncode = 0 mock_subprocess_run.return_value.stdout = "magic\nplaywright\n" success, errors = component.validate_installation() assert success is True assert not errors @patch("subprocess.run") def test_validate_installation_failure(self, mock_subprocess_run): component = MCPComponent(install_dir=Path("/fake/dir")) # Mock settings manager component.settings_manager = MagicMock() component.settings_manager.is_component_installed.return_value = True component.settings_manager.get_component_version.return_value = ( component.get_metadata()["version"] ) component.settings_manager.get_metadata_setting.return_value = [ "magic", "playwright", ] # Mock `claude mcp list` output - 'playwright' is missing mock_subprocess_run.return_value.returncode = 0 mock_subprocess_run.return_value.stdout = "magic\n" success, errors = component.validate_installation() assert success is False assert len(errors) == 1 assert "playwright" in errors[0]