Skip to main content
Glama

Gemini MCP Server

test_docker_mcp_validation.pyโ€ข5.95 kB
""" Validation test for Docker MCP implementation """ import json import os import subprocess import sys import tempfile from pathlib import Path from unittest.mock import patch import pytest # Add project root to path sys.path.insert(0, str(Path(__file__).parent.parent)) class TestDockerMCPValidation: """Validation tests for Docker MCP""" @pytest.fixture(autouse=True) def setup(self): """Automatic setup for each test""" self.project_root = Path(__file__).parent.parent self.dockerfile_path = self.project_root / "Dockerfile" def test_dockerfile_exists_and_valid(self): """Test Dockerfile existence and validity""" assert self.dockerfile_path.exists(), "Missing Dockerfile" content = self.dockerfile_path.read_text() assert "FROM python:" in content, "Python base required" assert "server.py" in content, "server.py must be copied" @patch("subprocess.run") def test_docker_command_validation(self, mock_run): """Test Docker command validation""" mock_run.return_value.returncode = 0 # Standard Docker MCP command cmd = ["docker", "run", "--rm", "-i", "--env-file", ".env", "zen-mcp-server:latest", "python", "server.py"] subprocess.run(cmd, capture_output=True) mock_run.assert_called_once_with(cmd, capture_output=True) def test_environment_variables_validation(self): """Test environment variables validation""" required_vars = ["GEMINI_API_KEY", "OPENAI_API_KEY", "XAI_API_KEY"] # Test with variable present with patch.dict(os.environ, {"GEMINI_API_KEY": "test"}): has_key = any(os.getenv(var) for var in required_vars) assert has_key, "At least one API key required" # Test without variables with patch.dict(os.environ, {}, clear=True): has_key = any(os.getenv(var) for var in required_vars) assert not has_key, "No key should be present" def test_docker_security_configuration(self): """Test Docker security configuration""" if not self.dockerfile_path.exists(): pytest.skip("Dockerfile not found") content = self.dockerfile_path.read_text() # Check non-root user has_user_config = "USER " in content or "useradd" in content or "adduser" in content # Note: The test can be adjusted according to implementation if has_user_config: assert True, "User configuration found" else: # Warning instead of failure for flexibility pytest.warns(UserWarning, "Consider adding a non-root user") class TestDockerIntegration: """Docker-MCP integration tests""" @pytest.fixture def temp_env_file(self): """Fixture for temporary .env file""" content = """GEMINI_API_KEY=test_key LOG_LEVEL=INFO DEFAULT_MODEL=auto """ with tempfile.NamedTemporaryFile(mode="w", suffix=".env", delete=False, encoding="utf-8") as f: f.write(content) temp_file_path = f.name # File is now closed, can yield yield temp_file_path os.unlink(temp_file_path) def test_env_file_parsing(self, temp_env_file): """Test .env file parsing""" env_vars = {} with open(temp_env_file, encoding="utf-8") as f: for line in f: line = line.strip() if line and not line.startswith("#") and "=" in line: key, value = line.split("=", 1) env_vars[key] = value assert "GEMINI_API_KEY" in env_vars assert env_vars["GEMINI_API_KEY"] == "test_key" assert env_vars["LOG_LEVEL"] == "INFO" def test_mcp_message_structure(self): """Test MCP message structure""" message = {"jsonrpc": "2.0", "method": "initialize", "params": {}, "id": 1} # Check JSON serialization json_str = json.dumps(message) parsed = json.loads(json_str) assert parsed["jsonrpc"] == "2.0" assert "method" in parsed assert "id" in parsed class TestDockerPerformance: """Docker performance tests""" def test_image_size_expectation(self): """Test expected image size""" # Maximum expected size (in MB) max_size_mb = 500 # Simulation - in reality, Docker would be queried simulated_size = 294 # MB observed assert simulated_size <= max_size_mb, f"Image too large: {simulated_size}MB > {max_size_mb}MB" def test_startup_performance(self): """Test startup performance""" max_startup_seconds = 10 simulated_startup = 3 # seconds assert simulated_startup <= max_startup_seconds, f"Startup too slow: {simulated_startup}s" @pytest.mark.integration class TestFullIntegration: """Full integration tests""" def test_complete_setup_simulation(self): """Simulate complete setup""" # Simulate all required components components = { "dockerfile": True, "mcp_config": True, "env_template": True, "documentation": True, } # Check that all components are present missing = [k for k, v in components.items() if not v] assert not missing, f"Missing components: {missing}" def test_docker_mcp_workflow(self): """Test complete Docker-MCP workflow""" # Workflow steps workflow_steps = [ "build_image", "create_env_file", "configure_mcp_json", "test_docker_run", "validate_mcp_communication", ] # Simulate each step for step in workflow_steps: # In reality, each step would be tested individually assert step is not None, f"Step {step} not defined" if __name__ == "__main__": # Run tests with pytest pytest.main([__file__, "-v"])

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/BeehiveInnovations/gemini-mcp-server'

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