synapse-core 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/synapse.rb +351 -0
- data/lib/synapse/command/command_bus.rb +45 -0
- data/lib/synapse/command/command_callback.rb +18 -0
- data/lib/synapse/command/command_filter.rb +17 -0
- data/lib/synapse/command/command_handler.rb +13 -0
- data/lib/synapse/command/dispatch_interceptor.rb +16 -0
- data/lib/synapse/command/duplication.rb +43 -0
- data/lib/synapse/command/errors.rb +27 -0
- data/lib/synapse/command/filters/validation.rb +32 -0
- data/lib/synapse/command/gateway.rb +34 -0
- data/lib/synapse/command/interceptor_chain.rb +31 -0
- data/lib/synapse/command/interceptors/serialization.rb +35 -0
- data/lib/synapse/command/message.rb +19 -0
- data/lib/synapse/command/rollback_policy.rb +22 -0
- data/lib/synapse/command/simple_command_bus.rb +138 -0
- data/lib/synapse/command/wiring.rb +47 -0
- data/lib/synapse/domain/aggregate_root.rb +121 -0
- data/lib/synapse/domain/event_container.rb +127 -0
- data/lib/synapse/domain/message.rb +82 -0
- data/lib/synapse/domain/message_builder.rb +34 -0
- data/lib/synapse/domain/stream.rb +108 -0
- data/lib/synapse/duplication.rb +60 -0
- data/lib/synapse/errors.rb +13 -0
- data/lib/synapse/event_bus/event_bus.rb +40 -0
- data/lib/synapse/event_bus/event_listener.rb +16 -0
- data/lib/synapse/event_bus/event_listener_proxy.rb +12 -0
- data/lib/synapse/event_bus/simple_event_bus.rb +69 -0
- data/lib/synapse/event_bus/wiring.rb +23 -0
- data/lib/synapse/event_sourcing/aggregate_factory.rb +69 -0
- data/lib/synapse/event_sourcing/aggregate_root.rb +104 -0
- data/lib/synapse/event_sourcing/conflict_resolver.rb +80 -0
- data/lib/synapse/event_sourcing/entity.rb +64 -0
- data/lib/synapse/event_sourcing/member.rb +72 -0
- data/lib/synapse/event_sourcing/repository.rb +119 -0
- data/lib/synapse/event_sourcing/snapshot/count_stream.rb +86 -0
- data/lib/synapse/event_sourcing/snapshot/count_trigger.rb +91 -0
- data/lib/synapse/event_sourcing/snapshot/taker.rb +73 -0
- data/lib/synapse/event_sourcing/storage_listener.rb +34 -0
- data/lib/synapse/event_sourcing/stream_decorator.rb +25 -0
- data/lib/synapse/event_store/errors.rb +16 -0
- data/lib/synapse/event_store/event_store.rb +43 -0
- data/lib/synapse/event_store/in_memory.rb +59 -0
- data/lib/synapse/event_store/mongo/cursor_event_stream.rb +63 -0
- data/lib/synapse/event_store/mongo/event_store.rb +86 -0
- data/lib/synapse/event_store/mongo/per_commit_strategy.rb +253 -0
- data/lib/synapse/event_store/mongo/per_event_strategy.rb +143 -0
- data/lib/synapse/event_store/mongo/storage_strategy.rb +113 -0
- data/lib/synapse/event_store/mongo/template.rb +73 -0
- data/lib/synapse/identifier.rb +23 -0
- data/lib/synapse/message.rb +101 -0
- data/lib/synapse/message_builder.rb +38 -0
- data/lib/synapse/process_manager/correlation.rb +32 -0
- data/lib/synapse/process_manager/correlation_resolver.rb +14 -0
- data/lib/synapse/process_manager/correlation_set.rb +58 -0
- data/lib/synapse/process_manager/process.rb +71 -0
- data/lib/synapse/repository/errors.rb +26 -0
- data/lib/synapse/repository/lock_manager.rb +40 -0
- data/lib/synapse/repository/locking.rb +97 -0
- data/lib/synapse/repository/pessimistic_lock_manager.rb +61 -0
- data/lib/synapse/repository/repository.rb +109 -0
- data/lib/synapse/serialization/converter.rb +39 -0
- data/lib/synapse/serialization/converter/chain.rb +45 -0
- data/lib/synapse/serialization/converter/factory.rb +68 -0
- data/lib/synapse/serialization/converter/identity.rb +29 -0
- data/lib/synapse/serialization/converter/json.rb +31 -0
- data/lib/synapse/serialization/converter/ox.rb +31 -0
- data/lib/synapse/serialization/errors.rb +12 -0
- data/lib/synapse/serialization/lazy_object.rb +61 -0
- data/lib/synapse/serialization/message/data.rb +25 -0
- data/lib/synapse/serialization/message/metadata.rb +13 -0
- data/lib/synapse/serialization/message/serialization_aware.rb +17 -0
- data/lib/synapse/serialization/message/serialization_aware_message.rb +66 -0
- data/lib/synapse/serialization/message/serialized_message.rb +201 -0
- data/lib/synapse/serialization/message/serialized_message_builder.rb +64 -0
- data/lib/synapse/serialization/message/serialized_object_cache.rb +50 -0
- data/lib/synapse/serialization/message/serializer.rb +47 -0
- data/lib/synapse/serialization/revision_resolver.rb +30 -0
- data/lib/synapse/serialization/serialized_object.rb +37 -0
- data/lib/synapse/serialization/serialized_type.rb +31 -0
- data/lib/synapse/serialization/serializer.rb +98 -0
- data/lib/synapse/serialization/serializer/marshal.rb +32 -0
- data/lib/synapse/serialization/serializer/oj.rb +34 -0
- data/lib/synapse/serialization/serializer/ox.rb +31 -0
- data/lib/synapse/uow/factory.rb +28 -0
- data/lib/synapse/uow/listener.rb +79 -0
- data/lib/synapse/uow/listener_collection.rb +93 -0
- data/lib/synapse/uow/nesting.rb +262 -0
- data/lib/synapse/uow/provider.rb +71 -0
- data/lib/synapse/uow/storage_listener.rb +14 -0
- data/lib/synapse/uow/transaction_manager.rb +27 -0
- data/lib/synapse/uow/uow.rb +178 -0
- data/lib/synapse/upcasting/chain.rb +78 -0
- data/lib/synapse/upcasting/context.rb +58 -0
- data/lib/synapse/upcasting/data.rb +30 -0
- data/lib/synapse/upcasting/single_upcaster.rb +57 -0
- data/lib/synapse/upcasting/upcaster.rb +55 -0
- data/lib/synapse/version.rb +3 -0
- data/lib/synapse/wiring/message_wiring.rb +41 -0
- data/lib/synapse/wiring/wire.rb +55 -0
- data/lib/synapse/wiring/wire_registry.rb +61 -0
- data/test/command/duplication_test.rb +54 -0
- data/test/command/gateway_test.rb +25 -0
- data/test/command/interceptor_chain_test.rb +26 -0
- data/test/command/serialization_test.rb +37 -0
- data/test/command/simple_command_bus_test.rb +141 -0
- data/test/command/validation_test.rb +42 -0
- data/test/command/wiring_test.rb +73 -0
- data/test/domain/aggregate_root_test.rb +57 -0
- data/test/domain/fixtures.rb +31 -0
- data/test/domain/message_test.rb +61 -0
- data/test/domain/stream_test.rb +35 -0
- data/test/duplication_test.rb +40 -0
- data/test/event_bus/wiring_test.rb +46 -0
- data/test/event_sourcing/aggregate_factory_test.rb +28 -0
- data/test/event_sourcing/aggregate_root_test.rb +76 -0
- data/test/event_sourcing/entity_test.rb +34 -0
- data/test/event_sourcing/fixtures.rb +85 -0
- data/test/event_sourcing/repository_test.rb +102 -0
- data/test/event_sourcing/snapshot/aggregate_taker_test.rb +39 -0
- data/test/event_sourcing/snapshot/deferred_taker_test.rb +19 -0
- data/test/event_sourcing/snapshot/integration_test.rb +65 -0
- data/test/event_sourcing/storage_listener_test.rb +77 -0
- data/test/event_store/in_memory_test.rb +47 -0
- data/test/process_manager/correlation_set_test.rb +49 -0
- data/test/process_manager/correlation_test.rb +24 -0
- data/test/process_manager/process_test.rb +52 -0
- data/test/repository/locking_test.rb +101 -0
- data/test/serialization/converter/factory_test.rb +33 -0
- data/test/serialization/converter/identity_test.rb +17 -0
- data/test/serialization/converter/json_test.rb +31 -0
- data/test/serialization/converter/ox_test.rb +40 -0
- data/test/serialization/fixtures.rb +17 -0
- data/test/serialization/lazy_object_test.rb +32 -0
- data/test/serialization/message/metadata_test.rb +19 -0
- data/test/serialization/message/serialization_aware_message_test.rb +88 -0
- data/test/serialization/message/serialized_message_builder_test.rb +41 -0
- data/test/serialization/message/serialized_message_test.rb +140 -0
- data/test/serialization/message/serializer_test.rb +50 -0
- data/test/serialization/revision_resolver_test.rb +12 -0
- data/test/serialization/serialized_object_test.rb +36 -0
- data/test/serialization/serialized_type_test.rb +27 -0
- data/test/serialization/serializer/marshal_test.rb +22 -0
- data/test/serialization/serializer/oj_test.rb +24 -0
- data/test/serialization/serializer/ox_test.rb +36 -0
- data/test/serialization/serializer_test.rb +20 -0
- data/test/test_helper.rb +19 -0
- data/test/uow/factory_test.rb +23 -0
- data/test/uow/outer_commit_listener_test.rb +50 -0
- data/test/uow/provider_test.rb +70 -0
- data/test/uow/uow_test.rb +337 -0
- data/test/upcasting/chain_test.rb +29 -0
- data/test/upcasting/fixtures.rb +66 -0
- data/test/wiring/wire_registry_test.rb +60 -0
- data/test/wiring/wire_test.rb +51 -0
- metadata +263 -0
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Synapse
|
4
|
+
module Command
|
5
|
+
class DuplicationFilterTest < Test::Unit::TestCase
|
6
|
+
def test_filter
|
7
|
+
recorder = DuplicationRecorder.new
|
8
|
+
filter = DuplicationFilter.new recorder
|
9
|
+
|
10
|
+
command = CommandMessage.build
|
11
|
+
|
12
|
+
result = filter.filter command
|
13
|
+
|
14
|
+
assert_same command, result
|
15
|
+
assert recorder.recorded? command
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class DuplicationCleanupInterceptorTest < Test::Unit::TestCase
|
20
|
+
def test_intercept
|
21
|
+
recorder = DuplicationRecorder.new
|
22
|
+
interceptor = DuplicationCleanupInterceptor.new recorder
|
23
|
+
|
24
|
+
command = CommandMessage.build
|
25
|
+
unit = Object.new
|
26
|
+
|
27
|
+
chain = Object.new
|
28
|
+
mock(chain).proceed(command) do
|
29
|
+
raise TransientError
|
30
|
+
end
|
31
|
+
|
32
|
+
recorder.record command
|
33
|
+
|
34
|
+
assert_raise TransientError do
|
35
|
+
interceptor.intercept command, unit, chain
|
36
|
+
end
|
37
|
+
|
38
|
+
refute recorder.recorded? command
|
39
|
+
|
40
|
+
mock(chain).proceed(command) do
|
41
|
+
raise ArgumentError
|
42
|
+
end
|
43
|
+
|
44
|
+
recorder.record command
|
45
|
+
|
46
|
+
assert_raise ArgumentError do
|
47
|
+
interceptor.intercept command, unit, chain
|
48
|
+
end
|
49
|
+
|
50
|
+
assert recorder.recorded? command
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Synapse
|
4
|
+
module Command
|
5
|
+
|
6
|
+
class CommandGatewayTest < Test::Unit::TestCase
|
7
|
+
def test_send
|
8
|
+
command_bus = Object.new
|
9
|
+
gateway = CommandGateway.new command_bus
|
10
|
+
|
11
|
+
command = Object.new
|
12
|
+
command_message = CommandMessage.build do |builder|
|
13
|
+
builder.payload = command
|
14
|
+
end
|
15
|
+
|
16
|
+
mock(command_bus).dispatch(is_a(CommandMessage)).ordered
|
17
|
+
mock(command_bus).dispatch(command_message).ordered
|
18
|
+
|
19
|
+
gateway.send command
|
20
|
+
gateway.send command_message
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Synapse
|
4
|
+
module Command
|
5
|
+
|
6
|
+
class InterceptorChainTest < Test::Unit::TestCase
|
7
|
+
def test_proceed
|
8
|
+
unit = Object.new
|
9
|
+
interceptor = Object.new
|
10
|
+
interceptors = Array.new << interceptor
|
11
|
+
handler = Object.new
|
12
|
+
|
13
|
+
command = Object.new
|
14
|
+
|
15
|
+
chain = InterceptorChain.new unit, interceptors, handler
|
16
|
+
|
17
|
+
mock(interceptor).intercept(command, unit, chain).ordered
|
18
|
+
mock(handler).handle(command, unit).ordered
|
19
|
+
|
20
|
+
chain.proceed command
|
21
|
+
chain.proceed command
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Synapse
|
4
|
+
module Command
|
5
|
+
|
6
|
+
class SerializationOptimizingInterceptorTest < Test::Unit::TestCase
|
7
|
+
def test_intercept
|
8
|
+
interceptor = SerializationOptimizingInterceptor.new
|
9
|
+
|
10
|
+
command = CommandMessage.build
|
11
|
+
chain = Object.new
|
12
|
+
unit = Object.new
|
13
|
+
|
14
|
+
mock(chain).proceed(command)
|
15
|
+
mock(unit).register_listener(is_a(SerializationOptimizingListener))
|
16
|
+
|
17
|
+
interceptor.intercept(command, unit, chain)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class SerializationOptimizingListenerTest < Test::Unit::TestCase
|
22
|
+
def test_on_event_registered
|
23
|
+
listener = SerializationOptimizingListener.new
|
24
|
+
unit = Object.new
|
25
|
+
|
26
|
+
event = Domain::DomainEventMessage.build
|
27
|
+
decorated = listener.on_event_registered unit, event
|
28
|
+
assert decorated.is_a? Serialization::SerializationAwareDomainEventMessage
|
29
|
+
|
30
|
+
event = Domain::EventMessage.build
|
31
|
+
decorated = listener.on_event_registered unit, event
|
32
|
+
assert decorated.is_a? Serialization::SerializationAwareEventMessage
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Synapse
|
4
|
+
module Command
|
5
|
+
|
6
|
+
class SimpleCommandBusTest < Test::Unit::TestCase
|
7
|
+
def setup
|
8
|
+
@unit_factory = Object.new
|
9
|
+
@unit = Object.new
|
10
|
+
@command_bus = SimpleCommandBus.new @unit_factory
|
11
|
+
@logger = Logging.logger[@command_bus.class]
|
12
|
+
|
13
|
+
mock(@unit_factory).create.any_times do
|
14
|
+
@unit
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_dispatch
|
19
|
+
handler = Object.new
|
20
|
+
command = CommandMessage.build do |m|
|
21
|
+
m.payload = TestCommand.new
|
22
|
+
end
|
23
|
+
|
24
|
+
mock(handler).handle(command, @unit)
|
25
|
+
mock(@unit).commit
|
26
|
+
|
27
|
+
@command_bus.subscribe TestCommand, handler
|
28
|
+
@command_bus.dispatch command
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_dispatch_result
|
32
|
+
handler = Object.new
|
33
|
+
callback = Object.new
|
34
|
+
command = CommandMessage.build do |m|
|
35
|
+
m.payload = TestCommand.new
|
36
|
+
end
|
37
|
+
|
38
|
+
result = 123
|
39
|
+
|
40
|
+
mock(handler).handle(command, @unit) do
|
41
|
+
result
|
42
|
+
end
|
43
|
+
mock(callback).on_success(result)
|
44
|
+
mock(@unit).commit
|
45
|
+
|
46
|
+
@command_bus.subscribe TestCommand, handler
|
47
|
+
@command_bus.dispatch_with_callback command, callback
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_dispatch_no_handler
|
51
|
+
command = CommandMessage.build do |m|
|
52
|
+
m.payload = TestCommand.new
|
53
|
+
end
|
54
|
+
|
55
|
+
callback = Object.new
|
56
|
+
mock(callback).on_failure(is_a(NoHandlerError))
|
57
|
+
|
58
|
+
@command_bus.dispatch_with_callback command, callback
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_dispatch_rollback_on_exception
|
62
|
+
handler = Object.new
|
63
|
+
command = CommandMessage.build do |m|
|
64
|
+
m.payload = TestCommand.new
|
65
|
+
end
|
66
|
+
|
67
|
+
exception = TypeError.new
|
68
|
+
|
69
|
+
mock(handler).handle(command, @unit) do
|
70
|
+
raise exception
|
71
|
+
end
|
72
|
+
|
73
|
+
mock(@logger).error(anything)
|
74
|
+
mock(@unit).rollback(exception)
|
75
|
+
|
76
|
+
@command_bus.subscribe TestCommand, handler
|
77
|
+
|
78
|
+
callback = Object.new
|
79
|
+
mock(callback).on_failure(is_a(CommandExecutionError))
|
80
|
+
|
81
|
+
@command_bus.dispatch_with_callback command, callback
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_dispatch_commit_on_exception
|
85
|
+
handler = Object.new
|
86
|
+
command = CommandMessage.build do |m|
|
87
|
+
m.payload = TestCommand.new
|
88
|
+
end
|
89
|
+
|
90
|
+
exception = TypeError.new
|
91
|
+
|
92
|
+
mock(handler).handle(command, @unit) do
|
93
|
+
raise exception
|
94
|
+
end
|
95
|
+
|
96
|
+
rollback_policy = Object.new
|
97
|
+
mock(rollback_policy).should_rollback(exception) do
|
98
|
+
false
|
99
|
+
end
|
100
|
+
mock(@unit).commit
|
101
|
+
|
102
|
+
@command_bus.rollback_policy = rollback_policy
|
103
|
+
@command_bus.subscribe TestCommand, handler
|
104
|
+
|
105
|
+
callback = Object.new
|
106
|
+
mock(callback).on_failure(is_a(CommandExecutionError))
|
107
|
+
|
108
|
+
@command_bus.dispatch_with_callback command, callback
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_subscribe
|
112
|
+
handler = Object.new
|
113
|
+
|
114
|
+
mock(@logger).debug(anything).ordered
|
115
|
+
mock(@logger).info(anything).ordered
|
116
|
+
|
117
|
+
@command_bus.subscribe TestCommand, handler
|
118
|
+
@command_bus.subscribe TestCommand, handler
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_unsubscribe
|
122
|
+
handler_a = Object.new
|
123
|
+
handler_b = Object.new
|
124
|
+
|
125
|
+
mock(@logger).info(anything).ordered # not subscribed to anyone
|
126
|
+
mock(@logger).debug(anything).ordered # now subscribed
|
127
|
+
mock(@logger).info(anything).ordered # subscribed to different
|
128
|
+
mock(@logger).debug(anything).ordered # now unsubscribed
|
129
|
+
|
130
|
+
@command_bus.unsubscribe TestCommand, handler_a
|
131
|
+
@command_bus.subscribe TestCommand, handler_a
|
132
|
+
@command_bus.unsubscribe TestCommand, handler_b
|
133
|
+
@command_bus.unsubscribe TestCommand, handler_a
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
class TestCommand; end
|
138
|
+
class TestOtherCommand; end
|
139
|
+
|
140
|
+
end
|
141
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'active_model'
|
3
|
+
|
4
|
+
module Synapse
|
5
|
+
module Command
|
6
|
+
|
7
|
+
class ActiveModelValidationFilterTest < Test::Unit::TestCase
|
8
|
+
def test_filter
|
9
|
+
message = CommandMessage.build do |m|
|
10
|
+
m.payload = CreatePersonCommand.new 'River'
|
11
|
+
end
|
12
|
+
|
13
|
+
filter = ActiveModelValidationFilter.new
|
14
|
+
filter.filter message
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_filter_fails
|
18
|
+
message = CommandMessage.build do |m|
|
19
|
+
m.payload = CreatePersonCommand.new nil
|
20
|
+
end
|
21
|
+
|
22
|
+
filter = ActiveModelValidationFilter.new
|
23
|
+
assert_raise ActiveModelValidationError do
|
24
|
+
filter.filter message
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class CreatePersonCommand
|
30
|
+
include ActiveModel::Validations
|
31
|
+
|
32
|
+
attr_reader :name
|
33
|
+
|
34
|
+
validates :name, :presence => true
|
35
|
+
|
36
|
+
def initialize(name)
|
37
|
+
@name = name
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Synapse
|
4
|
+
module Command
|
5
|
+
|
6
|
+
class WiringCommandHandlerTest < Test::Unit::TestCase
|
7
|
+
def test_handle
|
8
|
+
handler = ExampleWiringCommandHandler.new
|
9
|
+
unit = Object.new
|
10
|
+
|
11
|
+
command = CommandMessage.build do |builder|
|
12
|
+
builder.payload = TestCommand.new
|
13
|
+
end
|
14
|
+
|
15
|
+
handler.handle command, unit
|
16
|
+
assert handler.handled
|
17
|
+
|
18
|
+
command = CommandMessage.build do |builder|
|
19
|
+
builder.payload = TestSubCommand.new
|
20
|
+
end
|
21
|
+
|
22
|
+
handler.handle command, unit
|
23
|
+
assert handler.sub_handled
|
24
|
+
|
25
|
+
command = CommandMessage.build do |builder|
|
26
|
+
builder.payload = 5
|
27
|
+
end
|
28
|
+
|
29
|
+
assert_raise ArgumentError do
|
30
|
+
handler.handle command, unit
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_subscribe
|
35
|
+
handler = ExampleWiringCommandHandler.new
|
36
|
+
bus = Object.new
|
37
|
+
|
38
|
+
mock(bus).subscribe(TestSubCommand, handler)
|
39
|
+
mock(bus).subscribe(TestCommand, handler)
|
40
|
+
|
41
|
+
handler.subscribe bus
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_unsubscribe
|
45
|
+
handler = ExampleWiringCommandHandler.new
|
46
|
+
bus = Object.new
|
47
|
+
|
48
|
+
mock(bus).unsubscribe(TestSubCommand, handler)
|
49
|
+
mock(bus).unsubscribe(TestCommand, handler)
|
50
|
+
|
51
|
+
handler.unsubscribe bus
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
class TestCommand; end
|
56
|
+
class TestSubCommand; end
|
57
|
+
|
58
|
+
class ExampleWiringCommandHandler
|
59
|
+
include WiringCommandHandler
|
60
|
+
|
61
|
+
attr_accessor :handled, :sub_handled
|
62
|
+
|
63
|
+
wire TestCommand do |command|
|
64
|
+
@handled = true
|
65
|
+
end
|
66
|
+
|
67
|
+
wire TestSubCommand do |command|
|
68
|
+
@sub_handled = true
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'domain/fixtures'
|
3
|
+
|
4
|
+
module Synapse
|
5
|
+
module Domain
|
6
|
+
class AggregateRootTest < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@person = Person.new 123, 'Fry'
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_publish_events
|
13
|
+
assert_equal 0, @person.uncommitted_event_count
|
14
|
+
|
15
|
+
@person.change_name 'Leela'
|
16
|
+
|
17
|
+
events = Array.new
|
18
|
+
|
19
|
+
@person.add_registration_listener do |event|
|
20
|
+
events.push event
|
21
|
+
event
|
22
|
+
end
|
23
|
+
|
24
|
+
@person.change_name 'Bender'
|
25
|
+
|
26
|
+
assert_equal 2, @person.uncommitted_event_count
|
27
|
+
assert_equal events, @person.uncommitted_events.to_a
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_mark_committed
|
31
|
+
@person.change_name 'Bender'
|
32
|
+
@person.mark_committed
|
33
|
+
|
34
|
+
assert_equal 0, @person.uncommitted_event_count
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_mark_deleted
|
38
|
+
@person.delete
|
39
|
+
|
40
|
+
assert @person.deleted?
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_identifier_not_initialized
|
44
|
+
p = Person.new nil, nil
|
45
|
+
|
46
|
+
assert_raise AggregateIdentifierNotInitializedError do
|
47
|
+
p.change_name 'Zoidberg'
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_empty_uncommitted_events
|
52
|
+
assert @person.uncommitted_events.end?
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|