""" Tests for the GameObject resources. Resources: - unity://scene/gameobject/{instance_id} - unity://scene/gameobject/{instance_id}/components - unity://scene/gameobject/{instance_id}/component/{component_name} """ import pytest from .test_helpers import DummyContext import services.resources.gameobject as gameobject_res_mod @pytest.mark.asyncio async def test_get_gameobject_data(monkeypatch): """Test reading a single GameObject resource.""" captured = {} async def fake_send(cmd, params, **kwargs): captured["cmd"] = cmd captured["params"] = params return { "success": True, "data": { "instanceID": 12345, "name": "Player", "tag": "Player", "layer": 0, "activeSelf": True, "activeInHierarchy": True, "isStatic": False, "path": "/Player", "componentTypes": ["Transform", "PlayerController", "Rigidbody"], }, } monkeypatch.setattr( gameobject_res_mod, "async_send_command_with_retry", fake_send, ) resp = await gameobject_res_mod.get_gameobject( ctx=DummyContext(), instance_id="12345", ) assert resp.success is True assert captured["params"]["instanceID"] == 12345 @pytest.mark.asyncio async def test_get_gameobject_components(monkeypatch): """Test reading all components for a GameObject.""" captured = {} async def fake_send(cmd, params, **kwargs): captured["cmd"] = cmd captured["params"] = params return { "success": True, "data": { "cursor": 0, "pageSize": 25, "next_cursor": None, "truncated": False, "total": 3, "items": [ {"typeName": "UnityEngine.Transform", "instanceID": 1, "enabled": True}, {"typeName": "UnityEngine.MeshRenderer", "instanceID": 2, "enabled": True}, {"typeName": "UnityEngine.BoxCollider", "instanceID": 3, "enabled": True}, ], }, } monkeypatch.setattr( gameobject_res_mod, "async_send_command_with_retry", fake_send, ) resp = await gameobject_res_mod.get_gameobject_components( ctx=DummyContext(), instance_id="12345", ) assert resp.success is True assert captured["params"]["instanceID"] == 12345 @pytest.mark.asyncio async def test_get_gameobject_components_pagination(monkeypatch): """Test pagination parameters for components resource.""" captured = {} async def fake_send(cmd, params, **kwargs): captured["params"] = params return { "success": True, "data": { "cursor": 10, "pageSize": 5, "next_cursor": "15", "truncated": True, "total": 20, "items": [], }, } monkeypatch.setattr( gameobject_res_mod, "async_send_command_with_retry", fake_send, ) resp = await gameobject_res_mod.get_gameobject_components( ctx=DummyContext(), instance_id="12345", page_size=5, cursor=10, ) assert resp.success is True p = captured["params"] assert p["pageSize"] == 5 assert p["cursor"] == 10 @pytest.mark.asyncio async def test_get_gameobject_components_include_properties(monkeypatch): """Test include_properties flag for components resource.""" captured = {} async def fake_send(cmd, params, **kwargs): captured["params"] = params return { "success": True, "data": { "items": [ { "typeName": "UnityEngine.Rigidbody", "instanceID": 123, "mass": 1.0, "drag": 0.0, "useGravity": True, } ] }, } monkeypatch.setattr( gameobject_res_mod, "async_send_command_with_retry", fake_send, ) resp = await gameobject_res_mod.get_gameobject_components( ctx=DummyContext(), instance_id="12345", include_properties=True, ) assert resp.success is True assert captured["params"]["includeProperties"] is True @pytest.mark.asyncio async def test_get_gameobject_component_single(monkeypatch): """Test reading a single component by name.""" captured = {} async def fake_send(cmd, params, **kwargs): captured["cmd"] = cmd captured["params"] = params return { "success": True, "data": { "typeName": "UnityEngine.Rigidbody", "instanceID": 67890, "mass": 5.0, "drag": 0.1, "angularDrag": 0.05, "useGravity": True, "isKinematic": False, }, } monkeypatch.setattr( gameobject_res_mod, "async_send_command_with_retry", fake_send, ) resp = await gameobject_res_mod.get_gameobject_component( ctx=DummyContext(), instance_id="12345", component_name="Rigidbody", ) assert resp.success is True p = captured["params"] assert p["instanceID"] == 12345 assert p["componentName"] == "Rigidbody" @pytest.mark.asyncio async def test_get_gameobject_component_not_found(monkeypatch): """Test error when component is not found.""" async def fake_send(cmd, params, **kwargs): return { "success": False, "message": "GameObject '12345' does not have a 'NonExistent' component.", } monkeypatch.setattr( gameobject_res_mod, "async_send_command_with_retry", fake_send, ) resp = await gameobject_res_mod.get_gameobject_component( ctx=DummyContext(), instance_id="12345", component_name="NonExistent", ) assert resp.success is False assert "NonExistent" in (resp.message or "") @pytest.mark.asyncio async def test_get_gameobject_not_found(monkeypatch): """Test error when GameObject is not found.""" async def fake_send(cmd, params, **kwargs): return { "success": False, "message": "GameObject with instanceID '99999' not found.", } monkeypatch.setattr( gameobject_res_mod, "async_send_command_with_retry", fake_send, ) resp = await gameobject_res_mod.get_gameobject( ctx=DummyContext(), instance_id="99999", ) assert resp.success is False assert "99999" in (resp.message or "")