require 'openid/extensions/sreg' require 'openid/message' require 'openid/server' require 'test/unit' module OpenID module SReg module SRegTest SOME_DATA = { 'nickname'=>'linusaur', 'postcode'=>'12345', 'country'=>'US', 'gender'=>'M', 'fullname'=>'Leonhard Euler', 'email'=>'president@whitehouse.gov', 'dob'=>'0000-00-00', 'language'=>'en-us', } class SRegTest < Test::Unit::TestCase def test_is11 assert_equal(NS_URI, NS_URI_1_1) end def test_check_field_name DATA_FIELDS.keys.each{|field_name| OpenID::check_sreg_field_name(field_name) } assert_raises(ArgumentError) { OpenID::check_sreg_field_name('invalid') } assert_raises(ArgumentError) { OpenID::check_sreg_field_name(nil) } end def test_unsupported endpoint = FakeEndpoint.new([]) assert(!OpenID::supports_sreg?(endpoint)) assert_equal([NS_URI_1_1,NS_URI_1_0], endpoint.checked_uris) end def test_supported_1_1 endpoint = FakeEndpoint.new([NS_URI_1_1]) assert(OpenID::supports_sreg?(endpoint)) assert_equal([NS_URI_1_1], endpoint.checked_uris) end def test_supported_1_0 endpoint = FakeEndpoint.new([NS_URI_1_0]) assert(OpenID::supports_sreg?(endpoint)) assert_equal([NS_URI_1_1,NS_URI_1_0], endpoint.checked_uris) end end class FakeEndpoint < Object attr_accessor :checked_uris def initialize(supported) @supported = supported @checked_uris = [] end def uses_extension(namespace_uri) @checked_uris << namespace_uri return @supported.member?(namespace_uri) end end class FakeMessage < Object attr_accessor :namespaces attr_accessor :openid1 def initialize @openid1 = false @namespaces = NamespaceMap.new end def is_openid1 return @openid1 end end class GetNSTest < Test::Unit::TestCase def setup @msg = FakeMessage.new end def test_openid2_empty ns_uri = OpenID::get_sreg_ns(@msg) assert_equal('sreg', @msg.namespaces.get_alias(ns_uri)) assert_equal(NS_URI, ns_uri) end def test_openid1_empty @msg.openid1 = true ns_uri = OpenID::get_sreg_ns(@msg) assert_equal('sreg', @msg.namespaces.get_alias(ns_uri)) assert_equal(NS_URI, ns_uri) end def test_openid1defined_1_0 @msg.openid1 = true @msg.namespaces.add(NS_URI_1_0) ns_uri = OpenID::get_sreg_ns(@msg) assert_equal(NS_URI_1_0, ns_uri) end def test_openid1_defined_1_0_override_alias [true, false].each{|openid_version| [NS_URI_1_0, NS_URI_1_1].each{|sreg_version| ['sreg', 'bogus'].each{|name| setup @msg.openid1 = openid_version @msg.namespaces.add_alias(sreg_version, name) ns_uri = OpenID::get_sreg_ns(@msg) assert_equal(name, @msg.namespaces.get_alias(ns_uri)) assert_equal(sreg_version, ns_uri) } } } end def test_openid1_defined_badly @msg.openid1 = true @msg.namespaces.add_alias('http://invalid/', 'sreg') assert_raises(NamespaceError) { OpenID::get_sreg_ns(@msg) } end def test_openid2_defined_badly @msg.namespaces.add_alias('http://invalid/', 'sreg') assert_raises(NamespaceError) { OpenID::get_sreg_ns(@msg) } end def test_openid2_defined_1_0 @msg.namespaces.add(NS_URI_1_0) ns_uri = OpenID::get_sreg_ns(@msg) assert_equal(NS_URI_1_0, ns_uri) end def test_openid1_sreg_ns_from_args args = { 'sreg.optional'=> 'nickname', 'sreg.required'=> 'dob', } m = Message.from_openid_args(args) assert_equal('nickname', m.get_arg(NS_URI_1_1, 'optional')) assert_equal('dob', m.get_arg(NS_URI_1_1, 'required')) end end class SRegRequestTest < Test::Unit::TestCase def test_construct_empty req = Request.new assert_equal([], req.optional) assert_equal([], req.required) assert_equal(nil, req.policy_url) assert_equal(NS_URI, req.ns_uri) end def test_construct_fields req = Request.new(['nickname'],['gender'],'http://policy', 'http://sreg.ns_uri') assert_equal(['gender'], req.optional) assert_equal(['nickname'], req.required) assert_equal('http://policy', req.policy_url) assert_equal('http://sreg.ns_uri', req.ns_uri) end def test_construct_bad_fields assert_raises(ArgumentError) {Request.new(['elvis'])} end def test_from_openid_request_message_copied message = Message.from_openid_args({"sreg.required" => "nickname"}) openid_req = Server::OpenIDRequest.new openid_req.message = message sreg_req = Request.from_openid_request(openid_req) # check that the message is copied by looking at sreg namespace assert_equal(NS_URI_1_1, message.namespaces.get_namespace_uri('sreg')) assert_equal(NS_URI, sreg_req.ns_uri) assert_equal(['nickname'], sreg_req.required) end def test_from_openid_request_ns_1_0 message = Message.from_openid_args({'ns.sreg' => NS_URI_1_0, "sreg.required" => "nickname"}) openid_req = Server::OpenIDRequest.new openid_req.message = message sreg_req = Request.from_openid_request(openid_req) assert_equal(NS_URI_1_0, sreg_req.ns_uri) assert_equal(['nickname'], sreg_req.required) end def test_from_openid_request_no_sreg message = Message.new openid_req = Server::OpenIDRequest.new openid_req.message = message sreg_req = Request.from_openid_request(openid_req) assert(sreg_req.nil?) end def test_parse_extension_args_empty req = Request.new req.parse_extension_args({}) end def test_parse_extension_args_extra_ignored req = Request.new req.parse_extension_args({'extra' => 'stuff'}) end def test_parse_extension_args_non_strict req = Request.new req.parse_extension_args({'required' => 'stuff'}) assert_equal([], req.required) end def test_parse_extension_args_strict req = Request.new assert_raises(ArgumentError) { req.parse_extension_args({'required' => 'stuff'}, true) } end def test_parse_extension_args_policy req = Request.new req.parse_extension_args({'policy_url' => 'http://policy'}, true) assert_equal('http://policy', req.policy_url) end def test_parse_extension_args_required_empty req = Request.new req.parse_extension_args({'required' => ''}, true) assert_equal([], req.required) end def test_parse_extension_args_optional_empty req = Request.new req.parse_extension_args({'optional' => ''},true) assert_equal([], req.optional) end def test_parse_extension_args_optional_single req = Request.new req.parse_extension_args({'optional' => 'nickname'},true) assert_equal(['nickname'], req.optional) end def test_parse_extension_args_optional_list req = Request.new req.parse_extension_args({'optional' => 'nickname,email'},true) assert_equal(['nickname','email'], req.optional) end def test_parse_extension_args_optional_list_bad_nonstrict req = Request.new req.parse_extension_args({'optional' => 'nickname,email,beer'}) assert_equal(['nickname','email'], req.optional) end def test_parse_extension_args_optional_list_bad_strict req = Request.new assert_raises(ArgumentError) { req.parse_extension_args({'optional' => 'nickname,email,beer'}, true) } end def test_parse_extension_args_both_nonstrict req = Request.new req.parse_extension_args({'optional' => 'nickname', 'required' => 'nickname'}) assert_equal(['nickname'], req.required) assert_equal([], req.optional) end def test_parse_extension_args_both_strict req = Request.new assert_raises(ArgumentError) { req.parse_extension_args({'optional' => 'nickname', 'required' => 'nickname'},true) } end def test_parse_extension_args_both_list req = Request.new req.parse_extension_args({'optional' => 'nickname,email', 'required' => 'country,postcode'},true) assert_equal(['nickname','email'], req.optional) assert_equal(['country','postcode'], req.required) end def test_all_requested_fields req = Request.new assert_equal([], req.all_requested_fields) req.request_field('nickname') assert_equal(['nickname'], req.all_requested_fields) req.request_field('gender', true) requested = req.all_requested_fields.sort assert_equal(['gender', 'nickname'], requested) end def test_were_fields_requested req = Request.new assert(!req.were_fields_requested?) req.request_field('nickname') assert(req.were_fields_requested?) end def test_member req = Request.new DATA_FIELDS.keys.each {|f| assert(!req.member?(f)) } assert(!req.member?('something else')) req.request_field('nickname') DATA_FIELDS.keys.each {|f| assert_equal(f == 'nickname',req.member?(f)) } end def test_request_field_bogus req = Request.new fields = DATA_FIELDS.keys fields.each {|f| req.request_field(f) } assert_equal(fields, req.optional) assert_equal([], req.required) # By default, adding the same fields over again has no effect fields.each {|f| req.request_field(f) } assert_equal(fields, req.optional) assert_equal([], req.required) # Requesting a field as required overrides requesting it as optional expected = fields[1..-1] overridden = fields[0] req.request_field(overridden, true) assert_equal(expected, req.optional) assert_equal([overridden], req.required) fields.each {|f| req.request_field(f, true) } assert_equal(fields, req.required) assert_equal([], req.optional) end def test_request_fields_type req = Request.new assert_raises(ArgumentError) { req.request_fields('nickname') } end def test_request_fields req = Request.new fields = DATA_FIELDS.keys req.request_fields(fields) assert_equal(fields, req.optional) assert_equal([], req.required) # By default, adding the same fields over again has no effect req.request_fields(fields) assert_equal(fields, req.optional) assert_equal([], req.required) # required overrides optional expected = fields[1..-1] overridden = fields[0] req.request_fields([overridden], true) assert_equal(expected, req.optional) assert_equal([overridden], req.required) req.request_fields(fields, true) assert_equal(fields, req.required) assert_equal([], req.optional) # optional does not override required req.request_fields(fields) assert_equal(fields, req.required) assert_equal([], req.optional) end def test_get_extension_args req = Request.new assert_equal({}, req.get_extension_args) req.request_field('nickname') assert_equal({'optional' => 'nickname'}, req.get_extension_args) req.request_field('email') assert_equal({'optional' => 'nickname,email'}, req.get_extension_args) req.request_field('gender', true) assert_equal({'optional' => 'nickname,email', 'required' => 'gender'}, req.get_extension_args) req.request_field('dob', true) assert_equal({'optional' => 'nickname,email', 'required' => 'gender,dob'}, req.get_extension_args) req.policy_url = 'http://policy' assert_equal({'optional' => 'nickname,email', 'required' => 'gender,dob', 'policy_url' => 'http://policy'}, req.get_extension_args) end end class DummySuccessResponse attr_accessor :message def initialize(message, signed_stuff) @message = message @signed_stuff = signed_stuff end def get_signed_ns(ns_uri) return @signed_stuff end end class SRegResponseTest < Test::Unit::TestCase def test_construct resp = Response.new(SOME_DATA) assert_equal(SOME_DATA, resp.get_extension_args) assert_equal(NS_URI, resp.ns_uri) resp2 = Response.new({}, "http://foo") assert_equal({}, resp2.get_extension_args) assert_equal('http://foo', resp2.ns_uri) end def test_from_success_response_signed message = Message.from_openid_args({ 'sreg.nickname'=>'The Mad Stork', }) success_resp = DummySuccessResponse.new(message, {}) sreg_resp = Response.from_success_response(success_resp) assert_equal({}, sreg_resp.get_extension_args) end def test_from_success_response_unsigned message = Message.from_openid_args({ 'ns.sreg' => NS_URI, 'sreg.nickname' => 'The Mad Stork', }) success_resp = DummySuccessResponse.new(message, {}) sreg_resp = Response.from_success_response(success_resp, false) assert_equal({'nickname' => 'The Mad Stork'}, sreg_resp.get_extension_args) end end class SendFieldsTest < Test::Unit::TestCase # class SendFieldsTest < Object def test_send_fields # create a request message with simple reg fields sreg_req = Request.new(['nickname', 'email'], ['fullname']) req_msg = Message.new req_msg.update_args(NS_URI, sreg_req.get_extension_args) req = Server::OpenIDRequest.new req.message = req_msg # -> checkid_* request # create a response resp_msg = Message.new resp = Server::OpenIDResponse.new(req) resp.fields = resp_msg sreg_resp = Response.extract_response(sreg_req, SOME_DATA) resp.add_extension(sreg_resp) # <- id_res response # extract sent fields sreg_data_resp = resp_msg.get_args(NS_URI) assert_equal({'nickname' => 'linusaur', 'email'=>'president@whitehouse.gov', 'fullname'=>'Leonhard Euler', }, sreg_data_resp) end end end end end