From ab13a986199d00cf3974509928556fa421b94851 Mon Sep 17 00:00:00 2001 From: Sam Schmidt Date: Wed, 28 Jan 2026 11:21:38 -0500 Subject: [PATCH] Add tests for Claude tool use --- .../providers/claude/tool_result_test.rb | 110 ++++++++++++++++++ .../agent/providers/claude/tool_use_test.rb | 49 ++++++++ 2 files changed, 159 insertions(+) create mode 100644 test/roast/cogs/agent/providers/claude/tool_result_test.rb create mode 100644 test/roast/cogs/agent/providers/claude/tool_use_test.rb diff --git a/test/roast/cogs/agent/providers/claude/tool_result_test.rb b/test/roast/cogs/agent/providers/claude/tool_result_test.rb new file mode 100644 index 00000000..9e39425a --- /dev/null +++ b/test/roast/cogs/agent/providers/claude/tool_result_test.rb @@ -0,0 +1,110 @@ +# frozen_string_literal: true + +require "test_helper" + +module Roast + module Cogs + class Agent < Cog + module Providers + class Claude < Provider + class ToolResultTest < ActiveSupport::TestCase + test "initialize with tool_use message" do + tool_use_message = Messages::ToolUseMessage.new( + type: :tool_use, + hash: { name: "bash", input: { description: "List files" } }, + ) + tool_result = ToolResult.new( + tool_use: tool_use_message, + content: "file1.txt\nfile2.txt", + is_error: false, + ) + + assert_equal :bash, tool_result.tool_name + assert_equal "List files", tool_result.tool_use_description + assert_equal "file1.txt\nfile2.txt", tool_result.content + refute tool_result.is_error + end + + test "initialize with nil tool_use" do + tool_result = ToolResult.new( + tool_use: nil, + content: "some content", + is_error: false, + ) + + assert_equal :unknown, tool_result.tool_name + assert_nil tool_result.tool_use_description + end + + test "initialize with tool_use without description" do + tool_use_message = Messages::ToolUseMessage.new( + type: :tool_use, + hash: { name: "custom", input: {} }, + ) + tool_result = ToolResult.new( + tool_use: tool_use_message, + content: "result", + is_error: false, + ) + + assert_nil tool_result.tool_use_description + end + + test "initialize sets is_error flag" do + tool_result = ToolResult.new( + tool_use: nil, + content: "error message", + is_error: true, + ) + + assert tool_result.is_error + end + + test "format calls format_unknown for unknown tool" do + tool_result = ToolResult.new( + tool_use: nil, + content: "result content", + is_error: false, + ) + + output = tool_result.format + + assert_match(/UNKNOWN \[unknown\]/, output) + assert_match(/OK/, output) + assert_match(/result content/, output) + end + + test "format shows ERROR for error results" do + tool_result = ToolResult.new( + tool_use: nil, + content: "error details", + is_error: true, + ) + + output = tool_result.format + + assert_match(/ERROR/, output) + assert_match(/error details/, output) + end + + test "format includes description when present" do + tool_use_message = Messages::ToolUseMessage.new( + type: :tool_use, + hash: { name: "bash", input: { description: "Run command" } }, + ) + tool_result = ToolResult.new( + tool_use: tool_use_message, + content: "output", + is_error: false, + ) + + output = tool_result.format + + assert_match(/Run command/, output) + end + end + end + end + end + end +end diff --git a/test/roast/cogs/agent/providers/claude/tool_use_test.rb b/test/roast/cogs/agent/providers/claude/tool_use_test.rb new file mode 100644 index 00000000..3ee650d5 --- /dev/null +++ b/test/roast/cogs/agent/providers/claude/tool_use_test.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +require "test_helper" + +module Roast + module Cogs + class Agent < Cog + module Providers + class Claude < Provider + class ToolUseTest < ActiveSupport::TestCase + test "initialize sets name and input" do + tool_use = ToolUse.new(name: :bash, input: { command: "ls" }) + + assert_equal :bash, tool_use.name + assert_equal({ command: "ls" }, tool_use.input) + end + + test "format calls format_bash for bash tool" do + tool_use = ToolUse.new(name: :bash, input: { command: "ls" }) + + output = tool_use.format + + assert_match(/BASH/, output) + assert_match(/command.*ls/, output) + end + + test "format calls format_unknown for unknown tool" do + tool_use = ToolUse.new(name: :unknown_tool, input: { arg: "value" }) + + output = tool_use.format + + assert_match(/UNKNOWN \[unknown_tool\]/, output) + assert_match(/arg.*value/, output) + end + + test "format_unknown includes tool name and input" do + tool_use = ToolUse.new(name: :custom, input: { key: "value" }) + + output = tool_use.send(:format_unknown) + + assert_match(/UNKNOWN \[custom\]/, output) + assert_match(/key.*value/, output) + end + end + end + end + end + end +end