Pub/sub now works out of the box — New() starts a process-scoped
embedded NATS server with JetStream. The PubSub interface remains
for custom backends via Config(Options{PubSub: ...}).
- Move vianats functionality into nats.go (eliminates circular import)
- Add NATSConn(), JetStream(), EnsureStream(), ReplayHistory[T]() to via
- Delete vianats/ package
- Simplify nats-chatroom and pubsub-crud examples
- Rewrite pubsub tests to use real embedded NATS
69 lines
1.3 KiB
Go
69 lines
1.3 KiB
Go
package via
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/ryanhamamura/via/h"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestPublishSubscribe_RoundTrip(t *testing.T) {
|
|
v := New()
|
|
defer v.Shutdown()
|
|
|
|
type event struct {
|
|
Name string `json:"name"`
|
|
Count int `json:"count"`
|
|
}
|
|
|
|
var got event
|
|
done := make(chan struct{})
|
|
|
|
c := newContext("typed-ctx", "/", v)
|
|
c.View(func() h.H { return h.Div() })
|
|
|
|
_, err := Subscribe(c, "events", func(e event) {
|
|
got = e
|
|
close(done)
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
err = Publish(c, "events", event{Name: "click", Count: 42})
|
|
require.NoError(t, err)
|
|
|
|
select {
|
|
case <-done:
|
|
case <-time.After(2 * time.Second):
|
|
t.Fatal("timed out waiting for message")
|
|
}
|
|
assert.Equal(t, "click", got.Name)
|
|
assert.Equal(t, 42, got.Count)
|
|
}
|
|
|
|
func TestSubscribe_SkipsBadJSON(t *testing.T) {
|
|
v := New()
|
|
defer v.Shutdown()
|
|
|
|
type msg struct {
|
|
Text string `json:"text"`
|
|
}
|
|
|
|
called := false
|
|
c := newContext("bad-json-ctx", "/", v)
|
|
c.View(func() h.H { return h.Div() })
|
|
|
|
_, err := Subscribe(c, "topic", func(m msg) {
|
|
called = true
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
// Publish raw invalid JSON — handler should silently skip
|
|
err = c.Publish("topic", []byte("not json"))
|
|
require.NoError(t, err)
|
|
|
|
time.Sleep(50 * time.Millisecond)
|
|
assert.False(t, called)
|
|
}
|