Co-authored-by: Jeffrey Smith <jasafpro@gmail.com> Co-committed-by: Jeffrey Smith <jasafpro@gmail.com>
167 lines
4.7 KiB
Go
167 lines
4.7 KiB
Go
package handlers
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
|
|
"go.starlark.net/starlark"
|
|
)
|
|
|
|
// ── jsonToStarlark ────────────────────────────────────────────────────────────
|
|
|
|
func TestJSONToStarlark_String(t *testing.T) {
|
|
v := jsonToStarlark("hello")
|
|
s, ok := v.(starlark.String)
|
|
if !ok || string(s) != "hello" {
|
|
t.Errorf("expected starlark.String(hello), got %v (%T)", v, v)
|
|
}
|
|
}
|
|
|
|
func TestJSONToStarlark_Int(t *testing.T) {
|
|
v := jsonToStarlark(float64(42))
|
|
i, ok := v.(starlark.Int)
|
|
if !ok {
|
|
t.Fatalf("expected starlark.Int, got %T", v)
|
|
}
|
|
n, _ := i.Int64()
|
|
if n != 42 {
|
|
t.Errorf("expected 42, got %d", n)
|
|
}
|
|
}
|
|
|
|
func TestJSONToStarlark_Float(t *testing.T) {
|
|
v := jsonToStarlark(3.14)
|
|
if _, ok := v.(starlark.Float); !ok {
|
|
t.Errorf("expected starlark.Float, got %T", v)
|
|
}
|
|
}
|
|
|
|
func TestJSONToStarlark_Bool(t *testing.T) {
|
|
if jsonToStarlark(true) != starlark.True {
|
|
t.Error("expected starlark.True")
|
|
}
|
|
if jsonToStarlark(false) != starlark.False {
|
|
t.Error("expected starlark.False")
|
|
}
|
|
}
|
|
|
|
func TestJSONToStarlark_Nil(t *testing.T) {
|
|
if jsonToStarlark(nil) != starlark.None {
|
|
t.Error("expected starlark.None for nil")
|
|
}
|
|
}
|
|
|
|
func TestJSONToStarlark_Dict(t *testing.T) {
|
|
v := jsonToStarlark(map[string]interface{}{"key": "val"})
|
|
d, ok := v.(*starlark.Dict)
|
|
if !ok {
|
|
t.Fatalf("expected *starlark.Dict, got %T", v)
|
|
}
|
|
got, found, _ := d.Get(starlark.String("key"))
|
|
if !found || string(got.(starlark.String)) != "val" {
|
|
t.Errorf("expected key=val in dict, got %v", got)
|
|
}
|
|
}
|
|
|
|
func TestJSONToStarlark_List(t *testing.T) {
|
|
v := jsonToStarlark([]interface{}{"a", "b"})
|
|
l, ok := v.(*starlark.List)
|
|
if !ok {
|
|
t.Fatalf("expected *starlark.List, got %T", v)
|
|
}
|
|
if l.Len() != 2 {
|
|
t.Errorf("expected 2 elements, got %d", l.Len())
|
|
}
|
|
}
|
|
|
|
// ── starlarkValueToGo ─────────────────────────────────────────────────────────
|
|
|
|
func TestStarlarkValueToGo_String(t *testing.T) {
|
|
v := starlarkValueToGo(starlark.String("hi"))
|
|
if v != "hi" {
|
|
t.Errorf("expected 'hi', got %v", v)
|
|
}
|
|
}
|
|
|
|
func TestStarlarkValueToGo_Int(t *testing.T) {
|
|
v := starlarkValueToGo(starlark.MakeInt(7))
|
|
if v != int64(7) {
|
|
t.Errorf("expected int64(7), got %v (%T)", v, v)
|
|
}
|
|
}
|
|
|
|
func TestStarlarkValueToGo_Bool(t *testing.T) {
|
|
if starlarkValueToGo(starlark.True) != true {
|
|
t.Error("expected true")
|
|
}
|
|
}
|
|
|
|
func TestStarlarkValueToGo_None(t *testing.T) {
|
|
if starlarkValueToGo(starlark.None) != nil {
|
|
t.Error("expected nil for starlark.None")
|
|
}
|
|
}
|
|
|
|
func TestStarlarkValueToGo_Dict(t *testing.T) {
|
|
d := starlark.NewDict(1)
|
|
_ = d.SetKey(starlark.String("x"), starlark.MakeInt(1))
|
|
v := starlarkValueToGo(d)
|
|
m, ok := v.(map[string]interface{})
|
|
if !ok {
|
|
t.Fatalf("expected map, got %T", v)
|
|
}
|
|
if m["x"] != int64(1) {
|
|
t.Errorf("expected x=1, got %v", m["x"])
|
|
}
|
|
}
|
|
|
|
func TestStarlarkValueToGo_List(t *testing.T) {
|
|
l := starlark.NewList([]starlark.Value{starlark.String("a"), starlark.String("b")})
|
|
v := starlarkValueToGo(l)
|
|
arr, ok := v.([]interface{})
|
|
if !ok {
|
|
t.Fatalf("expected []interface{}, got %T", v)
|
|
}
|
|
if len(arr) != 2 || arr[0] != "a" {
|
|
t.Errorf("unexpected list: %v", arr)
|
|
}
|
|
}
|
|
|
|
// ── RoundTrip: JSON → Starlark → Go → JSON ───────────────────────────────────
|
|
|
|
func TestRoundTrip_JSONToStarlarkToJSON(t *testing.T) {
|
|
// Simulate what executeExtensionTool does: parse args, pass as Starlark, convert result back.
|
|
argsJSON := `{"query": "hello", "limit": 10, "active": true}`
|
|
var raw map[string]interface{}
|
|
if err := json.Unmarshal([]byte(argsJSON), &raw); err != nil {
|
|
t.Fatalf("unmarshal: %v", err)
|
|
}
|
|
sv := jsonToStarlark(raw)
|
|
got := starlarkValueToGo(sv)
|
|
out, err := json.Marshal(got)
|
|
if err != nil {
|
|
t.Fatalf("marshal: %v", err)
|
|
}
|
|
// Verify key fields present
|
|
var result map[string]interface{}
|
|
if err := json.Unmarshal(out, &result); err != nil {
|
|
t.Fatalf("unmarshal result: %v", err)
|
|
}
|
|
if result["query"] != "hello" {
|
|
t.Errorf("expected query=hello, got %v", result["query"])
|
|
}
|
|
if result["active"] != true {
|
|
t.Errorf("expected active=true, got %v", result["active"])
|
|
}
|
|
}
|
|
|
|
// ── BuildExtToolMap ───────────────────────────────────────────────────────────
|
|
|
|
func TestBuildExtToolMap_Empty(t *testing.T) {
|
|
// nil Packages store → returns nil (no panic)
|
|
result := BuildExtToolMap(nil, storesWithExtData(newMemExtDataStore()), "user1")
|
|
if result != nil && len(result) != 0 {
|
|
t.Errorf("expected empty map for stores without Packages, got %v", result)
|
|
}
|
|
}
|