"""Tests for manage_editor tool.""" import asyncio import inspect from types import SimpleNamespace from unittest.mock import AsyncMock import pytest from services.tools.manage_editor import manage_editor import services.tools.manage_editor as manage_editor_mod from services.registry import get_registered_tools # ── Fixture ────────────────────────────────────────────────────────── @pytest.fixture def mock_unity(monkeypatch): captured: dict[str, object] = {} async def fake_send(send_fn, unity_instance, tool_name, params): captured["unity_instance"] = unity_instance captured["tool_name"] = tool_name captured["params"] = params return {"success": True, "message": "ok"} monkeypatch.setattr( "services.tools.manage_editor.get_unity_instance_from_context", AsyncMock(return_value="unity-instance-1"), ) monkeypatch.setattr( "services.tools.manage_editor.send_with_unity_instance", fake_send, ) return captured # ── Undo/Redo ──────────────────────────────────────────────────────── def test_undo_forwards_to_unity(mock_unity): result = asyncio.run(manage_editor(SimpleNamespace(), action="undo")) assert result["success"] is True assert mock_unity["params"]["action"] == "undo" assert mock_unity["tool_name"] == "manage_editor" def test_redo_forwards_to_unity(mock_unity): result = asyncio.run(manage_editor(SimpleNamespace(), action="redo")) assert result["success"] is True assert mock_unity["params"]["action"] == "redo" # ── All Unity-forwarded actions ────────────────────────────────────── UNITY_FORWARDED_ACTIONS = [ "play", "pause", "stop", "set_active_tool", "add_tag", "remove_tag", "add_layer", "remove_layer", "deploy_package", "restore_package", "undo", "redo", ] @pytest.mark.parametrize("action_name", UNITY_FORWARDED_ACTIONS) def test_every_action_forwards_to_unity(mock_unity, action_name): result = asyncio.run(manage_editor(SimpleNamespace(), action=action_name)) assert result["success"] is True assert mock_unity["params"]["action"] == action_name # ── Python-only actions ────────────────────────────────────────────── def test_telemetry_status_handled_python_side(mock_unity): result = asyncio.run(manage_editor(SimpleNamespace(), action="telemetry_status")) assert result["success"] is True assert "telemetry_enabled" in result assert "params" not in mock_unity def test_telemetry_ping_handled_python_side(mock_unity): result = asyncio.run(manage_editor(SimpleNamespace(), action="telemetry_ping")) assert result["success"] is True assert "params" not in mock_unity # ── None params omitted ───────────────────────────────────────────── def test_undo_omits_none_params(mock_unity): result = asyncio.run(manage_editor(SimpleNamespace(), action="undo")) assert result["success"] is True params = mock_unity["params"] assert "toolName" not in params assert "tagName" not in params assert "layerName" not in params