mirror of
https://github.com/YspCoder/clawgo.git
synced 2026-04-14 12:27:29 +08:00
141 lines
3.5 KiB
Go
141 lines
3.5 KiB
Go
package tools
|
|
|
|
import (
|
|
"context"
|
|
"os/exec"
|
|
"runtime"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/YspCoder/clawgo/pkg/config"
|
|
)
|
|
|
|
func TestFilesystemToolsParseStringArgs(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
root := t.TempDir()
|
|
write := NewWriteFileTool(root)
|
|
read := NewReadFileTool(root)
|
|
list := NewListDirTool(root)
|
|
|
|
if _, err := write.Execute(context.Background(), map[string]interface{}{
|
|
"path": "demo.txt",
|
|
"content": "hello world",
|
|
"append": "false",
|
|
}); err != nil {
|
|
t.Fatalf("write failed: %v", err)
|
|
}
|
|
|
|
out, err := read.Execute(context.Background(), map[string]interface{}{
|
|
"path": "demo.txt",
|
|
"offset": "6",
|
|
"limit": "5",
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("read failed: %v", err)
|
|
}
|
|
if out != "world" {
|
|
t.Fatalf("unexpected read output: %q", out)
|
|
}
|
|
|
|
listOut, err := list.Execute(context.Background(), map[string]interface{}{
|
|
"path": ".",
|
|
"recursive": "true",
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("list failed: %v", err)
|
|
}
|
|
if !strings.Contains(listOut, "demo.txt") {
|
|
t.Fatalf("unexpected list output: %s", listOut)
|
|
}
|
|
|
|
edit := NewEditFileTool(root)
|
|
if _, err := edit.Execute(context.Background(), map[string]interface{}{
|
|
"path": "demo.txt",
|
|
"old_text": "world",
|
|
"new_text": "",
|
|
}); err != nil {
|
|
t.Fatalf("edit with empty new_text failed: %v", err)
|
|
}
|
|
emptyWrite, err := write.Execute(context.Background(), map[string]interface{}{
|
|
"path": "empty.txt",
|
|
"content": "",
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("write empty content failed: %v", err)
|
|
}
|
|
if !strings.Contains(emptyWrite, "empty.txt") {
|
|
t.Fatalf("unexpected empty write output: %s", emptyWrite)
|
|
}
|
|
}
|
|
|
|
func TestSpawnToolParsesStringNumbers(t *testing.T) {
|
|
manager := NewSubagentManager(nil, t.TempDir(), nil)
|
|
manager.SetRunFunc(func(ctx context.Context, run *SubagentRun) (string, error) {
|
|
return "ok", nil
|
|
})
|
|
tool := NewSpawnTool(manager)
|
|
|
|
out, err := tool.Execute(context.Background(), map[string]interface{}{
|
|
"task": "implement check",
|
|
"agent_id": "coder",
|
|
"max_retries": "2",
|
|
"retry_backoff_ms": "100",
|
|
"timeout_sec": "5",
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("spawn failed: %v", err)
|
|
}
|
|
if !strings.Contains(out, "spawned") && !strings.Contains(strings.ToLower(out), "subagent") {
|
|
t.Fatalf("unexpected spawn output: %s", out)
|
|
}
|
|
time.Sleep(50 * time.Millisecond)
|
|
}
|
|
|
|
func TestExecBrowserWebToolsParseStringArgs(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
execTool := NewExecTool(configShellForTest(), t.TempDir(), NewProcessManager(t.TempDir()))
|
|
command := "printf hi"
|
|
if runtime.GOOS == "windows" {
|
|
if _, err := exec.LookPath("sh"); err != nil {
|
|
t.Skip("sh is not available in test environment")
|
|
}
|
|
}
|
|
execOut, err := execTool.Execute(context.Background(), map[string]interface{}{
|
|
"command": command,
|
|
"background": "false",
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("exec failed: %v", err)
|
|
}
|
|
if !strings.Contains(execOut, "hi") {
|
|
t.Fatalf("unexpected exec output: %s", execOut)
|
|
}
|
|
|
|
browserTool := NewBrowserTool()
|
|
if _, err := browserTool.Execute(context.Background(), map[string]interface{}{
|
|
"action": "unknown",
|
|
"url": "https://example.com",
|
|
}); err == nil {
|
|
t.Fatal("expected browser tool to reject unknown action")
|
|
}
|
|
|
|
search := NewWebSearchTool("", 5)
|
|
searchOut, err := search.Execute(context.Background(), map[string]interface{}{
|
|
"query": "golang",
|
|
"count": "3",
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("web search failed: %v", err)
|
|
}
|
|
if !strings.Contains(searchOut, "BRAVE_API_KEY") {
|
|
t.Fatalf("unexpected web search output: %s", searchOut)
|
|
}
|
|
}
|
|
|
|
func configShellForTest() config.ShellConfig {
|
|
return config.ShellConfig{}
|
|
}
|