neuralcad / tests /test_tools.py
CallMeDaniel's picture
refactor: migrate tools to BaseTool subclasses with args_schema
1db1a69
"""Tests for agents/tools.py — CrewAI CadQuery tools.
These tests require CadQuery to be installed.
"""
import json
import pytest
from agents.tools import ExecuteCadTool, ValidateCadTool, GenerateGcodeTool, set_last_shape, get_last_shape
pytestmark = pytest.mark.requires_cadquery
class TestExecuteCadTool:
def test_valid_code(self):
tool = ExecuteCadTool()
result = json.loads(tool._run(code="result = cq.Workplane('XY').box(10,10,10)"))
assert result["success"] is True
assert result["volume_mm3"] > 0
assert result["face_count"] == 6
def test_invalid_code(self):
tool = ExecuteCadTool()
result = json.loads(tool._run(code="result = bad_code"))
assert result["success"] is False
assert result["error"] is not None
def test_missing_result(self):
tool = ExecuteCadTool()
result = json.loads(tool._run(code="x = 42"))
assert result["success"] is False
class TestValidateCadTool:
def test_valid_machinable(self):
# First execute code to set the last shape
exec_tool = ExecuteCadTool()
exec_tool._run(code="result = cq.Workplane('XY').box(50, 30, 10)")
# Now validate the last shape
tool = ValidateCadTool()
result = json.loads(tool._run())
assert "validation" in result
assert result["validation"]["machinable"] is True
def test_no_shape_available(self):
set_last_shape(None)
tool = ValidateCadTool()
result = json.loads(tool._run())
assert result["success"] is False
def test_returns_validation(self):
exec_tool = ExecuteCadTool()
exec_tool._run(code="result = cq.Workplane('XY').box(20, 20, 20)")
tool = ValidateCadTool()
result = json.loads(tool._run())
assert "validation" in result
assert result["success"] is True
class TestGenerateGcodeTool:
def test_returns_error_when_no_shape(self):
set_last_shape(None)
tool = GenerateGcodeTool()
result = json.loads(tool._run(
operations=["pocket", "profile"],
tool_diameter=6.0,
post_processor="grbl",
))
assert result["success"] is False
assert "no shape" in result["error"].lower()
def test_returns_error_when_ocp_not_installed(self):
from unittest.mock import MagicMock
set_last_shape(MagicMock())
tool = GenerateGcodeTool()
result = json.loads(tool._run(
operations=["pocket"],
tool_diameter=6.0,
post_processor="grbl",
))
assert result["success"] is False
set_last_shape(None)