spec/util/capability_spec.rb in twilio-ruby-3.12.2 vs spec/util/capability_spec.rb in twilio-ruby-3.12.3

- old
+ new

@@ -1,137 +1,186 @@ require 'spec_helper' describe Twilio::Util::Capability do - before :each do - @capability = Twilio::Util::Capability.new 'myAccountSid', 'myAuthToken' - end + describe 'config' do + after(:each) do + Twilio.instance_variable_set('@configuration', nil) + end - def queries(q) - q.scan(/scope:client:(incoming|outgoing)\?(\S+)/).map{|(type, query)| [type, Rack::Utils.parse_query(query)]} - end + it 'should set the account sid and auth token from a configuration block' do + Twilio.configure do |config| + config.account_sid = 'someSid' + config.auth_token = 'someToken' + end - it 'should return a valid jwt when #generate is called' do - token = @capability.generate - decoded, header = JWT.decode token, 'myAuthToken' - expect(decoded['scope']).not_to be_nil - expect(decoded['iss']).not_to be_nil - expect(decoded['exp']).not_to be_nil - end + capability = Twilio::Util::Capability.new + expect(capability.instance_variable_get('@account_sid')).to eq('someSid') + expect(capability.instance_variable_get('@auth_token')).to eq('someToken') + end - it 'should properly set the iss key in the payload' do - token = @capability.generate - decoded, header = JWT.decode token, 'myAuthToken' - expect(decoded['iss']).to eq('myAccountSid') - end + it 'should overwrite account sid and auth token if passed to initializer' do + Twilio.configure do |config| + config.account_sid = 'someSid' + config.auth_token = 'someToken' + end - it 'should properly set the exp key based on the default hour ttl' do - seconds = Time.now.to_i - token = @capability.generate - decoded, header = JWT.decode token, 'myAuthToken' - expect(decoded['exp']).to eq(seconds + 3600) - end + capability = Twilio::Util::Capability.new'otherSid', 'otherToken' + expect(capability.instance_variable_get('@account_sid')).to eq('otherSid') + expect(capability.instance_variable_get('@auth_token')).to eq('otherToken') + end - it 'should properly set the exp key based on the ttl passed to #generate' do - ttl = rand 10000 - seconds = Time.now.to_i - token = @capability.generate ttl - decoded, header = JWT.decode token, 'myAuthToken' - expect(decoded['exp']).to eq(seconds + ttl) - end + it 'should overwrite the account sid if only the sid is given' do + Twilio.configure do |config| + config.account_sid = 'someSid' + config.auth_token = 'someToken' + end - it 'should generate a proper incoming client scope string' do - @capability.allow_client_incoming 'andrew' - token = @capability.generate - decoded, header = JWT.decode token, 'myAuthToken' - expect(queries(decoded['scope'])).to eq([['incoming', {'clientName' => 'andrew'}]]) - end + capability = Twilio::Util::Capability.new 'otherSid' + expect(capability.instance_variable_get('@account_sid')).to eq('otherSid') + expect(capability.instance_variable_get('@auth_token')).to eq('someToken') + end - it 'should generate multiple proper incoming client scope strings' do - @capability.allow_client_incoming 'andrew' - @capability.allow_client_incoming 'bridget' - token = @capability.generate - decoded, header = JWT.decode token, 'myAuthToken' - expect(queries(decoded['scope'])).to eq([ - ['incoming', {'clientName' => 'andrew'}], - ['incoming', {'clientName' => 'bridget'}] - ]) - end + it 'should throw an argument error if the sid and token isn\'t set' do + expect { Twilio::Util::Capability.new }.to raise_error(ArgumentError) + end - it 'should generate a proper outgoing client scope string' do - @capability.allow_client_outgoing 'myAppSid' - token = @capability.generate - decoded, header = JWT.decode token, 'myAuthToken' - expect(queries(decoded['scope'])).to eq([['outgoing', {'appSid' => 'myAppSid'}]]) + it 'should throw an argument error if only the account_sid is set' do + expect { Twilio::Util::Capability.new 'someSid' }.to raise_error(ArgumentError) + end end - it 'should generate a proper outgoing client scope string with parameters' do - app_params_hash = {'key' => 'a value', :foo => 'bar/baz'} - @capability.allow_client_outgoing 'myAppSid', app_params_hash - app_params = @capability.instance_eval {url_encode(app_params_hash)} - params_hash = {'appSid' => 'myAppSid', 'appParams' => app_params} - @capability.instance_eval {url_encode(params_hash)} - token = @capability.generate - decoded, header= JWT.decode token, 'myAuthToken' - expect(queries(decoded['scope'])).to eq([['outgoing', params_hash]]) - end + describe 'with a capability' do + before :each do + @capability = Twilio::Util::Capability.new 'myAccountSid', 'myAuthToken' + end - it 'should generate a proper outgoing client scope string based on the ' + - 'client name when calling #allow_client_incoming first' do - @capability.allow_client_incoming 'andrew' - @capability.allow_client_outgoing 'myAppSid' - token = @capability.generate - decoded, header = JWT.decode token, 'myAuthToken' - expect(queries(decoded['scope'])).to eq([ - ['incoming', {'clientName' => 'andrew'}], - ['outgoing', {'clientName' => 'andrew', 'appSid' => 'myAppSid'}] - ]) - end + def queries(q) + q.scan(/scope:client:(incoming|outgoing)\?(\S+)/).map{|(type, query)| [type, Rack::Utils.parse_query(query)]} + end - it 'should generate a proper outgoing client scope string based on the ' + - 'client name when calling #allow_client_incoming second' do - @capability.allow_client_outgoing 'myAppSid' - @capability.allow_client_incoming 'andrew' - token = @capability.generate - decoded, header = JWT.decode token, 'myAuthToken' - expect(queries(decoded['scope'])).to eq([["incoming", {"clientName"=>"andrew"}], ["outgoing", {"clientName"=>"andrew", "appSid"=>"myAppSid"}]]) - end + it 'should return a valid jwt when #generate is called' do + token = @capability.generate + decoded, header = JWT.decode token, 'myAuthToken' + expect(decoded['scope']).not_to be_nil + expect(decoded['iss']).not_to be_nil + expect(decoded['exp']).not_to be_nil + end - it 'should generate a proper outgoing client scope string with parameters ' + - 'and a client name when calling #allow_client_incoming first' do - @capability.allow_client_incoming 'andrew' - app_params_hash = {'key' => 'a value', :foo => 'bar/baz'} - @capability.allow_client_outgoing 'myAppSid', app_params_hash - app_params = @capability.instance_eval {url_encode(app_params_hash)} - params_hash = {'appSid' => 'myAppSid', 'appParams' => app_params, 'clientName' => 'andrew'} - @capability.instance_eval {url_encode(params_hash)} - token = @capability.generate - decoded, header = JWT.decode token, 'myAuthToken' - scopes = queries(decoded['scope']) - expect(scopes.shift).to eq(["incoming", {"clientName"=>"andrew"}]) - scope = scopes.shift - expect(scope.first).to eq('outgoing') - expect(Rack::Utils.parse_query(scope.last['appParams'])).to eq({'key' => 'a value', 'foo' => 'bar/baz'}) - expect(scope.last["clientName"]).to eq("andrew") - expect(scope.last["appSid"]).to eq("myAppSid") - expect(scopes).to be_empty - end + it 'should properly set the iss key in the payload' do + token = @capability.generate + decoded, header = JWT.decode token, 'myAuthToken' + expect(decoded['iss']).to eq('myAccountSid') + end - it 'should generate a proper outgoing client scope string with parameters ' + - 'and a client name when calling #allow_client_incoming second' do - app_params_hash = {'key' => 'a value', :foo => 'bar/baz'} - @capability.allow_client_outgoing 'myAppSid', app_params_hash - @capability.allow_client_incoming 'andrew' - app_params = @capability.instance_eval {url_encode(app_params_hash)} - params_hash = {'appSid' => 'myAppSid', 'appParams' => app_params, 'clientName' => 'andrew'} - @capability.instance_eval {url_encode(params_hash)} - token = @capability.generate - decoded, header = JWT.decode token, 'myAuthToken' - scopes = queries(decoded['scope']) - expect(scopes.shift).to eq(["incoming", {"clientName"=>"andrew"}]) - scope = scopes.shift - expect(scope.first).to eq('outgoing') - expect(Rack::Utils.parse_query(scope.last['appParams'])).to eq({'key' => 'a value', 'foo' => 'bar/baz'}) - expect(scope.last["clientName"]).to eq("andrew") - expect(scope.last["appSid"]).to eq("myAppSid") - expect(scopes).to be_empty + it 'should properly set the exp key based on the default hour ttl' do + seconds = Time.now.to_i + token = @capability.generate + decoded, header = JWT.decode token, 'myAuthToken' + expect(decoded['exp']).to eq(seconds + 3600) + end + + it 'should properly set the exp key based on the ttl passed to #generate' do + ttl = rand 10000 + seconds = Time.now.to_i + token = @capability.generate ttl + decoded, header = JWT.decode token, 'myAuthToken' + expect(decoded['exp']).to eq(seconds + ttl) + end + + it 'should generate a proper incoming client scope string' do + @capability.allow_client_incoming 'andrew' + token = @capability.generate + decoded, header = JWT.decode token, 'myAuthToken' + expect(queries(decoded['scope'])).to eq([['incoming', {'clientName' => 'andrew'}]]) + end + + it 'should generate multiple proper incoming client scope strings' do + @capability.allow_client_incoming 'andrew' + @capability.allow_client_incoming 'bridget' + token = @capability.generate + decoded, header = JWT.decode token, 'myAuthToken' + expect(queries(decoded['scope'])).to eq([ + ['incoming', {'clientName' => 'andrew'}], + ['incoming', {'clientName' => 'bridget'}] + ]) + end + + it 'should generate a proper outgoing client scope string' do + @capability.allow_client_outgoing 'myAppSid' + token = @capability.generate + decoded, header = JWT.decode token, 'myAuthToken' + expect(queries(decoded['scope'])).to eq([['outgoing', {'appSid' => 'myAppSid'}]]) + end + + it 'should generate a proper outgoing client scope string with parameters' do + app_params_hash = {'key' => 'a value', :foo => 'bar/baz'} + @capability.allow_client_outgoing 'myAppSid', app_params_hash + app_params = @capability.instance_eval {url_encode(app_params_hash)} + params_hash = {'appSid' => 'myAppSid', 'appParams' => app_params} + @capability.instance_eval {url_encode(params_hash)} + token = @capability.generate + decoded, header= JWT.decode token, 'myAuthToken' + expect(queries(decoded['scope'])).to eq([['outgoing', params_hash]]) + end + + it 'should generate a proper outgoing client scope string based on the ' + + 'client name when calling #allow_client_incoming first' do + @capability.allow_client_incoming 'andrew' + @capability.allow_client_outgoing 'myAppSid' + token = @capability.generate + decoded, header = JWT.decode token, 'myAuthToken' + expect(queries(decoded['scope'])).to eq([ + ['incoming', {'clientName' => 'andrew'}], + ['outgoing', {'clientName' => 'andrew', 'appSid' => 'myAppSid'}] + ]) + end + + it 'should generate a proper outgoing client scope string based on the ' + + 'client name when calling #allow_client_incoming second' do + @capability.allow_client_outgoing 'myAppSid' + @capability.allow_client_incoming 'andrew' + token = @capability.generate + decoded, header = JWT.decode token, 'myAuthToken' + expect(queries(decoded['scope'])).to eq([["incoming", {"clientName"=>"andrew"}], ["outgoing", {"clientName"=>"andrew", "appSid"=>"myAppSid"}]]) + end + + it 'should generate a proper outgoing client scope string with parameters ' + + 'and a client name when calling #allow_client_incoming first' do + @capability.allow_client_incoming 'andrew' + app_params_hash = {'key' => 'a value', :foo => 'bar/baz'} + @capability.allow_client_outgoing 'myAppSid', app_params_hash + app_params = @capability.instance_eval {url_encode(app_params_hash)} + params_hash = {'appSid' => 'myAppSid', 'appParams' => app_params, 'clientName' => 'andrew'} + @capability.instance_eval {url_encode(params_hash)} + token = @capability.generate + decoded, header = JWT.decode token, 'myAuthToken' + scopes = queries(decoded['scope']) + expect(scopes.shift).to eq(["incoming", {"clientName"=>"andrew"}]) + scope = scopes.shift + expect(scope.first).to eq('outgoing') + expect(Rack::Utils.parse_query(scope.last['appParams'])).to eq({'key' => 'a value', 'foo' => 'bar/baz'}) + expect(scope.last["clientName"]).to eq("andrew") + expect(scope.last["appSid"]).to eq("myAppSid") + expect(scopes).to be_empty + end + + it 'should generate a proper outgoing client scope string with parameters ' + + 'and a client name when calling #allow_client_incoming second' do + app_params_hash = {'key' => 'a value', :foo => 'bar/baz'} + @capability.allow_client_outgoing 'myAppSid', app_params_hash + @capability.allow_client_incoming 'andrew' + app_params = @capability.instance_eval {url_encode(app_params_hash)} + params_hash = {'appSid' => 'myAppSid', 'appParams' => app_params, 'clientName' => 'andrew'} + @capability.instance_eval {url_encode(params_hash)} + token = @capability.generate + decoded, header = JWT.decode token, 'myAuthToken' + scopes = queries(decoded['scope']) + expect(scopes.shift).to eq(["incoming", {"clientName"=>"andrew"}]) + scope = scopes.shift + expect(scope.first).to eq('outgoing') + expect(Rack::Utils.parse_query(scope.last['appParams'])).to eq({'key' => 'a value', 'foo' => 'bar/baz'}) + expect(scope.last["clientName"]).to eq("andrew") + expect(scope.last["appSid"]).to eq("myAppSid") + expect(scopes).to be_empty + end end end