diff --git a/lib/omniauth/strategies/openid_connect/user_info.rb b/lib/omniauth/strategies/openid_connect/user_info.rb index fba23bd..677b4ba 100644 --- a/lib/omniauth/strategies/openid_connect/user_info.rb +++ b/lib/omniauth/strategies/openid_connect/user_info.rb @@ -28,8 +28,10 @@ def mapped_attributes mapping = default_attribute_map.merge(options.attribute_map) values = user_info.raw_attributes.symbolize_keys mapping.to_h do |k, possible_values| + # Avoid using filter_map here as we want to include false values mapped_value = Array(possible_values) - .filter_map { |v| values[v.to_sym] } + .map { |v| values[v.to_sym] } + .reject { |v| v.nil? || v == '' } .first [k.to_sym, mapped_value] diff --git a/omniauth-openid-connect.gemspec b/omniauth-openid-connect.gemspec index c087a85..1b64c50 100644 --- a/omniauth-openid-connect.gemspec +++ b/omniauth-openid-connect.gemspec @@ -24,7 +24,7 @@ Gem::Specification.new do |spec| spec.add_dependency 'addressable', '~> 2.5' spec.add_development_dependency 'bundler', '>= 1.5' spec.add_development_dependency 'minitest', '~> 5.1' - spec.add_development_dependency 'mocha', '~> 1.11', '>= 1.11.2' + spec.add_development_dependency 'mocha', '~> 2.1.0' spec.add_development_dependency 'guard', '~> 2.14' spec.add_development_dependency 'guard-minitest', '~> 2.4' spec.add_development_dependency 'guard-bundler', '~> 2.1' diff --git a/test/lib/omniauth/strategies/openid_connect_test.rb b/test/lib/omniauth/strategies/openid_connect_test.rb index f642f41..1fe3ba4 100644 --- a/test/lib/omniauth/strategies/openid_connect_test.rb +++ b/test/lib/omniauth/strategies/openid_connect_test.rb @@ -363,6 +363,30 @@ def test_info_custom_mapping assert_equal 'bar', info[:login] end + def test_info_boolean_mapping_false + strategy.options.attribute_map = { admin: 'isAdmin' } + + info = strategy.info + + assert_equal user_info.name, info[:name] + assert_equal user_info.email, info[:email] + assert_equal false, info[:admin] + end + + def test_info_boolean_mapping_true + azure_userinfo = ::OpenIDConnect::ResponseObject::UserInfo.new( + sub: SecureRandom.hex(16), + name: Faker::Name.name, + isAdmin: true + ) + strategy.stubs(:user_info).returns(azure_userinfo) + strategy.options.attribute_map = { admin: 'isAdmin' } + + info = strategy.info + + assert_equal true, info[:admin] + end + def test_info_mail_unique_mapping azure_userinfo = ::OpenIDConnect::ResponseObject::UserInfo.new( sub: SecureRandom.hex(16), diff --git a/test/strategy_test_case.rb b/test/strategy_test_case.rb index 2c2be59..9c23e14 100644 --- a/test/strategy_test_case.rb +++ b/test/strategy_test_case.rb @@ -1,4 +1,4 @@ -class StrategyTestCase < MiniTest::Test +class StrategyTestCase < Minitest::Test class DummyApp def call(env); end end @@ -28,7 +28,8 @@ def user_info phone_number: Faker::PhoneNumber.phone_number, website: Faker::Internet.url, # custom claim - foobar: 'bar' + foobar: 'bar', + isAdmin: false ) end diff --git a/test/test_helper.rb b/test/test_helper.rb index af670b9..6514e0c 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,6 +1,7 @@ lib = File.expand_path('../../lib', __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) require 'simplecov' +require 'minitest/assertions' require 'minitest/autorun' require 'mocha/minitest' require 'faker'