49 lines
1.6 KiB
Go
49 lines
1.6 KiB
Go
//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
|
|
})
|
|
}
|