Skip to content

Commit 66eb3e0

Browse files
authored
added some cqrs tests (ThreeDotsLabs#136)
1 parent 4748343 commit 66eb3e0

File tree

7 files changed

+290
-8
lines changed

7 files changed

+290
-8
lines changed

components/cqrs/command_bus_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,30 @@ import (
1010
"github.com/ThreeDotsLabs/watermill/components/cqrs"
1111
)
1212

13+
func TestNewCommandBus(t *testing.T) {
14+
pub := newPublisherStub()
15+
generateTopic := func(commandName string) string {
16+
return ""
17+
}
18+
marshaler := cqrs.JSONMarshaler{}
19+
20+
cb, err := cqrs.NewCommandBus(pub, generateTopic, marshaler)
21+
assert.NotNil(t, cb)
22+
assert.NoError(t, err)
23+
24+
cb, err = cqrs.NewCommandBus(nil, generateTopic, marshaler)
25+
assert.Nil(t, cb)
26+
assert.Error(t, err)
27+
28+
cb, err = cqrs.NewCommandBus(pub, nil, marshaler)
29+
assert.Nil(t, cb)
30+
assert.Error(t, err)
31+
32+
cb, err = cqrs.NewCommandBus(pub, generateTopic, nil)
33+
assert.Nil(t, cb)
34+
assert.Error(t, err)
35+
}
36+
1337
func TestCommandBus_Send_ContextPropagation(t *testing.T) {
1438
publisher := newPublisherStub()
1539

components/cqrs/command_processor_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,37 @@ import (
1313
"github.com/stretchr/testify/require"
1414
)
1515

16+
func TestNewCommandProcessor(t *testing.T) {
17+
handlers := []cqrs.CommandHandler{nonPointerCommandHandler{}}
18+
19+
generateTopic := func(commandName string) string {
20+
return ""
21+
}
22+
subscriberConstructor := func(handlerName string) (subscriber message.Subscriber, e error) {
23+
return nil, nil
24+
}
25+
26+
cp, err := cqrs.NewCommandProcessor(handlers, generateTopic, subscriberConstructor, cqrs.JSONMarshaler{}, nil)
27+
assert.NotNil(t, cp)
28+
assert.NoError(t, err)
29+
30+
cp, err = cqrs.NewCommandProcessor([]cqrs.CommandHandler{}, generateTopic, subscriberConstructor, cqrs.JSONMarshaler{}, nil)
31+
assert.Nil(t, cp)
32+
assert.Error(t, err)
33+
34+
cp, err = cqrs.NewCommandProcessor(handlers, nil, subscriberConstructor, cqrs.JSONMarshaler{}, nil)
35+
assert.Nil(t, cp)
36+
assert.Error(t, err)
37+
38+
cp, err = cqrs.NewCommandProcessor(handlers, generateTopic, nil, cqrs.JSONMarshaler{}, nil)
39+
assert.Nil(t, cp)
40+
assert.Error(t, err)
41+
42+
cp, err = cqrs.NewCommandProcessor(handlers, generateTopic, subscriberConstructor, nil, nil)
43+
assert.Nil(t, cp)
44+
assert.Error(t, err)
45+
}
46+
1647
type nonPointerCommandHandler struct {
1748
}
1849

@@ -76,4 +107,5 @@ func TestCommandProcessor_multiple_same_command_handlers(t *testing.T) {
76107

77108
err = commandProcessor.AddHandlersToRouter(router)
78109
assert.EqualValues(t, cqrs.DuplicateCommandHandlerError{CommandName: "cqrs_test.TestCommand"}, err)
110+
assert.Equal(t, "command handler for command cqrs_test.TestCommand already exists", err.Error())
79111
}

components/cqrs/cqrs_test.go

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ func TestCQRS(t *testing.T) {
4747
captureEventHandler.Reset()
4848

4949
assert.NoError(t, router.Close())
50+
51+
assert.Equal(t, cqrsFacade.CommandEventMarshaler(), ts.Marshaler)
5052
}
5153

5254
func createRouterAndFacade(ts TestServices, t *testing.T, commandHandler *CaptureCommandHandler, eventHandler *CaptureEventHandler) (*message.Router, *cqrs.Facade) {
@@ -224,3 +226,126 @@ func (p *publisherStub) Publish(topic string, messages ...*message.Message) erro
224226

225227
return nil
226228
}
229+
230+
func TestFacadeConfig_Validate(t *testing.T) {
231+
ts := NewTestServices()
232+
233+
router, err := message.NewRouter(message.RouterConfig{}, ts.Logger)
234+
require.NoError(t, err)
235+
236+
validConfig := cqrs.FacadeConfig{
237+
GenerateCommandsTopic: func(commandName string) string {
238+
return commandName
239+
},
240+
GenerateEventsTopic: func(eventName string) string {
241+
return eventName
242+
},
243+
CommandHandlers: func(cb *cqrs.CommandBus, eb *cqrs.EventBus) []cqrs.CommandHandler {
244+
return []cqrs.CommandHandler{}
245+
},
246+
EventHandlers: func(cb *cqrs.CommandBus, eb *cqrs.EventBus) []cqrs.EventHandler {
247+
return []cqrs.EventHandler{}
248+
},
249+
Router: router,
250+
CommandsPublisher: ts.CommandsPubSub,
251+
CommandsSubscriberConstructor: func(handlerName string) (message.Subscriber, error) {
252+
return ts.CommandsPubSub, nil
253+
},
254+
EventsPublisher: ts.EventsPubSub,
255+
EventsSubscriberConstructor: func(handlerName string) (message.Subscriber, error) {
256+
return ts.EventsPubSub, nil
257+
},
258+
Logger: ts.Logger,
259+
CommandEventMarshaler: ts.Marshaler,
260+
}
261+
262+
testCases := []struct {
263+
Name string
264+
Config cqrs.FacadeConfig
265+
Valid bool
266+
}{
267+
{
268+
Name: "valid",
269+
Config: validConfig,
270+
Valid: true,
271+
},
272+
{
273+
Name: "missing_GenerateCommandsTopic",
274+
Config: transformConfig(validConfig, func(config *cqrs.FacadeConfig) {
275+
config.GenerateCommandsTopic = nil
276+
}),
277+
Valid: false,
278+
},
279+
{
280+
Name: "missing_CommandsSubscriberConstructor",
281+
Config: transformConfig(validConfig, func(config *cqrs.FacadeConfig) {
282+
config.CommandsSubscriberConstructor = nil
283+
}),
284+
Valid: false,
285+
},
286+
{
287+
Name: "missing_CommandsPublisher",
288+
Config: transformConfig(validConfig, func(config *cqrs.FacadeConfig) {
289+
config.CommandsPublisher = nil
290+
}),
291+
Valid: false,
292+
},
293+
{
294+
Name: "missing_GenerateEventsTopic",
295+
Config: transformConfig(validConfig, func(config *cqrs.FacadeConfig) {
296+
config.GenerateEventsTopic = nil
297+
}),
298+
Valid: false,
299+
},
300+
{
301+
Name: "missing_GenerateEventsTopic",
302+
Config: transformConfig(validConfig, func(config *cqrs.FacadeConfig) {
303+
config.EventsSubscriberConstructor = nil
304+
}),
305+
Valid: false,
306+
},
307+
{
308+
Name: "missing_EventsPublisher",
309+
Config: transformConfig(validConfig, func(config *cqrs.FacadeConfig) {
310+
config.EventsPublisher = nil
311+
}),
312+
Valid: false,
313+
},
314+
{
315+
Name: "missing_Router",
316+
Config: transformConfig(validConfig, func(config *cqrs.FacadeConfig) {
317+
config.Router = nil
318+
}),
319+
Valid: false,
320+
},
321+
{
322+
Name: "missing_Logger",
323+
Config: transformConfig(validConfig, func(config *cqrs.FacadeConfig) {
324+
config.Logger = nil
325+
}),
326+
Valid: false,
327+
},
328+
{
329+
Name: "missing_CommandEventMarshaler",
330+
Config: transformConfig(validConfig, func(config *cqrs.FacadeConfig) {
331+
config.CommandEventMarshaler = nil
332+
}),
333+
Valid: false,
334+
},
335+
}
336+
337+
for _, c := range testCases {
338+
t.Run(c.Name, func(t *testing.T) {
339+
if c.Valid {
340+
assert.NoError(t, c.Config.Validate())
341+
} else {
342+
assert.Error(t, c.Config.Validate())
343+
}
344+
})
345+
}
346+
}
347+
348+
func transformConfig(config cqrs.FacadeConfig, transformFn func(config *cqrs.FacadeConfig)) cqrs.FacadeConfig {
349+
transformFn(&config)
350+
return config
351+
}

components/cqrs/event_bus_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,30 @@ import (
99
"github.com/stretchr/testify/require"
1010
)
1111

12+
func TestNewEventBus(t *testing.T) {
13+
pub := newPublisherStub()
14+
generateTopic := func(commandName string) string {
15+
return ""
16+
}
17+
marshaler := cqrs.JSONMarshaler{}
18+
19+
cb, err := cqrs.NewEventBus(pub, generateTopic, marshaler)
20+
assert.NotNil(t, cb)
21+
assert.NoError(t, err)
22+
23+
cb, err = cqrs.NewEventBus(nil, generateTopic, marshaler)
24+
assert.Nil(t, cb)
25+
assert.Error(t, err)
26+
27+
cb, err = cqrs.NewEventBus(pub, nil, marshaler)
28+
assert.Nil(t, cb)
29+
assert.Error(t, err)
30+
31+
cb, err = cqrs.NewEventBus(pub, generateTopic, nil)
32+
assert.Nil(t, cb)
33+
assert.Error(t, err)
34+
}
35+
1236
func TestEventBus_Send_ContextPropagation(t *testing.T) {
1337
publisher := newPublisherStub()
1438

components/cqrs/event_processor_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,37 @@ import (
1313
"github.com/stretchr/testify/require"
1414
)
1515

16+
func TestNewEventProcessor(t *testing.T) {
17+
handlers := []cqrs.EventHandler{nonPointerEventProcessor{}}
18+
19+
generateTopic := func(commandName string) string {
20+
return ""
21+
}
22+
subscriberConstructor := func(handlerName string) (subscriber message.Subscriber, e error) {
23+
return nil, nil
24+
}
25+
26+
cp, err := cqrs.NewEventProcessor(handlers, generateTopic, subscriberConstructor, cqrs.JSONMarshaler{}, nil)
27+
assert.NotNil(t, cp)
28+
assert.NoError(t, err)
29+
30+
cp, err = cqrs.NewEventProcessor([]cqrs.EventHandler{}, generateTopic, subscriberConstructor, cqrs.JSONMarshaler{}, nil)
31+
assert.Nil(t, cp)
32+
assert.Error(t, err)
33+
34+
cp, err = cqrs.NewEventProcessor(handlers, nil, subscriberConstructor, cqrs.JSONMarshaler{}, nil)
35+
assert.Nil(t, cp)
36+
assert.Error(t, err)
37+
38+
cp, err = cqrs.NewEventProcessor(handlers, generateTopic, nil, cqrs.JSONMarshaler{}, nil)
39+
assert.Nil(t, cp)
40+
assert.Error(t, err)
41+
42+
cp, err = cqrs.NewEventProcessor(handlers, generateTopic, subscriberConstructor, nil, nil)
43+
assert.Nil(t, cp)
44+
assert.Error(t, err)
45+
}
46+
1647
type nonPointerEventProcessor struct {
1748
}
1849

components/cqrs/marshaler_json_test.go

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,46 @@ import (
1111
"github.com/ThreeDotsLabs/watermill/components/cqrs"
1212
)
1313

14+
var jsonEventToMarshal = TestEvent{
15+
ID: watermill.NewULID(),
16+
When: time.Date(2016, time.August, 15, 14, 13, 12, 0, time.UTC),
17+
}
18+
1419
func TestJsonMarshaler(t *testing.T) {
1520
marshaler := cqrs.JSONMarshaler{}
1621

17-
eventToMarshal := TestEvent{
18-
ID: watermill.NewULID(),
19-
When: time.Date(2016, time.August, 15, 14, 13, 12, 0, time.UTC),
20-
}
21-
22-
msg, err := marshaler.Marshal(eventToMarshal)
22+
msg, err := marshaler.Marshal(jsonEventToMarshal)
2323
require.NoError(t, err)
2424

2525
eventToUnmarshal := TestEvent{}
2626
err = marshaler.Unmarshal(msg, &eventToUnmarshal)
2727
require.NoError(t, err)
2828

29-
assert.EqualValues(t, eventToMarshal, eventToUnmarshal)
29+
assert.EqualValues(t, jsonEventToMarshal, eventToUnmarshal)
30+
}
31+
32+
func TestJSONMarshaler_Marshal_new_uuid_set(t *testing.T) {
33+
marshaler := cqrs.JSONMarshaler{
34+
NewUUID: func() string {
35+
return "foo"
36+
},
37+
}
38+
39+
msg, err := marshaler.Marshal(jsonEventToMarshal)
40+
require.NoError(t, err)
41+
42+
assert.Equal(t, msg.UUID, "foo")
43+
}
44+
45+
func TestJSONMarshaler_Marshal_generate_name(t *testing.T) {
46+
marshaler := cqrs.JSONMarshaler{
47+
GenerateName: func(v interface{}) string {
48+
return "foo"
49+
},
50+
}
51+
52+
msg, err := marshaler.Marshal(jsonEventToMarshal)
53+
require.NoError(t, err)
54+
55+
assert.Equal(t, msg.Metadata.Get("name"), "foo")
3056
}

components/cqrs/marshaler_protobuf_test.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ func TestProtobufMarshaler(t *testing.T) {
1818

1919
when, err := ptypes.TimestampProto(time.Now())
2020
require.NoError(t, err)
21-
2221
eventToMarshal := &TestProtobufEvent{
2322
Id: watermill.NewULID(),
2423
When: when,
@@ -32,4 +31,25 @@ func TestProtobufMarshaler(t *testing.T) {
3231
require.NoError(t, err)
3332

3433
assert.EqualValues(t, eventToMarshal.String(), eventToUnmarshal.String())
34+
assert.Equal(t, msg.Metadata.Get("name"), "cqrs_test.TestProtobufEvent")
35+
}
36+
37+
func TestProtobufMarshaler_Marshal_generated_name(t *testing.T) {
38+
marshaler := cqrs.ProtobufMarshaler{
39+
NewUUID: func() string {
40+
return "foo"
41+
},
42+
}
43+
44+
when, err := ptypes.TimestampProto(time.Now())
45+
require.NoError(t, err)
46+
eventToMarshal := &TestProtobufEvent{
47+
Id: watermill.NewULID(),
48+
When: when,
49+
}
50+
51+
msg, err := marshaler.Marshal(eventToMarshal)
52+
require.NoError(t, err)
53+
54+
assert.Equal(t, msg.UUID, "foo")
3555
}

0 commit comments

Comments
 (0)