mirror of
https://github.com/YspCoder/clawgo.git
synced 2026-04-13 21:57:29 +08:00
88 lines
2.5 KiB
Go
88 lines
2.5 KiB
Go
package tools
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
type stubFetchTool struct{}
|
|
|
|
func (s *stubFetchTool) Name() string { return "web_fetch" }
|
|
func (s *stubFetchTool) Description() string { return "stub" }
|
|
func (s *stubFetchTool) Parameters() map[string]interface{} {
|
|
return map[string]interface{}{}
|
|
}
|
|
func (s *stubFetchTool) Execute(_ context.Context, args map[string]interface{}) (string, error) {
|
|
return "fetched:" + MapStringArg(args, "url"), nil
|
|
}
|
|
func (s *stubFetchTool) ParallelSafe() bool { return true }
|
|
|
|
func TestMemorySearchToolParsesStringMaxResults(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
workspace := t.TempDir()
|
|
write := NewMemoryWriteTool(workspace)
|
|
if _, err := write.Execute(context.Background(), map[string]interface{}{
|
|
"content": "alpha beta gamma",
|
|
"kind": "longterm",
|
|
"importance": "high",
|
|
}); err != nil {
|
|
t.Fatalf("memory write failed: %v", err)
|
|
}
|
|
|
|
search := NewMemorySearchTool(workspace)
|
|
out, err := search.Execute(context.Background(), map[string]interface{}{
|
|
"query": "alpha",
|
|
"maxResults": "1",
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("memory search failed: %v", err)
|
|
}
|
|
if !strings.Contains(out, "alpha beta gamma") {
|
|
t.Fatalf("unexpected search output: %s", out)
|
|
}
|
|
}
|
|
|
|
func TestParallelToolParsesStringSlices(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
reg := NewToolRegistry()
|
|
reg.Register(&stubFetchTool{})
|
|
tool := NewParallelTool(reg, 2, map[string]struct{}{"web_fetch": {}})
|
|
|
|
out, err := tool.Execute(context.Background(), map[string]interface{}{
|
|
"calls": []map[string]interface{}{
|
|
{"tool": "web_fetch", "arguments": map[string]interface{}{"url": "https://example.com"}, "id": "first"},
|
|
},
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("parallel execute failed: %v", err)
|
|
}
|
|
if !strings.Contains(out, "first") || !strings.Contains(out, "https://example.com") {
|
|
t.Fatalf("unexpected parallel output: %s", out)
|
|
}
|
|
}
|
|
|
|
func TestParallelFetchToolParsesStringURLsSlice(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
_, _ = w.Write([]byte("parallel fetch ok"))
|
|
}))
|
|
defer srv.Close()
|
|
|
|
tool := NewParallelFetchTool(NewWebFetchTool(100), 2, map[string]struct{}{"web_fetch": {}})
|
|
out, err := tool.Execute(context.Background(), map[string]interface{}{
|
|
"urls": []string{srv.URL},
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("parallel_fetch execute failed: %v", err)
|
|
}
|
|
if !strings.Contains(out, "parallel fetch ok") {
|
|
t.Fatalf("unexpected parallel_fetch output: %s", out)
|
|
}
|
|
}
|