spec/unit/realtime/channel_spec.rb in ably-0.1.5 vs spec/unit/realtime/channel_spec.rb in ably-0.1.6
- old
+ new
@@ -1,10 +1,10 @@
require 'spec_helper'
require "support/protocol_msgbus_helper"
describe Ably::Realtime::Channel do
- let(:client) { double(:client) }
+ let(:client) { double('client').as_null_object }
let(:channel_name) { 'test' }
subject do
Ably::Realtime::Channel.new(client, channel_name)
end
@@ -21,7 +21,81 @@
expect { subject.trigger(:invalid) }.to raise_error KeyError
expect { subject.off(:invalid) }.to raise_error KeyError
end
end
- it_behaves_like 'an incoming protocol message bus'
+ context 'msgbus' do
+ let(:message) do
+ Ably::Models::Message.new({
+ 'name' => 'test',
+ 'data' => 'payload'
+ }, instance_double('Ably::Models::ProtocolMessage'))
+ end
+ let(:msgbus) { subject.__incoming_msgbus__ }
+
+ specify 'supports messages' do
+ received = 0
+ msgbus.subscribe(:message) { received += 1 }
+ expect { msgbus.publish(:message, message) }.to change { received }.to(1)
+ end
+
+ specify 'fail with unacceptable STATE event names' do
+ expect { msgbus.subscribe(:invalid) }.to raise_error KeyError
+ expect { msgbus.publish(:invalid) }.to raise_error KeyError
+ expect { msgbus.unsubscribe(:invalid) }.to raise_error KeyError
+ end
+ end
+
+ context 'subscriptions' do
+ let(:message_history) { Hash.new { |hash, key| hash[key] = 0 } }
+ let(:event_name) { 'click' }
+ let(:message) { instance_double('Ably::Models::Message', name: event_name) }
+
+ context '#subscribe' do
+ specify 'to all events' do
+ subject.subscribe { |message| message_history[:received] += 1}
+ subject.__incoming_msgbus__.publish(:message, message)
+ expect(message_history[:received]).to eql(1)
+ end
+
+ specify 'to specific events' do
+ subject.subscribe(event_name) { |message| message_history[:received] += 1 }
+ subject.subscribe('move') { |message| message_history[:received] += 1 }
+ subject.__incoming_msgbus__.publish(:message, message)
+ expect(message_history[:received]).to eql(1)
+ end
+ end
+
+ context '#unsubscribe' do
+ let(:callback) do
+ Proc.new { |message| message_history[:received] += 1 }
+ end
+ before do
+ subject.subscribe(event_name, &callback)
+ end
+
+ specify 'to all events' do
+ subject.unsubscribe &callback
+ subject.__incoming_msgbus__.publish(:message, message)
+ expect(message_history[:received]).to eql(0)
+ end
+
+ specify 'to specific events' do
+ subject.unsubscribe event_name, &callback
+ subject.__incoming_msgbus__.publish(:message, message)
+ expect(message_history[:received]).to eql(0)
+ end
+
+ specify 'to specific non-matching events' do
+ subject.unsubscribe 'move', &callback
+ subject.__incoming_msgbus__.publish(:message, message)
+ expect(message_history[:received]).to eql(1)
+ end
+
+ specify 'all callbacks by not providing a callback' do
+ subject.unsubscribe event_name
+ subject.__incoming_msgbus__.publish(:message, message)
+ expect(message_history[:received]).to eql(0)
+ end
+ end
+ end
end