The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
grafana/pkg/bus/bus_test.go

201 lines
4.2 KiB

package bus
import (
"context"
"errors"
"testing"
"github.com/stretchr/testify/require"
)
type testQuery struct {
ID int64
Resp string
}
func TestDispatch(t *testing.T) {
bus := New()
var invoked bool
bus.AddHandlerCtx(func(ctx context.Context, query *testQuery) error {
invoked = true
return nil
})
err := bus.DispatchCtx(context.Background(), &testQuery{})
require.NoError(t, err)
require.True(t, invoked, "expected handler to be called")
}
func TestDispatch_NoRegisteredHandler(t *testing.T) {
bus := New()
err := bus.DispatchCtx(context.Background(), &testQuery{})
require.Equal(t, err, ErrHandlerNotFound,
"expected bus to return HandlerNotFound since no handler is registered")
}
func TestDispatch_ContextHandler(t *testing.T) {
bus := New()
var invoked bool
bus.AddHandlerCtx(func(ctx context.Context, query *testQuery) error {
invoked = true
return nil
})
err := bus.DispatchCtx(context.Background(), &testQuery{})
require.NoError(t, err)
require.True(t, invoked, "expected handler to be called")
}
func TestDispatchCtx(t *testing.T) {
bus := New()
var invoked bool
bus.AddHandlerCtx(func(ctx context.Context, query *testQuery) error {
invoked = true
return nil
})
err := bus.DispatchCtx(context.Background(), &testQuery{})
require.NoError(t, err)
require.True(t, invoked, "expected handler to be called")
}
func TestDispatchCtx_NoContextHandler(t *testing.T) {
bus := New()
var invoked bool
bus.AddHandlerCtx(func(ctx context.Context, query *testQuery) error {
invoked = true
return nil
})
err := bus.DispatchCtx(context.Background(), &testQuery{})
require.NoError(t, err)
require.True(t, invoked, "expected handler to be called")
}
func TestDispatchCtx_NoRegisteredHandler(t *testing.T) {
bus := New()
err := bus.DispatchCtx(context.Background(), &testQuery{})
require.Equal(t, err, ErrHandlerNotFound,
"expected bus to return HandlerNotFound since no handler is registered")
}
func TestQuery(t *testing.T) {
bus := New()
want := "hello from handler"
bus.AddHandlerCtx(func(ctx context.Context, q *testQuery) error {
q.Resp = want
return nil
})
q := &testQuery{}
err := bus.DispatchCtx(context.Background(), q)
require.NoError(t, err, "unable to dispatch query")
require.Equal(t, want, q.Resp)
}
func TestQuery_HandlerReturnsError(t *testing.T) {
bus := New()
bus.AddHandlerCtx(func(ctx context.Context, query *testQuery) error {
return errors.New("handler error")
})
err := bus.DispatchCtx(context.Background(), &testQuery{})
require.Error(t, err, "expected error but got none")
}
func TestEventPublish(t *testing.T) {
bus := New()
var invoked bool
bus.AddEventListenerCtx(func(ctx context.Context, query *testQuery) error {
invoked = true
return nil
})
err := bus.PublishCtx(context.Background(), &testQuery{})
require.NoError(t, err, "unable to publish event")
require.True(t, invoked)
}
func TestEventPublish_NoRegisteredListener(t *testing.T) {
bus := New()
err := bus.PublishCtx(context.Background(), &testQuery{})
require.NoError(t, err, "unable to publish event")
}
func TestEventCtxPublishCtx(t *testing.T) {
bus := New()
var invoked bool
bus.AddEventListenerCtx(func(ctx context.Context, query *testQuery) error {
invoked = true
return nil
})
err := bus.PublishCtx(context.Background(), &testQuery{})
require.NoError(t, err, "unable to publish event")
require.True(t, invoked)
}
func TestEventPublishCtx_NoRegisteredListener(t *testing.T) {
bus := New()
err := bus.PublishCtx(context.Background(), &testQuery{})
require.NoError(t, err, "unable to publish event")
}
func TestEventPublishCtx(t *testing.T) {
bus := New()
var invoked bool
bus.AddEventListenerCtx(func(ctx context.Context, query *testQuery) error {
invoked = true
return nil
})
err := bus.PublishCtx(context.Background(), &testQuery{})
require.NoError(t, err, "unable to publish event")
require.True(t, invoked)
}
func TestEventCtxPublish(t *testing.T) {
bus := New()
var invoked bool
bus.AddEventListenerCtx(func(ctx context.Context, query *testQuery) error {
invoked = true
return nil
})
err := bus.PublishCtx(context.Background(), &testQuery{})
require.NoError(t, err, "unable to publish event")
require.True(t, invoked)
}