import asyncio
import sys
import types
from types import SimpleNamespace
from .test_helpers import DummyContext
from core.config import config
class DummyMiddlewareContext:
def __init__(self, ctx):
self.fastmcp_context = ctx
def test_auto_selects_single_instance_via_pluginhub(monkeypatch):
plugin_hub = types.ModuleType("transport.plugin_hub")
class PluginHub:
@classmethod
def is_configured(cls) -> bool:
return True
@classmethod
async def get_sessions(cls):
raise AssertionError("get_sessions should be stubbed in test")
plugin_hub.PluginHub = PluginHub
monkeypatch.setitem(sys.modules, "transport.plugin_hub", plugin_hub)
monkeypatch.delitem(sys.modules, "transport.unity_instance_middleware", raising=False)
from transport.unity_instance_middleware import UnityInstanceMiddleware, PluginHub as ImportedPluginHub
assert ImportedPluginHub is plugin_hub.PluginHub
monkeypatch.setattr(config, "transport_mode", "http")
middleware = UnityInstanceMiddleware()
ctx = DummyContext()
ctx.client_id = "client-1"
middleware_context = DummyMiddlewareContext(ctx)
call_count = {"sessions": 0}
async def fake_get_sessions():
call_count["sessions"] += 1
return SimpleNamespace(
sessions={
"session-1": SimpleNamespace(project="Ramble", hash="deadbeef"),
}
)
monkeypatch.setattr(plugin_hub.PluginHub, "get_sessions", fake_get_sessions)
selected = asyncio.run(middleware._maybe_autoselect_instance(ctx))
assert selected == "Ramble@deadbeef"
assert middleware.get_active_instance(ctx) == "Ramble@deadbeef"
assert call_count["sessions"] == 1
asyncio.run(middleware._inject_unity_instance(middleware_context))
assert ctx.get_state("unity_instance") == "Ramble@deadbeef"
assert call_count["sessions"] == 1
def test_auto_selects_single_instance_via_stdio(monkeypatch):
plugin_hub = types.ModuleType("transport.plugin_hub")
class PluginHub:
@classmethod
def is_configured(cls) -> bool:
return False
plugin_hub.PluginHub = PluginHub
monkeypatch.setitem(sys.modules, "transport.plugin_hub", plugin_hub)
monkeypatch.delitem(sys.modules, "transport.unity_instance_middleware", raising=False)
from transport.unity_instance_middleware import UnityInstanceMiddleware, PluginHub as ImportedPluginHub
assert ImportedPluginHub is plugin_hub.PluginHub
monkeypatch.setattr(config, "transport_mode", "stdio")
middleware = UnityInstanceMiddleware()
ctx = DummyContext()
ctx.client_id = "client-1"
middleware_context = DummyMiddlewareContext(ctx)
class PoolStub:
def discover_all_instances(self, force_refresh=False):
assert force_refresh is True
return [SimpleNamespace(id="UnityMCPTests@cc8756d4")]
unity_connection = types.ModuleType("transport.legacy.unity_connection")
unity_connection.get_unity_connection_pool = lambda: PoolStub()
monkeypatch.setitem(sys.modules, "transport.legacy.unity_connection", unity_connection)
selected = asyncio.run(middleware._maybe_autoselect_instance(ctx))
assert selected == "UnityMCPTests@cc8756d4"
assert middleware.get_active_instance(ctx) == "UnityMCPTests@cc8756d4"
asyncio.run(middleware._inject_unity_instance(middleware_context))
assert ctx.get_state("unity_instance") == "UnityMCPTests@cc8756d4"
def test_auto_select_handles_stdio_errors(monkeypatch):
plugin_hub = types.ModuleType("transport.plugin_hub")
class PluginHub:
@classmethod
def is_configured(cls) -> bool:
return False
plugin_hub.PluginHub = PluginHub
monkeypatch.setitem(sys.modules, "transport.plugin_hub", plugin_hub)
monkeypatch.delitem(sys.modules, "transport.unity_instance_middleware", raising=False)
from transport.unity_instance_middleware import UnityInstanceMiddleware, PluginHub as ImportedPluginHub
assert ImportedPluginHub is plugin_hub.PluginHub
middleware = UnityInstanceMiddleware()
ctx = DummyContext()
ctx.client_id = "client-1"
class PoolStub:
def discover_all_instances(self, force_refresh=False):
raise ConnectionError("stdio unavailable")
unity_connection = types.ModuleType("transport.legacy.unity_connection")
unity_connection.get_unity_connection_pool = lambda: PoolStub()
monkeypatch.setitem(sys.modules, "transport.legacy.unity_connection", unity_connection)
selected = asyncio.run(middleware._maybe_autoselect_instance(ctx))
assert selected is None
assert middleware.get_active_instance(ctx) is None