synapse-core 0.4.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/synapse/command/async_command_bus.rb +41 -0
- data/lib/synapse/command/command_callback.rb +49 -2
- data/lib/synapse/command/command_handler.rb +2 -0
- data/lib/synapse/command/filters/validation.rb +2 -2
- data/lib/synapse/command/gateway/interval_retry_scheduler.rb +75 -0
- data/lib/synapse/command/gateway/retry_scheduler.rb +26 -0
- data/lib/synapse/command/gateway/retrying_callback.rb +46 -0
- data/lib/synapse/command/gateway.rb +56 -11
- data/lib/synapse/command/interceptor_chain.rb +2 -2
- data/lib/synapse/command/interceptors/serialization.rb +2 -2
- data/lib/synapse/command/message.rb +16 -0
- data/lib/synapse/command/simple_command_bus.rb +6 -2
- data/lib/synapse/command/wiring.rb +3 -3
- data/lib/synapse/command.rb +7 -1
- data/lib/synapse/common/concurrency/identifier_lock.rb +2 -17
- data/lib/synapse/common/concurrency/public_lock.rb +8 -9
- data/lib/synapse/common/errors.rb +1 -1
- data/lib/synapse/common/message.rb +2 -6
- data/lib/synapse/common.rb +9 -0
- data/lib/synapse/configuration/component/command_bus/async_command_bus.rb +41 -0
- data/lib/synapse/configuration/component/command_bus/gateway.rb +38 -0
- data/lib/synapse/configuration/component/command_bus/simple_command_bus.rb +81 -0
- data/lib/synapse/configuration/component/command_bus.rb +35 -0
- data/lib/synapse/configuration/component/event_bus/simple_event_bus.rb +41 -0
- data/lib/synapse/configuration/component/event_bus.rb +15 -0
- data/lib/synapse/configuration/component/event_sourcing/repository.rb +62 -0
- data/lib/synapse/configuration/component/event_sourcing.rb +15 -0
- data/lib/synapse/configuration/component/repository/locking_repository.rb +85 -0
- data/lib/synapse/configuration/component/repository/simple_repository.rb +31 -0
- data/lib/synapse/configuration/component/repository.rb +15 -0
- data/lib/synapse/configuration/component/serialization/converter_factory.rb +50 -0
- data/lib/synapse/configuration/component/serialization/serializer.rb +90 -0
- data/lib/synapse/configuration/component/serialization.rb +25 -0
- data/lib/synapse/configuration/component/uow/unit_factory.rb +51 -0
- data/lib/synapse/configuration/component/uow.rb +22 -0
- data/lib/synapse/configuration/component/upcasting/upcaster_chain.rb +61 -0
- data/lib/synapse/configuration/component/upcasting.rb +15 -0
- data/lib/synapse/configuration/container.rb +80 -0
- data/lib/synapse/configuration/container_builder.rb +108 -0
- data/lib/synapse/configuration/definition.rb +31 -0
- data/lib/synapse/configuration/definition_builder.rb +138 -0
- data/lib/synapse/configuration/dependent.rb +31 -0
- data/lib/synapse/configuration/ext.rb +35 -0
- data/lib/synapse/configuration.rb +32 -0
- data/lib/synapse/domain/aggregate_root.rb +25 -26
- data/lib/synapse/domain/event_container.rb +5 -5
- data/lib/synapse/domain/message.rb +16 -0
- data/lib/synapse/event_bus/event_listener.rb +2 -0
- data/lib/synapse/event_bus/event_publisher.rb +19 -0
- data/lib/synapse/event_bus/simple_event_bus.rb +21 -30
- data/lib/synapse/event_bus/wiring.rb +5 -4
- data/lib/synapse/event_bus.rb +1 -1
- data/lib/synapse/event_sourcing/aggregate_root.rb +6 -4
- data/lib/synapse/process_manager/container_resource_injector.rb +18 -0
- data/lib/synapse/process_manager/pessimistic_lock_manager.rb +1 -1
- data/lib/synapse/process_manager/process.rb +4 -0
- data/lib/synapse/process_manager/process_factory.rb +3 -3
- data/lib/synapse/process_manager/repository/in_memory.rb +1 -1
- data/lib/synapse/process_manager/wiring/process.rb +6 -6
- data/lib/synapse/process_manager/wiring/process_manager.rb +8 -8
- data/lib/synapse/process_manager.rb +2 -0
- data/lib/synapse/repository/locking.rb +5 -3
- data/lib/synapse/repository/optimistic_lock_manager.rb +2 -7
- data/lib/synapse/repository/pessimistic_lock_manager.rb +3 -3
- data/lib/synapse/repository/repository.rb +2 -2
- data/lib/synapse/repository/simple_repository.rb +69 -0
- data/lib/synapse/repository.rb +1 -0
- data/lib/synapse/serialization/converter/chain.rb +2 -2
- data/lib/synapse/serialization/converter_factory.rb +2 -2
- data/lib/synapse/serialization/lazy_object.rb +2 -2
- data/lib/synapse/serialization/message/serialization_aware_message.rb +3 -3
- data/lib/synapse/serialization/message/serialized_message.rb +6 -10
- data/lib/synapse/serialization/message/serialized_message_builder.rb +4 -4
- data/lib/synapse/serialization/message/serialized_object_cache.rb +2 -2
- data/lib/synapse/serialization/message/serializer.rb +2 -2
- data/lib/synapse/serialization/revision_resolver.rb +3 -3
- data/lib/synapse/serialization/serialized_object.rb +2 -2
- data/lib/synapse/serialization/serialized_type.rb +2 -2
- data/lib/synapse/serialization/serializer/attribute.rb +2 -2
- data/lib/synapse/serialization/serializer/marshal.rb +2 -2
- data/lib/synapse/serialization/serializer/oj.rb +2 -2
- data/lib/synapse/serialization/serializer/ox.rb +2 -2
- data/lib/synapse/serialization/serializer.rb +2 -2
- data/lib/synapse/uow/factory.rb +2 -2
- data/lib/synapse/uow/listener_collection.rb +2 -2
- data/lib/synapse/uow/nesting.rb +9 -2
- data/lib/synapse/uow/provider.rb +2 -2
- data/lib/synapse/uow/uow.rb +8 -2
- data/lib/synapse/upcasting/{chain.rb → upcaster_chain.rb} +0 -0
- data/lib/synapse/upcasting.rb +1 -1
- data/lib/synapse/version.rb +1 -1
- data/lib/synapse/wiring/message_wiring.rb +31 -0
- data/lib/synapse.rb +2 -14
- data/test/auditing/data_provider_test.rb +2 -2
- data/test/auditing/dispatch_interceptor_test.rb +1 -1
- data/test/auditing/unit_listener_test.rb +3 -3
- data/test/command/async_command_bus_test.rb +49 -0
- data/test/command/duplication_test.rb +2 -2
- data/test/command/gateway/interval_retry_scheduler_test.rb +42 -0
- data/test/command/gateway/retrying_callback_test.rb +57 -0
- data/test/command/gateway_test.rb +41 -7
- data/test/command/interceptor_chain_test.rb +1 -1
- data/test/command/message_test.rb +17 -0
- data/test/command/serialization_test.rb +2 -2
- data/test/command/simple_command_bus_test.rb +7 -7
- data/test/command/validation_test.rb +3 -3
- data/test/command/wiring_test.rb +3 -3
- data/test/common/concurrency/identifier_lock_test.rb +2 -13
- data/test/common/concurrency/public_lock_test.rb +6 -6
- data/test/{duplication_test.rb → common/duplication_test.rb} +3 -3
- data/test/configuration/component/command_bus/async_command_bus_test.rb +36 -0
- data/test/configuration/component/command_bus/simple_command_bus_test.rb +57 -0
- data/test/configuration/component/event_bus/simple_event_bus_test.rb +58 -0
- data/test/configuration/component/serialization/converter_factory_test.rb +48 -0
- data/test/configuration/component/serialization/serializer_test.rb +78 -0
- data/test/configuration/component/uow/unit_factory_test.rb +46 -0
- data/test/configuration/container_builder_test.rb +47 -0
- data/test/configuration/container_test.rb +88 -0
- data/test/configuration/definition_builder_test.rb +126 -0
- data/test/configuration/definition_test.rb +41 -0
- data/test/configuration/dependent_test.rb +30 -0
- data/test/configuration/ext_test.rb +19 -0
- data/test/configuration/fixtures/dependent.rb +10 -0
- data/test/domain/aggregate_root_test.rb +5 -5
- data/test/domain/message_test.rb +15 -3
- data/test/domain/stream_test.rb +2 -2
- data/test/event_bus/publisher_test.rb +29 -0
- data/test/event_bus/wiring_test.rb +1 -1
- data/test/event_sourcing/aggregate_factory_test.rb +12 -6
- data/test/event_sourcing/aggregate_root_test.rb +4 -4
- data/test/event_sourcing/entity_test.rb +10 -9
- data/test/event_sourcing/repository_test.rb +6 -6
- data/test/event_sourcing/storage_listener_test.rb +8 -4
- data/test/event_store/in_memory_test.rb +3 -3
- data/test/process_manager/container_resource_injector_test.rb +19 -0
- data/test/process_manager/correlation_set_test.rb +2 -2
- data/test/process_manager/correlation_test.rb +2 -2
- data/test/process_manager/in_memory_test.rb +3 -3
- data/test/process_manager/process_factory_test.rb +2 -2
- data/test/process_manager/process_test.rb +3 -3
- data/test/process_manager/simple_process_manager_test.rb +5 -5
- data/test/process_manager/wiring/process_manager_test.rb +4 -4
- data/test/process_manager/wiring/process_test.rb +2 -2
- data/test/repository/locking_test.rb +4 -4
- data/test/repository/optimistic_test.rb +2 -2
- data/test/repository/pessimistic_test.rb +1 -1
- data/test/repository/simple_repository_test.rb +79 -0
- data/test/support/countdown_latch.rb +18 -0
- data/test/test_helper.rb +6 -3
- data/test/upcasting/data_test.rb +31 -0
- metadata +84 -25
- data/lib/synapse/event_bus/event_listener_proxy.rb +0 -12
- data/lib/synapse/partitioning/memory_queue_reader.rb +0 -31
- data/lib/synapse/partitioning/memory_queue_writer.rb +0 -19
- data/lib/synapse/partitioning/message_receipt.rb +0 -25
- data/lib/synapse/partitioning/packing/json_packer.rb +0 -93
- data/lib/synapse/partitioning/packing/json_unpacker.rb +0 -83
- data/lib/synapse/partitioning/packing.rb +0 -27
- data/lib/synapse/partitioning/queue_reader.rb +0 -32
- data/lib/synapse/partitioning/queue_writer.rb +0 -17
- data/lib/synapse/partitioning.rb +0 -18
- data/test/partitioning/memory_test.rb +0 -34
- data/test/partitioning/packing/json_test.rb +0 -62
@@ -0,0 +1,126 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Synapse
|
4
|
+
module Configuration
|
5
|
+
class DefinitionBuilderTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@container = Container.new
|
9
|
+
end
|
10
|
+
|
11
|
+
should 'build a definition with just an identifier' do
|
12
|
+
DefinitionBuilder.build @container, :some_id do
|
13
|
+
# we'll pass here
|
14
|
+
end
|
15
|
+
assert @container.registered? :some_id
|
16
|
+
end
|
17
|
+
|
18
|
+
should 'build a definition using an identifier set in the block' do
|
19
|
+
DefinitionBuilder.build @container do
|
20
|
+
identified_by :other_id
|
21
|
+
end
|
22
|
+
assert @container.registered? :other_id
|
23
|
+
end
|
24
|
+
|
25
|
+
should 'build a definition using tags set in the block' do
|
26
|
+
reference = Object.new
|
27
|
+
|
28
|
+
DefinitionBuilder.build @container, :derp_service do
|
29
|
+
tag :one, :two
|
30
|
+
use_instance reference
|
31
|
+
end
|
32
|
+
|
33
|
+
assert @container.registered? :derp_service
|
34
|
+
assert_equal [reference], @container.resolve_tagged(:one)
|
35
|
+
assert_equal [reference], @container.resolve_tagged(:two)
|
36
|
+
assert_equal [], @container.resolve_tagged(:three)
|
37
|
+
end
|
38
|
+
|
39
|
+
should 'build a prototype definition using a factory' do
|
40
|
+
DefinitionBuilder.build @container, :keygen do
|
41
|
+
as_prototype
|
42
|
+
use_factory do
|
43
|
+
SecureRandom.uuid
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
first = @container.resolve :keygen
|
48
|
+
second = @container.resolve :keygen
|
49
|
+
|
50
|
+
refute_equal first, second
|
51
|
+
end
|
52
|
+
|
53
|
+
should 'build a singleton definition using a factory' do
|
54
|
+
DefinitionBuilder.build @container, :static_keygen do
|
55
|
+
as_singleton
|
56
|
+
use_factory do
|
57
|
+
SecureRandom.uuid
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
first = @container.resolve :static_keygen
|
62
|
+
second = @container.resolve :static_keygen
|
63
|
+
|
64
|
+
assert_equal first, second
|
65
|
+
end
|
66
|
+
|
67
|
+
should 'delegate resolution to the service container' do
|
68
|
+
DefinitionBuilder.build @container, :some_dependency do
|
69
|
+
use_instance 123
|
70
|
+
end
|
71
|
+
|
72
|
+
DefinitionBuilder.build @container, :dependent do
|
73
|
+
use_factory do
|
74
|
+
resolve :some_dependency
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
value = @container.resolve :dependent
|
79
|
+
assert_equal 123, value
|
80
|
+
|
81
|
+
DefinitionBuilder.build @container, :self_dependent do
|
82
|
+
use_factory do
|
83
|
+
resolve Hash.new
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
value = @container.resolve :self_dependent
|
88
|
+
assert value.is_a? Hash
|
89
|
+
end
|
90
|
+
|
91
|
+
should 'delegate tag resolution to the service container' do
|
92
|
+
DefinitionBuilder.build @container, :some_tagged_dependency do
|
93
|
+
use_instance 123
|
94
|
+
tag :dependency
|
95
|
+
end
|
96
|
+
|
97
|
+
DefinitionBuilder.build @container, :dependent do
|
98
|
+
use_factory do
|
99
|
+
resolve_tagged :dependency
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
value = @container.resolve :dependent
|
104
|
+
assert_equal [123], value
|
105
|
+
end
|
106
|
+
|
107
|
+
should 'delegate building child services to another builder' do
|
108
|
+
DefinitionBuilder.build @container, :outside do
|
109
|
+
build_composite do
|
110
|
+
identified_by :inside
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
assert @container.registered? :outside
|
115
|
+
assert @container.registered? :inside
|
116
|
+
end
|
117
|
+
|
118
|
+
should 'raise an exception if no identifier is set when registering with the container' do
|
119
|
+
assert_raise ConfigurationError do
|
120
|
+
DefinitionBuilder.build @container
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Synapse
|
4
|
+
module Configuration
|
5
|
+
class DefinitionTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
should 'call the defrred factory every time if prototype' do
|
8
|
+
factory_invoked = 0
|
9
|
+
factory = proc do
|
10
|
+
factory_invoked += 1
|
11
|
+
end
|
12
|
+
|
13
|
+
definition = Definition.new Set.new, true, factory, nil
|
14
|
+
definition.resolve
|
15
|
+
definition.resolve
|
16
|
+
assert_equal 2, factory_invoked
|
17
|
+
end
|
18
|
+
|
19
|
+
should 'call the deferred factory only once if singleton' do
|
20
|
+
factory_invoked = 0
|
21
|
+
factory = proc do
|
22
|
+
factory_invoked += 1
|
23
|
+
end
|
24
|
+
|
25
|
+
definition = Definition.new Set.new, false, factory, nil
|
26
|
+
definition.resolve
|
27
|
+
definition.resolve
|
28
|
+
assert_equal 1, factory_invoked
|
29
|
+
end
|
30
|
+
|
31
|
+
should 'resolve to an instance if one is provided' do
|
32
|
+
instance = Object.new
|
33
|
+
|
34
|
+
# Singleton service definition w/ late instance
|
35
|
+
definition = Definition.new Set.new, false, nil, instance
|
36
|
+
assert_same instance, definition.resolve
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'configuration/fixtures/dependent'
|
3
|
+
|
4
|
+
module Synapse
|
5
|
+
module Configuration
|
6
|
+
class DependentTest < Test::Unit::TestCase
|
7
|
+
|
8
|
+
should 'create accessors for injectable attributes' do
|
9
|
+
dependent = ExampleDependent.new
|
10
|
+
|
11
|
+
service_a = Object.new
|
12
|
+
service_b = Object.new
|
13
|
+
|
14
|
+
dependent.service_a = service_a
|
15
|
+
dependent.some_service = service_b
|
16
|
+
|
17
|
+
assert_same service_a, dependent.service_a
|
18
|
+
assert_same service_b, dependent.some_service
|
19
|
+
end
|
20
|
+
|
21
|
+
should 'track which services to inject in which attributes' do
|
22
|
+
dependencies = ExampleDependent.dependencies
|
23
|
+
|
24
|
+
assert_equal :service_a, dependencies[:service_a]
|
25
|
+
assert_equal :some_service, dependencies[:service_b]
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Synapse
|
4
|
+
module Configuration
|
5
|
+
class ExtensionTest < Test::Unit::TestCase
|
6
|
+
should 'delegate building to the service container' do
|
7
|
+
reference = Object.new
|
8
|
+
|
9
|
+
Synapse.build do
|
10
|
+
factory :test_service do
|
11
|
+
reference
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
assert_same reference, Synapse.container[:test_service]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -9,7 +9,7 @@ module Synapse
|
|
9
9
|
@person = Person.new 123, 'Fry'
|
10
10
|
end
|
11
11
|
|
12
|
-
|
12
|
+
should 'track published events' do
|
13
13
|
assert_equal 0, @person.uncommitted_event_count
|
14
14
|
|
15
15
|
@person.change_name 'Leela'
|
@@ -27,20 +27,20 @@ module Synapse
|
|
27
27
|
assert_equal events, @person.uncommitted_events.to_a
|
28
28
|
end
|
29
29
|
|
30
|
-
|
30
|
+
should 'handle being marked committed' do
|
31
31
|
@person.change_name 'Bender'
|
32
32
|
@person.mark_committed
|
33
33
|
|
34
34
|
assert_equal 0, @person.uncommitted_event_count
|
35
35
|
end
|
36
36
|
|
37
|
-
|
37
|
+
should 'handle being marked for deletion' do
|
38
38
|
@person.delete
|
39
39
|
|
40
40
|
assert @person.deleted?
|
41
41
|
end
|
42
42
|
|
43
|
-
|
43
|
+
should 'raise an exception if identifier not initialized, but events are applied' do
|
44
44
|
p = Person.new nil, nil
|
45
45
|
|
46
46
|
assert_raise AggregateIdentifierNotInitializedError do
|
@@ -48,7 +48,7 @@ module Synapse
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
-
|
51
|
+
should 'return an empty domain event stream if no events have been published' do
|
52
52
|
assert @person.uncommitted_events.end?
|
53
53
|
end
|
54
54
|
|
data/test/domain/message_test.rb
CHANGED
@@ -2,6 +2,18 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
module Synapse
|
4
4
|
module Domain
|
5
|
+
class EventMessageTest < Test::Unit::TestCase
|
6
|
+
should 'wrap event objects into event messages' do
|
7
|
+
event = Object.new
|
8
|
+
event_message = EventMessage.build
|
9
|
+
|
10
|
+
assert_same event_message, EventMessage.as_message(event_message)
|
11
|
+
|
12
|
+
wrapped = EventMessage.as_message(event)
|
13
|
+
assert_same event, wrapped.payload
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
5
17
|
class DomainEventMessageTest < Test::Unit::TestCase
|
6
18
|
def setup
|
7
19
|
@payload = OpenStruct.new
|
@@ -15,7 +27,7 @@ module Synapse
|
|
15
27
|
end
|
16
28
|
end
|
17
29
|
|
18
|
-
|
30
|
+
should 'populate fields with sensible defaults' do
|
19
31
|
# ensure empty fields were populated with default values
|
20
32
|
assert @message.id
|
21
33
|
assert @message.metadata
|
@@ -28,7 +40,7 @@ module Synapse
|
|
28
40
|
assert_equal @sequence_number, @message.sequence_number
|
29
41
|
end
|
30
42
|
|
31
|
-
|
43
|
+
should 'create a complete copy of itself when merging metadata' do
|
32
44
|
additional_metadata_a = { foo: 'bar' }
|
33
45
|
additional_metadata_b = { baz: 'qux' }
|
34
46
|
|
@@ -46,7 +58,7 @@ module Synapse
|
|
46
58
|
assert_equal additional_metadata_a.merge(additional_metadata_b), merged.metadata
|
47
59
|
end
|
48
60
|
|
49
|
-
|
61
|
+
should 'create a complete copy of itself when replacing metadata' do
|
50
62
|
additional_metadata_a = { foo: 'bar' }
|
51
63
|
additional_metadata_b = { baz: 'qux' }
|
52
64
|
|
data/test/domain/stream_test.rb
CHANGED
@@ -12,12 +12,12 @@ module Synapse
|
|
12
12
|
@stream = SimpleDomainEventStream.new @events
|
13
13
|
end
|
14
14
|
|
15
|
-
|
15
|
+
should 'support peeking without moving the pointer forward' do
|
16
16
|
assert_same @events.at(0), @stream.peek
|
17
17
|
assert_same @events.at(0), @stream.peek
|
18
18
|
end
|
19
19
|
|
20
|
-
|
20
|
+
should 'raise an exception when the end of the stream is reached' do
|
21
21
|
@stream.next_event
|
22
22
|
@stream.next_event
|
23
23
|
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Synapse
|
4
|
+
module EventBus
|
5
|
+
class EventPublisherTest < Test::Unit::TestCase
|
6
|
+
should 'wrap event objects in messages before they are published' do
|
7
|
+
event_bus = Object.new
|
8
|
+
|
9
|
+
mock(event_bus).publish(is_a(Domain::EventMessage)) do |message|
|
10
|
+
assert message.payload.is_a? TestEvent
|
11
|
+
end
|
12
|
+
|
13
|
+
publisher = ExampleEventPublisher.new
|
14
|
+
publisher.event_bus = event_bus
|
15
|
+
publisher.do_something
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class ExampleEventPublisher
|
20
|
+
include EventPublisher
|
21
|
+
|
22
|
+
def do_something
|
23
|
+
publish_event TestEvent.new
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class TestEvent; end
|
28
|
+
end
|
29
|
+
end
|
@@ -4,7 +4,7 @@ module Synapse
|
|
4
4
|
module EventBus
|
5
5
|
|
6
6
|
class WiringEventListenerTest < Test::Unit::TestCase
|
7
|
-
|
7
|
+
should 'use the correct handler when notified of an events' do
|
8
8
|
listener = ExampleWiringEventListener.new
|
9
9
|
|
10
10
|
event = Domain::EventMessage.build do |builder|
|
@@ -4,23 +4,29 @@ module Synapse
|
|
4
4
|
module EventSourcing
|
5
5
|
|
6
6
|
class GenericAggregateFactoryTest < Test::Unit::TestCase
|
7
|
-
def
|
8
|
-
factory = GenericAggregateFactory.new StubAggregate
|
7
|
+
def setup
|
8
|
+
@factory = GenericAggregateFactory.new StubAggregate
|
9
|
+
end
|
9
10
|
|
11
|
+
should 'create an aggregate from a normal event' do
|
10
12
|
event = Domain::DomainEventMessage.build do |m|
|
11
13
|
m.payload = StubCreatedEvent.new 123
|
12
14
|
end
|
13
15
|
|
16
|
+
aggregate = @factory.create_aggregate 123, event
|
17
|
+
|
18
|
+
assert aggregate.is_a? StubAggregate
|
19
|
+
end
|
20
|
+
|
21
|
+
should 'use an aggregate snapshot if available' do
|
14
22
|
snapshot = StubAggregate.new 123
|
15
23
|
snapshot_event = Domain::DomainEventMessage.build do |m|
|
16
24
|
m.payload = snapshot
|
17
25
|
end
|
18
26
|
|
19
|
-
|
20
|
-
aggregate_b = factory.create_aggregate(123, event)
|
27
|
+
aggregate = @factory.create_aggregate 123, snapshot_event
|
21
28
|
|
22
|
-
assert
|
23
|
-
assert aggregate_b.is_a? StubAggregate
|
29
|
+
assert aggregate.equal? snapshot
|
24
30
|
end
|
25
31
|
end
|
26
32
|
|
@@ -5,7 +5,7 @@ module Synapse
|
|
5
5
|
module EventSourcing
|
6
6
|
|
7
7
|
class AggregateRootTest < Test::Unit::TestCase
|
8
|
-
|
8
|
+
should 'track published events' do
|
9
9
|
stub = StubAggregate.new 123
|
10
10
|
stub.change_something
|
11
11
|
stub.change_something
|
@@ -20,7 +20,7 @@ module Synapse
|
|
20
20
|
assert_equal 2, stub.version
|
21
21
|
end
|
22
22
|
|
23
|
-
|
23
|
+
should 'support initializing state from an event stream' do
|
24
24
|
events = Array.new
|
25
25
|
events.push create_event(123, 0, StubCreatedEvent.new(123))
|
26
26
|
events.push create_event(123, 1, StubChangedEvent.new)
|
@@ -34,7 +34,7 @@ module Synapse
|
|
34
34
|
assert_equal 2, aggregate.version
|
35
35
|
end
|
36
36
|
|
37
|
-
|
37
|
+
should 'raise an exception if initialization is attempted when the aggregate has state' do
|
38
38
|
aggregate = StubAggregate.new 123
|
39
39
|
|
40
40
|
assert_raise RuntimeError do
|
@@ -42,7 +42,7 @@ module Synapse
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
|
45
|
+
should 'notify child entities of aggregate events' do
|
46
46
|
stub_entity_a = StubEntity.new
|
47
47
|
stub_entity_b = StubEntity.new
|
48
48
|
|
@@ -5,27 +5,28 @@ module Synapse
|
|
5
5
|
module EventSourcing
|
6
6
|
|
7
7
|
class EntityTest < Test::Unit::TestCase
|
8
|
-
|
8
|
+
should 'raise an exception if an event is published and aggregate root is not set' do
|
9
9
|
entity = StubEntity.new
|
10
|
-
aggregate_a = StubAggregate.new 123
|
11
|
-
aggregate_b = StubAggregate.new 123
|
12
10
|
|
13
11
|
assert_raise RuntimeError do
|
14
12
|
entity.change_something
|
15
13
|
end
|
16
14
|
|
17
|
-
|
15
|
+
aggregate = StubAggregate.new 123
|
18
16
|
|
19
|
-
|
20
|
-
|
21
|
-
end
|
17
|
+
entity.aggregate_root = aggregate
|
18
|
+
entity.change_something
|
22
19
|
end
|
23
20
|
|
24
|
-
|
21
|
+
should 'raise an exception if registration is attempted with more than one aggregate' do
|
25
22
|
entity = StubEntity.new
|
23
|
+
aggregate_a = StubAggregate.new 123
|
24
|
+
aggregate_b = StubAggregate.new 123
|
25
|
+
|
26
|
+
entity.aggregate_root = aggregate_a
|
26
27
|
|
27
28
|
assert_raise RuntimeError do
|
28
|
-
entity.
|
29
|
+
entity.aggregate_root = aggregate_b
|
29
30
|
end
|
30
31
|
end
|
31
32
|
end
|
@@ -17,7 +17,7 @@ module Synapse
|
|
17
17
|
@repository.unit_provider = @unit_provider
|
18
18
|
end
|
19
19
|
|
20
|
-
|
20
|
+
should 'raise an exception if an incompatible aggregate is added' do
|
21
21
|
aggregate = Domain::Person.new 123, 'Polandball'
|
22
22
|
|
23
23
|
assert_raise ArgumentError do
|
@@ -25,7 +25,7 @@ module Synapse
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
|
28
|
+
should 'load an aggregate from an event stream' do
|
29
29
|
event = create_event(123, 0, StubCreatedEvent.new(123))
|
30
30
|
|
31
31
|
mock(@event_store).read_events(@factory.type_identifier, 123) do
|
@@ -35,7 +35,7 @@ module Synapse
|
|
35
35
|
aggregate = @repository.load 123
|
36
36
|
end
|
37
37
|
|
38
|
-
|
38
|
+
should 'raise an exception if an unexpected aggregate version is loaded' do
|
39
39
|
event = create_event(123, 1, StubCreatedEvent.new(123))
|
40
40
|
|
41
41
|
mock(@event_store).read_events(@factory.type_identifier, 123) do
|
@@ -47,7 +47,7 @@ module Synapse
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
|
50
|
+
should 'raise an exception if an event stream could not be found for the aggregate id' do
|
51
51
|
mock(@event_store).read_events(@factory.type_identifier, 123) do
|
52
52
|
raise EventStore::StreamNotFoundError.new @factory.type_identifier, 123
|
53
53
|
end
|
@@ -57,7 +57,7 @@ module Synapse
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
-
|
60
|
+
should 'raise an exception if the loaded aggregate has been marked for deletion' do
|
61
61
|
event_a = create_event(123, 0, StubCreatedEvent.new(123))
|
62
62
|
event_b = create_event(123, 1, StubDeletedEvent.new)
|
63
63
|
|
@@ -70,7 +70,7 @@ module Synapse
|
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
|
-
|
73
|
+
should 'defer version checking to a conflict resolver if one is set' do
|
74
74
|
@repository.conflict_resolver = ConflictResolver.new
|
75
75
|
|
76
76
|
event_a = create_event(123, 0, StubCreatedEvent.new(123))
|
@@ -4,7 +4,7 @@ module Synapse
|
|
4
4
|
module EventSourcing
|
5
5
|
|
6
6
|
class EventSourcedStorageListenerTest < Test::Unit::TestCase
|
7
|
-
|
7
|
+
should 'append uncommitted aggregate events to the event store' do
|
8
8
|
event_store = Object.new
|
9
9
|
lock_manager = Repository::NullLockManager.new
|
10
10
|
decorators = Array.new
|
@@ -33,9 +33,9 @@ module Synapse
|
|
33
33
|
listener.store aggregate
|
34
34
|
end
|
35
35
|
|
36
|
-
|
36
|
+
should 'validate lock if the aggregate is not new' do
|
37
37
|
event_store = Object.new
|
38
|
-
lock_manager =
|
38
|
+
lock_manager = Object.new
|
39
39
|
decorators = Array.new
|
40
40
|
type_identifier = StubAggregate.to_s.demodulize
|
41
41
|
aggregate = StubAggregate.new 123
|
@@ -44,13 +44,17 @@ module Synapse
|
|
44
44
|
123
|
45
45
|
end
|
46
46
|
|
47
|
+
mock(lock_manager).validate_lock(aggregate) do
|
48
|
+
true
|
49
|
+
end
|
50
|
+
|
47
51
|
mock(event_store).append_events(type_identifier, anything)
|
48
52
|
|
49
53
|
listener = EventSourcedStorageListener.new event_store, lock_manager, decorators, type_identifier
|
50
54
|
listener.store aggregate
|
51
55
|
end
|
52
56
|
|
53
|
-
|
57
|
+
should 'raise an exception if the aggregate is not new and the lock is invalid' do
|
54
58
|
event_store = Object.new
|
55
59
|
lock_manager = Object.new
|
56
60
|
decorators = Array.new
|
@@ -8,13 +8,13 @@ module Synapse
|
|
8
8
|
@event_store = InMemoryEventStore.new
|
9
9
|
end
|
10
10
|
|
11
|
-
|
11
|
+
should 'raise an exception if a stream could not be found' do
|
12
12
|
assert_raise StreamNotFoundError do
|
13
13
|
@event_store.read_events 'Person', 123
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
|
17
|
+
should 'support appending and reading an event stream' do
|
18
18
|
event_a = Domain::DomainEventMessage.build { |e| e.aggregate_id = 123 }
|
19
19
|
event_b = Domain::DomainEventMessage.build { |e| e.aggregate_id = 123 }
|
20
20
|
event_c = Domain::DomainEventMessage.build { |e| e.aggregate_id = 123 }
|
@@ -30,7 +30,7 @@ module Synapse
|
|
30
30
|
assert_equal [event_a, event_b, event_c], stream.to_a
|
31
31
|
end
|
32
32
|
|
33
|
-
|
33
|
+
should 'be able to be cleared of all streams' do
|
34
34
|
event = Domain::DomainEventMessage.build { |e| e.aggregate_id = 123 }
|
35
35
|
stream = Domain::SimpleDomainEventStream.new event
|
36
36
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Synapse
|
4
|
+
module ProcessManager
|
5
|
+
|
6
|
+
class ContainerResourceInjectorTest < Test::Unit::TestCase
|
7
|
+
should 'use a service container to inject resources' do
|
8
|
+
container = Object.new
|
9
|
+
resource_injector = ContainerResourceInjector.new container
|
10
|
+
process = Process.new
|
11
|
+
|
12
|
+
mock(container).inject_into(process)
|
13
|
+
|
14
|
+
resource_injector.inject_resources process
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -4,7 +4,7 @@ module Synapse
|
|
4
4
|
module ProcessManager
|
5
5
|
class CorrelationSetTest < Test::Unit::TestCase
|
6
6
|
|
7
|
-
|
7
|
+
should 'track correlation additions' do
|
8
8
|
correlation = Correlation.new :order_id, '512d5467-d319-481e-ab5e-4d6f7445bcff'
|
9
9
|
|
10
10
|
set = CorrelationSet.new
|
@@ -25,7 +25,7 @@ module Synapse
|
|
25
25
|
assert_equal 0, set.deletions.count
|
26
26
|
end
|
27
27
|
|
28
|
-
|
28
|
+
should 'track correlation deletions' do
|
29
29
|
correlation = Correlation.new :order_id, '512d5467-d319-481e-ab5e-4d6f7445bcff'
|
30
30
|
|
31
31
|
set = CorrelationSet.new
|
@@ -3,14 +3,14 @@ require 'test_helper'
|
|
3
3
|
module Synapse
|
4
4
|
module ProcessManager
|
5
5
|
class CorrelationTest < Test::Unit::TestCase
|
6
|
-
|
6
|
+
should 'coerce key and value to correct types' do
|
7
7
|
correlation = Correlation.new :foo, 'bar'
|
8
8
|
|
9
9
|
assert_equal :foo, correlation.key
|
10
10
|
assert_equal 'bar', correlation.value
|
11
11
|
end
|
12
12
|
|
13
|
-
|
13
|
+
should 'be able to determine equality with similar correlations' do
|
14
14
|
correlation_a = Correlation.new :foo, 'bar'
|
15
15
|
correlation_b = Correlation.new :foo, 'bar'
|
16
16
|
correlation_c = Correlation.new :foo, 'baz'
|