package main import ( "encoding/json" "os" "reflect" "sort" "strings" "testing" ) func TestTheToolsServedAreTheToolsTheManifestNames(t *testing.T) { raw, err := os.ReadFile("../../module.json") if err != nil { t.Fatal(err) } var m struct { Tools []string `json:"tools"` } if err := json.Unmarshal(raw, &m); err != nil { t.Fatal(err) } served := []string{} for _, tool := range tools(client(&fake{}, 1000)) { if !strings.HasPrefix(tool.Name, "docker_") || tool.Description == "" || tool.Run == nil { t.Errorf("tool %q", tool.Name) } served = append(served, tool.Name) } sort.Strings(served) listed := append([]string{}, m.Tools...) sort.Strings(listed) if !reflect.DeepEqual(served, listed) { t.Fatalf("served %v, manifest %v", served, listed) } } func TestNumbersAreDefaultedAndBounded(t *testing.T) { if n, _ := bounded(map[string]any{}, "lines", 200, 2000); n != 200 { t.Error(n) } if n, _ := bounded(map[string]any{"lines": float64(99999)}, "lines", 200, 2000); n != 2000 { t.Error(n) } for _, bad := range []any{float64(0), float64(-1), float64(1.5), "10"} { if _, err := bounded(map[string]any{"lines": bad}, "lines", 200, 2000); err == nil { t.Errorf("%v accepted", bad) } } } func TestAStopFromTheToolNeedsAContainer(t *testing.T) { for _, tool := range tools(client(&fake{}, 1000)) { if tool.Name == "docker_stop" { if _, err := tool.Run(map[string]any{}); err == nil { t.Fatal("a stop without a container was accepted") } } } }