Commit 43cd9d1
Changed files (2)
pkg
pkg/event/aggregator.go
@@ -1,23 +1,24 @@
package event
-type Event string
+type Event any
type Subscription func(any)
type Aggregator struct {
- subscriptions map[Event]Subscription
+ subscriptions map[Event][]Subscription
}
func New() *Aggregator {
return &Aggregator{
- subscriptions: map[Event]Subscription{},
+ subscriptions: map[Event][]Subscription{},
}
}
func (a *Aggregator) Subscribe(event Event, f Subscription) {
- a.subscriptions[event] = f
+ a.subscriptions[event] = append(a.subscriptions[event], f)
}
func (a *Aggregator) Publish(event Event, message any) {
- subscription := a.subscriptions[event]
- subscription(message)
+ for _, subscription := range a.subscriptions[event] {
+ subscription(message)
+ }
}
pkg/event/aggregator_test.go
@@ -8,16 +8,45 @@ import (
func TestEventAggregator(t *testing.T) {
t.Run("Publish", func(t *testing.T) {
- events := New()
- called := false
+ t.Run("without any subscribers", func(t *testing.T) {
+ events := New()
- events.Subscribe("announcement", func(message any) {
- called = true
- assert.Equal(t, "Hello", message)
+ events.Publish("announcements.engineering", "Business, Business, Business... Numbers!")
})
- events.Publish("announcement", "Hello")
+ t.Run("with a single subscriber", func(t *testing.T) {
+ events := New()
+ called := false
- assert.True(t, called)
+ events.Subscribe("announcement", func(message any) {
+ called = true
+ assert.Equal(t, "Hello", message)
+ })
+
+ events.Publish("announcement", "Hello")
+
+ assert.True(t, called)
+ })
+
+ t.Run("with multiple subscribers", func(t *testing.T) {
+ events := New()
+ called := map[int]bool{}
+
+ events.Subscribe("announcement", func(message any) {
+ called[0] = true
+ assert.Equal(t, "Greetings", message)
+ })
+
+ events.Subscribe("announcement", func(message any) {
+ called[1] = true
+ assert.Equal(t, "Greetings", message)
+ })
+
+ events.Publish("announcement", "Greetings")
+
+ assert.Equal(t, 2, len(called))
+ assert.True(t, called[0])
+ assert.True(t, called[1])
+ })
})
}