Anydoc / anydoc parser engine (push) Canceled after 0s
App / Format, vet, test, and build (push) Canceled after 0s
CLI / test (macos-latest / go 1.26) (push) Canceled after 0s
CLI / test (ubuntu-latest / go 1.26) (push) Canceled after 0s
CLI / test (windows-latest / go 1.26) (push) Canceled after 0s
Build and Push Docker Image / build-ui (push) Canceled after 0s
Build and Push Docker Image / build-docreader (push) Canceled after 0s
Build and Push Docker Image / build-sandbox (push) Canceled after 0s
Build and Push Docker Image / build-app (amd64, linux/amd64, ubuntu-latest) (push) Canceled after 0s
Build and Push Docker Image / build-app (arm64, linux/arm64, ubuntu-24.04-arm) (push) Canceled after 0s
DocReader / Python tests and Go client tests (push) Canceled after 0s
Build & Publish (dsh-weknora) / Typecheck, test, pack (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (pinned) (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (latest, advisory) (push) Canceled after 0s
Frontend / Test, type-check, and build (push) Canceled after 0s
Go Lint Cache / warm lint cache (.) (push) Canceled after 0s
Go Lint Cache / warm lint cache (cli) (push) Canceled after 0s
Go Lint Cache / warm lint cache (client) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.10) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.11) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.12) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.13) (push) Canceled after 0s
Build and Push Docker Image / merge (push) Canceled after 0s
Build & Publish (dsh-weknora) / Publish to npm (push) Canceled after 0s
Build & Publish (mcp-server) / Build sdist + wheel (push) Canceled after 0s
Build & Publish (mcp-server) / Publish to PyPI (push) Canceled after 0s
101 lines
2.9 KiB
Go
101 lines
2.9 KiB
Go
package tools
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
)
|
|
|
|
func TestCastParams_StringToBool(t *testing.T) {
|
|
schema := json.RawMessage(`{"type":"object","properties":{"enabled":{"type":"boolean"}}}`)
|
|
args := json.RawMessage(`{"enabled":"true"}`)
|
|
result := CastParams(args, schema)
|
|
|
|
var parsed map[string]interface{}
|
|
if err := json.Unmarshal(result, &parsed); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if parsed["enabled"] != true {
|
|
t.Errorf("expected true, got %v (%T)", parsed["enabled"], parsed["enabled"])
|
|
}
|
|
}
|
|
|
|
func TestCastParams_StringToInt(t *testing.T) {
|
|
schema := json.RawMessage(`{"type":"object","properties":{"count":{"type":"integer"}}}`)
|
|
args := json.RawMessage(`{"count":"42"}`)
|
|
result := CastParams(args, schema)
|
|
|
|
var parsed map[string]interface{}
|
|
if err := json.Unmarshal(result, &parsed); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
// JSON numbers are float64 in Go
|
|
if parsed["count"] != float64(42) {
|
|
t.Errorf("expected 42, got %v (%T)", parsed["count"], parsed["count"])
|
|
}
|
|
}
|
|
|
|
func TestCastParams_StringToFloat(t *testing.T) {
|
|
schema := json.RawMessage(`{"type":"object","properties":{"score":{"type":"number"}}}`)
|
|
args := json.RawMessage(`{"score":"3.14"}`)
|
|
result := CastParams(args, schema)
|
|
|
|
var parsed map[string]interface{}
|
|
if err := json.Unmarshal(result, &parsed); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if parsed["score"] != 3.14 {
|
|
t.Errorf("expected 3.14, got %v", parsed["score"])
|
|
}
|
|
}
|
|
|
|
func TestCastParams_NoChangeNeeded(t *testing.T) {
|
|
schema := json.RawMessage(`{"type":"object","properties":{"name":{"type":"string"}}}`)
|
|
args := json.RawMessage(`{"name":"hello"}`)
|
|
result := CastParams(args, schema)
|
|
|
|
if string(result) != string(args) {
|
|
t.Errorf("expected no change, got %s", result)
|
|
}
|
|
}
|
|
|
|
func TestCastParams_NilSchema(t *testing.T) {
|
|
args := json.RawMessage(`{"foo":"bar"}`)
|
|
result := CastParams(args, nil)
|
|
if string(result) != string(args) {
|
|
t.Errorf("expected no change with nil schema")
|
|
}
|
|
}
|
|
|
|
func TestCastParams_BoolFalseString(t *testing.T) {
|
|
schema := json.RawMessage(`{"type":"object","properties":{"flag":{"type":"boolean"}}}`)
|
|
args := json.RawMessage(`{"flag":"false"}`)
|
|
result := CastParams(args, schema)
|
|
|
|
var parsed map[string]interface{}
|
|
if err := json.Unmarshal(result, &parsed); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if parsed["flag"] != false {
|
|
t.Errorf("expected false, got %v (%T)", parsed["flag"], parsed["flag"])
|
|
}
|
|
}
|
|
|
|
func TestCastParams_StringToStringArray(t *testing.T) {
|
|
schema := json.RawMessage(`{"type":"object","properties":{"patterns":{"type":"array","items":{"type":"string"}}}}`)
|
|
args := json.RawMessage(`{"patterns":"OpenClaw"}`)
|
|
result := CastParams(args, schema)
|
|
|
|
var parsed map[string]interface{}
|
|
if err := json.Unmarshal(result, &parsed); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
patterns, ok := parsed["patterns"].([]interface{})
|
|
if !ok {
|
|
t.Fatalf("expected patterns to be array, got %T", parsed["patterns"])
|
|
}
|
|
if len(patterns) != 1 || patterns[0] != "OpenClaw" {
|
|
t.Fatalf("expected [OpenClaw], got %v", patterns)
|
|
}
|
|
}
|