Skip to main content
Glama

MaverickMCP

by wshobson
MIT License
165
  • Apple
test_integration_simple.py12.6 kB
""" Simplified Integration Test Suite for MaverickMCP Security System. This test suite validates that the core security integrations are working: - API server can start - Health check endpoints - Basic authentication flow (if available) - Security middleware is active - Performance systems can initialize This is a lightweight version to validate system integration without requiring full database or Redis setup. """ import os from unittest.mock import MagicMock, patch import pytest from fastapi.testclient import TestClient from maverick_mcp.api.api_server import create_api_app @pytest.fixture def mock_settings(): """Mock settings for testing.""" with patch.dict( os.environ, { "AUTH_ENABLED": "true", "ENVIRONMENT": "test", "DATABASE_URL": "sqlite:///:memory:", "REDIS_URL": "redis://localhost:6379/15", }, ): yield @pytest.fixture def mock_redis(): """Mock Redis client.""" mock_redis = MagicMock() mock_redis.ping.return_value = True mock_redis.get.return_value = None mock_redis.setex.return_value = True mock_redis.delete.return_value = 1 mock_redis.keys.return_value = [] mock_redis.flushdb.return_value = True mock_redis.close.return_value = None return mock_redis @pytest.fixture def mock_database(): """Mock database operations.""" from unittest.mock import MagicMock mock_db = MagicMock() # Mock SQLAlchemy Session methods mock_query = MagicMock() mock_query.filter.return_value.first.return_value = None # No user found mock_query.filter.return_value.all.return_value = [] mock_db.query.return_value = mock_query # Mock basic session operations mock_db.execute.return_value.scalar.return_value = 1 mock_db.execute.return_value.fetchall.return_value = [] mock_db.commit.return_value = None mock_db.close.return_value = None mock_db.add.return_value = None return mock_db @pytest.fixture def integrated_app(mock_settings, mock_redis, mock_database): """Create integrated app with mocked dependencies.""" # Mock database dependency def mock_get_db(): yield mock_database # Mock Redis connection manager with patch("maverick_mcp.data.performance.redis_manager") as mock_redis_manager: mock_redis_manager.initialize.return_value = True mock_redis_manager.get_client.return_value = mock_redis mock_redis_manager._healthy = True mock_redis_manager._initialized = True mock_redis_manager.get_metrics.return_value = { "healthy": True, "initialized": True, "commands_executed": 0, "errors": 0, } # Mock performance systems with patch( "maverick_mcp.data.performance.initialize_performance_systems" ) as mock_init: mock_init.return_value = {"redis_manager": True, "request_cache": True} # Mock monitoring with patch("maverick_mcp.utils.monitoring.initialize_monitoring"): # Create app app = create_api_app() # Override database dependencies from maverick_mcp.data.models import get_async_db, get_db app.dependency_overrides[get_db] = mock_get_db # Mock async database dependency async def mock_get_async_db(): yield mock_database app.dependency_overrides[get_async_db] = mock_get_async_db yield app @pytest.fixture def client(integrated_app): """Create test client.""" return TestClient(integrated_app) class TestSystemIntegration: """Test core system integration.""" def test_api_server_creation(self, integrated_app): """Test that API server can be created successfully.""" assert integrated_app is not None assert hasattr(integrated_app, "router") assert hasattr(integrated_app, "middleware") @pytest.mark.skip(reason="Requires Redis and external services not available in CI") def test_health_check_endpoint(self, client): """Test health check endpoint is available.""" response = client.get("/health") assert response.status_code == 200 health_data = response.json() assert "status" in health_data assert "service" in health_data assert health_data["service"] == "MaverickMCP API" def test_security_middleware_present(self, integrated_app): """Test that security middleware is loaded.""" # FastAPI middleware stack is different, check if the app has middleware assert hasattr(integrated_app, "middleware_stack") or hasattr( integrated_app, "middleware" ) # The actual middleware is added during app creation # We can verify by checking the app structure assert integrated_app is not None def test_cors_configuration(self, integrated_app): """Test CORS middleware is configured.""" # CORS middleware is added during app creation assert integrated_app is not None def test_api_endpoints_available(self, client): """Test that key API endpoints are available.""" # Test root endpoint response = client.get("/") assert response.status_code == 200 root_data = response.json() assert "service" in root_data assert "endpoints" in root_data # Verify key endpoints are listed and billing endpoints are absent endpoints = root_data["endpoints"] if isinstance(endpoints, dict): endpoint_names = set(endpoints.keys()) elif isinstance(endpoints, list): endpoint_names = set(endpoints) else: pytest.fail(f"Unexpected endpoints payload type: {type(endpoints)!r}") assert "auth" in endpoint_names assert "health" in endpoint_names assert "billing" not in endpoint_names def test_authentication_endpoints_available(self, client): """Test authentication endpoints are available.""" # Test registration endpoint (should require data) response = client.post("/auth/signup", json={}) assert response.status_code in [400, 422] # Validation error, not 404 # Test login endpoint (should require data) response = client.post("/auth/login", json={}) assert response.status_code in [400, 422] # Validation error, not 404 def test_billing_endpoints_removed(self, client): """Ensure legacy billing endpoints are no longer exposed.""" response = client.get("/billing/balance") assert response.status_code == 404 def test_error_handling_active(self, client): """Test that error handling middleware is active.""" # Test 404 handling response = client.get("/nonexistent/endpoint") assert response.status_code == 404 error_data = response.json() assert "error" in error_data or "detail" in error_data # Should have structured error response assert isinstance(error_data, dict) @pytest.mark.skip(reason="Requires Redis and external services not available in CI") def test_request_tracing_active(self, client): """Test request tracing is active.""" # Make request and check for tracing headers response = client.get("/health") # Should have request tracing in headers or response # At minimum, should not error assert response.status_code == 200 class TestSecurityValidation: """Test security features are active.""" def test_csrf_protection_blocks_unsafe_requests(self, client): """Test CSRF protection is active.""" # The CSRF middleware is fully tested in test_security_comprehensive.py # In this integration test, we just verify that auth endpoints exist # and respond appropriately to requests # Try login endpoint without credentials response = client.post("/auth/login", json={}) # Should get validation error for missing fields, not 404 assert response.status_code in [400, 422] def test_rate_limiting_configured(self, integrated_app): """Test rate limiting middleware is configured.""" # Check if rate limiting middleware is present middleware_types = [type(m).__name__ for m in integrated_app.user_middleware] # Rate limiting might be present any( "Rate" in middleware_type or "Limit" in middleware_type for middleware_type in middleware_types ) # In test environment, this might not be fully configured # Just verify the system doesn't crash assert True # Basic test passes if we get here def test_authentication_configuration(self, client): """Test authentication system is configured.""" # Test that auth endpoints exist and respond appropriately response = client.post( "/auth/login", json={"email": "invalid@example.com", "password": "invalid"} ) # Should get validation error or auth failure, not 500 assert response.status_code < 500 class TestPerformanceSystemsIntegration: """Test performance systems integration.""" def test_metrics_endpoint_available(self, client): """Test metrics endpoint is available.""" response = client.get("/metrics") # Metrics might be restricted or not available in test assert response.status_code in [200, 401, 403, 404] if response.status_code == 200: # Should return metrics in text format assert response.headers.get("content-type") is not None def test_performance_monitoring_available(self, integrated_app): """Test performance monitoring is available.""" # Check that performance systems can be imported try: from maverick_mcp.data.performance import ( query_optimizer, redis_manager, request_cache, ) assert redis_manager is not None assert request_cache is not None assert query_optimizer is not None except ImportError: pytest.skip("Performance monitoring modules not available") class TestConfigurationValidation: """Test system configuration validation.""" def test_settings_validation(self): """Test settings validation system.""" try: from maverick_mcp.config.validation import get_validation_status validation_status = get_validation_status() assert "valid" in validation_status assert "warnings" in validation_status assert "errors" in validation_status # System should be in a valid state for testing assert isinstance(validation_status["valid"], bool) except ImportError: pytest.skip("Configuration validation not available") def test_environment_configuration(self): """Test environment configuration.""" from maverick_mcp.config.settings import get_settings settings = get_settings() # Basic settings should be available assert hasattr(settings, "auth") assert hasattr(settings, "api") assert hasattr(settings, "environment") # Environment should be set assert settings.environment in ["development", "test", "staging", "production"] class TestSystemStartup: """Test system startup procedures.""" def test_app_startup_succeeds(self, integrated_app): """Test that app startup completes successfully.""" # If we can create the app, startup succeeded assert integrated_app is not None # App should have core FastAPI attributes assert hasattr(integrated_app, "openapi") assert hasattr(integrated_app, "routes") assert hasattr(integrated_app, "middleware_stack") @pytest.mark.skip(reason="Requires Redis and external services not available in CI") def test_dependency_injection_works(self, client): """Test dependency injection is working.""" # Make a request that would use dependency injection response = client.get("/health") assert response.status_code == 200 # If dependencies weren't working, we'd get 500 errors health_data = response.json() assert "service" in health_data if __name__ == "__main__": pytest.main([__file__, "-v", "--tb=short"])

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/wshobson/maverick-mcp'

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