test_tools.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. """Tests for the tool registry and argument validation."""
  2. from stt_daemon.assistant.tools import Tool, ToolRegistry, default_registry
  3. def test_default_registry_exposes_get_datetime():
  4. registry = default_registry()
  5. tool = registry.get("get_datetime")
  6. assert tool is not None
  7. assert tool.side_effect == "read_only"
  8. spec = registry.specs()[0]
  9. assert spec["type"] == "function"
  10. assert spec["function"]["name"] == "get_datetime"
  11. def test_get_datetime_returns_iso_timestamp():
  12. tool = default_registry().get("get_datetime")
  13. assert tool is not None
  14. assert "T" in tool.run({})
  15. def test_validate_rejects_unknown_tool():
  16. args, error = default_registry().validate("nope", "{}")
  17. assert args is None
  18. assert error is not None and "unknown tool" in error
  19. def test_validate_rejects_malformed_json():
  20. args, error = default_registry().validate("get_datetime", "{not json")
  21. assert args is None
  22. assert error is not None and "invalid JSON" in error
  23. def test_validate_rejects_non_object_arguments():
  24. args, error = default_registry().validate("get_datetime", "[1, 2]")
  25. assert args is None
  26. assert error is not None and "object" in error
  27. def test_validate_accepts_empty_object():
  28. args, error = default_registry().validate("get_datetime", "{}")
  29. assert args == {}
  30. assert error is None
  31. def test_schema_requires_checks_unknown_and_types():
  32. registry = ToolRegistry()
  33. registry.register(
  34. Tool(
  35. name="set_volume",
  36. description="Set the volume",
  37. parameters={
  38. "type": "object",
  39. "properties": {"level": {"type": "integer"}},
  40. "required": ["level"],
  41. },
  42. run=lambda args: "ok",
  43. )
  44. )
  45. def reject(arguments, fragment):
  46. args, error = registry.validate("set_volume", arguments)
  47. assert args is None
  48. assert error is not None and fragment in error
  49. reject("{}", "missing required")
  50. reject('{"level": 1, "x": 2}', "unexpected argument")
  51. reject('{"level": "loud"}', "must be integer")
  52. reject('{"level": true}', "must be integer")
  53. assert registry.validate("set_volume", '{"level": 5}') == ({"level": 5}, None)