| package executor |
|
|
| import ( |
| "bytes" |
| "testing" |
|
|
| "github.com/tidwall/gjson" |
| ) |
|
|
| func TestApplyClaudeToolPrefix(t *testing.T) { |
| input := []byte(`{"tools":[{"name":"alpha"},{"name":"proxy_bravo"}],"tool_choice":{"type":"tool","name":"charlie"},"messages":[{"role":"assistant","content":[{"type":"tool_use","name":"delta","id":"t1","input":{}}]}]}`) |
| out := applyClaudeToolPrefix(input, "proxy_") |
|
|
| if got := gjson.GetBytes(out, "tools.0.name").String(); got != "proxy_alpha" { |
| t.Fatalf("tools.0.name = %q, want %q", got, "proxy_alpha") |
| } |
| if got := gjson.GetBytes(out, "tools.1.name").String(); got != "proxy_bravo" { |
| t.Fatalf("tools.1.name = %q, want %q", got, "proxy_bravo") |
| } |
| if got := gjson.GetBytes(out, "tool_choice.name").String(); got != "proxy_charlie" { |
| t.Fatalf("tool_choice.name = %q, want %q", got, "proxy_charlie") |
| } |
| if got := gjson.GetBytes(out, "messages.0.content.0.name").String(); got != "proxy_delta" { |
| t.Fatalf("messages.0.content.0.name = %q, want %q", got, "proxy_delta") |
| } |
| } |
|
|
| func TestApplyClaudeToolPrefix_SkipsBuiltinTools(t *testing.T) { |
| input := []byte(`{"tools":[{"type":"web_search_20250305","name":"web_search"},{"name":"my_custom_tool","input_schema":{"type":"object"}}]}`) |
| out := applyClaudeToolPrefix(input, "proxy_") |
|
|
| if got := gjson.GetBytes(out, "tools.0.name").String(); got != "web_search" { |
| t.Fatalf("built-in tool name should not be prefixed: tools.0.name = %q, want %q", got, "web_search") |
| } |
| if got := gjson.GetBytes(out, "tools.1.name").String(); got != "proxy_my_custom_tool" { |
| t.Fatalf("custom tool should be prefixed: tools.1.name = %q, want %q", got, "proxy_my_custom_tool") |
| } |
| } |
|
|
| func TestStripClaudeToolPrefixFromResponse(t *testing.T) { |
| input := []byte(`{"content":[{"type":"tool_use","name":"proxy_alpha","id":"t1","input":{}},{"type":"tool_use","name":"bravo","id":"t2","input":{}}]}`) |
| out := stripClaudeToolPrefixFromResponse(input, "proxy_") |
|
|
| if got := gjson.GetBytes(out, "content.0.name").String(); got != "alpha" { |
| t.Fatalf("content.0.name = %q, want %q", got, "alpha") |
| } |
| if got := gjson.GetBytes(out, "content.1.name").String(); got != "bravo" { |
| t.Fatalf("content.1.name = %q, want %q", got, "bravo") |
| } |
| } |
|
|
| func TestStripClaudeToolPrefixFromStreamLine(t *testing.T) { |
| line := []byte(`data: {"type":"content_block_start","content_block":{"type":"tool_use","name":"proxy_alpha","id":"t1"},"index":0}`) |
| out := stripClaudeToolPrefixFromStreamLine(line, "proxy_") |
|
|
| payload := bytes.TrimSpace(out) |
| if bytes.HasPrefix(payload, []byte("data:")) { |
| payload = bytes.TrimSpace(payload[len("data:"):]) |
| } |
| if got := gjson.GetBytes(payload, "content_block.name").String(); got != "alpha" { |
| t.Fatalf("content_block.name = %q, want %q", got, "alpha") |
| } |
| } |
|
|