//go:build integration package main import ( "encoding/json" "testing" "time" "github.com/nats-io/nats.go" "github.com/novox/mesh-controller/internal/broker" "github.com/novox/mesh-controller/internal/link" "github.com/novox/mesh-controller/internal/testbus" ) func TestACheckStoppedByItsKeyIsAnnouncedAsNoVerdict(t *testing.T) { js, err := broker.Dial(testbus.URL(t)) if err != nil { t.Fatal(err) } t.Cleanup(js.Close) if err := broker.AssertMeshStreams(js); err != nil { t.Fatal(err) } legacy, err := js.Conn().JetStream() if err != nil { t.Fatal(err) } was := checkEvents checkEvents = link.OverNATS{Conn: js.Conn(), JS: legacy} t.Cleanup(func() { checkEvents = was }) heard := make(chan *nats.Msg, 4) sub, err := js.Conn().ChanSubscribe(link.SeatEventSubject(link.MeshControllerSeat, link.KeyChecked), heard) if err != nil { t.Fatal(err) } defer func() { _ = sub.Unsubscribe() }() asked := &link.CheckRequest{Owner: "novox", Repo: "mesh-catalog", Number: 3} checked(t.Context(), link.BuildResult{ID: "stopped", Ref: "abc", Checked: asked, Failed: link.SupersededByKey}) checked(t.Context(), link.BuildResult{ID: "broken", Ref: "abc", Checked: asked, Failed: "the facts snapshot cannot be read"}) select { case m := <-heard: var c link.Checked _ = json.Unmarshal(m.Data, &c) if c.ID != "broken" || c.Verdict != "error" { t.Fatalf("the first verdict said is %+v; want only the broken check's error", c) } case <-time.After(5 * time.Second): t.Fatal("nothing was said") } select { case m := <-heard: t.Fatalf("a second verdict was said: %s", m.Data) case <-time.After(300 * time.Millisecond): } }