Skip to main content
Glama
conftest.pyโ€ข6.44 kB
""" Pytest configuration and shared fixtures for Alfresco MCP Server tests. Provides configuration for unit tests, integration tests, and code coverage. """ import pytest import pytest_asyncio import asyncio import os import httpx import tempfile import shutil from typing import Generator, AsyncGenerator from unittest.mock import MagicMock, AsyncMock, patch # Test markers pytest_plugins = ["pytest_asyncio"] def pytest_configure(config): """Configure pytest markers.""" config.addinivalue_line( "markers", "unit: marks tests as unit tests (fast, mocked)" ) config.addinivalue_line( "markers", "integration: marks tests as integration tests (requires live Alfresco)" ) config.addinivalue_line( "markers", "slow: marks tests as slow running" ) config.addinivalue_line( "markers", "performance: marks tests as performance benchmarks" ) @pytest.fixture(scope="session") def event_loop(): """Create an instance of the default event loop for the test session.""" loop = asyncio.get_event_loop_policy().new_event_loop() yield loop loop.close() @pytest.fixture def temp_dir() -> Generator[str, None, None]: """Create a temporary directory for test files.""" with tempfile.TemporaryDirectory() as temp_dir: yield temp_dir @pytest.fixture def mock_alfresco_factory(): """Mock Alfresco client factory for unit tests.""" factory = MagicMock() # Mock search client search_client = AsyncMock() search_client.search = AsyncMock() factory.create_search_client.return_value = search_client # Mock core client core_client = AsyncMock() core_client.get_node = AsyncMock() core_client.create_node = AsyncMock() core_client.update_node = AsyncMock() core_client.delete_node = AsyncMock() core_client.get_node_content = AsyncMock() factory.create_core_client.return_value = core_client return factory @pytest.fixture def mock_auth_util(): """Mock authentication utility for unit tests.""" auth_util = AsyncMock() auth_util.ensure_authenticated = AsyncMock() auth_util.get_auth_headers = AsyncMock(return_value={"Authorization": "Bearer mock-token"}) auth_util.is_authenticated.return_value = True return auth_util @pytest_asyncio.fixture async def fastmcp_client(): """FastMCP in-memory client for testing.""" from fastmcp import Client from alfresco_mcp_server.fastmcp_server import mcp async with Client(mcp) as client: yield client @pytest.fixture async def http_client() -> AsyncGenerator[httpx.AsyncClient, None]: """HTTP client for integration tests.""" async with httpx.AsyncClient(timeout=30.0) as client: yield client @pytest.fixture def alfresco_config(): """Alfresco configuration for tests.""" return { "url": os.getenv("ALFRESCO_URL", "http://localhost:8080"), "username": os.getenv("ALFRESCO_USERNAME", "admin"), "password": os.getenv("ALFRESCO_PASSWORD", "admin"), "verify_ssl": os.getenv("ALFRESCO_VERIFY_SSL", "false").lower() == "true" } @pytest.fixture def sample_documents(): """Sample document data for testing.""" import base64 return { "text_doc": { "filename": "test_document.txt", "content": "This is a test document for MCP server testing.", "content_base64": base64.b64encode( "This is a test document for MCP server testing.".encode() ).decode(), "mime_type": "text/plain" }, "json_doc": { "filename": "test_data.json", "content": '{"test": "data", "numbers": [1, 2, 3]}', "content_base64": base64.b64encode( '{"test": "data", "numbers": [1, 2, 3]}'.encode() ).decode(), "mime_type": "application/json" } } @pytest.fixture def mock_search_results(): """Mock search results for testing.""" from types import SimpleNamespace def create_mock_entry(name, node_id, is_folder=False): entry = SimpleNamespace() entry.entry = SimpleNamespace() entry.entry.name = name entry.entry.id = node_id entry.entry.isFolder = is_folder entry.entry.modifiedAt = "2024-01-15T10:30:00Z" entry.entry.createdByUser = {"displayName": "Test User"} entry.entry.content = {"sizeInBytes": 1024} if not is_folder else None entry.entry.path = {"name": "/Shared/Test"} return entry results = SimpleNamespace() results.list = SimpleNamespace() results.list.entries = [ create_mock_entry("Test Document 1.pdf", "doc-123", False), create_mock_entry("Test Folder", "folder-456", True), create_mock_entry("Test Document 2.txt", "doc-789", False) ] return results def pytest_collection_modifyitems(config, items): """Modify test collection to handle markers.""" if config.getoption("--integration"): # Only run integration tests skip_unit = pytest.mark.skip(reason="Integration test run - skipping unit tests") for item in items: if "integration" not in item.keywords: item.add_marker(skip_unit) else: # Skip integration tests by default skip_integration = pytest.mark.skip(reason="Integration tests require --integration flag") for item in items: if "integration" in item.keywords: item.add_marker(skip_integration) def pytest_addoption(parser): """Add custom command line options.""" parser.addoption( "--integration", action="store_true", default=False, help="Run integration tests (requires live Alfresco server)" ) parser.addoption( "--performance", action="store_true", default=False, help="Run performance benchmarks" ) @pytest.fixture def check_alfresco_available(alfresco_config): """Check if Alfresco server is available for integration tests.""" def _check(): try: response = httpx.get( f"{alfresco_config['url']}/alfresco/api/-default-/public/alfresco/versions/1/probes/-ready-", timeout=5.0 ) return response.status_code == 200 except Exception: return False return _check

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/stevereiner/python-alfresco-mcp-server'

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