ruby_event_store 0.30.0 → 0.31.0

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.
@@ -0,0 +1,76 @@
1
+ RSpec.shared_examples :broker do |broker_klass|
2
+ let(:event) { instance_double(::RubyEventStore::Event, type: 'EventType') }
3
+ let(:serialized_event) { instance_double(::RubyEventStore::SerializedRecord) }
4
+ let(:handler) { HandlerClass.new }
5
+ let(:subscriptions) { ::RubyEventStore::PubSub::Subscriptions.new }
6
+ let(:dispatcher) { ::RubyEventStore::PubSub::Dispatcher.new }
7
+ let(:broker) { broker_klass.new(subscriptions: subscriptions, dispatcher: dispatcher) }
8
+
9
+ specify "no dispatch when no subscriptions" do
10
+ expect(subscriptions).to receive(:all_for).with('EventType').and_return([])
11
+ expect(dispatcher).not_to receive(:call)
12
+ broker.call(event, serialized_event)
13
+ end
14
+
15
+ specify "calls subscription" do
16
+ expect(subscriptions).to receive(:all_for).with('EventType').and_return([handler])
17
+ expect(dispatcher).to receive(:call).with(handler, event, serialized_event)
18
+ broker.call(event, serialized_event)
19
+ end
20
+
21
+ specify "calls subscribed class" do
22
+ expect(subscriptions).to receive(:all_for).with('EventType').and_return([HandlerClass])
23
+ expect(dispatcher).to receive(:call).with(HandlerClass, event, serialized_event)
24
+ broker.call(event, serialized_event)
25
+ end
26
+
27
+ specify "calls all subscriptions" do
28
+ expect(subscriptions).to receive(:all_for).with('EventType').and_return([handler, HandlerClass])
29
+ expect(dispatcher).to receive(:call).with(handler, event, serialized_event)
30
+ expect(dispatcher).to receive(:call).with(HandlerClass, event, serialized_event)
31
+ broker.call(event, serialized_event)
32
+ end
33
+
34
+ specify 'raise error when no subscriber' do
35
+ expect { broker.add_subscription(nil, [])}.to raise_error(RubyEventStore::SubscriberNotExist, "subscriber must be first argument or block")
36
+ expect { broker.add_global_subscription(nil)}.to raise_error(RubyEventStore::SubscriberNotExist), "subscriber must be first argument or block"
37
+ expect { broker.add_thread_subscription(nil, []).call}.to raise_error(RubyEventStore::SubscriberNotExist), "subscriber must be first argument or block"
38
+ expect { broker.add_thread_global_subscription(nil).call}.to raise_error(RubyEventStore::SubscriberNotExist), "subscriber must be first argument or block"
39
+ end
40
+
41
+ specify "verify and add - local subscriptions" do
42
+ expect(dispatcher).to receive(:verify).with(handler)
43
+ expect(subscriptions).to receive(:add_subscription).with(handler, ['EventType'])
44
+ broker.add_subscription(handler, ['EventType'])
45
+ end
46
+
47
+ specify "verify and add - global subscriptions" do
48
+ expect(dispatcher).to receive(:verify).with(handler)
49
+ expect(subscriptions).to receive(:add_global_subscription).with(handler)
50
+ broker.add_global_subscription(handler)
51
+ end
52
+
53
+ specify "verify and add - thread local subscriptions" do
54
+ expect(dispatcher).to receive(:verify).with(handler)
55
+ expect(subscriptions).to receive(:add_thread_subscription).with(handler, ['EventType'])
56
+ broker.add_thread_subscription(handler, ['EventType'])
57
+ end
58
+
59
+ specify "verify and add - thread global subscriptions" do
60
+ expect(dispatcher).to receive(:verify).with(handler)
61
+ expect(subscriptions).to receive(:add_thread_global_subscription).with(handler)
62
+ broker.add_thread_global_subscription(handler)
63
+ end
64
+
65
+ private
66
+
67
+ class HandlerClass
68
+ @@received = nil
69
+ def self.received
70
+ @@received
71
+ end
72
+ def call(event)
73
+ @@received = event
74
+ end
75
+ end
76
+ end
@@ -1,18 +1,17 @@
1
1
  RSpec.shared_examples :dispatcher do |dispatcher|
2
- specify "calls subscribed instance" do
3
- handler = HandlerClass.new
4
- event = instance_double(::RubyEventStore::Event)
2
+ let(:event) { instance_double(::RubyEventStore::Event) }
3
+ let(:serialized_event) { instance_double(::RubyEventStore::SerializedRecord) }
4
+ let(:handler) { HandlerClass.new }
5
5
 
