98 lines
3.5 KiB
Python
98 lines
3.5 KiB
Python
"""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
|
|
|
|
|