Files
mesh-sdk/go/seatlist/processbus_test.go
T

47 lines
1.4 KiB
Go

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")
}
}