6
+ specify "calls subscribed instance" do
6
7
  expect(handler).to receive(:call).with(event)
7
- dispatcher.(handler, event)
8
+ dispatcher.call(handler, event, serialized_event)
8
9
  end
9
10
 
10
11
  specify "calls subscribed class" do
11
- event = instance_double(::RubyEventStore::Event)
12
-
13
- expect(HandlerClass).to receive(:new).and_return( h = HandlerClass.new )
14
- expect(h).to receive(:call).with(event)
15
- dispatcher.(HandlerClass, event)
12
+ expect(HandlerClass).to receive(:new).and_return(handler)
13
+ expect(handler).to receive(:call).with(event)
14
+ dispatcher.call(HandlerClass, event, serialized_event)
16
15
  end
17
16
 
18
17
  specify "allows callable classes and instances" do
@@ -1,3 +1,4 @@
1
+ # @private
1
2
  class SRecord
2
3
  def self.new(
3
4
  event_id: SecureRandom.uuid,
@@ -0,0 +1,111 @@
1
+ RSpec.shared_examples :subscriptions do |subscriptions_class|
2
+ Test1DomainEvent = Class.new(RubyEventStore::Event)
3
+ Test2DomainEvent = Class.new(RubyEventStore::Event)
4
+ Test3DomainEvent = Class.new(RubyEventStore::Event)
5
+
6
+ class TestHandler
7
+ def initialize
8
+ @events = []
9
+ end
10
+
11
+ def call(event)
12
+ @events << event
13
+ end
14
+
15
+ attr_reader :events
16
+ end
17
+
18
+ subject(:subscriptions) { subscriptions_class.new }
19
+
20
+ it 'returns all subscribed handlers' do
21
+ handler = TestHandler.new
22
+ another_handler = TestHandler.new
23
+ global_handler = TestHandler.new
24
+
25
+ subscriptions.add_subscription(handler, [Test1DomainEvent, Test3DomainEvent])
26
+ subscriptions.add_subscription(another_handler, [Test2DomainEvent])
27
+ subscriptions.add_global_subscription(global_handler)
28
+
29
+ expect(subscriptions.all_for('Test1DomainEvent')).to eq([handler, global_handler])
30
+ expect(subscriptions.all_for('Test2DomainEvent')).to eq([another_handler, global_handler])
31
+ expect(subscriptions.all_for('Test3DomainEvent')).to eq([handler, global_handler])
32
+ end
33
+
34
+ it 'returns subscribed thread handlers' do
35
+ handler = TestHandler.new
36
+ another_handler = TestHandler.new
37
+ global_handler = TestHandler.new
38
+
39
+ subscriptions.add_thread_subscription(handler, [Test1DomainEvent, Test3DomainEvent])
40
+ subscriptions.add_thread_subscription(another_handler, [Test2DomainEvent])
41
+ subscriptions.add_thread_global_subscription(global_handler)
42
+
43
+ expect(subscriptions.all_for('Test1DomainEvent')).to eq([global_handler, handler])
44
+ expect(subscriptions.all_for('Test2DomainEvent')).to eq([global_handler, another_handler])
45
+ expect(subscriptions.all_for('Test3DomainEvent')).to eq([global_handler, handler])
46
+ end
47
+
48
+ it 'returns lambda as an output of global subscribe methods' do
49
+ handler = TestHandler.new
50
+ result = subscriptions.add_global_subscription(handler)
51
+ expect(result).to respond_to(:call)
52
+ end
53
+
54
+ it 'returns lambda as an output of subscribe methods' do
55
+ handler = TestHandler.new
56
+ result = subscriptions.add_subscription(handler, [Test1DomainEvent, Test2DomainEvent])
57
+ expect(result).to respond_to(:call)
58
+ end
59
+
60
+ it 'revokes global subscription' do
61
+ handler = TestHandler.new
62
+
63
+ revoke = subscriptions.add_global_subscription(handler)
64
+ expect(subscriptions.all_for('Test1DomainEvent')).to eq([handler])
65
+ expect(subscriptions.all_for('Test2DomainEvent')).to eq([handler])
66
+ revoke.()
67
+ expect(subscriptions.all_for('Test1DomainEvent')).to eq([])
68
+ expect(subscriptions.all_for('Test2DomainEvent')).to eq([])
69
+ end
70
+
71
+ it 'revokes subscription' do
72
+ handler = TestHandler.new
73
+
74
+ revoke = subscriptions.add_subscription(handler, [Test1DomainEvent, Test2DomainEvent])
75
+ expect(subscriptions.all_for('Test1DomainEvent')).to eq([handler])
76
+ expect(subscriptions.all_for('Test2DomainEvent')).to eq([handler])
77
+ revoke.()
78
+ expect(subscriptions.all_for('Test1DomainEvent')).to eq([])
79
+ expect(subscriptions.all_for('Test2DomainEvent')).to eq([])
80
+ end
81
+
82
+ it 'revokes thread global subscription' do
83
+ handler = TestHandler.new
84
+
85
+ revoke = subscriptions.add_thread_global_subscription(handler)
86
+ expect(subscriptions.all_for('Test1DomainEvent')).to eq([handler])
87
+ expect(subscriptions.all_for('Test2DomainEvent')).to eq([handler])
88
+ revoke.()
89
+ expect(subscriptions.all_for('Test1DomainEvent')).to eq([])
90
+ expect(subscriptions.all_for('Test2DomainEvent')).to eq([])
91
+ end
92
+
93
+ it 'revokes thread subscription' do
94
+ handler = TestHandler.new
95
+
96
+ revoke = subscriptions.add_thread_subscription(handler, [Test1DomainEvent, Test2DomainEvent])
97
+ expect(subscriptions.all_for('Test1DomainEvent')).to eq([handler])
98
+ expect(subscriptions.all_for('Test2DomainEvent')).to eq([handler])
99
+ revoke.()
100
+ expect(subscriptions.all_for('Test1DomainEvent')).to eq([])
101
+ expect(subscriptions.all_for('Test2DomainEvent')).to eq([])
102
+ end
103
+
104
+ it 'subscribes by type of event which is a String' do
105
+ handler = TestHandler.new
106
+ subscriptions.add_subscription(handler, ["Test1DomainEvent"])
107
+ subscriptions.add_thread_subscription(handler, ["Test1DomainEvent"])
108
+
109
+ expect(subscriptions.all_for('Test1DomainEvent')).to eq([handler, handler])
110
+ end
111
+ end
@@ -1,6 +1,12 @@
1
1
  module RubyEventStore
2
+
3
+ # Used for building and executing the query specification.
2
4
  class Specification
5
+ # @private
6
+ # @api private
3
7
  NO_LIMIT = Object.new.freeze
8
+ # @private
9
+ # @api private
4
10
  NO_BATCH = Object.new.freeze
5
11
  DEFAULT_BATCH_SIZE = 100
6
12
 
@@ -35,18 +41,34 @@ module RubyEventStore
35
41
  end
36
42
  private_constant :Result
37
43
 
44
+ # @api private
45
+ # @private
38
46
  attr_reader :result
39
47
 
48
+ # @api private
49
+ # @private
40
50
  def initialize(repository, mapper, result = Result.new(:forward, :head, NO_LIMIT, Stream.new(GLOBAL_STREAM), NO_BATCH))
41
51
  @mapper = mapper
42
52
  @repository = repository
43
53
  @result = result
44
54
  end
45
55
 
56
+ # Limits the query to certain stream.
57
+ # {http://railseventstore.org/docs/read/ Find out more}.
58
+ #
59
+ # @param stream_name [String] name of the stream to get events from
60
+ # @return [Specification]
46
61
  def stream(stream_name)
47
62
  Specification.new(repository, mapper, result.dup.tap { |r| r.stream = Stream.new(stream_name) })
48
63
  end
49
64
 
65
+ # Limits the query to events before or after another event.
66
+ # {http://railseventstore.org/docs/read/ Find out more}.
67
+ #
68
+ # @param start [:head, String] id of event to start reading from.
69
+ # :head can mean the beginning or end of the stream, depending on the
70
+ # #direction
71
+ # @return [Specification]
50
72
  def from(start)
51
73
  case start
52
74
  when Symbol
@@ -58,19 +80,38 @@ module RubyEventStore
58
80
  Specification.new(repository, mapper, result.dup.tap { |r| r.start = start })
59
81
  end
60
82
 
83
+ # Sets the order of reading events to ascending (forward from the start).
84
+ # {http://railseventstore.org/docs/read/ Find out more}.
85
+ #
86
+ # @return [Specification]
61
87
  def forward
62
88
  Specification.new(repository, mapper, result.dup.tap { |r| r.direction = :forward })
63
89
  end
64
90
 
91
+ # Sets the order of reading events to descending (backward from the start).
92
+ # {http://railseventstore.org/docs/read/ Find out more}.
93
+ #
94
+ # @return [Specification]
65
95
  def backward
66
96
  Specification.new(repository, mapper, result.dup.tap { |r| r.direction = :backward })
67
97
  end
68
98
 
99
+ # Limits the query to specified number of events.
100
+ # {http://railseventstore.org/docs/read/ Find out more}.
101
+ #
102
+ # @param count [Integer] maximal number of events to retrieve
103
+ # @return [Specification]
69
104
  def limit(count)
70
105
  raise InvalidPageSize unless count && count > 0
71
106
  Specification.new(repository, mapper, result.dup.tap { |r| r.count = count })
72
107
  end
73
108
 
109
+ # Executes the query based on the specification built up to this point.
110
+ # Yields each batch of records that was retrieved from the store.
111
+ # {http://railseventstore.org/docs/read/ Find out more}.
112
+ #
113
+ # @yield [Array<Event, Proto>] batch of events
114
+ # @return [Enumerator, nil] Enumerator is returned when block not given
74
115
  def each_batch
75
116
  return to_enum(:each_batch) unless block_given?
76
117
 
@@ -80,6 +121,12 @@ module RubyEventStore
80
121
  end
81
122
  end
82
123
 
124
+ # Executes the query based on the specification built up to this point.
125
+ # Yields events read from the store if block given. Otherwise, returns enumerable collection.
126
+ # {http://railseventstore.org/docs/read/ Find out more}.
127
+ #
128
+ # @yield [Event, Proto] event
129
+ # @return [Enumerator, nil] Enumerator is returned when block not given
83
130
  def each
84
131
  return to_enum unless block_given?
85
132
 
@@ -88,6 +135,19 @@ module RubyEventStore
88
135
  end
89
136
  end
90
137
 
138
+ # Specifies that events should be obtained in batches.
139
+ # {http://railseventstore.org/docs/read/ Find out more}.
140
+ #
141
+ # Looping through a collection of events from the store
142
+ # can be inefficient since it will try to instantiate all
143
+ # the events at once.
144
+ #
145
+ # In that case, batch processing methods allow you to work
146
+ # with the records in batches, thereby greatly reducing
147
+ # memory consumption.
148
+ #
149
+ # @param batch_size [Integer] number of events to read in a single batch
150
+ # @return [Specification]
91
151
  def in_batches(batch_size = DEFAULT_BATCH_SIZE)
92
152
  Specification.new(repository, mapper, result.dup.tap { |r| r.batch_size = batch_size })
93
153
  end
@@ -1,3 +1,3 @@
1
1
  module RubyEventStore
2
- VERSION = "0.30.0"
2
+ VERSION = "0.31.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_event_store
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.30.0
4
+ version: 0.31.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arkency
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-05-31 00:00:00.000000000 Z
11
+ date: 2018-07-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -150,9 +150,12 @@ files:
150
150
  - README.md
151
151
  - exe/res-deprecated-read-api-migrator
152
152
  - lib/ruby_event_store.rb
153
+ - lib/ruby_event_store/async_dispatcher.rb
154
+ - lib/ruby_event_store/async_proxy_strategy.rb
153
155
  - lib/ruby_event_store/batch_enumerator.rb
154
156
  - lib/ruby_event_store/client.rb
155
157
  - lib/ruby_event_store/constants.rb
158
+ - lib/ruby_event_store/correlated_commands.rb
156
159
  - lib/ruby_event_store/deprecated_read_api_rewriter.rb
157
160
  - lib/ruby_event_store/deprecated_read_api_runner.rb
158
161
  - lib/ruby_event_store/deprecations.rb
@@ -160,6 +163,7 @@ files:
160
163
  - lib/ruby_event_store/event.rb
161
164
  - lib/ruby_event_store/expected_version.rb
162
165
  - lib/ruby_event_store/in_memory_repository.rb
166
+ - lib/ruby_event_store/link_by_metadata.rb
163
167
  - lib/ruby_event_store/mappers/default.rb
164
168
  - lib/ruby_event_store/mappers/null_mapper.rb
165
169
  - lib/ruby_event_store/mappers/protobuf.rb
@@ -167,10 +171,12 @@ files:
167
171
  - lib/ruby_event_store/projection.rb
168
172
  - lib/ruby_event_store/pub_sub/broker.rb
169
173
  - lib/ruby_event_store/pub_sub/dispatcher.rb
174
+ - lib/ruby_event_store/pub_sub/subscriptions.rb
170
175
  - lib/ruby_event_store/serialized_record.rb
176
+ - lib/ruby_event_store/spec/broker_lint.rb
171
177
  - lib/ruby_event_store/spec/dispatcher_lint.rb
172
- - lib/ruby_event_store/spec/event_broker_lint.rb
173
178
  - lib/ruby_event_store/spec/event_repository_lint.rb
179
+ - lib/ruby_event_store/spec/subscriptions_lint.rb
174
180
  - lib/ruby_event_store/specification.rb
175
181
  - lib/ruby_event_store/stream.rb
176
182
  - lib/ruby_event_store/version.rb
@@ -1,211 +0,0 @@
1
- RSpec.shared_examples :event_broker do |broker_class|
2
- Test1DomainEvent = Class.new(RubyEventStore::Event)
3
- Test2DomainEvent = Class.new(RubyEventStore::Event)
4
- Test3DomainEvent = Class.new(RubyEventStore::Event)
5
-
6
- class InvalidTestHandler
7
- end
8
- class TestHandler
9
- def initialize
10
- @events = []
11
- end
12
-
13
- def call(event)
14
- @events << event
15
- end
16
-
17
- attr_reader :events
18
- end
19
- class TestDispatcher
20
- attr_reader :dispatched
21
-
22
- def initialize
23
- @dispatched = []
24
- end
25
-
26
- def verify(_subscriber)
27
- end
28
-
29
- def call(subscriber, event)
30
- @dispatched << {subscriber: subscriber, event: event}
31
- end
32
- end
33
-
34
- subject(:broker) { broker_class.new }
35
-
36
- it 'raise error when no subscriber' do
37
- expect { broker.add_subscriber(nil, [])}.to raise_error(RubyEventStore::SubscriberNotExist)
38
- expect { broker.add_thread_subscriber(nil, [])}.to raise_error(RubyEventStore::SubscriberNotExist)
39
- expect { broker.add_global_subscriber(nil)}.to raise_error(RubyEventStore::SubscriberNotExist)
40
- expect { broker.add_thread_global_subscriber(nil)}.to raise_error(RubyEventStore::SubscriberNotExist)
41
- end
42
-
43
- it 'notifies subscribed handlers' do
44
- handler = TestHandler.new
45
- another_handler = TestHandler.new
46
- global_handler = TestHandler.new
47
-
48
- broker.add_subscriber(handler, [Test1DomainEvent, Test3DomainEvent])
49
- broker.add_subscriber(another_handler, [Test2DomainEvent])
50
- broker.add_global_subscriber(global_handler)
51
-
52
- event1 = Test1DomainEvent.new
53
- event2 = Test2DomainEvent.new
54
- event3 = Test3DomainEvent.new
55
-
56
- [event1, event2, event3].each do |ev|
57
- broker.notify_subscribers(ev)
58
- end
59
-
60
- expect(handler.events).to eq([event1,event3])
61
- expect(another_handler.events).to eq([event2])
62
- expect(global_handler.events).to eq([event1,event2,event3])
63
- end
64
-
65
- it 'notifies subscribed thread handlers' do
66
- handler = TestHandler.new
67
- another_handler = TestHandler.new
68
- global_handler = TestHandler.new
69
-
70
- broker.add_thread_subscriber(handler, [Test1DomainEvent, Test3DomainEvent])
71
- broker.add_thread_subscriber(another_handler, [Test2DomainEvent])
72
- broker.add_thread_global_subscriber(global_handler)
73
-
74
- event1 = Test1DomainEvent.new
75
- event2 = Test2DomainEvent.new
76
- event3 = Test3DomainEvent.new
77
-
78
- [event1, event2, event3].each do |ev|
79
- broker.notify_subscribers(ev)
80
- end
81
-
82
- expect(handler.events).to eq([event1,event3])
83
- expect(another_handler.events).to eq([event2])
84
- expect(global_handler.events).to eq([event1,event2,event3])
85
- end
86
-
87
- it 'raises error when no valid method on handler' do
88
- subscriber = InvalidTestHandler.new
89
- expect do
90
- broker.add_subscriber(subscriber, [Test1DomainEvent])
91
- end.to raise_error(RubyEventStore::InvalidHandler)
92
- end
93
-
94
- it 'raises error when no valid method on global handler' do
95
- subscriber = InvalidTestHandler.new
96
- expect do
97
- broker.add_global_subscriber(subscriber)
98
- end.to raise_error(RubyEventStore::InvalidHandler)
99
- end
100
-
101
- it 'raises error when no valid method on thread handler' do
102
- subscriber = InvalidTestHandler.new
103
- expect do
104
- broker.add_thread_subscriber(subscriber, [Test1DomainEvent])
105
- end.to raise_error(RubyEventStore::InvalidHandler)
106
- end
107
-
108
- it 'raises error when no valid method on global thread handler' do
109
- subscriber = InvalidTestHandler.new
110
- expect do
111
- broker.add_thread_global_subscriber(subscriber)
112
- end.to raise_error(RubyEventStore::InvalidHandler)
113
- end
114
-
115
- it 'returns lambda as an output of global subscribe methods' do
116
- handler = TestHandler.new
117
- result = broker.add_global_subscriber(handler)
118
- expect(result).to respond_to(:call)
119
- end
120
-
121
- it 'returns lambda as an output of subscribe methods' do
122
- handler = TestHandler.new
123
- result = broker.add_subscriber(handler, [Test1DomainEvent, Test2DomainEvent])
124
- expect(result).to respond_to(:call)
125
- end
126
-
127
- it 'revokes global subscription' do
128
- handler = TestHandler.new
129
- event1 = Test1DomainEvent.new
130
- event2 = Test2DomainEvent.new
131
-
132
- revoke = broker.add_global_subscriber(handler)
133
- broker.notify_subscribers(event1)
134
- expect(handler.events).to eq([event1])
135
- revoke.()
136
- broker.notify_subscribers(event2)
137
- expect(handler.events).to eq([event1])
138
- end
139
-
140
- it 'revokes subscription' do
141
- handler = TestHandler.new
142
- event1 = Test1DomainEvent.new
143
- event2 = Test2DomainEvent.new
144
-
145
- revoke = broker.add_subscriber(handler, [Test1DomainEvent, Test2DomainEvent])
146
- broker.notify_subscribers(event1)
147
- expect(handler.events).to eq([event1])
148
- revoke.()
149
- broker.notify_subscribers(event2)
150
- expect(handler.events).to eq([event1])
151
- end
152
-
153
- it 'revokes thread global subscription' do
154
- handler = TestHandler.new
155
- event1 = Test1DomainEvent.new
156
- event2 = Test2DomainEvent.new
157
-
158
- revoke = broker.add_thread_global_subscriber(handler)
159
- broker.notify_subscribers(event1)
160
- expect(handler.events).to eq([event1])
161
- revoke.()
162
- broker.notify_subscribers(event2)
163
- expect(handler.events).to eq([event1])
164
- end
165
-
166
- it 'revokes thread subscription' do
167
- handler = TestHandler.new
168
- event1 = Test1DomainEvent.new
169
- event2 = Test2DomainEvent.new
170
-
171
- revoke = broker.add_thread_subscriber(handler, [Test1DomainEvent, Test2DomainEvent])
172
- broker.notify_subscribers(event1)
173
- expect(handler.events).to eq([event1])
174
- revoke.()
175
- broker.notify_subscribers(event2)
176
- expect(handler.events).to eq([event1])
177
- end
178
-
179
- it 'allows to provide a custom dispatcher' do
180
- dispatcher = TestDispatcher.new
181
- handler = TestHandler.new
182
- event1 = Test1DomainEvent.new
183
- broker_with_custom_dispatcher = broker_class.new(dispatcher: dispatcher)
184
- broker_with_custom_dispatcher.add_subscriber(handler, [Test1DomainEvent])
185
- broker_with_custom_dispatcher.notify_subscribers(event1)
186
- expect(dispatcher.dispatched).to eq([{subscriber: handler, event: event1}])
187
- end
188
-
189
- it 'subscribes by type of event which is a String' do
190
- handler = TestHandler.new
191
- broker.add_subscriber(handler, ["Test1DomainEvent"])
192
- broker.add_thread_subscriber(handler, ["Test1DomainEvent"])
193
-
194
- event1 = Test1DomainEvent.new
195
- broker.notify_subscribers(event1)
196
-
197
- expect(handler.events).to eq([event1,event1])
198
- end
199
-
200
- private
201
-
202
- class HandlerClass
203
- @@received = nil
204
- def self.received
205
- @@received
206
- end
207
- def call(event)
208
- @@received = event
209
- end
210
- end
211
- end