"""Pytest configuration for unity-mcp tests.""" import logging import os import sys from pathlib import Path import pytest logger = logging.getLogger(__name__) # Add src directory to Python path so tests can import cli, transport, etc. src_path = Path(__file__).parent.parent / "src" if str(src_path) not in sys.path: sys.path.insert(0, str(src_path)) def _safe_reset_telemetry() -> None: """Safely reset telemetry, distinguishing import errors from reset failures.""" try: from core.telemetry import reset_telemetry except ImportError: # Telemetry module not available - this is normal if telemetry not used return try: reset_telemetry() except Exception as exc: logger.debug("Telemetry reset failed (may indicate cleanup needed)", exc_info=exc) @pytest.fixture(scope="module", autouse=True) def cleanup_telemetry(): """Clean up telemetry singleton after each test module to prevent state pollution.""" yield _safe_reset_telemetry() @pytest.fixture(scope="class") def fresh_telemetry(): """Reset telemetry before test class runs (for tests that need clean state).""" _safe_reset_telemetry() yield def pytest_collection_modifyitems(session, config, items): # noqa: ARG001 """Reorder tests so characterization tests run before integration tests. This prevents integration tests from initializing the telemetry singleton before characterization tests can mock it. """ # Separate integration tests from other tests integration_tests = [] other_tests = [] for item in items: # Check if test is in integration/ directory if "integration" in str(item.path): integration_tests.append(item) else: other_tests.append(item) # Reorder: characterization/unit tests first, then integration tests items[:] = other_tests + integration_tests @pytest.fixture(autouse=True) def restore_global_config(): """Restore global config/env mutations between tests.""" from core.config import config as global_config prior_env = os.environ.get("UNITY_MCP_TRANSPORT") prior = { "transport_mode": global_config.transport_mode, "http_remote_hosted": global_config.http_remote_hosted, "api_key_validation_url": global_config.api_key_validation_url, "api_key_login_url": global_config.api_key_login_url, "api_key_cache_ttl": global_config.api_key_cache_ttl, "api_key_service_token_header": global_config.api_key_service_token_header, "api_key_service_token": global_config.api_key_service_token, } yield if prior_env is None: os.environ.pop("UNITY_MCP_TRANSPORT", None) else: os.environ["UNITY_MCP_TRANSPORT"] = prior_env for key, value in prior.items(): setattr(global_config, key, value)