package seatlist import ( "encoding/json" "testing" "github.com/nats-io/nats.go/jetstream" ) type hubStub map[string]func(jetstream.Msg) func (h hubStub) Handle(pattern string, f func(jetstream.Msg)) error { h[pattern] = f; return nil } type msgStub struct { jetstream.Msg data []byte acked *int } func (m msgStub) Data() []byte { return m.data } func (m msgStub) Ack() error { *m.acked++; return nil } func TestAProcessBusAsksByKeyAndHearsTheSeatsEventsOnTheHub(t *testing.T) { var asked string hub := hubStub{} bus := ProcessBus(func(key string, body any) (json.RawMessage, error) { asked = key; return json.RawMessage(`{}`), nil }, hub) if _, err := bus.Ask(Key(), nil); err != nil || asked != Key() { t.Fatalf("asked %q, %v", asked, err) } var got []string if err := bus.Subscribe(Pattern(ChangedEvent), func(key string, body json.RawMessage) error { got = append(got, key+" "+string(body)); return nil }); err != nil { t.Fatal(err) } h := hub["mesh.seat."+Seat+".event."+ChangedEvent] if h == nil { t.Fatalf("handlers on %v, want the seat's own subject", hub) } acked := 0 h(msgStub{data: []byte(`{"seat":"x"}`), acked: &acked}) if len(got) != 1 || got[0] != Pattern(ChangedEvent)+` {"seat":"x"}` || acked != 1 { t.Errorf("heard %v, acked %d", got, acked) } if err := bus.Subscribe("nodot", nil); err == nil { t.Error("a pattern that names no seat event was taken") } }