//go:build integration package main import ( "encoding/json" "strings" "testing" "github.com/novox/mesh-controller/internal/inventory" ) func TestNodeShowAndStatusReadTheLastSendFromTheStore(t *testing.T) { open := aMesh(t) ctx := t.Context() record, err := open.inventory.NodeByName(ctx, "laptop") if err != nil { t.Fatal(err) } if err := open.inventory.RecordSentWith(ctx, record.ID, "d12", nil, 57, 40, inventory.Send{Sequence: 12, Epoch: 57, Sender: "a one-shot push by jochen at a shell on anchor", Generation: 40, Digest: "d12", Modules: []string{"docker", "sudo"}}); err != nil { t.Fatal(err) } if _, err := open.inventory.RecordDoing(ctx, record.ID, inventory.Doing{Outcome: inventory.OutcomeRefused, Declared: "d12", Refused: "unknown field \"generation\""}); err != nil { t.Fatal(err) } shown := printed(t, func() error { return showNode(ctx, open, "laptop") }) for _, want := range []string{"a one-shot push by jochen at a shell on anchor", "lease epoch 57", "generation 40", "docker, sudo", "unknown field \"generation\""} { if !strings.Contains(shown, want) { t.Errorf("node show laptop does not say %q:\n%s", want, shown) } } body := printed(t, func() error { return statusFor(ctx, open, true) }) var got struct { LastSent []struct { Node string `json:"node"` Sender string `json:"sender"` Answer string `json:"answer"` } `json:"lastSent"` } if err := json.Unmarshal([]byte(body), &got); err != nil { t.Fatalf("%v:\n%s", err, body) } if len(got.LastSent) != 1 || got.LastSent[0].Node != "laptop" || got.LastSent[0].Answer != "refused" || got.LastSent[0].Sender != "a one-shot push by jochen at a shell on anchor" { t.Fatalf("status --json's last sends read %+v", got.LastSent) } }