Files
bus/bus_test.go
Ian Gulliver 6d46cf96fe Initial commit
2023-04-20 18:29:49 +00:00

150 lines
2.8 KiB
Go

package bus_test
import (
"testing"
"github.com/gopatchy/bus"
"github.com/gopatchy/metadata"
"github.com/stretchr/testify/require"
)
func TestBus(t *testing.T) {
t.Parallel()
bus := bus.NewBus()
// Announce with no subscribers
bus.Announce("busTest1", &busTest{
Metadata: metadata.Metadata{
ID: "id-nosub",
},
})
// Complex subscription layout
c1a := bus.SubscribeKey("busTest1", "id-overlap", nil)
require.Nil(t, <-c1a)
defer bus.UnsubscribeKey("busTest1", "id-overlap", c1a)
c2a := bus.SubscribeKey("busTest2", "id-overlap", nil)
require.Nil(t, <-c2a)
defer bus.UnsubscribeKey("busTest2", "id-overlap", c2a)
c2b := bus.SubscribeKey("busTest2", "id-dupe", nil)
require.Nil(t, <-c2b)
defer bus.UnsubscribeKey("busTest2", "id-dupe", c2b)
c2c := bus.SubscribeKey("busTest2", "id-dupe", nil)
require.Nil(t, <-c2c)
defer bus.UnsubscribeKey("busTest2", "id-dupe", c2c)
ct1 := bus.SubscribeType("busTest1", nil)
require.Nil(t, <-ct1)
defer bus.UnsubscribeType("busTest1", ct1)
ct2 := bus.SubscribeType("busTest2", nil)
require.Nil(t, <-ct2)
defer bus.UnsubscribeType("busTest2", ct2)
// Overlapping IDs but not types
bus.Announce("busTest1", &busTest{
Metadata: metadata.Metadata{
ID: "id-overlap",
},
})
msg := <-c1a
require.Equal(t, "id-overlap", msg.(*busTest).ID)
msg = <-ct1
require.Equal(t, "id-overlap", msg.(*busTest).ID)
select {
case msg := <-c2a:
require.Fail(t, "unexpected message", msg)
case msg := <-ct2:
require.Fail(t, "unexpected message", msg)
default:
}
bus.Announce("busTest2", &busTest{
Metadata: metadata.Metadata{
ID: "id-overlap",
},
})
select {
case msg := <-c1a:
require.Fail(t, "unexpected message", msg)
case msg := <-ct1:
require.Fail(t, "unexpected message", msg)
default:
}
msg = <-c2a
require.Equal(t, "id-overlap", msg.(*busTest).ID)
msg = <-ct2
require.Equal(t, "id-overlap", msg.(*busTest).ID)
bus.Announce("busTest2", &busTest{
Metadata: metadata.Metadata{
ID: "id-dupe",
},
})
msg = <-c2b
require.Equal(t, "id-dupe", msg.(*busTest).ID)
msg = <-c2c
require.Equal(t, "id-dupe", msg.(*busTest).ID)
msg = <-ct2
require.Equal(t, "id-dupe", msg.(*busTest).ID)
}
func TestBusDelete(t *testing.T) {
t.Parallel()
bus := bus.NewBus()
c := bus.SubscribeKey("busTest", "id1", nil)
require.Nil(t, <-c)
defer bus.UnsubscribeKey("busTest", "id1", c)
ct := bus.SubscribeType("busTest", nil)
require.Nil(t, <-ct)
defer bus.UnsubscribeType("busTest", ct)
bus.Announce("busTest", &busTest{
Metadata: metadata.Metadata{
ID: "id1",
},
})
msg := <-c
require.Equal(t, "id1", msg.(*busTest).ID)
msg = <-ct
require.Equal(t, "id1", msg.(*busTest).ID)
bus.Delete("busTest", "id1")
_, ok := <-c
require.False(t, ok)
id := (<-ct).(string)
require.Equal(t, "id1", id)
}
type busTest struct {
metadata.Metadata
}