//go:build integration package link import ( "context" "testing" "github.com/novox/mesh-controller/internal/broker" ) func TestNatsAProvidersStandingReachesTheController(t *testing.T) { js := aBus(t) kept := &lockedStandings{} s := &Server{inbound: Nats(js), bus: OverNATS{Conn: js.Conn(), JS: js.Context()}, log: quiet()} if err := s.Follows(&toldAbout{}); err != nil { t.Fatal(err) } if err := s.Watches(kept); err != nil { t.Fatal(err) } ctx, stop := context.WithCancel(context.Background()) defer stop() go func() { _ = s.Serve(ctx) }() eventually(t, "the controller's event consumer being made", func() bool { _, err := js.Context().ConsumerInfo("EVENTS", broker.ControllerName) return err == nil }) for _, event := range []string{broker.ProvisionerFailing, broker.ProvisionerRecovered} { if _, err := js.Context().Publish("mesh.mod.keycloak.event."+event, []byte(`{"consumer":"mesh_home_grafana","provider-node":"anchor","class":"credentials-rejected"}`)); err != nil { t.Fatal(err) } } // Somebody else's event under the same prefix is not the controller's to hear. if _, err := js.Context().Publish("mesh.mod.keycloak.event.client.created", []byte(`{}`)); err != nil { t.Fatal(err) } eventually(t, "both standings being kept, in order, naming the emitter", func() bool { got := kept.all() return len(got) == 2 && got[0].Module == "keycloak" && got[0].Failing && !got[1].Failing }) eventually(t, "both being acknowledged and nothing else delivered", func() bool { info, err := js.Context().ConsumerInfo("EVENTS", broker.ControllerName) return err == nil && info.NumAckPending == 0 && info.Delivered.Consumer == 2 }) }