spec/unit/modules/event_emitter_spec.rb in ably-0.6.2 vs spec/unit/modules/event_emitter_spec.rb in ably-0.7.0
- old
+ new
@@ -12,12 +12,12 @@
let(:obj) { double('example') }
let(:msg) { double('message') }
subject { klass.new }
- context 'event fan out' do
- specify do
+ context '#trigger event fan out' do
+ it 'should emit an event for any number of subscribers' do
2.times do
subject.on(:message) { |msg| obj.received_message msg }
end
expect(obj).to receive(:received_message).with(msg).twice
@@ -31,11 +31,11 @@
subject.trigger :valid, msg
subject.trigger :ignored, msg
subject.trigger 'valid', msg
end
- context 'with coercion' do
+ context 'with coercion', :api_private do
let(:options) do
{ coerce_into: Proc.new { |event| String(event) } }
end
it 'calls the provided proc to coerce the event name' do
@@ -44,26 +44,83 @@
expect(obj).to receive(:received_message).with(msg).once
subject.trigger :valid, msg
end
end
- context 'without coercion' do
+ context 'without coercion', :api_private do
it 'only matches event names on type matches' do
subject.on('valid') { |msg| obj.received_message msg }
expect(obj).to_not receive(:received_message).with(msg)
subject.trigger :valid, msg
end
end
- context 'subscribe to multiple events' do
+ context '#on subscribe to multiple events' do
it 'with the same block' do
subject.on(:click, :hover) { |msg| obj.received_message msg }
expect(obj).to receive(:received_message).with(msg).twice
subject.trigger :click, msg
subject.trigger :hover, msg
+ end
+ end
+
+ context 'event callback changes within the callback block' do
+ context 'when new event callbacks are added' do
+ before do
+ 2.times do
+ subject.on(:message) do |msg|
+ obj.received_message msg
+ subject.on(:message) do |msg|
+ obj.received_message_from_new_callbacks msg
+ end
+ end
+ end
+ allow(obj).to receive(:received_message)
+ end
+
+ it 'is unaffected and processes the prior event callbacks once' do
+ expect(obj).to receive(:received_message).with(msg).twice
+ expect(obj).to_not receive(:received_message_from_new_callbacks).with(msg)
+ subject.trigger :message, msg
+ end
+
+ it 'adds them for the next emitted event' do
+ expect(obj).to receive(:received_message_from_new_callbacks).with(msg).twice
+
+ # New callbacks are added in this trigger
+ subject.trigger :message, msg
+
+ # New callbacks are now called with second event emitted
+ subject.trigger :message, msg
+ end
+ end
+
+ context 'when callbacks are removed' do
+ before do
+ 2.times do
+ subject.once(:message) do |msg|
+ obj.received_message msg
+ subject.off
+ end
+ end
+ end
+
+ it 'is unaffected and processes the prior event callbacks once' do
+ expect(obj).to receive(:received_message).with(msg).twice
+ subject.trigger :message, msg
+ end
+
+ it 'removes them for the next emitted event' do
+ expect(obj).to receive(:received_message).with(msg).twice
+
+ # Callbacks are removed in this trigger
+ subject.trigger :message, msg
+ # No callbacks should exist now
+ subject.trigger :message, msg
+ end
end
end
end
context '#once' do