import pytest from pathlib import Path from unittest.mock import patch, MagicMock, ANY import argparse from setup.cli.commands import install class TestInstallCommand: @patch('setup.cli.commands.install.get_components_to_install') @patch('setup.cli.commands.install.ComponentRegistry') @patch('setup.cli.commands.install.ConfigService') @patch('setup.cli.commands.install.Validator') @patch('setup.cli.commands.install.display_installation_plan') @patch('setup.cli.commands.install.perform_installation') @patch('setup.cli.commands.install.confirm', return_value=True) @patch('setup.cli.commands.install.validate_system_requirements', return_value=True) @patch('pathlib.Path.home') def test_run_resolves_dependencies_before_planning( self, mock_home, mock_validate_reqs, mock_confirm, mock_perform, mock_display, mock_validator, mock_config, mock_registry_class, mock_get_components, tmp_path ): # Arrange mock_home.return_value = tmp_path install_dir = tmp_path / ".claude" mock_args = argparse.Namespace( components=['mcp'], install_dir=install_dir, quiet=True, # to avoid calling display_header yes=True, force=False, dry_run=False, diagnose=False, list_components=False ) mock_registry_instance = MagicMock() mock_registry_class.return_value = mock_registry_instance mock_config_instance = MagicMock() mock_config.return_value = mock_config_instance mock_config_instance.validate_config_files.return_value = [] mock_get_components.return_value = ['mcp'] mock_registry_instance.resolve_dependencies.return_value = ['core', 'mcp'] # Act install.run(mock_args) # Assert # Check that resolve_dependencies was called with the initial list mock_registry_instance.resolve_dependencies.assert_called_once_with(['mcp']) # Check that display_installation_plan was not called because of quiet=True mock_display.assert_not_called() # Check that perform_installation was called with the resolved list mock_perform.assert_called_once_with(['core', 'mcp'], mock_args, ANY)