spec/acceptance/rest/channel_spec.rb in ably-0.8.5 vs spec/acceptance/rest/channel_spec.rb in ably-0.8.6

- old
+ new

@@ -123,10 +123,141 @@ expect(channel.history.items.first.name).to be_nil expect(channel.history.items.first.data).to be_nil end end end + + context 'identified clients' do + context 'when authenticated with a wildcard client_id' do + let(:token) { Ably::Rest::Client.new(default_options).auth.request_token(client_id: '*') } + let(:client_options) { default_options.merge(key: nil, token: token) } + let(:client) { Ably::Rest::Client.new(client_options) } + let(:channel) { client.channels.get(channel_name) } + + context 'with a valid client_id in the message' do + it 'succeeds' do + channel.publish([name: 'event', client_id: 'valid']) + channel.history do |messages| + expect(messages.first.client_id).to eql('valid') + end + end + end + + context 'with a wildcard client_id in the message' do + it 'throws an exception' do + expect { channel.publish([name: 'event', client_id: '*']) }.to raise_error Ably::Exceptions::IncompatibleClientId + end + end + + context 'with an empty client_id in the message' do + it 'succeeds and publishes without a client_id' do + channel.publish([name: 'event', client_id: nil]) + channel.history do |messages| + expect(messages.first.client_id).to eql('valid') + end + end + end + end + + context 'when authenticated with a Token string with an implicit client_id' do + let(:token) { Ably::Rest::Client.new(default_options).auth.request_token(client_id: 'valid').token } + let(:client_options) { default_options.merge(key: nil, token: token) } + let(:client) { Ably::Rest::Client.new(client_options) } + let(:channel) { client.channels.get(channel_name) } + + context 'without having a confirmed identity' do + context 'with a valid client_id in the message' do + it 'succeeds' do + channel.publish([name: 'event', client_id: 'valid']) + channel.history do |messages| + expect(messages.first.client_id).to eql('valid') + end + end + end + + context 'with an invalid client_id in the message' do + it 'succeeds in the client library but then fails when published to Ably' do + expect { channel.publish([name: 'event', client_id: 'invalid']) }.to raise_error Ably::Exceptions::InvalidRequest, /mismatched clientId/ + end + end + + context 'with an empty client_id in the message' do + it 'succeeds and publishes with an implicit client_id' do + channel.publish([name: 'event', client_id: nil]) + channel.history do |messages| + expect(messages.first.client_id).to eql('valid') + end + end + end + end + end + + context 'when authenticated with TokenDetails with a valid client_id' do + let(:token) { Ably::Rest::Client.new(default_options).auth.request_token(client_id: 'valid') } + let(:client_options) { default_options.merge(key: nil, token: token) } + let(:client) { Ably::Rest::Client.new(client_options) } + let(:channel) { client.channels.get(channel_name) } + + context 'with a valid client_id in the message' do + it 'succeeds' do + channel.publish([name: 'event', client_id: 'valid']) + channel.history do |messages| + expect(messages.first.client_id).to eql('valid') + end + end + end + + context 'with a wildcard client_id in the message' do + it 'throws an exception' do + expect { channel.publish([name: 'event', client_id: '*']) }.to raise_error Ably::Exceptions::IncompatibleClientId + end + end + + context 'with an invalid client_id in the message' do + it 'throws an exception' do + expect { channel.publish([name: 'event', client_id: 'invalid']) }.to raise_error Ably::Exceptions::IncompatibleClientId + end + end + + context 'with an empty client_id in the message' do + it 'succeeds and publishes with an implicit client_id' do + channel.publish([name: 'event', client_id: nil]) + channel.history do |messages| + expect(messages.first.client_id).to eql('valid') + end + end + end + end + + context 'when anonymous and no client_id' do + let(:token) { Ably::Rest::Client.new(default_options).auth.request_token(client_id: nil) } + let(:client_options) { default_options.merge(key: nil, token: token) } + let(:client) { Ably::Rest::Client.new(client_options) } + let(:channel) { client.channels.get(channel_name) } + + context 'with a client_id in the message' do + it 'throws an exception' do + expect { channel.publish([name: 'event', client_id: '*']) }.to raise_error Ably::Exceptions::IncompatibleClientId + end + end + + context 'with a wildcard client_id in the message' do + it 'throws an exception' do + expect { channel.publish([name: 'event', client_id: '*']) }.to raise_error Ably::Exceptions::IncompatibleClientId + end + end + + context 'with an empty client_id in the message' do + it 'succeeds and publishes with an implicit client_id' do + channel.publish([name: 'event', client_id: nil]) + channel.history do |messages| + expect(messages.first.client_id).to be_nil + end + end + end + end + end end describe '#history' do let(:channel) { client.channel("persisted:#{random_str(4)}") } let(:expected_history) do @@ -244,10 +375,10 @@ [:start, :end].each do |option| describe ":#{option}", :webmock do let!(:history_stub) { query_params = default_history_options .merge(option => milliseconds).map { |k, v| "#{k}=#{v}" }.join('&') - stub_request(:get, "#{endpoint}/channels/#{CGI.escape(channel_name)}/messages?#{query_params}"). + stub_request(:get, "#{endpoint}/channels/#{Addressable::URI.encode(channel_name)}/messages?#{query_params}"). to_return(:body => '{}', :headers => { 'Content-Type' => 'application/json' }) } before do channel.history(options)