import json
import unittest
from unittest.mock import MagicMock, patch
from tests import test_bootstrap # noqa: F401
class TestServerTools(unittest.TestCase):
@patch("blender_mcp.server.get_blender_connection")
def test_execute_ops_sends_execute_ops_command(self, get_conn):
mock_conn = MagicMock()
mock_conn.send_command.return_value = {"ok": True}
get_conn.return_value = mock_conn
from blender_mcp.server import execute_ops
req = {"dsl_version": "1", "transaction": "none", "dry_run": True, "ops": [{"type": "deselect_all"}]}
out = execute_ops(ctx=None, request=req)
self.assertEqual(json.loads(out), {"ok": True})
mock_conn.send_command.assert_called_once()
called_type, called_params = mock_conn.send_command.call_args[0]
self.assertEqual(called_type, "execute_ops")
self.assertIn("request", called_params)
self.assertEqual(called_params["request"]["dsl_version"], "1")
def test_execute_ops_validation_error_is_user_friendly(self):
from blender_mcp.server import execute_ops
out = execute_ops(ctx=None, request={"dsl_version": "2", "ops": [{"type": "deselect_all"}]})
self.assertTrue(out.startswith("DSL validation error:"))
@patch("blender_mcp.server.get_blender_connection")
def test_create_primitive_wrapper(self, get_conn):
mock_conn = MagicMock()
mock_conn.send_command.return_value = {"ok": True, "results": [{"op_index": 0, "status": "success"}]}
get_conn.return_value = mock_conn
from blender_mcp.server import create_primitive
out = create_primitive(ctx=None, primitive="cube", name="Cube_A", size=2.0, location=[0, 0, 1])
self.assertTrue(json.loads(out)["ok"])
called_type, called_params = mock_conn.send_command.call_args[0]
self.assertEqual(called_type, "execute_ops")
op = called_params["request"]["ops"][0]
self.assertEqual(op["type"], "create_primitive")
self.assertEqual(op["primitive"], "cube")
@patch("blender_mcp.server.get_blender_connection")
def test_set_shading_wrapper(self, get_conn):
mock_conn = MagicMock()
mock_conn.send_command.return_value = {"ok": True, "results": [{"op_index": 0, "status": "success"}]}
get_conn.return_value = mock_conn
from blender_mcp.server import set_shading
out = set_shading(ctx=None, names=["Cube"], shade="smooth", auto_smooth=True, auto_smooth_angle=45.0)
self.assertTrue(json.loads(out)["ok"])
called_type, called_params = mock_conn.send_command.call_args[0]
self.assertEqual(called_type, "execute_ops")
op = called_params["request"]["ops"][0]
self.assertEqual(op["type"], "set_shading")
self.assertEqual(op["shade"], "smooth")
if __name__ == "__main__":
unittest.main()