package main import ( "bytes" "context" "encoding/json" "os" "path/filepath" "strings" "testing" "mesh-delivery-view/internal/view" ) func serve(t *testing.T) string { t.Helper() m := view.New() m.Apply(view.Entry{Bucket: view.AssignmentsBucket, Key: "a.x", Value: []byte(`{"node":"a","module":"x","build":"b1"}`)}) dir, err := os.MkdirTemp(os.Getenv("TMPDIR"), "c") if err != nil { t.Fatal(err) } t.Cleanup(func() { os.RemoveAll(dir) }) l, err := view.ListenSocket(filepath.Join(dir, "cli.sock")) if err != nil { t.Fatal(err) } ctx, cancel := context.WithCancel(context.Background()) go view.ServeSocket(ctx, l, m) t.Cleanup(cancel) return filepath.Join(dir, "cli.sock") } func TestPrintsATable(t *testing.T) { // 1134/AC6 var out, errOut bytes.Buffer if code := run(nil, serve(t), &out, &errOut); code != 0 { t.Fatalf("exit %d: %s", code, errOut.String()) } if !strings.Contains(out.String(), "MODULE") || !strings.Contains(out.String(), "no have yet") { t.Fatalf("table = %q", out.String()) } } func TestJSONFlag(t *testing.T) { // 1134/AC6 var out, errOut bytes.Buffer if code := run([]string{"--json"}, serve(t), &out, &errOut); code != 0 { t.Fatalf("exit %d: %s", code, errOut.String()) } var s view.Snapshot if err := json.Unmarshal(out.Bytes(), &s); err != nil || len(s.Rows) != 1 || s.Rows[0].Module != "x" { t.Fatalf("json = %q, %v", out.String(), err) } } func TestFailsLoudWhenTheViewIsNotThere(t *testing.T) { // 1134/AC6 var out, errOut bytes.Buffer if code := run(nil, filepath.Join(os.Getenv("TMPDIR"), "none.sock"), &out, &errOut); code == 0 || errOut.Len() == 0 { t.Fatalf("exit %d, stderr %q", code, errOut.String()) } if code := run([]string{"--start"}, "", &out, &errOut); code != 2 { t.Fatalf("an unknown flag must exit 2, got %d", code) } }