Skip to main content
Glama
test_integration.py7.91 kB
""" Integration tests for the complete server initialization flow """ import os import sys import tempfile from unittest.mock import MagicMock, patch from adbdevicemanager import AdbDeviceManager # Add the parent directory to the path so we can import our modules sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) class TestServerIntegration: """Test complete server initialization scenarios""" def setup_method(self): """Setup for each test method""" self.temp_dir = tempfile.mkdtemp() self.config_file = os.path.join(self.temp_dir, "config.yaml") def _simulate_server_initialization(self, config_file_path): """ Simulate the complete server initialization process Returns: (device_manager, messages) """ import yaml messages = [] config = {} device_name = None if os.path.exists(config_file_path): try: with open(config_file_path) as f: config = yaml.safe_load(f.read()) or {} device_config = config.get("device", {}) configured_device_name = device_config.get( "name") if device_config else None if configured_device_name and configured_device_name.strip(): device_name = configured_device_name.strip() messages.append(f"Loaded config from {config_file_path}") messages.append(f"Configured device: {device_name}") else: messages.append(f"Loaded config from {config_file_path}") messages.append( "No device specified in config, will auto-select if only one device connected") except Exception as e: messages.append( f"Error loading config file {config_file_path}: {e}") raise else: messages.append( f"Config file {config_file_path} not found, using auto-selection for device") # Initialize device manager (with mocked dependencies) device_manager = AdbDeviceManager(device_name, exit_on_error=False) return device_manager, messages @patch('adbdevicemanager.AdbDeviceManager.check_adb_installed') @patch('adbdevicemanager.AdbDeviceManager.get_available_devices') @patch('adbdevicemanager.AdbClient') def test_no_config_auto_selection_success(self, mock_adb_client, mock_get_devices, mock_check_adb): """Test successful server start with no config file and single device""" # Setup mocks mock_check_adb.return_value = True mock_get_devices.return_value = ["device123"] mock_device = MagicMock() mock_adb_client.return_value.device.return_value = mock_device # Use non-existent config file non_existent_config = os.path.join(self.temp_dir, "non_existent.yaml") with patch('builtins.print') as mock_print: device_manager, messages = self._simulate_server_initialization( non_existent_config) # Verify results assert device_manager.device == mock_device assert any("not found" in msg for msg in messages) assert any("auto-selection" in msg for msg in messages) mock_print.assert_called_with( "No device specified, automatically selected: device123") @patch('adbdevicemanager.AdbDeviceManager.check_adb_installed') @patch('adbdevicemanager.AdbDeviceManager.get_available_devices') @patch('adbdevicemanager.AdbClient') def test_config_with_null_device_auto_selection(self, mock_adb_client, mock_get_devices, mock_check_adb): """Test server start with config file containing name: null""" # Setup mocks mock_check_adb.return_value = True mock_get_devices.return_value = ["device456"] mock_device = MagicMock() mock_adb_client.return_value.device.return_value = mock_device # Create config with null device name config_content = """ device: name: null """ with open(self.config_file, 'w') as f: f.write(config_content) with patch('builtins.print') as mock_print: device_manager, messages = self._simulate_server_initialization( self.config_file) # Verify results assert device_manager.device == mock_device assert any("Loaded config" in msg for msg in messages) assert any("auto-select" in msg for msg in messages) mock_print.assert_called_with( "No device specified, automatically selected: device456") @patch('adbdevicemanager.AdbDeviceManager.check_adb_installed') @patch('adbdevicemanager.AdbDeviceManager.get_available_devices') @patch('adbdevicemanager.AdbClient') def test_config_with_specific_device(self, mock_adb_client, mock_get_devices, mock_check_adb): """Test server start with config file specifying a device""" # Setup mocks mock_check_adb.return_value = True mock_get_devices.return_value = ["device123", "device456"] mock_device = MagicMock() mock_adb_client.return_value.device.return_value = mock_device # Create config with specific device name config_content = """ device: name: "device456" """ with open(self.config_file, 'w') as f: f.write(config_content) device_manager, messages = self._simulate_server_initialization( self.config_file) # Verify results assert device_manager.device == mock_device mock_adb_client.return_value.device.assert_called_once_with( "device456") assert any("Configured device: device456" in msg for msg in messages) @patch('adbdevicemanager.AdbDeviceManager.check_adb_installed') @patch('adbdevicemanager.AdbDeviceManager.get_available_devices') def test_multiple_devices_no_config_error(self, mock_get_devices, mock_check_adb): """Test server initialization fails with multiple devices and no config""" # Setup mocks mock_check_adb.return_value = True mock_get_devices.return_value = ["device123", "device456"] # Use non-existent config file non_existent_config = os.path.join(self.temp_dir, "non_existent.yaml") try: device_manager, messages = self._simulate_server_initialization( non_existent_config) assert False, "Should have raised an exception" except RuntimeError as e: assert "Multiple devices connected" in str(e) assert "device123" in str(e) assert "device456" in str(e) @patch('adbdevicemanager.AdbDeviceManager.check_adb_installed') @patch('adbdevicemanager.AdbDeviceManager.get_available_devices') def test_device_not_found_error(self, mock_get_devices, mock_check_adb): """Test server initialization fails when specified device is not found""" # Setup mocks mock_check_adb.return_value = True mock_get_devices.return_value = ["device123"] # Create config with non-existent device name config_content = """ device: name: "non-existent-device" """ with open(self.config_file, 'w') as f: f.write(config_content) try: device_manager, messages = self._simulate_server_initialization( self.config_file) assert False, "Should have raised an exception" except RuntimeError as e: assert "Device non-existent-device not found" in str(e) assert "Available devices" in str(e) def teardown_method(self): """Cleanup after each test method""" if os.path.exists(self.config_file): os.remove(self.config_file) os.rmdir(self.temp_dir)

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/minhalvp/android-mcp-server'

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