"""
Tests for the manage_components tool.
This tool handles component lifecycle operations (add, remove, set_property).
"""
import pytest
from .test_helpers import DummyContext
import services.tools.manage_components as manage_comp_mod
@pytest.mark.asyncio
async def test_manage_components_add_single(monkeypatch):
"""Test adding a single component."""
captured = {}
async def fake_send(cmd, params, **kwargs):
captured["cmd"] = cmd
captured["params"] = params
return {
"success": True,
"data": {
"addedComponents": [{"typeName": "UnityEngine.Rigidbody", "instanceID": 12345}]
},
}
monkeypatch.setattr(
manage_comp_mod,
"async_send_command_with_retry",
fake_send,
)
resp = await manage_comp_mod.manage_components(
ctx=DummyContext(),
action="add",
target="Player",
component_type="Rigidbody",
)
assert resp.get("success") is True
assert captured["cmd"] == "manage_components"
assert captured["params"]["action"] == "add"
assert captured["params"]["target"] == "Player"
assert captured["params"]["componentType"] == "Rigidbody"
@pytest.mark.asyncio
async def test_manage_components_remove(monkeypatch):
"""Test removing a component."""
captured = {}
async def fake_send(cmd, params, **kwargs):
captured["params"] = params
return {"success": True, "data": {"instanceID": 12345, "name": "Player"}}
monkeypatch.setattr(
manage_comp_mod,
"async_send_command_with_retry",
fake_send,
)
resp = await manage_comp_mod.manage_components(
ctx=DummyContext(),
action="remove",
target="Player",
component_type="Rigidbody",
)
assert resp.get("success") is True
assert captured["params"]["action"] == "remove"
assert captured["params"]["componentType"] == "Rigidbody"
@pytest.mark.asyncio
async def test_manage_components_set_property_single(monkeypatch):
"""Test setting a single component property."""
captured = {}
async def fake_send(cmd, params, **kwargs):
captured["params"] = params
return {"success": True, "data": {"instanceID": 12345}}
monkeypatch.setattr(
manage_comp_mod,
"async_send_command_with_retry",
fake_send,
)
resp = await manage_comp_mod.manage_components(
ctx=DummyContext(),
action="set_property",
target="Player",
component_type="Rigidbody",
property="mass",
value=5.0,
)
assert resp.get("success") is True
assert captured["params"]["action"] == "set_property"
assert captured["params"]["property"] == "mass"
assert captured["params"]["value"] == 5.0
@pytest.mark.asyncio
async def test_manage_components_set_property_multiple(monkeypatch):
"""Test setting multiple component properties via properties dict."""
captured = {}
async def fake_send(cmd, params, **kwargs):
captured["params"] = params
return {"success": True, "data": {"instanceID": 12345}}
monkeypatch.setattr(
manage_comp_mod,
"async_send_command_with_retry",
fake_send,
)
resp = await manage_comp_mod.manage_components(
ctx=DummyContext(),
action="set_property",
target="Player",
component_type="Rigidbody",
properties={"mass": 5.0, "drag": 0.5},
)
assert resp.get("success") is True
assert captured["params"]["action"] == "set_property"
assert captured["params"]["properties"] == {"mass": 5.0, "drag": 0.5}
@pytest.mark.asyncio
async def test_manage_components_set_property_json_string(monkeypatch):
"""Test setting component properties with JSON string input."""
captured = {}
async def fake_send(cmd, params, **kwargs):
captured["params"] = params
return {"success": True, "data": {"instanceID": 12345}}
monkeypatch.setattr(
manage_comp_mod,
"async_send_command_with_retry",
fake_send,
)
resp = await manage_comp_mod.manage_components(
ctx=DummyContext(),
action="set_property",
target="Player",
component_type="Rigidbody",
properties='{"mass": 10.0}', # JSON string
)
assert resp.get("success") is True
assert captured["params"]["properties"] == {"mass": 10.0}
@pytest.mark.asyncio
async def test_manage_components_add_with_properties(monkeypatch):
"""Test adding a component with initial properties."""
captured = {}
async def fake_send(cmd, params, **kwargs):
captured["params"] = params
return {
"success": True,
"data": {"addedComponents": [{"typeName": "Rigidbody", "instanceID": 123}]},
}
monkeypatch.setattr(
manage_comp_mod,
"async_send_command_with_retry",
fake_send,
)
resp = await manage_comp_mod.manage_components(
ctx=DummyContext(),
action="add",
target="Player",
component_type="Rigidbody",
properties={"mass": 2.0, "useGravity": False},
)
assert resp.get("success") is True
assert captured["params"]["properties"] == {"mass": 2.0, "useGravity": False}
@pytest.mark.asyncio
async def test_manage_components_search_method_passthrough(monkeypatch):
"""Test that search_method is correctly passed through."""
captured = {}
async def fake_send(cmd, params, **kwargs):
captured["params"] = params
return {"success": True, "data": {}}
monkeypatch.setattr(
manage_comp_mod,
"async_send_command_with_retry",
fake_send,
)
resp = await manage_comp_mod.manage_components(
ctx=DummyContext(),
action="add",
target="Canvas/Panel",
component_type="Image",
search_method="by_path",
)
assert resp.get("success") is True
assert captured["params"]["searchMethod"] == "by_path"
@pytest.mark.asyncio
async def test_manage_components_target_by_id(monkeypatch):
"""Test targeting by instance ID."""
captured = {}
async def fake_send(cmd, params, **kwargs):
captured["params"] = params
return {"success": True, "data": {}}
monkeypatch.setattr(
manage_comp_mod,
"async_send_command_with_retry",
fake_send,
)
resp = await manage_comp_mod.manage_components(
ctx=DummyContext(),
action="add",
target=12345, # Integer instance ID
component_type="BoxCollider",
search_method="by_id",
)
assert resp.get("success") is True
assert captured["params"]["target"] == 12345
assert captured["params"]["searchMethod"] == "by_id"