"""Unit tests for virtual robotics tool."""
from unittest.mock import Mock
import pytest
from robotics_mcp.tools.virtual_robotics import VirtualRoboticsTool
@pytest.fixture
def mock_mcp():
"""Create mock MCP server."""
mcp = Mock()
return mcp
@pytest.fixture
def virtual_robotics_tool(mock_mcp, state_manager):
"""Create virtual robotics tool instance with osc MCP for VRChat spawn."""
return VirtualRoboticsTool(mock_mcp, state_manager, mounted_servers={"osc": mock_mcp})
@pytest.mark.asyncio
async def test_spawn_robot_registration(virtual_robotics_tool, state_manager):
"""Test that spawning robot registers it in state manager when MCP available."""
from unittest.mock import AsyncMock, patch
with patch("robotics_mcp.tools.virtual_robotics.Client") as mock_client:
mock_client_instance = AsyncMock()
mock_client.return_value.__aenter__.return_value = mock_client_instance
mock_client_instance.call_tool = AsyncMock(return_value={})
result = await virtual_robotics_tool._spawn_robot(
robot_type="scout",
robot_id="test_scout",
position={"x": 0, "y": 0, "z": 0},
scale=1.0,
platform="vrchat",
)
assert result["status"] == "success"
robot = state_manager.get_robot("test_scout")
assert robot is not None
assert robot.robot_type == "scout"
assert robot.platform == "vrchat"
@pytest.mark.asyncio
async def test_spawn_robot_auto_id(virtual_robotics_tool, state_manager):
"""Test auto-generation of robot ID when Unity MCP available."""
from unittest.mock import AsyncMock, patch
virtual_robotics_tool.mounted_servers["unity"] = virtual_robotics_tool.mcp
with patch("robotics_mcp.tools.virtual_robotics.Client") as mock_client:
mock_client_instance = AsyncMock()
mock_client.return_value.__aenter__.return_value = mock_client_instance
mock_client_instance.call_tool = AsyncMock(return_value={})
result = await virtual_robotics_tool._spawn_robot(
robot_type="scout",
robot_id=None,
position={"x": 0, "y": 0, "z": 0},
scale=1.0,
platform="unity",
)
assert result["status"] == "success"
assert "robot_id" in result
assert result["robot_id"].startswith("vbot_scout")
@pytest.mark.asyncio
async def test_get_status(virtual_robotics_tool, state_manager):
"""Test getting virtual robot status."""
# Register robot first
state_manager.register_robot("test_scout", "scout", platform="unity")
result = await virtual_robotics_tool._get_status("test_scout")
assert result["status"] == "success"
assert result["robot"]["robot_id"] == "test_scout"
@pytest.mark.asyncio
async def test_get_status_not_found(virtual_robotics_tool):
"""Test getting status for non-existent robot."""
result = await virtual_robotics_tool._get_status("nonexistent")
assert result["status"] == "error"
assert "not found" in result["message"].lower()
@pytest.mark.asyncio
async def test_set_scale(virtual_robotics_tool, state_manager):
"""Test setting robot scale."""
state_manager.register_robot("test_scout", "scout", platform="unity")
result = await virtual_robotics_tool._set_scale("test_scout", scale=2.0)
assert result["status"] == "success"
assert result["scale"] == 2.0