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,102 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'domain/fixtures'
|
3
|
+
|
4
|
+
module Synapse
|
5
|
+
module EventSourcing
|
6
|
+
class EventSourcingRepositoryTest < Test::Unit::TestCase
|
7
|
+
def setup
|
8
|
+
@unit_provider = UnitOfWork::UnitOfWorkProvider.new
|
9
|
+
@unit = UnitOfWork::UnitOfWork.new @unit_provider
|
10
|
+
@unit.start
|
11
|
+
@factory = GenericAggregateFactory.new StubAggregate
|
12
|
+
@event_store = Object.new
|
13
|
+
@lock_manager = Repository::NullLockManager.new
|
14
|
+
|
15
|
+
@repository = EventSourcingRepository.new @factory, @event_store, @lock_manager
|
16
|
+
@repository.event_bus = EventBus::SimpleEventBus.new
|
17
|
+
@repository.unit_provider = @unit_provider
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_add_compatibility
|
21
|
+
aggregate = Domain::Person.new 123, 'Polandball'
|
22
|
+
|
23
|
+
assert_raise ArgumentError do
|
24
|
+
@repository.add aggregate # Polandball can't into repository :(
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_load
|
29
|
+
event = create_event(123, 0, StubCreatedEvent.new(123))
|
30
|
+
|
31
|
+
mock(@event_store).read_events(@factory.type_identifier, 123) do
|
32
|
+
Domain::SimpleDomainEventStream.new event
|
33
|
+
end
|
34
|
+
|
35
|
+
aggregate = @repository.load 123
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_load_incorrect_version
|
39
|
+
event = create_event(123, 1, StubCreatedEvent.new(123))
|
40
|
+
|
41
|
+
mock(@event_store).read_events(@factory.type_identifier, 123) do
|
42
|
+
Domain::SimpleDomainEventStream.new event
|
43
|
+
end
|
44
|
+
|
45
|
+
assert_raise Repository::ConflictingAggregateVersionError do
|
46
|
+
aggregate = @repository.load 123, 0
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_load_not_found
|
51
|
+
mock(@event_store).read_events(@factory.type_identifier, 123) do
|
52
|
+
raise EventStore::StreamNotFoundError.new @factory.type_identifier, 123
|
53
|
+
end
|
54
|
+
|
55
|
+
assert_raise Repository::AggregateNotFoundError do
|
56
|
+
@repository.load 123
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_load_deleted
|
61
|
+
event_a = create_event(123, 0, StubCreatedEvent.new(123))
|
62
|
+
event_b = create_event(123, 1, StubDeletedEvent.new)
|
63
|
+
|
64
|
+
mock(@event_store).read_events(@factory.type_identifier, 123) do
|
65
|
+
Domain::SimpleDomainEventStream.new event_a, event_b
|
66
|
+
end
|
67
|
+
|
68
|
+
assert_raise AggregateDeletedError do
|
69
|
+
aggregate = @repository.load 123
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_conflict_resolution
|
74
|
+
@repository.conflict_resolver = ConflictResolver.new
|
75
|
+
|
76
|
+
event_a = create_event(123, 0, StubCreatedEvent.new(123))
|
77
|
+
event_b = create_event(123, 1, StubChangedEvent.new)
|
78
|
+
|
79
|
+
mock(@event_store).read_events(@factory.type_identifier, 123) do
|
80
|
+
Domain::SimpleDomainEventStream.new event_a, event_b
|
81
|
+
end
|
82
|
+
|
83
|
+
mock(@event_store).append_events(@factory.type_identifier, anything)
|
84
|
+
|
85
|
+
aggregate = @repository.load 123, 0
|
86
|
+
aggregate.change_something
|
87
|
+
|
88
|
+
@unit.commit
|
89
|
+
end
|
90
|
+
|
91
|
+
private
|
92
|
+
|
93
|
+
def create_event(aggregate_id, seq, payload)
|
94
|
+
Domain::DomainEventMessage.build do |m|
|
95
|
+
m.aggregate_id = aggregate_id
|
96
|
+
m.sequence_number = seq
|
97
|
+
m.payload = payload
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'event_sourcing/fixtures'
|
3
|
+
|
4
|
+
module Synapse
|
5
|
+
module EventSourcing
|
6
|
+
|
7
|
+
class AggregateSnapshotTakerTest < Test::Unit::TestCase
|
8
|
+
def test_schedule_snapshot
|
9
|
+
event_store = Object.new
|
10
|
+
aggregate_factory = GenericAggregateFactory.new StubAggregate
|
11
|
+
|
12
|
+
type_identifier = aggregate_factory.type_identifier
|
13
|
+
id = 123
|
14
|
+
|
15
|
+
event = Domain::DomainEventMessage.build do |builder|
|
16
|
+
builder.payload = StubCreatedEvent.new id
|
17
|
+
builder.sequence_number = 0
|
18
|
+
builder.aggregate_id = id
|
19
|
+
end
|
20
|
+
stream = Domain::SimpleDomainEventStream.new event
|
21
|
+
|
22
|
+
mock(event_store).read_events(type_identifier, id) do
|
23
|
+
stream
|
24
|
+
end
|
25
|
+
|
26
|
+
mock(event_store).append_snapshot_event(type_identifier, anything) do |_, snapshot|
|
27
|
+
assert_equal StubAggregate, snapshot.payload_type
|
28
|
+
assert_equal 0, snapshot.sequence_number
|
29
|
+
assert_equal id, snapshot.aggregate_id
|
30
|
+
end
|
31
|
+
|
32
|
+
snapshot_taker = AggregateSnapshotTaker.new event_store
|
33
|
+
snapshot_taker.register_factory aggregate_factory
|
34
|
+
snapshot_taker.schedule_snapshot type_identifier, id
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Synapse
|
4
|
+
module EventSourcing
|
5
|
+
|
6
|
+
class DeferredSnapshotTakerTest < Test::Unit::TestCase
|
7
|
+
def test_schedule_snapshot
|
8
|
+
delegate = Object.new
|
9
|
+
|
10
|
+
mock(EventMachine).defer.yields
|
11
|
+
mock(delegate).schedule_snapshot 'test', 123
|
12
|
+
|
13
|
+
snapshot_taker = DeferredSnapshotTaker.new delegate
|
14
|
+
snapshot_taker.schedule_snapshot 'test', 123
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'event_sourcing/fixtures'
|
3
|
+
|
4
|
+
module Synapse
|
5
|
+
module EventSourcing
|
6
|
+
|
7
|
+
class SnapshotIntegrationTest < Test::Unit::TestCase
|
8
|
+
def test_integration
|
9
|
+
unit_provider = Object.new
|
10
|
+
unit = Object.new
|
11
|
+
|
12
|
+
mock(unit_provider).current do
|
13
|
+
unit
|
14
|
+
end
|
15
|
+
|
16
|
+
listener = nil
|
17
|
+
|
18
|
+
mock(unit).register_listener(is_a(SnapshotUnitOfWorkListener)) do |l|
|
19
|
+
listener = l
|
20
|
+
end
|
21
|
+
|
22
|
+
event_store = Object.new
|
23
|
+
|
24
|
+
aggregate_id = 123
|
25
|
+
type_identifier = Object.to_s
|
26
|
+
|
27
|
+
aggregate = Object.new
|
28
|
+
mock(aggregate).id.any_times do
|
29
|
+
aggregate_id
|
30
|
+
end
|
31
|
+
|
32
|
+
snapshot_taker = Object.new
|
33
|
+
snapshot_trigger = EventCountSnapshotTrigger.new snapshot_taker, unit_provider
|
34
|
+
snapshot_trigger.threshold = 5
|
35
|
+
|
36
|
+
read_stream = create_stream 3
|
37
|
+
append_stream = create_stream 3
|
38
|
+
|
39
|
+
decorated_read_stream = snapshot_trigger.decorate_for_read type_identifier, aggregate_id, read_stream
|
40
|
+
decorated_read_stream.to_a # Causes stream to iterate over all events
|
41
|
+
|
42
|
+
decorated_append_stream = snapshot_trigger.decorate_for_append type_identifier, aggregate, append_stream
|
43
|
+
decorated_append_stream.to_a # Ditto
|
44
|
+
|
45
|
+
# At this point, there is a snapshot unit of work listener added
|
46
|
+
# Let's "cleanup" the unit of work and check if the snapshot is triggered
|
47
|
+
|
48
|
+
mock(snapshot_taker).schedule_snapshot type_identifier, aggregate_id
|
49
|
+
|
50
|
+
listener.on_cleanup unit
|
51
|
+
end
|
52
|
+
|
53
|
+
def create_stream(size)
|
54
|
+
events = Array.new
|
55
|
+
|
56
|
+
size.times do
|
57
|
+
events.push Domain::DomainEventMessage.build
|
58
|
+
end
|
59
|
+
|
60
|
+
Domain::SimpleDomainEventStream.new events
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Synapse
|
4
|
+
module EventSourcing
|
5
|
+
|
6
|
+
class EventSourcedStorageListenerTest < Test::Unit::TestCase
|
7
|
+
def test_store
|
8
|
+
event_store = Object.new
|
9
|
+
lock_manager = Repository::NullLockManager.new
|
10
|
+
decorators = Array.new
|
11
|
+
type_identifier = StubAggregate.to_s.demodulize
|
12
|
+
aggregate = Object.new
|
13
|
+
|
14
|
+
decorator = Object.new
|
15
|
+
decorators.push decorator
|
16
|
+
|
17
|
+
original_stream = Domain::DomainEventStream.new
|
18
|
+
decorated_stream = Domain::DomainEventStream.new
|
19
|
+
|
20
|
+
mock(aggregate).version
|
21
|
+
mock(aggregate).uncommitted_events do
|
22
|
+
original_stream
|
23
|
+
end
|
24
|
+
mock(aggregate).mark_committed
|
25
|
+
|
26
|
+
mock(decorator).decorate_for_append(type_identifier, aggregate, original_stream) do
|
27
|
+
decorated_stream
|
28
|
+
end
|
29
|
+
|
30
|
+
mock(event_store).append_events(type_identifier, decorated_stream)
|
31
|
+
|
32
|
+
listener = EventSourcedStorageListener.new event_store, lock_manager, decorators, type_identifier
|
33
|
+
listener.store aggregate
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_store_locking
|
37
|
+
event_store = Object.new
|
38
|
+
lock_manager = Repository::NullLockManager.new
|
39
|
+
decorators = Array.new
|
40
|
+
type_identifier = StubAggregate.to_s.demodulize
|
41
|
+
aggregate = StubAggregate.new 123
|
42
|
+
|
43
|
+
mock(aggregate).version do
|
44
|
+
123
|
45
|
+
end
|
46
|
+
|
47
|
+
mock(event_store).append_events(type_identifier, anything)
|
48
|
+
|
49
|
+
listener = EventSourcedStorageListener.new event_store, lock_manager, decorators, type_identifier
|
50
|
+
listener.store aggregate
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_store_lock_failed
|
54
|
+
event_store = Object.new
|
55
|
+
lock_manager = Object.new
|
56
|
+
decorators = Array.new
|
57
|
+
type_identifier = StubAggregate.to_s.demodulize
|
58
|
+
aggregate = Object.new
|
59
|
+
|
60
|
+
mock(aggregate).version do
|
61
|
+
123
|
62
|
+
end
|
63
|
+
|
64
|
+
mock(lock_manager).validate_lock(aggregate) do
|
65
|
+
false
|
66
|
+
end
|
67
|
+
|
68
|
+
listener = EventSourcedStorageListener.new event_store, lock_manager, decorators, type_identifier
|
69
|
+
|
70
|
+
assert_raise Repository::ConflictingModificationError do
|
71
|
+
listener.store aggregate
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Synapse
|
4
|
+
module EventStore
|
5
|
+
class InMemoryEventStoreTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@event_store = InMemoryEventStore.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_empty_stream
|
12
|
+
assert_raise StreamNotFoundError do
|
13
|
+
@event_store.read_events 'Person', 123
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_append_and_read
|
18
|
+
event_a = Domain::DomainEventMessage.build { |e| e.aggregate_id = 123 }
|
19
|
+
event_b = Domain::DomainEventMessage.build { |e| e.aggregate_id = 123 }
|
20
|
+
event_c = Domain::DomainEventMessage.build { |e| e.aggregate_id = 123 }
|
21
|
+
|
22
|
+
stream_a = Domain::SimpleDomainEventStream.new event_a, event_b
|
23
|
+
stream_b = Domain::SimpleDomainEventStream.new event_c
|
24
|
+
|
25
|
+
@event_store.append_events 'Person', stream_a
|
26
|
+
@event_store.append_events 'Person', stream_b
|
27
|
+
|
28
|
+
stream = @event_store.read_events 'Person', 123
|
29
|
+
|
30
|
+
assert_equal [event_a, event_b, event_c], stream.to_a
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_clear
|
34
|
+
event = Domain::DomainEventMessage.build { |e| e.aggregate_id = 123 }
|
35
|
+
stream = Domain::SimpleDomainEventStream.new event
|
36
|
+
|
37
|
+
@event_store.append_events 'Person', stream
|
38
|
+
@event_store.clear
|
39
|
+
|
40
|
+
assert_raise StreamNotFoundError do
|
41
|
+
@event_store.read_events 'Person', 123
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Synapse
|
4
|
+
module ProcessManager
|
5
|
+
class CorrelationSetTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_add
|
8
|
+
correlation = Correlation.new :order_id, '512d5467-d319-481e-ab5e-4d6f7445bcff'
|
9
|
+
|
10
|
+
set = CorrelationSet.new
|
11
|
+
set.add correlation
|
12
|
+
set.add correlation
|
13
|
+
|
14
|
+
assert set.include? correlation
|
15
|
+
assert_equal 1, set.count
|
16
|
+
assert_equal 1, set.additions.count
|
17
|
+
|
18
|
+
set.commit
|
19
|
+
|
20
|
+
set.delete correlation
|
21
|
+
set.add correlation
|
22
|
+
|
23
|
+
assert_equal 1, set.count
|
24
|
+
assert_equal 0, set.additions.count
|
25
|
+
assert_equal 0, set.deletions.count
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_delete
|
29
|
+
correlation = Correlation.new :order_id, '512d5467-d319-481e-ab5e-4d6f7445bcff'
|
30
|
+
|
31
|
+
set = CorrelationSet.new
|
32
|
+
set.add correlation
|
33
|
+
set.delete correlation
|
34
|
+
|
35
|
+
assert_equal 0, set.count
|
36
|
+
assert_equal 0, set.additions.count
|
37
|
+
assert_equal 0, set.deletions.count
|
38
|
+
|
39
|
+
set.add correlation
|
40
|
+
set.commit
|
41
|
+
|
42
|
+
set.delete correlation
|
43
|
+
assert_equal 0, set.count
|
44
|
+
assert_equal 1, set.deletions.count
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Synapse
|
4
|
+
module ProcessManager
|
5
|
+
class CorrelationTest < Test::Unit::TestCase
|
6
|
+
def test_intiialize
|
7
|
+
correlation = Correlation.new :foo, 'bar'
|
8
|
+
|
9
|
+
assert_equal :foo, correlation.key
|
10
|
+
assert_equal 'bar', correlation.value
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_object_equality
|
14
|
+
correlation_a = Correlation.new :foo, 'bar'
|
15
|
+
correlation_b = Correlation.new :foo, 'bar'
|
16
|
+
correlation_c = Correlation.new :foo, 'baz'
|
17
|
+
|
18
|
+
assert_equal correlation_a, correlation_b
|
19
|
+
assert_equal correlation_b, correlation_b
|
20
|
+
refute_equal correlation_a, correlation_c
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Synapse
|
4
|
+
module ProcessManager
|
5
|
+
|
6
|
+
class ProcessTest < Test::Unit::TestCase
|
7
|
+
def test_initialize
|
8
|
+
process = StubProcess.new
|
9
|
+
correlation = Correlation.new :process_id, process.id
|
10
|
+
|
11
|
+
# If no identifier was given, one should be generated
|
12
|
+
refute process.id.nil?
|
13
|
+
assert process.correlations.include? correlation
|
14
|
+
assert process.active?
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_dissociate_from
|
18
|
+
process = StubProcess.new
|
19
|
+
|
20
|
+
key = :order_id
|
21
|
+
value = '512d5467'
|
22
|
+
|
23
|
+
process.cause_correlate key, value
|
24
|
+
assert process.correlations.include? Correlation.new(key, value)
|
25
|
+
|
26
|
+
process.cause_dissociate key, value
|
27
|
+
refute process.correlations.include? Correlation.new(key, value)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_finish
|
31
|
+
process = StubProcess.new
|
32
|
+
process.cause_finish
|
33
|
+
|
34
|
+
refute process.active?
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class StubProcess < Process
|
39
|
+
def cause_finish
|
40
|
+
finish
|
41
|
+
end
|
42
|
+
|
43
|
+
def cause_correlate(key, value)
|
44
|
+
correlate_with key, value
|
45
|
+
end
|
46
|
+
def cause_dissociate(key, value)
|
47
|
+
dissociate_from key, value
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|