88 lines
2.8 KiB
Python
88 lines
2.8 KiB
Python
"""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)
|