spec/slack/real_time/client_spec.rb in slack-ruby-client-0.8.1 vs spec/slack/real_time/client_spec.rb in slack-ruby-client-0.9.0

- old
+ new

@@ -1,10 +1,9 @@ require 'spec_helper' -RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' } do +RSpec.describe Slack::RealTime::Client do let(:ws) { double(Slack::RealTime::Concurrency::Mock::WebSocket, on: true) } - let(:url) { 'wss://ms173.slack-msgs.com/websocket/lqcUiAvrKTP-uuid=' } before do @token = ENV.delete('SLACK_API_TOKEN') Slack::Config.reset Slack::RealTime::Config.reset Slack::RealTime.configure do |config| @@ -41,115 +40,187 @@ expect(client.token).to eq 'local token' expect(client.web_client.token).to eq 'local token' end end end - context 'client' do - context 'started' do - let(:client) { Slack::RealTime::Client.new(store_class: Slack::RealTime::Stores::Store) } - describe '#start!' do - let(:socket) { double(Slack::RealTime::Socket, connected?: true) } - before do - allow(Slack::RealTime::Socket).to receive(:new).with(url, ping: 30, logger: Slack::Logger.default).and_return(socket) - allow(socket).to receive(:connect!) - allow(socket).to receive(:start_sync) - client.start! + context 'client with a full store', vcr: { cassette_name: 'web/rtm_start' } do + let(:client) { Slack::RealTime::Client.new(store_class: Slack::RealTime::Stores::Store) } + let(:url) { 'wss://ms173.slack-msgs.com/websocket/lqcUiAvrKTP-uuid=' } + describe '#start!' do + let(:socket) { double(Slack::RealTime::Socket, connected?: true) } + before do + allow(Slack::RealTime::Socket).to receive(:new).with(url, ping: 30, logger: Slack::Logger.default).and_return(socket) + allow(socket).to receive(:connect!) + allow(socket).to receive(:start_sync) + client.start! + end + context 'properties provided upon connection' do + it 'sets url' do + expect(client.url).to eq url end - context 'properties provided upon connection' do - it 'sets url' do - expect(client.url).to eq url - end - it 'sets team' do - expect(client.team.domain).to eq 'dblockdotorg' - end - it 'sets teams' do - expect(client.teams.count).to eq 1 - expect(client.teams.values.first).to eq client.team - end - it 'sets self' do - expect(client.self.id).to eq 'U07518DTL' - end - it 'sets users' do - expect(client.users.count).to eq 18 - expect(client.users.values.first['id']).to eq 'U07518DTL' - end - it 'sets channels' do - expect(client.channels.count).to eq 37 - expect(client.channels.values.first['name']).to eq 'a1' - end - it 'sets ims' do - expect(client.ims.count).to eq 2 - expect(client.ims.values.first['user']).to eq 'USLACKBOT' - end - it 'sets bots' do - expect(client.bots.count).to eq 16 - expect(client.bots.values.first['name']).to eq 'bot' - end - it 'sets groups' do - expect(client.groups.count).to eq 1 - end + it 'sets team' do + expect(client.team.domain).to eq 'dblockdotorg' end - it 'uses web client to fetch url' do - expect(client.web_client).to be_a Slack::Web::Client + it 'sets teams' do + expect(client.teams.count).to eq 1 + expect(client.teams.values.first).to eq client.team end - it 'remembers socket' do - expect(client.instance_variable_get('@socket')).to eq socket + it 'sets self' do + expect(client.self.id).to eq 'U07518DTL' end + it 'sets users' do + expect(client.users.count).to eq 18 + expect(client.users.values.first['id']).to eq 'U07518DTL' + end + it 'sets channels' do + expect(client.channels.count).to eq 37 + expect(client.channels.values.first['name']).to eq 'a1' + end + it 'sets ims' do + expect(client.ims.count).to eq 2 + expect(client.ims.values.first['user']).to eq 'USLACKBOT' + end + it 'sets bots' do + expect(client.bots.count).to eq 16 + expect(client.bots.values.first['name']).to eq 'bot' + end + it 'sets groups' do + expect(client.groups.count).to eq 1 + end + end + it 'uses web client to fetch url' do + expect(client.web_client).to be_a Slack::Web::Client + end + it 'remembers socket' do + expect(client.instance_variable_get('@socket')).to eq socket + end + it 'cannot be invoked twice' do + expect do + client.start! + end.to raise_error Slack::RealTime::Client::ClientAlreadyStartedError + end + describe '#stop!' do + before do + expect(socket).to receive(:disconnect!) + client.stop! + end it 'cannot be invoked twice' do + client.instance_variable_set('@socket', nil) # caused by a :close callback expect do - client.start! - end.to raise_error Slack::RealTime::Client::ClientAlreadyStartedError + client.stop! + end.to raise_error Slack::RealTime::Client::ClientNotStartedError end - describe '#stop!' do - before do - expect(socket).to receive(:disconnect!) + end + describe '#next_id' do + it 'increments' do + previous_id = client.send(:next_id) + expect(client.send(:next_id)).to eq previous_id + 1 + end + end + context 'subclassed' do + let(:client) { Class.new(Slack::RealTime::Client).new(store_class: Slack::RealTime::Stores::Store) } + it 'runs event handlers' do + event = Slack::RealTime::Event.new( + 'type' => 'team_rename', + 'name' => 'New Team Name Inc.' + ) + client.send(:dispatch, event) + expect(client.store.team.name).to eq 'New Team Name Inc.' + end + end + end + end + context 'client with a default store', vcr: { cassette_name: 'web/rtm_connect' } do + let(:client) { Slack::RealTime::Client.new } + let(:url) { 'wss://mpmulti-w5tz.slack-msgs.com/websocket/uid' } + describe '#start!' do + let(:socket) { double(Slack::RealTime::Socket, connected?: true) } + before do + allow(Slack::RealTime::Socket).to receive(:new).with(url, ping: 30, logger: Slack::Logger.default).and_return(socket) + allow(socket).to receive(:connect!) + allow(socket).to receive(:start_sync) + client.start! + end + context 'properties provided upon connection' do + it 'sets url' do + expect(client.url).to eq url + end + it 'sets team' do + expect(client.team.domain).to eq 'dblockdotorg' + end + it 'sets teams' do + expect(client.teams.count).to eq 1 + expect(client.teams.values.first).to eq client.team + end + it 'sets self' do + expect(client.self.id).to eq 'U07518DTL' + end + it 'sets user' do + expect(client.users.count).to eq 1 + expect(client.users.values.first['id']).to eq 'U07518DTL' + end + it 'no channels' do + expect(client.channels.count).to eq 0 + end + it 'no ims' do + expect(client.ims.count).to eq 0 + end + it 'no bots' do + expect(client.bots.count).to eq 0 + end + it 'no groups' do + expect(client.groups.count).to eq 0 + end + end + it 'uses web client to fetch url' do + expect(client.web_client).to be_a Slack::Web::Client + end + it 'remembers socket' do + expect(client.instance_variable_get('@socket')).to eq socket + end + it 'cannot be invoked twice' do + expect do + client.start! + end.to raise_error Slack::RealTime::Client::ClientAlreadyStartedError + end + describe '#stop!' do + before do + expect(socket).to receive(:disconnect!) + client.stop! + end + it 'cannot be invoked twice' do + client.instance_variable_set('@socket', nil) # caused by a :close callback + expect do client.stop! - end - it 'cannot be invoked twice' do - client.instance_variable_set('@socket', nil) # caused by a :close callback - expect do - client.stop! - end.to raise_error Slack::RealTime::Client::ClientNotStartedError - end + end.to raise_error Slack::RealTime::Client::ClientNotStartedError end - describe '#next_id' do - it 'increments' do - previous_id = client.send(:next_id) - expect(client.send(:next_id)).to eq previous_id + 1 - end + end + describe '#next_id' do + it 'increments' do + previous_id = client.send(:next_id) + expect(client.send(:next_id)).to eq previous_id + 1 end - context 'store_class: nil' do - let(:client) { Slack::RealTime::Client.new(store_class: nil) } - it 'sets store to nil' do - expect(client.store).to be nil - end - it "doesn't handle events" do - event = Slack::RealTime::Event.new( - 'type' => 'team_rename', - 'name' => 'New Team Name Inc.' - ) - expect(client).to_not receive(:run_handlers) - client.send(:dispatch, event) - end - it 'self' do - expect(client.self).to be nil - end - it 'team' do - expect(client.team).to be nil - end + end + context 'store_class: nil' do + let(:client) { Slack::RealTime::Client.new(store_class: nil) } + it 'sets store to nil' do + expect(client.store).to be nil end - context 'subclassed' do - let(:client) { Class.new(Slack::RealTime::Client).new(store_class: Slack::RealTime::Stores::Store) } - it 'runs event handlers' do - event = Slack::RealTime::Event.new( - 'type' => 'team_rename', - 'name' => 'New Team Name Inc.' - ) - client.send(:dispatch, event) - expect(client.store.team.name).to eq 'New Team Name Inc.' - end + it "doesn't handle events" do + event = Slack::RealTime::Event.new( + 'type' => 'team_rename', + 'name' => 'New Team Name Inc.' + ) + expect(client).to_not receive(:run_handlers) + client.send(:dispatch, event) end + it 'self' do + expect(client.self).to be nil + end + it 'team' do + expect(client.team).to be nil + end end end context 'with defaults' do let(:client) { Slack::RealTime::Client.new } describe '#initialize' do @@ -188,10 +259,11 @@ end context 'global config' do after do Slack::RealTime::Client.config.reset end + let(:url) { 'wss://mpmulti-w5tz.slack-msgs.com/websocket/uid' } let(:client) { Slack::RealTime::Client.new } context 'ping' do before do Slack::RealTime::Client.configure do |config| config.websocket_ping = 15 @@ -199,11 +271,11 @@ end describe '#initialize' do it 'sets ping' do expect(client.websocket_ping).to eq 15 end - it 'creates a connection with custom ping' do + it 'creates a connection with custom ping', vcr: { cassette_name: 'web/rtm_connect' } do expect(Slack::RealTime::Concurrency::Mock::WebSocket).to receive(:new).with(url, nil, ping: 15).and_return(ws) client.start! end it 'sets start_options' do expect(client.start_options).to eq(request: { timeout: 180 }) @@ -224,11 +296,11 @@ expect(client.websocket_proxy).to eq( origin: 'http://username:password@proxy.example.com', headers: { 'User-Agent' => 'ruby' } ) end - it 'creates a connection with custom proxy' do + it 'creates a connection with custom proxy', vcr: { cassette_name: 'web/rtm_connect' } do expect(Slack::RealTime::Concurrency::Mock::WebSocket).to receive(:new).with( url, nil, ping: 30, proxy: { @@ -254,40 +326,99 @@ before do allow(Slack::RealTime::Socket).to receive(:new).and_return(socket) allow(socket).to receive(:connect!) allow(socket).to receive(:start_sync) end - it 'calls rtm_start with start options' do - expect(client.web_client).to receive(:rtm_start).with(simple_latest: true).and_call_original + it 'calls rtm_start with start options', vcr: { cassette_name: 'web/rtm_connect' } do + expect(client.web_client).to receive(:rtm_connect).with(simple_latest: true).and_call_original client.start! end end end end context 'store_class' do - before do - Slack::RealTime::Client.configure do |config| - config.store_class = Slack::RealTime::Stores::Starter + context 'starter' do + before do + Slack::RealTime::Client.configure do |config| + config.store_class = Slack::RealTime::Stores::Starter + end end + describe '#initialize' do + it 'can be overriden explicitly' do + client = Slack::RealTime::Client.new(store_class: Slack::RealTime::Store) + expect(client.send(:store_class)).to eq Slack::RealTime::Store + end + it 'sets store_class' do + expect(client.send(:store_class)).to eq(Slack::RealTime::Stores::Starter) + end + context 'start!' do + let(:socket) { double(Slack::RealTime::Socket, connected?: true) } + before do + allow(Slack::RealTime::Socket).to receive(:new).and_return(socket) + allow(socket).to receive(:connect!) + allow(socket).to receive(:start_sync) + end + it 'instantiates the correct store class', vcr: { cassette_name: 'web/rtm_connect' } do + client.start! + expect(client.store).to be_a Slack::RealTime::Stores::Starter + end + end + end end + context 'store' do + before do + Slack::RealTime::Client.configure do |config| + config.store_class = Slack::RealTime::Stores::Store + end + end + describe '#initialize' do + context 'start!' do + let(:socket) { double(Slack::RealTime::Socket, connected?: true) } + before do + allow(Slack::RealTime::Socket).to receive(:new).and_return(socket) + allow(socket).to receive(:connect!) + allow(socket).to receive(:start_sync) + end + it 'calls rtm_start and not rtm_connect', vcr: { cassette_name: 'web/rtm_start' } do + expect(client.web_client).to receive(:rtm_start).and_call_original + client.start! + end + end + end + end + end + context 'start_method' do describe '#initialize' do it 'can be overriden explicitly' do - client = Slack::RealTime::Client.new(store_class: Slack::RealTime::Store) - expect(client.send(:store_class)).to eq Slack::RealTime::Store + client = Slack::RealTime::Client.new(start_method: :overriden) + expect(client.send(:start_method)).to eq :overriden end - it 'sets store_class' do - expect(client.send(:store_class)).to eq(Slack::RealTime::Stores::Starter) + context 'with start_method' do + before do + Slack::RealTime::Client.configure do |config| + config.start_method = :overriden + end + end + it 'sets start_method' do + expect(client.send(:start_method)).to eq :overriden + end + it 'calls the overriden method' do + expect(client.web_client).to receive(:overriden).and_raise('overriden') + expect do + client.start! + end.to raise_error RuntimeError, 'overriden' + end end context 'start!' do let(:socket) { double(Slack::RealTime::Socket, connected?: true) } before do allow(Slack::RealTime::Socket).to receive(:new).and_return(socket) allow(socket).to receive(:connect!) allow(socket).to receive(:start_sync) end - it 'instantiates the correct store class' do + it 'defaults to :rtm_connect', vcr: { cassette_name: 'web/rtm_connect' } do + expect(client.web_client).to receive(:rtm_connect).and_call_original client.start! - expect(client.store).to be_a Slack::RealTime::Stores::Starter end end end end end