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