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,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
|