synapse-core 0.1.2
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.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,101 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
module Synapse
|
|
4
|
+
module Repository
|
|
5
|
+
class LockingRepositoryTest < Test::Unit::TestCase
|
|
6
|
+
def setup
|
|
7
|
+
@event_bus = Object.new
|
|
8
|
+
@lock_manager = Object.new
|
|
9
|
+
@storage_listener = Object.new
|
|
10
|
+
@unit_provider = UnitOfWork::UnitOfWorkProvider.new
|
|
11
|
+
|
|
12
|
+
@unit = UnitOfWork::UnitOfWork.new @unit_provider
|
|
13
|
+
@unit.start
|
|
14
|
+
|
|
15
|
+
# I herd you like dependencies
|
|
16
|
+
@repository = TestRepository.new @lock_manager
|
|
17
|
+
@repository.event_bus = @event_bus
|
|
18
|
+
@repository.storage_listener = @storage_listener
|
|
19
|
+
@repository.unit_provider = @unit_provider
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_add
|
|
23
|
+
mock(@lock_manager).obtain_lock(123)
|
|
24
|
+
mock(@lock_manager).release_lock(123)
|
|
25
|
+
|
|
26
|
+
aggregate = TestAggregateRoot.new 123, nil
|
|
27
|
+
|
|
28
|
+
mock(@storage_listener).store(aggregate)
|
|
29
|
+
|
|
30
|
+
@repository.add aggregate
|
|
31
|
+
@unit.commit
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def test_add_incompatible_aggregate
|
|
35
|
+
mock(@lock_manager).obtain_lock(123)
|
|
36
|
+
mock(@lock_manager).release_lock(123)
|
|
37
|
+
|
|
38
|
+
aggregate = OpenStruct.new
|
|
39
|
+
aggregate.id = 123
|
|
40
|
+
|
|
41
|
+
assert_raises ArgumentError do
|
|
42
|
+
@repository.add aggregate
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def test_add_versioned
|
|
47
|
+
mock(@lock_manager).obtain_lock(123)
|
|
48
|
+
mock(@lock_manager).release_lock(123)
|
|
49
|
+
|
|
50
|
+
aggregate = TestAggregateRoot.new 123, 0
|
|
51
|
+
|
|
52
|
+
assert_raises ArgumentError do
|
|
53
|
+
@repository.add aggregate
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def test_load_version_ahead
|
|
58
|
+
mock(@lock_manager).obtain_lock(123)
|
|
59
|
+
mock(@lock_manager).release_lock(123)
|
|
60
|
+
|
|
61
|
+
@repository.aggregate = TestAggregateRoot.new 123, 1
|
|
62
|
+
|
|
63
|
+
assert_raises ConflictingAggregateVersionError do
|
|
64
|
+
@repository.load 123, 0
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
class TestAggregateRoot
|
|
70
|
+
include Domain::AggregateRoot
|
|
71
|
+
|
|
72
|
+
def initialize(id, version)
|
|
73
|
+
@id, @version = id, version
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
class TestRepository < LockingRepository
|
|
78
|
+
attr_accessor :aggregate, :storage_listener
|
|
79
|
+
|
|
80
|
+
protected
|
|
81
|
+
|
|
82
|
+
def perform_load(aggregate_id, expected_version)
|
|
83
|
+
unless @aggregate
|
|
84
|
+
raise AggregateNotFoundError
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
assert_version_expected @aggregate, expected_version
|
|
88
|
+
|
|
89
|
+
@aggregate
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def aggregate_type
|
|
93
|
+
TestAggregateRoot
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def storage_listener
|
|
97
|
+
@storage_listener
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
module Synapse
|
|
4
|
+
module Serialization
|
|
5
|
+
|
|
6
|
+
class ConverterFactoryTest < Test::Unit::TestCase
|
|
7
|
+
|
|
8
|
+
def setup
|
|
9
|
+
@factory = ConverterFactory.new
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def test_identity
|
|
13
|
+
assert @factory.has_converter?(String, String)
|
|
14
|
+
assert @factory.converter(String, String).is_a?(IdentityConverter)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def test_converter
|
|
18
|
+
refute @factory.has_converter?(Object, String)
|
|
19
|
+
|
|
20
|
+
assert_raise ConversionError do
|
|
21
|
+
@factory.converter(Object, String)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
converter = ObjectToJsonConverter.new
|
|
25
|
+
@factory.register converter
|
|
26
|
+
|
|
27
|
+
assert @factory.has_converter?(Object, String)
|
|
28
|
+
assert_equal converter, @factory.converter(Object, String)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
module Synapse
|
|
4
|
+
module Serialization
|
|
5
|
+
class IdentityConverterTest < Test::Unit::TestCase
|
|
6
|
+
def test_conversion
|
|
7
|
+
converter = IdentityConverter.new Object
|
|
8
|
+
content = Hash.new
|
|
9
|
+
|
|
10
|
+
assert_equal Object, converter.source_type
|
|
11
|
+
assert_equal Object, converter.target_type
|
|
12
|
+
assert content === converter.convert(content)
|
|
13
|
+
assert content === converter.convert_content(content)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
module Synapse
|
|
4
|
+
module Serialization
|
|
5
|
+
class JsonToObjectConverterTest < Test::Unit::TestCase
|
|
6
|
+
def test_convert
|
|
7
|
+
converter = JsonToObjectConverter.new
|
|
8
|
+
|
|
9
|
+
assert_equal String, converter.source_type
|
|
10
|
+
assert_equal Object, converter.target_type
|
|
11
|
+
|
|
12
|
+
output = converter.convert_content '{}'
|
|
13
|
+
|
|
14
|
+
assert_equal Hash, output.class
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
class ObjectToJsonConverterTest < Test::Unit::TestCase
|
|
19
|
+
def test_convert
|
|
20
|
+
converter = ObjectToJsonConverter.new
|
|
21
|
+
|
|
22
|
+
assert_equal Object, converter.source_type
|
|
23
|
+
assert_equal String, converter.target_type
|
|
24
|
+
|
|
25
|
+
output = converter.convert_content Hash.new
|
|
26
|
+
|
|
27
|
+
assert_equal String, output.class
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
module Synapse
|
|
4
|
+
module Serialization
|
|
5
|
+
class OxDocumentToXmlConverterTest < Test::Unit::TestCase
|
|
6
|
+
def setup
|
|
7
|
+
skip 'Ox not supported on JRuby' if defined? JRUBY_VERSION
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_convert
|
|
11
|
+
converter = OxDocumentToXmlConverter.new
|
|
12
|
+
|
|
13
|
+
assert_equal Ox::Document, converter.source_type
|
|
14
|
+
assert_equal String, converter.target_type
|
|
15
|
+
|
|
16
|
+
input = Ox::Document.new
|
|
17
|
+
output = converter.convert_content input
|
|
18
|
+
|
|
19
|
+
assert_equal String, output.class
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
class XmlToOxDocumentConverterTest < Test::Unit::TestCase
|
|
24
|
+
def setup
|
|
25
|
+
skip 'Ox not supported on JRuby' if defined? JRUBY_VERSION
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def test_convert
|
|
29
|
+
converter = XmlToOxDocumentConverter.new
|
|
30
|
+
|
|
31
|
+
assert_equal String, converter.source_type
|
|
32
|
+
assert_equal Ox::Document, converter.target_type
|
|
33
|
+
|
|
34
|
+
output = converter.convert_content '<?xml?>'
|
|
35
|
+
|
|
36
|
+
assert_equal Ox::Document, output.class
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
require 'serialization/fixtures'
|
|
3
|
+
|
|
4
|
+
module Synapse
|
|
5
|
+
module Serialization
|
|
6
|
+
class LazyObjectTest < Test::Unit::TestCase
|
|
7
|
+
def test_deserialize_once
|
|
8
|
+
serializer = MarshalSerializer.new
|
|
9
|
+
event = TestEvent.new 'a', 'b'
|
|
10
|
+
|
|
11
|
+
serialized = serializer.serialize event, String
|
|
12
|
+
|
|
13
|
+
lazy = LazyObject.new serialized, serializer
|
|
14
|
+
|
|
15
|
+
assert_equal serialized, lazy.serialized_object
|
|
16
|
+
assert_equal serializer, lazy.serializer
|
|
17
|
+
assert_equal TestEvent, lazy.type
|
|
18
|
+
|
|
19
|
+
refute lazy.deserialized?
|
|
20
|
+
|
|
21
|
+
deserialized_a = lazy.deserialized
|
|
22
|
+
deserialized_b = lazy.deserialized
|
|
23
|
+
|
|
24
|
+
assert deserialized_a === deserialized_b
|
|
25
|
+
assert deserialized_a == event
|
|
26
|
+
assert deserialized_b == event
|
|
27
|
+
|
|
28
|
+
assert lazy.deserialized?
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
module Synapse
|
|
4
|
+
module Serialization
|
|
5
|
+
class SerializedMetadataTest < Test::Unit::TestCase
|
|
6
|
+
def test_initialize
|
|
7
|
+
content = 'test-metadata'
|
|
8
|
+
content_type = String
|
|
9
|
+
|
|
10
|
+
metadata = SerializedMetadata.new content, content_type
|
|
11
|
+
|
|
12
|
+
assert_equal content, metadata.content
|
|
13
|
+
assert_equal content_type, metadata.content_type
|
|
14
|
+
assert_equal Hash.to_s, metadata.type.name
|
|
15
|
+
assert_equal nil, metadata.type.revision
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
module Synapse
|
|
4
|
+
module Serialization
|
|
5
|
+
class SerializationAwareDomainEventMessageTest < Test::Unit::TestCase
|
|
6
|
+
def test_delegation
|
|
7
|
+
message = Domain::DomainEventMessage.build do |builder|
|
|
8
|
+
builder.payload = Object.new
|
|
9
|
+
builder.aggregate_id = 123
|
|
10
|
+
builder.sequence_number = 0
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
aware = SerializationAwareDomainEventMessage.new message
|
|
14
|
+
|
|
15
|
+
# EventMessage
|
|
16
|
+
assert_same message.id, aware.id
|
|
17
|
+
assert_same message.metadata, aware.metadata
|
|
18
|
+
assert_same message.payload, aware.payload
|
|
19
|
+
assert_same message.timestamp, aware.timestamp
|
|
20
|
+
|
|
21
|
+
# DomainEventMessage
|
|
22
|
+
assert_same message.aggregate_id, aware.aggregate_id
|
|
23
|
+
assert_same message.sequence_number, aware.sequence_number
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_caching
|
|
27
|
+
message = Domain::DomainEventMessage.build do |builder|
|
|
28
|
+
builder.payload = Object.new
|
|
29
|
+
builder.aggregate_id = 123
|
|
30
|
+
builder.sequence_number = 0
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
aware = SerializationAwareDomainEventMessage.new message
|
|
34
|
+
|
|
35
|
+
serializer_a = MarshalSerializer.new
|
|
36
|
+
serializer_b = MarshalSerializer.new
|
|
37
|
+
|
|
38
|
+
[:serialize_metadata, :serialize_payload].each do |method|
|
|
39
|
+
serialized_a = aware.send method, serializer_a, String
|
|
40
|
+
serialized_b = aware.send method, serializer_a, String
|
|
41
|
+
serialized_c = aware.send method, serializer_b, String
|
|
42
|
+
|
|
43
|
+
assert_same serialized_a, serialized_b
|
|
44
|
+
refute_same serialized_a, serialized_c
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_decorate
|
|
49
|
+
message = Domain::DomainEventMessage.build
|
|
50
|
+
|
|
51
|
+
aware = SerializationAwareDomainEventMessage.decorate message
|
|
52
|
+
new_aware = SerializationAwareDomainEventMessage.decorate aware
|
|
53
|
+
|
|
54
|
+
assert_same aware, new_aware
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def test_and_metadata
|
|
58
|
+
message = Domain::DomainEventMessage.build do |builder|
|
|
59
|
+
builder.metadata = { foo: 0 }
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
aware = SerializationAwareDomainEventMessage.new message
|
|
63
|
+
new_aware = aware.and_metadata Hash.new
|
|
64
|
+
|
|
65
|
+
assert_same new_aware, aware
|
|
66
|
+
|
|
67
|
+
new_aware = aware.and_metadata bar: 1
|
|
68
|
+
|
|
69
|
+
assert new_aware.is_a? SerializationAwareDomainEventMessage
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def test_with_metadata
|
|
73
|
+
message = Domain::DomainEventMessage.build do |builder|
|
|
74
|
+
builder.metadata = { foo: 0 }
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
aware = SerializationAwareDomainEventMessage.new message
|
|
78
|
+
new_aware = aware.with_metadata foo: 0
|
|
79
|
+
|
|
80
|
+
assert_same new_aware, aware
|
|
81
|
+
|
|
82
|
+
new_aware = aware.with_metadata bar: 1
|
|
83
|
+
|
|
84
|
+
assert new_aware.is_a? SerializationAwareDomainEventMessage
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
module Synapse
|
|
4
|
+
module Serialization
|
|
5
|
+
|
|
6
|
+
class SerializedDomainEventMessageBuilderTest < Test::Unit::TestCase
|
|
7
|
+
def test_from_data
|
|
8
|
+
builder = SerializedDomainEventMessageBuilder.new
|
|
9
|
+
|
|
10
|
+
serializer = MarshalSerializer.new
|
|
11
|
+
|
|
12
|
+
data = StubSerializedDomainEventData.new
|
|
13
|
+
data.id = 0
|
|
14
|
+
data.metadata = SerializedObject.new(nil, nil, SerializedType.new(Object.to_s, nil))
|
|
15
|
+
data.payload = SerializedObject.new(nil, nil, SerializedType.new(Object.to_s, nil))
|
|
16
|
+
data.aggregate_id = 1
|
|
17
|
+
data.sequence_number = 2
|
|
18
|
+
|
|
19
|
+
builder.from_data data, serializer
|
|
20
|
+
|
|
21
|
+
built = builder.build
|
|
22
|
+
|
|
23
|
+
assert_equal data.id, built.id
|
|
24
|
+
|
|
25
|
+
assert_equal data.metadata, built.serialized_metadata.serialized_object
|
|
26
|
+
assert_equal serializer, built.serialized_metadata.serializer
|
|
27
|
+
assert_equal data.payload, built.serialized_payload.serialized_object
|
|
28
|
+
assert_equal serializer, built.serialized_payload.serializer
|
|
29
|
+
|
|
30
|
+
assert_equal data.timestamp, built.timestamp
|
|
31
|
+
assert_equal data.aggregate_id, built.aggregate_id
|
|
32
|
+
assert_equal data.sequence_number, built.sequence_number
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
class StubSerializedDomainEventData < SerializedDomainEventData
|
|
37
|
+
attr_accessor :id, :metadata, :payload, :timestamp, :aggregate_id, :sequence_number
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
module Synapse
|
|
4
|
+
module Serialization
|
|
5
|
+
|
|
6
|
+
class SerializedMessageTest < Test::Unit::TestCase
|
|
7
|
+
def test_build
|
|
8
|
+
message = SerializedMessage.build do |builder|
|
|
9
|
+
assert builder.is_a? SerializedMessageBuilder
|
|
10
|
+
end
|
|
11
|
+
assert message.is_a? SerializedMessage
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class SerializedEventMessageTest < Test::Unit::TestCase
|
|
16
|
+
def test_build
|
|
17
|
+
message = SerializedEventMessage.build do |builder|
|
|
18
|
+
assert builder.is_a? SerializedEventMessageBuilder
|
|
19
|
+
end
|
|
20
|
+
assert message.is_a? SerializedEventMessage
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class SerializedDomainEventMessageTest < Test::Unit::TestCase
|
|
25
|
+
def setup
|
|
26
|
+
@serializer_a = MarshalSerializer.new
|
|
27
|
+
@serializer_b = MarshalSerializer.new
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_serialization
|
|
31
|
+
metadata = { foo: 0 }
|
|
32
|
+
payload = { bar: 1 }
|
|
33
|
+
|
|
34
|
+
metadata_serialized = @serializer_a.serialize metadata, String
|
|
35
|
+
payload_serialized = @serializer_a.serialize payload, String
|
|
36
|
+
|
|
37
|
+
metadata_lazy = LazyObject.new metadata_serialized, @serializer_a
|
|
38
|
+
payload_lazy = LazyObject.new payload_serialized, @serializer_a
|
|
39
|
+
|
|
40
|
+
message = SerializedDomainEventMessage.build do |builder|
|
|
41
|
+
builder.metadata = metadata_lazy
|
|
42
|
+
builder.payload = payload_lazy
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
refute message.serialized_metadata.deserialized?
|
|
46
|
+
assert_equal metadata, message.metadata
|
|
47
|
+
|
|
48
|
+
assert_equal Hash, message.payload_type
|
|
49
|
+
refute message.serialized_payload.deserialized?
|
|
50
|
+
|
|
51
|
+
assert_equal payload, message.payload
|
|
52
|
+
assert message.serialized_payload.deserialized?
|
|
53
|
+
|
|
54
|
+
metadata_serialized_a = message.serialize_metadata @serializer_a, String
|
|
55
|
+
assert_same metadata_serialized, metadata_serialized_a
|
|
56
|
+
payload_serialized_a = message.serialize_payload @serializer_a, String
|
|
57
|
+
assert_same payload_serialized, payload_serialized_a
|
|
58
|
+
|
|
59
|
+
metadata_serialized_b = message.serialize_metadata @serializer_b, String
|
|
60
|
+
assert_equal metadata_serialized, metadata_serialized_b
|
|
61
|
+
payload_serialized_b = message.serialize_payload @serializer_b, String
|
|
62
|
+
assert_equal payload_serialized, payload_serialized_b
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def test_and_metadata
|
|
66
|
+
metadata = { foo: 0 }
|
|
67
|
+
payload = { bar: 1 }
|
|
68
|
+
|
|
69
|
+
metadata_serialized = @serializer_a.serialize metadata, String
|
|
70
|
+
metadata_lazy = LazyObject.new metadata_serialized, @serializer_a
|
|
71
|
+
payload_serialized = @serializer_a.serialize metadata, String
|
|
72
|
+
payload_lazy = LazyObject.new payload_serialized, @serializer_a
|
|
73
|
+
|
|
74
|
+
message = SerializedDomainEventMessage.build do |builder|
|
|
75
|
+
builder.id = 1
|
|
76
|
+
builder.metadata = metadata_lazy
|
|
77
|
+
builder.payload = payload_lazy
|
|
78
|
+
builder.timestamp = Time.now
|
|
79
|
+
builder.aggregate_id = 2
|
|
80
|
+
builder.sequence_number = 3
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
new_message = message.and_metadata Hash.new
|
|
84
|
+
assert_same message, new_message
|
|
85
|
+
|
|
86
|
+
new_message = message.and_metadata baz: 3
|
|
87
|
+
|
|
88
|
+
merged = {
|
|
89
|
+
foo: 0,
|
|
90
|
+
baz: 3
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
assert_equal merged, new_message.metadata
|
|
94
|
+
assert_message_content_equal message, new_message
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def test_with_metadata
|
|
98
|
+
metadata = { foo: 0 }
|
|
99
|
+
payload = { bar: 1 }
|
|
100
|
+
|
|
101
|
+
metadata_serialized = @serializer_a.serialize metadata, String
|
|
102
|
+
metadata_lazy = LazyObject.new metadata_serialized, @serializer_a
|
|
103
|
+
payload_serialized = @serializer_a.serialize metadata, String
|
|
104
|
+
payload_lazy = LazyObject.new payload_serialized, @serializer_a
|
|
105
|
+
|
|
106
|
+
message = SerializedDomainEventMessage.build do |builder|
|
|
107
|
+
builder.id = 1
|
|
108
|
+
builder.metadata = metadata_lazy
|
|
109
|
+
builder.payload = payload_lazy
|
|
110
|
+
builder.timestamp = Time.now
|
|
111
|
+
builder.aggregate_id = 2
|
|
112
|
+
builder.sequence_number = 3
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
new_message = message.with_metadata foo: 0
|
|
116
|
+
assert_same message, new_message
|
|
117
|
+
|
|
118
|
+
new_message = message.with_metadata baz: 3
|
|
119
|
+
|
|
120
|
+
replaced = {
|
|
121
|
+
baz: 3
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
assert_equal replaced, new_message.metadata
|
|
125
|
+
assert_message_content_equal message, new_message
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
private
|
|
129
|
+
|
|
130
|
+
def assert_message_content_equal(expected, actual)
|
|
131
|
+
assert_equal expected.id, actual.id
|
|
132
|
+
assert_equal expected.serialized_payload, actual.serialized_payload
|
|
133
|
+
assert_equal expected.timestamp, actual.timestamp
|
|
134
|
+
assert_equal expected.aggregate_id, actual.aggregate_id
|
|
135
|
+
assert_equal expected.sequence_number, actual.sequence_number
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
end
|
|
140
|
+
end
|