"""Integration tests for manage_texture tool.""" import pytest import asyncio from .test_helpers import DummyContext import services.tools.manage_texture as manage_texture_mod def run_async(coro): """Simple wrapper to run a coroutine synchronously.""" loop = asyncio.new_event_loop() try: asyncio.set_event_loop(loop) return loop.run_until_complete(coro) finally: loop.close() asyncio.set_event_loop(None) async def noop_preflight(*args, **kwargs): return None class TestManageTextureIntegration: """Integration tests for texture management tool logic.""" def test_create_texture_with_color_array(self, monkeypatch): """Test creating a texture with RGB color array (0-255).""" captured = {} async def fake_send(func, instance, cmd, params, **kwargs): captured["cmd"] = cmd captured["params"] = params return {"success": True, "message": "Created texture"} monkeypatch.setattr(manage_texture_mod, "send_with_unity_instance", fake_send) monkeypatch.setattr(manage_texture_mod, "preflight", noop_preflight) resp = run_async(manage_texture_mod.manage_texture( ctx=DummyContext(), action="create", path="Assets/TestTextures/Red.png", width=64, height=64, fill_color=[255, 0, 0, 255] )) assert resp["success"] is True assert captured["params"]["fillColor"] == [255, 0, 0, 255] def test_create_texture_with_normalized_color(self, monkeypatch): """Test creating a texture with normalized color (0.0-1.0).""" captured = {} async def fake_send(func, instance, cmd, params, **kwargs): captured["params"] = params return {"success": True, "message": "Created texture"} monkeypatch.setattr(manage_texture_mod, "send_with_unity_instance", fake_send) monkeypatch.setattr(manage_texture_mod, "preflight", noop_preflight) resp = run_async(manage_texture_mod.manage_texture( ctx=DummyContext(), action="create", path="Assets/TestTextures/Blue.png", fill_color=[0.0, 0.0, 1.0, 1.0] )) assert resp["success"] is True # Should be normalized to 0-255 assert captured["params"]["fillColor"] == [0, 0, 255, 255] def test_create_sprite_with_pattern(self, monkeypatch): """Test creating a sprite with checkerboard pattern.""" captured = {} async def fake_send(func, instance, cmd, params, **kwargs): captured["params"] = params return {"success": True, "message": "Created sprite", "data": {"asSprite": True}} monkeypatch.setattr(manage_texture_mod, "send_with_unity_instance", fake_send) monkeypatch.setattr(manage_texture_mod, "preflight", noop_preflight) resp = run_async(manage_texture_mod.manage_texture( ctx=DummyContext(), action="create_sprite", path="Assets/TestTextures/Checkerboard.png", pattern="checkerboard", as_sprite={ "pixelsPerUnit": 100.0, "pivot": [0.5, 0.5] } )) assert resp["success"] is True assert captured["params"]["action"] == "create_sprite" assert captured["params"]["pattern"] == "checkerboard" assert captured["params"]["spriteSettings"]["pixelsPerUnit"] == 100.0 def test_create_texture_with_import_settings(self, monkeypatch): """Test creating a texture with import settings (conversion of snake_case to camelCase).""" captured = {} async def fake_send(func, instance, cmd, params, **kwargs): captured["params"] = params return {"success": True, "message": "Created texture"} monkeypatch.setattr(manage_texture_mod, "send_with_unity_instance", fake_send) monkeypatch.setattr(manage_texture_mod, "preflight", noop_preflight) resp = run_async(manage_texture_mod.manage_texture( ctx=DummyContext(), action="create", path="Assets/TestTextures/SpriteTexture.png", import_settings={ "texture_type": "sprite", "sprite_pixels_per_unit": 100, "filter_mode": "point", "wrap_mode": "clamp" } )) assert resp["success"] is True settings = captured["params"]["importSettings"] assert settings["textureType"] == "Sprite" assert settings["spritePixelsPerUnit"] == 100 assert settings["filterMode"] == "Point" assert settings["wrapMode"] == "Clamp" def test_texture_modify_params(self, monkeypatch): """Test texture modify parameter conversion.""" captured = {} async def fake_send(func, instance, cmd, params, **kwargs): captured["params"] = params return {"success": True, "message": "Modified texture"} monkeypatch.setattr(manage_texture_mod, "send_with_unity_instance", fake_send) monkeypatch.setattr(manage_texture_mod, "preflight", noop_preflight) resp = run_async(manage_texture_mod.manage_texture( ctx=DummyContext(), action="modify", path="Assets/Textures/Test.png", set_pixels={ "x": 0, "y": 0, "width": 10, "height": 10, "color": [255, 0, 0, 255] } )) assert resp["success"] is True assert captured["params"]["setPixels"]["color"] == [255, 0, 0, 255] def test_texture_modify_pixels_array(self, monkeypatch): """Test texture modify pixel array normalization.""" captured = {} async def fake_send(func, instance, cmd, params, **kwargs): captured["params"] = params return {"success": True, "message": "Modified texture"} monkeypatch.setattr(manage_texture_mod, "send_with_unity_instance", fake_send) monkeypatch.setattr(manage_texture_mod, "preflight", noop_preflight) resp = run_async(manage_texture_mod.manage_texture( ctx=DummyContext(), action="modify", path="Assets/Textures/Test.png", set_pixels={ "x": 0, "y": 0, "width": 2, "height": 2, "pixels": [ [1.0, 0.0, 0.0, 1.0], [0.0, 1.0, 0.0, 1.0], [0.0, 0.0, 1.0, 1.0], [0.5, 0.5, 0.5, 1.0], ] } )) assert resp["success"] is True assert captured["params"]["setPixels"]["pixels"] == [ [255, 0, 0, 255], [0, 255, 0, 255], [0, 0, 255, 255], [128, 128, 128, 255], ] def test_texture_modify_pixels_invalid_length(self, monkeypatch): """Test error handling for invalid pixel array length.""" async def fake_send(*args, **kwargs): return {"success": True} monkeypatch.setattr(manage_texture_mod, "send_with_unity_instance", fake_send) monkeypatch.setattr(manage_texture_mod, "preflight", noop_preflight) resp = run_async(manage_texture_mod.manage_texture( ctx=DummyContext(), action="modify", path="Assets/Textures/Test.png", set_pixels={ "x": 0, "y": 0, "width": 2, "height": 2, "pixels": [ [255, 0, 0, 255], [0, 255, 0, 255], [0, 0, 255, 255], ] } )) assert resp["success"] is False assert "pixels array must have 4 entries" in resp["message"] def test_texture_modify_invalid_set_pixels_type(self, monkeypatch): """Test error handling for invalid set_pixels input type.""" async def fake_send(*args, **kwargs): return {"success": True} monkeypatch.setattr(manage_texture_mod, "send_with_unity_instance", fake_send) monkeypatch.setattr(manage_texture_mod, "preflight", noop_preflight) resp = run_async(manage_texture_mod.manage_texture( ctx=DummyContext(), action="modify", path="Assets/Textures/Test.png", set_pixels=[] )) assert resp["success"] is False assert resp["message"] == "set_pixels must be a JSON object" def test_texture_delete_params(self, monkeypatch): """Test texture delete parameter pass-through.""" captured = {} async def fake_send(func, instance, cmd, params, **kwargs): captured["params"] = params return {"success": True, "message": "Deleted texture"} monkeypatch.setattr(manage_texture_mod, "send_with_unity_instance", fake_send) monkeypatch.setattr(manage_texture_mod, "preflight", noop_preflight) resp = run_async(manage_texture_mod.manage_texture( ctx=DummyContext(), action="delete", path="Assets/Textures/Old.png" )) assert resp["success"] is True assert captured["params"]["path"] == "Assets/Textures/Old.png" def test_invalid_dimensions(self, monkeypatch): """Test error handling for invalid dimensions.""" async def fake_send(func, instance, cmd, params, **kwargs): w = params.get("width", 0) if w > 4096: return {"success": False, "message": "Invalid dimensions: 5000x64. Must be 1-4096."} return {"success": True} monkeypatch.setattr(manage_texture_mod, "send_with_unity_instance", fake_send) monkeypatch.setattr(manage_texture_mod, "preflight", noop_preflight) resp = run_async(manage_texture_mod.manage_texture( ctx=DummyContext(), action="create", path="Assets/Invalid.png", width=0, height=64 # Non-positive dimension )) assert resp["success"] is False assert "positive" in resp["message"].lower()