feat(tools/basic): 内置基础工具(calculator(注入安全)/datetime/random/text/json/markdown)+ 批量注册
This commit is contained in:
1 parent
b3c61aa1ff
commit
08223c06a5
19 files changed
+2074
No files matched your search
@@ -0,0 +1,121 @@
|
||||
package basic
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// TestMarkdown_Execute_Normal covers table, list, heading and metadata ops.
|
||||
func TestMarkdown_Execute_Normal(t *testing.T) {
|
||||
t.Parallel()
|
||||
tool := markdown{}
|
||||
|
||||
t.Run("table", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
got, err := run(t, tool, map[string]any{
|
||||
"operation": "table",
|
||||
"headers": []any{"name", "score"},
|
||||
"rows": []any{[]any{"ada", "90"}, []any{"grace", "100"}},
|
||||
})
|
||||
assertNoErr(t, err)
|
||||
want := "| name | score |\n| --- | --- |\n| ada | 90 |\n| grace | 100 |\n"
|
||||
if got := fieldString(t, mapResult(t, got), "result"); got != want {
|
||||
t.Fatalf("table = %q, want %q", got, want)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("bulleted list", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
got, err := run(t, tool, map[string]any{"operation": "list", "items": []any{"a", "b"}})
|
||||
assertNoErr(t, err)
|
||||
if want := "- a\n- b\n"; fieldString(t, mapResult(t, got), "result") != want {
|
||||
t.Fatalf("got %q", fieldString(t, mapResult(t, got), "result"))
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("ordered list", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
got, err := run(t, tool, map[string]any{"operation": "list", "items": []any{"a", "b"}, "ordered": true})
|
||||
assertNoErr(t, err)
|
||||
if want := "1. a\n2. b\n"; fieldString(t, mapResult(t, got), "result") != want {
|
||||
t.Fatalf("got %q", fieldString(t, mapResult(t, got), "result"))
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("heading", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
got, err := run(t, tool, map[string]any{"operation": "heading", "level": 2, "text": "Title"})
|
||||
assertNoErr(t, err)
|
||||
if want := "## Title\n"; fieldString(t, mapResult(t, got), "result") != want {
|
||||
t.Fatalf("got %q", fieldString(t, mapResult(t, got), "result"))
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("metadata with front matter", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
got, err := run(t, tool, map[string]any{"operation": "metadata", "content": "---\ntitle: Hi\n---\nBody text"})
|
||||
assertNoErr(t, err)
|
||||
m := mapResult(t, got)
|
||||
meta := m["meta"].(map[string]string)
|
||||
if meta["title"] != "Hi" {
|
||||
t.Fatalf("meta = %v, want title=Hi", meta)
|
||||
}
|
||||
if got := m["body"].(string); got != "Body text" {
|
||||
t.Fatalf("body = %q, want Body text", got)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("metadata without front matter", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
got, err := run(t, tool, map[string]any{"operation": "metadata", "content": "just body"})
|
||||
assertNoErr(t, err)
|
||||
m := mapResult(t, got)
|
||||
if meta := m["meta"].(map[string]string); len(meta) != 0 {
|
||||
t.Fatalf("meta = %v, want empty", meta)
|
||||
}
|
||||
if got := m["body"].(string); got != "just body" {
|
||||
t.Fatalf("body = %q", got)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// TestMarkdown_Execute_Errors covers bad operation inputs.
|
||||
func TestMarkdown_Execute_Errors(t *testing.T) {
|
||||
t.Parallel()
|
||||
tool := markdown{}
|
||||
cases := []struct {
|
||||
name string
|
||||
args map[string]any
|
||||
target error
|
||||
}{
|
||||
{name: "unknown operation", args: map[string]any{"operation": "quote"}, target: ErrUnsupported},
|
||||
{name: "table without headers", args: map[string]any{"operation": "table", "rows": []any{}}, target: ErrInvalidArgument},
|
||||
{name: "list without items", args: map[string]any{"operation": "list"}, target: ErrInvalidArgument},
|
||||
{name: "heading level too low", args: map[string]any{"operation": "heading", "level": 0, "text": "x"}, target: ErrInvalidArgument},
|
||||
{name: "heading level too high", args: map[string]any{"operation": "heading", "level": 7, "text": "x"}, target: ErrInvalidArgument},
|
||||
{name: "heading without text", args: map[string]any{"operation": "heading", "level": 1}, target: ErrInvalidArgument},
|
||||
{name: "metadata without content", args: map[string]any{"operation": "metadata"}, target: ErrInvalidArgument},
|
||||
}
|
||||
for _, tc := range cases {
|
||||
tc := tc
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
_, err := run(t, tool, tc.args)
|
||||
assertIs(t, err, tc.target)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// TestMarkdown_Schema verifies required operation.
|
||||
func TestMarkdown_Schema(t *testing.T) {
|
||||
t.Parallel()
|
||||
p, err := markdown{}.Parameters()
|
||||
assertNoErr(t, err)
|
||||
reqs := p["required"].([]any)
|
||||
if len(reqs) != 1 || reqs[0] != "operation" {
|
||||
t.Fatalf("required = %v, want [operation]", reqs)
|
||||
}
|
||||
if !strings.Contains(p["properties"].(map[string]any)["operation"].(map[string]any)["enum"].([]any)[0].(string), "table") {
|
||||
t.Fatalf("enum should include table")
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user