@@ -30,6 +30,7 @@ import (
30
30
"errors"
31
31
"net"
32
32
"strconv"
33
+ "strings"
33
34
"testing"
34
35
"time"
35
36
@@ -50,17 +51,17 @@ import (
50
51
egomock "github.com/tochemey/ego/v3/mocks/ego"
51
52
"github.com/tochemey/ego/v3/projection"
52
53
testpb "github.com/tochemey/ego/v3/test/data/pb/v3"
53
- testkit2 "github.com/tochemey/ego/v3/testkit"
54
+ testkit "github.com/tochemey/ego/v3/testkit"
54
55
)
55
56
56
57
// nolint
57
58
func TestEngine (t * testing.T ) {
58
59
t .Run ("EventSourced entity With single node cluster enabled" , func (t * testing.T ) {
59
60
ctx := context .TODO ()
60
61
// create the event store
61
- eventStore := testkit2 .NewEventsStore ()
62
+ eventStore := testkit .NewEventsStore ()
62
63
require .NoError (t , eventStore .Connect (ctx ))
63
- offsetStore := testkit2 .NewOffsetStore ()
64
+ offsetStore := testkit .NewOffsetStore ()
64
65
require .NoError (t , offsetStore .Connect (ctx ))
65
66
66
67
nodePorts := dynaport .Get (3 )
@@ -130,7 +131,7 @@ func TestEngine(t *testing.T) {
130
131
// create an entity behavior with a given id
131
132
behavior := NewEventSourcedEntity (entityID )
132
133
// create an entity
133
- err = engine .Entity (ctx , behavior )
134
+ err = engine .Entity (ctx , behavior , WithPassivateAfter ( time . Hour ) )
134
135
require .NoError (t , err )
135
136
// send some commands to the pid
136
137
var command proto.Message
@@ -190,7 +191,7 @@ func TestEngine(t *testing.T) {
190
191
t .Run ("EventSourced entity With no cluster enabled" , func (t * testing.T ) {
191
192
ctx := context .TODO ()
192
193
// create the event store
193
- eventStore := testkit2 .NewEventsStore ()
194
+ eventStore := testkit .NewEventsStore ()
194
195
// connect to the event store
195
196
require .NoError (t , eventStore .Connect (ctx ))
196
197
@@ -263,7 +264,7 @@ func TestEngine(t *testing.T) {
263
264
t .Run ("EventSourced entity With SendCommand when not started" , func (t * testing.T ) {
264
265
ctx := context .TODO ()
265
266
// create the event store
266
- eventStore := testkit2 .NewEventsStore ()
267
+ eventStore := testkit .NewEventsStore ()
267
268
require .NoError (t , eventStore .Connect (ctx ))
268
269
269
270
// create the ego engine
@@ -273,14 +274,14 @@ func TestEngine(t *testing.T) {
273
274
274
275
_ , _ , err := engine .SendCommand (ctx , entityID , new (samplepb.CreateAccount ), time .Minute )
275
276
require .Error (t , err )
276
- assert .EqualError (t , err , ErrEngineNotStarted .Error ())
277
+ require .EqualError (t , err , ErrEngineNotStarted .Error ())
277
278
278
- assert .NoError (t , eventStore .Disconnect (ctx ))
279
+ require .NoError (t , eventStore .Disconnect (ctx ))
279
280
})
280
281
t .Run ("EventSourced entity With SendCommand when entityID is not set" , func (t * testing.T ) {
281
282
ctx := context .TODO ()
282
283
// create the event store
283
- eventStore := testkit2 .NewEventsStore ()
284
+ eventStore := testkit .NewEventsStore ()
284
285
require .NoError (t , eventStore .Connect (ctx ))
285
286
286
287
// create the ego engine
@@ -301,7 +302,7 @@ func TestEngine(t *testing.T) {
301
302
t .Run ("EventSourced entity With SendCommand when entity is not found" , func (t * testing.T ) {
302
303
ctx := context .TODO ()
303
304
// create the event store
304
- eventStore := testkit2 .NewEventsStore ()
305
+ eventStore := testkit .NewEventsStore ()
305
306
require .NoError (t , eventStore .Connect (ctx ))
306
307
307
308
// create the ego engine
@@ -322,7 +323,7 @@ func TestEngine(t *testing.T) {
322
323
t .Run ("EventSourced entity With IsProjectionRunning when not started" , func (t * testing.T ) {
323
324
ctx := context .TODO ()
324
325
// create the event store
325
- eventStore := testkit2 .NewEventsStore ()
326
+ eventStore := testkit .NewEventsStore ()
326
327
require .NoError (t , eventStore .Connect (ctx ))
327
328
328
329
// create the ego engine
@@ -338,11 +339,11 @@ func TestEngine(t *testing.T) {
338
339
t .Run ("EventSourced entity With RemoveProjection" , func (t * testing.T ) {
339
340
ctx := context .TODO ()
340
341
// create the event store
341
- eventStore := testkit2 .NewEventsStore ()
342
+ eventStore := testkit .NewEventsStore ()
342
343
// connect to the event store
343
344
require .NoError (t , eventStore .Connect (ctx ))
344
345
345
- offsetStore := testkit2 .NewOffsetStore ()
346
+ offsetStore := testkit .NewOffsetStore ()
346
347
require .NoError (t , offsetStore .Connect (ctx ))
347
348
348
349
// create the ego engine
@@ -381,7 +382,7 @@ func TestEngine(t *testing.T) {
381
382
t .Run ("EventSourced entity With RemoveProjection when not started" , func (t * testing.T ) {
382
383
ctx := context .TODO ()
383
384
// create the event store
384
- eventStore := testkit2 .NewEventsStore ()
385
+ eventStore := testkit .NewEventsStore ()
385
386
require .NoError (t , eventStore .Connect (ctx ))
386
387
387
388
// create the ego engine
@@ -395,7 +396,7 @@ func TestEngine(t *testing.T) {
395
396
})
396
397
t .Run ("DurableStore entity With single node cluster enabled" , func (t * testing.T ) {
397
398
ctx := context .TODO ()
398
- stateStore := testkit2 .NewDurableStore ()
399
+ stateStore := testkit .NewDurableStore ()
399
400
require .NoError (t , stateStore .Connect (ctx ))
400
401
401
402
nodePorts := dynaport .Get (3 )
@@ -491,7 +492,7 @@ func TestEngine(t *testing.T) {
491
492
})
492
493
t .Run ("DurableStore entity With no cluster enabled" , func (t * testing.T ) {
493
494
ctx := context .TODO ()
494
- stateStore := testkit2 .NewDurableStore ()
495
+ stateStore := testkit .NewDurableStore ()
495
496
require .NoError (t , stateStore .Connect (ctx ))
496
497
497
498
// create the ego engine
@@ -512,7 +513,7 @@ func TestEngine(t *testing.T) {
512
513
entityID := uuid .NewString ()
513
514
behavior := NewAccountDurableStateBehavior (entityID )
514
515
515
- err = engine .DurableStateEntity (ctx , behavior )
516
+ err = engine .DurableStateEntity (ctx , behavior , WithPassivateAfter ( time . Hour ) )
516
517
require .NoError (t , err )
517
518
var command proto.Message
518
519
@@ -557,7 +558,7 @@ func TestEngine(t *testing.T) {
557
558
t .Run ("DurableStore entity With SendCommand when not started" , func (t * testing.T ) {
558
559
ctx := context .TODO ()
559
560
560
- stateStore := testkit2 .NewDurableStore ()
561
+ stateStore := testkit .NewDurableStore ()
561
562
require .NoError (t , stateStore .Connect (ctx ))
562
563
563
564
// create the ego engine
@@ -575,7 +576,7 @@ func TestEngine(t *testing.T) {
575
576
})
576
577
t .Run ("DurableStore entity With SendCommand when entityID is not set" , func (t * testing.T ) {
577
578
ctx := context .TODO ()
578
- stateStore := testkit2 .NewDurableStore ()
579
+ stateStore := testkit .NewDurableStore ()
579
580
require .NoError (t , stateStore .Connect (ctx ))
580
581
581
582
// create the ego engine
@@ -597,7 +598,7 @@ func TestEngine(t *testing.T) {
597
598
t .Run ("DurableStore entity With SendCommand when entity is not found" , func (t * testing.T ) {
598
599
ctx := context .TODO ()
599
600
600
- stateStore := testkit2 .NewDurableStore ()
601
+ stateStore := testkit .NewDurableStore ()
601
602
require .NoError (t , stateStore .Connect (ctx ))
602
603
603
604
// create the ego engine
@@ -619,9 +620,9 @@ func TestEngine(t *testing.T) {
619
620
t .Run ("With Events Publisher with cluster enabled" , func (t * testing.T ) {
620
621
ctx := context .TODO ()
621
622
// create the event store
622
- eventStore := testkit2 .NewEventsStore ()
623
+ eventStore := testkit .NewEventsStore ()
623
624
require .NoError (t , eventStore .Connect (ctx ))
624
- offsetStore := testkit2 .NewOffsetStore ()
625
+ offsetStore := testkit .NewOffsetStore ()
625
626
require .NoError (t , offsetStore .Connect (ctx ))
626
627
627
628
nodePorts := dynaport .Get (3 )
@@ -768,7 +769,7 @@ func TestEngine(t *testing.T) {
768
769
})
769
770
t .Run ("With DurableState Publisher with no cluster enabled" , func (t * testing.T ) {
770
771
ctx := context .TODO ()
771
- stateStore := testkit2 .NewDurableStore ()
772
+ stateStore := testkit .NewDurableStore ()
772
773
require .NoError (t , stateStore .Connect (ctx ))
773
774
774
775
// mock the state publisher
@@ -837,7 +838,7 @@ func TestEngine(t *testing.T) {
837
838
})
838
839
t .Run ("With DurableState Publisher with cluster enabled" , func (t * testing.T ) {
839
840
ctx := context .TODO ()
840
- stateStore := testkit2 .NewDurableStore ()
841
+ stateStore := testkit .NewDurableStore ()
841
842
require .NoError (t , stateStore .Connect (ctx ))
842
843
843
844
nodePorts := dynaport .Get (3 )
@@ -949,7 +950,7 @@ func TestEngine(t *testing.T) {
949
950
t .Run ("With DurableState Publisher when not started" , func (t * testing.T ) {
950
951
ctx := context .TODO ()
951
952
// create the event store
952
- eventStore := testkit2 .NewEventsStore ()
953
+ eventStore := testkit .NewEventsStore ()
953
954
require .NoError (t , eventStore .Connect (ctx ))
954
955
955
956
publisher := new (egomock.StatePublisher )
@@ -965,7 +966,7 @@ func TestEngine(t *testing.T) {
965
966
t .Run ("With EventPublisher when not started" , func (t * testing.T ) {
966
967
ctx := context .TODO ()
967
968
// create the event store
968
- eventStore := testkit2 .NewEventsStore ()
969
+ eventStore := testkit .NewEventsStore ()
969
970
require .NoError (t , eventStore .Connect (ctx ))
970
971
971
972
publisher := new (egomock.EventPublisher )
@@ -980,7 +981,7 @@ func TestEngine(t *testing.T) {
980
981
})
981
982
t .Run ("With Engine Stop failure when EventPublisher close fails" , func (t * testing.T ) {
982
983
ctx := context .TODO ()
983
- stateStore := testkit2 .NewDurableStore ()
984
+ stateStore := testkit .NewDurableStore ()
984
985
require .NoError (t , stateStore .Connect (ctx ))
985
986
986
987
// mock the state publisher
@@ -1008,10 +1009,9 @@ func TestEngine(t *testing.T) {
1008
1009
lib .Pause (time .Second )
1009
1010
publisher .AssertExpectations (t )
1010
1011
})
1011
-
1012
1012
t .Run ("With Engine Stop failure when DurableState Publisher close fails" , func (t * testing.T ) {
1013
1013
ctx := context .TODO ()
1014
- stateStore := testkit2 .NewDurableStore ()
1014
+ stateStore := testkit .NewDurableStore ()
1015
1015
require .NoError (t , stateStore .Connect (ctx ))
1016
1016
1017
1017
// mock the state publisher
@@ -1039,6 +1039,130 @@ func TestEngine(t *testing.T) {
1039
1039
lib .Pause (time .Second )
1040
1040
publisher .AssertExpectations (t )
1041
1041
})
1042
+ t .Run ("With AddProjection when engine not started" , func (t * testing.T ) {
1043
+ ctx := context .TODO ()
1044
+ // create the event store
1045
+ eventStore := testkit .NewEventsStore ()
1046
+ offsetStore := testkit .NewOffsetStore ()
1047
+
1048
+ // create a projection message handler
1049
+ handler := projection .NewDiscardHandler (log .DiscardLogger )
1050
+
1051
+ engine := NewEngine ("Sample" , eventStore ,
1052
+ WithLogger (log .DiscardLogger ))
1053
+
1054
+ projectionName := "projection"
1055
+ err := engine .AddProjection (ctx , projectionName , handler , offsetStore )
1056
+ require .Error (t , err )
1057
+ })
1058
+ t .Run ("With AddProjection when projection name is invalid" , func (t * testing.T ) {
1059
+ ctx := context .TODO ()
1060
+ // create the event store
1061
+ eventStore := testkit .NewEventsStore ()
1062
+ // connect to the event store
1063
+ require .NoError (t , eventStore .Connect (ctx ))
1064
+
1065
+ offsetStore := testkit .NewOffsetStore ()
1066
+ require .NoError (t , offsetStore .Connect (ctx ))
1067
+
1068
+ // create the ego engine
1069
+ engine := NewEngine ("Sample" , eventStore , WithLogger (log .DiscardLogger ))
1070
+ // start ego engine
1071
+ err := engine .Start (ctx )
1072
+ require .NoError (t , err )
1073
+
1074
+ lib .Pause (time .Second )
1075
+
1076
+ // create a projection message handler
1077
+ handler := projection .NewDiscardHandler (log .DiscardLogger )
1078
+ // add projection
1079
+ projectionName := strings .Repeat ("a" , 256 )
1080
+ err = engine .AddProjection (ctx , projectionName , handler , offsetStore )
1081
+ require .Error (t , err )
1082
+ require .Contains (t , err .Error (), "failed to register the projection" )
1083
+
1084
+ // free resources
1085
+ assert .NoError (t , offsetStore .Disconnect (ctx ))
1086
+ assert .NoError (t , eventStore .Disconnect (ctx ))
1087
+ assert .NoError (t , engine .Stop (ctx ))
1088
+ })
1089
+ t .Run ("With Subscribe when not started" , func (t * testing.T ) {
1090
+ ctx := context .TODO ()
1091
+ // create the event store
1092
+ eventStore := testkit .NewEventsStore ()
1093
+ require .NoError (t , eventStore .Connect (ctx ))
1094
+
1095
+ engine := NewEngine ("Sample" , eventStore ,
1096
+ WithLogger (log .DiscardLogger ))
1097
+
1098
+ // subscribe to events
1099
+ subscriber , err := engine .Subscribe ()
1100
+ require .Error (t , err )
1101
+ require .ErrorIs (t , err , ErrEngineNotStarted )
1102
+ require .Nil (t , subscriber )
1103
+
1104
+ // free resources
1105
+ require .NoError (t , eventStore .Disconnect (ctx ))
1106
+ require .NoError (t , engine .Stop (ctx ))
1107
+ })
1108
+ t .Run ("EventSourced entity when not started" , func (t * testing.T ) {
1109
+ ctx := context .TODO ()
1110
+ // create the event store
1111
+ eventStore := testkit .NewEventsStore ()
1112
+ require .NoError (t , eventStore .Connect (ctx ))
1113
+
1114
+ // create the ego engine
1115
+ engine := NewEngine ("Sample" , eventStore , WithLogger (log .DiscardLogger ))
1116
+ // create a persistence id
1117
+ entityID := uuid .NewString ()
1118
+ // create an entity behavior with a given id
1119
+ behavior := NewEventSourcedEntity (entityID )
1120
+
1121
+ err := engine .Entity (ctx , behavior )
1122
+ require .Error (t , err )
1123
+ require .ErrorIs (t , err , ErrEngineNotStarted )
1124
+
1125
+ require .NoError (t , eventStore .Disconnect (ctx ))
1126
+ })
1127
+ t .Run ("DurableStore entity when not started" , func (t * testing.T ) {
1128
+ ctx := context .TODO ()
1129
+
1130
+ stateStore := testkit .NewDurableStore ()
1131
+ require .NoError (t , stateStore .Connect (ctx ))
1132
+
1133
+ // create the ego engine
1134
+ engine := NewEngine ("Sample" , nil ,
1135
+ WithStateStore (stateStore ),
1136
+ WithLogger (log .DiscardLogger ))
1137
+
1138
+ entityID := uuid .NewString ()
1139
+ behavior := NewAccountDurableStateBehavior (entityID )
1140
+
1141
+ err := engine .DurableStateEntity (ctx , behavior )
1142
+ require .Error (t , err )
1143
+ require .ErrorIs (t , err , ErrEngineNotStarted )
1144
+
1145
+ require .NoError (t , stateStore .Disconnect (ctx ))
1146
+ require .NoError (t , engine .Stop (ctx ))
1147
+ })
1148
+ t .Run ("DurableStore entity when durable store not set" , func (t * testing.T ) {
1149
+ ctx := context .TODO ()
1150
+
1151
+ // create the ego engine
1152
+ engine := NewEngine ("Sample" , nil ,
1153
+ WithLogger (log .DiscardLogger ))
1154
+
1155
+ require .NoError (t , engine .Start (ctx ))
1156
+
1157
+ entityID := uuid .NewString ()
1158
+ behavior := NewAccountDurableStateBehavior (entityID )
1159
+
1160
+ err := engine .DurableStateEntity (ctx , behavior )
1161
+ require .Error (t , err )
1162
+ require .ErrorIs (t , err , ErrDurableStateStoreRequired )
1163
+
1164
+ require .NoError (t , engine .Stop (ctx ))
1165
+ })
1042
1166
}
1043
1167
1044
1168
// EventSourcedEntity implements persistence.Behavior
0 commit comments