summaryrefslogtreecommitdiffstats
path: root/vendor/gems/ruby-openid-2.1.4/test/test_ax.rb
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/gems/ruby-openid-2.1.4/test/test_ax.rb')
-rw-r--r--vendor/gems/ruby-openid-2.1.4/test/test_ax.rb648
1 files changed, 648 insertions, 0 deletions
diff --git a/vendor/gems/ruby-openid-2.1.4/test/test_ax.rb b/vendor/gems/ruby-openid-2.1.4/test/test_ax.rb
new file mode 100644
index 000000000..c1dcfb1f5
--- /dev/null
+++ b/vendor/gems/ruby-openid-2.1.4/test/test_ax.rb
@@ -0,0 +1,648 @@
+require 'openid/extensions/ax'
+require 'openid/message'
+require 'openid/consumer/responses'
+require 'openid/consumer/discovery'
+require 'openid/consumer/checkid_request'
+
+module OpenID
+ module AX
+ class BogusAXMessage < AXMessage
+ @mode = 'bogus'
+
+ def get_extension_args
+ new_args
+ end
+
+ def do_check_mode(args)
+ check_mode(args)
+ end
+
+ def do_check_mode_new_args
+ check_mode(new_args)
+ end
+ end
+
+ class AXMessageTest < Test::Unit::TestCase
+ def setup
+ @bax = BogusAXMessage.new
+ end
+
+ def test_check_mode
+ assert_raises(Error) { @bax.do_check_mode({'mode' => 'fetch_request'})}
+ @bax.do_check_mode({'mode' => @bax.mode})
+ end
+
+ def test_check_mode_new_args
+ @bax.do_check_mode_new_args
+ end
+ end
+
+ class AttrInfoTest < Test::Unit::TestCase
+ def test_construct
+ assert_raises(ArgumentError) { AttrInfo.new }
+ type_uri = 'uri geller'
+ ainfo = AttrInfo.new(type_uri)
+
+ assert_equal(type_uri, ainfo.type_uri)
+ assert_equal(1, ainfo.count)
+ assert_equal(false, ainfo.required)
+ assert_equal(nil, ainfo.ns_alias)
+ end
+ end
+
+ class ToTypeURIsTest < Test::Unit::TestCase
+ def setup
+ @aliases = NamespaceMap.new
+ end
+
+ def test_empty
+ [nil, ''].each{|empty|
+ uris = AX.to_type_uris(@aliases, empty)
+ assert_equal([], uris)
+ }
+ end
+
+ def test_undefined
+ assert_raises(IndexError) {
+ AX.to_type_uris(@aliases, 'http://janrain.com/')
+ }
+ end
+
+ def test_one
+ uri = 'http://janrain.com/'
+ name = 'openid_hackers'
+ @aliases.add_alias(uri, name)
+ uris = AX::to_type_uris(@aliases, name)
+ assert_equal([uri], uris)
+ end
+
+ def test_two
+ uri1 = 'http://janrain.com/'
+ name1 = 'openid_hackers'
+ @aliases.add_alias(uri1, name1)
+
+ uri2 = 'http://jyte.com/'
+ name2 = 'openid_hack'
+ @aliases.add_alias(uri2, name2)
+
+ uris = AX.to_type_uris(@aliases, [name1, name2].join(','))
+ assert_equal([uri1, uri2], uris)
+ end
+ end
+
+ class ParseAXValuesTest < Test::Unit::TestCase
+ def ax_values(ax_args, expected_args)
+ msg = KeyValueMessage.new
+ msg.parse_extension_args(ax_args)
+ assert_equal(expected_args, msg.data)
+ end
+
+ def ax_error(ax_args, error)
+ msg = KeyValueMessage.new
+ assert_raises(error) {
+ msg.parse_extension_args(ax_args)
+ }
+ end
+
+ def test_empty_is_valid
+ ax_values({}, {})
+ end
+
+ def test_missing_value_for_alias_explodes
+ ax_error({'type.foo'=>'urn:foo'}, IndexError)
+ end
+
+ def test_count_present_but_not_value
+ ax_error({'type.foo'=>'urn:foo', 'count.foo' => '1'}, IndexError)
+ end
+
+ def test_invalid_count_value
+ msg = FetchRequest.new
+ assert_raises(Error) {
+ msg.parse_extension_args({'type.foo'=>'urn:foo',
+ 'count.foo' => 'bogus'})
+ }
+ end
+
+ def test_request_unlimited_values
+ msg = FetchRequest.new
+ args = {'mode' => 'fetch_request',
+ 'required' => 'foo',
+ 'type.foo' => 'urn:foo',
+ 'count.foo' => UNLIMITED_VALUES
+ }
+ msg.parse_extension_args(args)
+ foo = msg.attributes[0]
+ assert_equal(UNLIMITED_VALUES, foo.count)
+ assert(foo.wants_unlimited_values?)
+ end
+
+ def test_long_alias
+ # spec says we must support at least 32 character-long aliases
+ name = 'x' * MINIMUM_SUPPORTED_ALIAS_LENGTH
+
+ msg = KeyValueMessage.new
+ args = {
+ "type.#{name}" => 'urn:foo',
+ "count.#{name}" => '1',
+ "value.#{name}.1" => 'first',
+ }
+ msg.parse_extension_args(args)
+ assert_equal(['first'],msg['urn:foo'])
+ end
+
+ def test_invalid_alias
+ types = [
+ KeyValueMessage,
+ FetchRequest
+ ]
+ inputs = [
+ {'type.a.b'=>'urn:foo',
+ 'count.a.b'=>'1'},
+ {'type.a,b'=>'urn:foo',
+ 'count.a,b'=>'1'},
+ ]
+ types.each{|t|
+ inputs.each{|input|
+ msg = t.new
+ assert_raises(Error) {msg.parse_extension_args(input)}
+ }
+ }
+ end
+
+ def test_count_present_and_is_zero
+ ax_values(
+ {'type.foo'=>'urn:foo',
+ 'count.foo'=>'0',
+ },
+ {'urn:foo'=>[]}
+ )
+ end
+
+ def test_singleton_empty
+ ax_values(
+ {'type.foo'=>'urn:foo',
+ 'value.foo'=>'',
+ },
+ {'urn:foo'=>[]}
+ )
+ end
+
+ def test_double_alias
+ ax_error(
+ {'type.foo'=>'urn:foo',
+ 'value.foo'=>'',
+ 'type.bar'=>'urn:foo',
+ 'value.bar'=>'',
+ },
+ IndexError
+ )
+ end
+
+ def test_double_singleton
+ ax_values(
+ {'type.foo'=>'urn:foo',
+ 'value.foo'=>'',
+ 'type.bar'=>'urn:bar',
+ 'value.bar'=>'',
+ },
+ {'urn:foo'=>[],'urn:bar'=>[]}
+ )
+ end
+
+ def singleton_value
+ ax_values(
+ {'type.foo'=>'urn:foo',
+ 'value.foo'=>'something',
+ },
+ {'urn:foo'=>['something']}
+ )
+ end
+ end
+
+ class FetchRequestTest < Test::Unit::TestCase
+ def setup
+ @msg = FetchRequest.new
+ @type_a = 'http://janrain.example.com/a'
+ @name_a = 'a'
+ end
+
+ def test_mode
+ assert_equal('fetch_request', @msg.mode)
+ end
+
+ def test_construct
+ assert_equal({}, @msg.requested_attributes)
+ assert_equal(nil, @msg.update_url)
+
+ msg = FetchRequest.new('hailstorm')
+ assert_equal({}, msg.requested_attributes)
+ assert_equal('hailstorm', msg.update_url)
+ end
+
+ def test_add
+ uri = 'mud://puddle'
+
+ assert(! @msg.member?(uri))
+ a = AttrInfo.new(uri)
+ @msg.add(a)
+ assert(@msg.member?(uri))
+ end
+
+ def test_add_twice
+ uri = 'its://raining'
+ a = AttrInfo.new(uri)
+ @msg.add(a)
+ assert_raises(IndexError) {@msg.add(a)}
+ end
+
+ def do_extension_args(expected_args)
+ expected_args['mode'] = @msg.mode
+ assert_equal(expected_args, @msg.get_extension_args)
+ end
+
+ def test_get_extension_args_empty
+ do_extension_args({})
+ end
+
+ def test_get_extension_args_no_alias
+ a = AttrInfo.new('foo://bar')
+ @msg.add(a)
+ ax_args = @msg.get_extension_args
+ ax_args.each{|k,v|
+ if v == a.type_uri and k.index('type.') == 0
+ @name = k[5..-1]
+ break
+ end
+ }
+ do_extension_args({'type.'+@name => a.type_uri,
+ 'if_available' => @name})
+ end
+
+ def test_get_extension_args_alias_if_available
+ a = AttrInfo.new('type://of.transportation',
+ 'transport')
+ @msg.add(a)
+ do_extension_args({'type.'+a.ns_alias => a.type_uri,
+ 'if_available' => a.ns_alias})
+ end
+
+ def test_get_extension_args_alias_req
+ a = AttrInfo.new('type://of.transportation',
+ 'transport',
+ true)
+ @msg.add(a)
+ do_extension_args({'type.'+a.ns_alias => a.type_uri,
+ 'required' => a.ns_alias})
+ end
+
+ def test_get_required_attrs_empty
+ assert_equal([], @msg.get_required_attrs)
+ end
+
+ def test_parse_extension_args_extra_type
+ args = {
+ 'mode' => 'fetch_request',
+ 'type.' + @name_a => @type_a
+ }
+ assert_raises(Error) {@msg.parse_extension_args(args)}
+ end
+
+ def test_parse_extension_args
+ args = {
+ 'mode' => 'fetch_request',
+ 'type.' + @name_a => @type_a,
+ 'if_available' => @name_a
+ }
+ @msg.parse_extension_args(args)
+ assert(@msg.member?(@type_a) )
+ assert_equal([@type_a], @msg.requested_types)
+ ai = @msg.requested_attributes[@type_a]
+ assert(ai.is_a?(AttrInfo))
+ assert(!ai.required)
+ assert_equal(@type_a, ai.type_uri)
+ assert_equal(@name_a, ai.ns_alias)
+ assert_equal([ai], @msg.attributes)
+ end
+
+ def test_extension_args_idempotent
+ args = {
+ 'mode' => 'fetch_request',
+ 'type.' + @name_a => @type_a,
+ 'if_available' => @name_a
+ }
+ @msg.parse_extension_args(args)
+ assert_equal(args, @msg.get_extension_args)
+ assert(!@msg.requested_attributes[@type_a].required)
+ end
+
+ def test_extension_args_idempotent_count_required
+ args = {
+ 'mode' => 'fetch_request',
+ 'type.' + @name_a => @type_a,
+ 'count.' + @name_a => '2',
+ 'required' => @name_a
+ }
+ @msg.parse_extension_args(args)
+ assert_equal(args, @msg.get_extension_args)
+ assert(@msg.requested_attributes[@type_a].required)
+ end
+
+ def test_extension_args_count1
+ args = {
+ 'mode' => 'fetch_request',
+ 'type.' + @name_a => @type_a,
+ 'count.' + @name_a => '1',
+ 'if_available' => @name_a
+ }
+ norm_args = {
+ 'mode' => 'fetch_request',
+ 'type.' + @name_a => @type_a,
+ 'if_available' => @name_a
+ }
+ @msg.parse_extension_args(args)
+ assert_equal(norm_args, @msg.get_extension_args)
+ end
+
+ def test_from_openid_request_no_ax
+ message = Message.new
+ openid_req = Server::OpenIDRequest.new
+ openid_req.message = message
+ ax_req = FetchRequest.from_openid_request(openid_req)
+ assert(ax_req.nil?)
+ end
+
+ def test_openid_update_url_verification_error
+ openid_req_msg = Message.from_openid_args({
+ 'mode' => 'checkid_setup',
+ 'ns' => OPENID2_NS,
+ 'realm' => 'http://example.com/realm',
+ 'ns.ax' => AXMessage::NS_URI,
+ 'ax.update_url' => 'http://different.site/path',
+ 'ax.mode' => 'fetch_request',
+ })
+ openid_req = Server::OpenIDRequest.new
+ openid_req.message = openid_req_msg
+ assert_raises(Error) {
+ FetchRequest.from_openid_request(openid_req)
+ }
+ end
+
+ def test_openid_no_realm
+ openid_req_msg = Message.from_openid_args({
+ 'mode' => 'checkid_setup',
+ 'ns' => OPENID2_NS,
+ 'ns.ax' => AXMessage::NS_URI,
+ 'ax.update_url' => 'http://different.site/path',
+ 'ax.mode' => 'fetch_request',
+ })
+ openid_req = Server::OpenIDRequest.new
+ openid_req.message = openid_req_msg
+ assert_raises(Error) {
+ FetchRequest.from_openid_request(openid_req)
+ }
+ end
+
+ def test_openid_update_url_verification_success
+ openid_req_msg = Message.from_openid_args({
+ 'mode' => 'checkid_setup',
+ 'ns' => OPENID2_NS,
+ 'realm' => 'http://example.com/realm',
+ 'ns.ax' => AXMessage::NS_URI,
+ 'ax.update_url' => 'http://example.com/realm/update_path',
+ 'ax.mode' => 'fetch_request',
+ })
+ openid_req = Server::OpenIDRequest.new
+ openid_req.message = openid_req_msg
+ fr = FetchRequest.from_openid_request(openid_req)
+ assert(fr.is_a?(FetchRequest))
+ end
+
+ def test_openid_update_url_verification_success_return_to
+ openid_req_msg = Message.from_openid_args({
+ 'mode' => 'checkid_setup',
+ 'ns' => OPENID2_NS,
+ 'return_to' => 'http://example.com/realm',
+ 'ns.ax' => AXMessage::NS_URI,
+ 'ax.update_url' => 'http://example.com/realm/update_path',
+ 'ax.mode' => 'fetch_request',
+ })
+ openid_req = Server::OpenIDRequest.new
+ openid_req.message = openid_req_msg
+ fr = FetchRequest.from_openid_request(openid_req)
+ assert(fr.is_a?(FetchRequest))
+ end
+
+ def test_add_extension
+ openid_req_msg = Message.from_openid_args({
+ 'mode' => 'checkid_setup',
+ 'ns' => OPENID2_NS,
+ 'return_to' => 'http://example.com/realm',
+ })
+
+ e = OpenID::OpenIDServiceEndpoint.new
+ openid_req = Consumer::CheckIDRequest.new(nil, e)
+ openid_req.message = openid_req_msg
+
+ fr = FetchRequest.new
+ fr.add(AttrInfo.new("urn:bogus"))
+
+ openid_req.add_extension(fr)
+
+ expected = {
+ 'mode' => 'fetch_request',
+ 'if_available' => 'ext0',
+ 'type.ext0' => 'urn:bogus',
+ }
+
+ expected.each { |k,v|
+ assert(openid_req.message.get_arg(AXMessage::NS_URI, k) == v)
+ }
+ end
+ end
+
+ class FetchResponseTest < Test::Unit::TestCase
+ def setup
+ @msg = FetchResponse.new
+ @value_a = 'commodity'
+ @type_a = 'http://blood.transfusion/'
+ @name_a = 'george'
+ @request_update_url = 'http://some.url.that.is.awesome/'
+ end
+
+ def test_construct
+ assert_equal(nil, @msg.update_url)
+ assert_equal({}, @msg.data)
+ end
+
+ def test_get_extension_args_empty
+ eargs = {
+ 'mode' => 'fetch_response'
+ }
+ assert_equal(eargs, @msg.get_extension_args)
+ end
+
+ def test_get_extension_args_empty_request
+ eargs = {
+ 'mode' => 'fetch_response'
+ }
+ req = FetchRequest.new
+ assert_equal(eargs, @msg.get_extension_args(req))
+ end
+
+ def test_get_extension_args_empty_request_some
+ uri = 'http://not.found/'
+ name = 'ext0'
+ eargs = {
+ 'mode' => 'fetch_response',
+ 'type.' + name => uri,
+ 'count.' + name => '0'
+ }
+ req = FetchRequest.new
+ req.add(AttrInfo.new(uri))
+ assert_equal(eargs, @msg.get_extension_args(req))
+ end
+
+ def test_update_url_in_response
+ uri = 'http://not.found/'
+ name = 'ext0'
+ eargs = {
+ 'mode' => 'fetch_response',
+ 'update_url' => @request_update_url,
+ 'type.' + name => uri,
+ 'count.' + name => '0'
+ }
+ req = FetchRequest.new(@request_update_url)
+ req.add(AttrInfo.new(uri))
+ assert_equal(eargs, @msg.get_extension_args(req))
+ end
+
+ def test_get_extension_args_some_request
+ eargs = {
+ 'mode' => 'fetch_response',
+ 'type.' + @name_a => @type_a,
+ 'value.' + @name_a + '.1' => @value_a,
+ 'count.' + @name_a => '1'
+ }
+ req = FetchRequest.new
+ req.add(AttrInfo.new(@type_a, @name_a))
+ @msg.add_value(@type_a, @value_a)
+ assert_equal(eargs, @msg.get_extension_args(req))
+ end
+
+ def test_get_extension_args_some_not_request
+ req = FetchRequest.new
+ @msg.add_value(@type_a, @value_a)
+ assert_raises(IndexError) {@msg.get_extension_args(req)}
+ end
+
+ def test_get_single_success
+ req = FetchRequest.new
+ @msg.add_value(@type_a, @value_a)
+ assert_equal(@value_a, @msg.get_single(@type_a))
+ end
+
+ def test_get_single_none
+ assert_equal(nil, @msg.get_single(@type_a))
+ end
+
+ def test_get_single_extra
+ @msg.set_values(@type_a, ['x', 'y'])
+ assert_raises(Error) { @msg.get_single(@type_a) }
+ end
+
+ def test_from_success_response
+ uri = 'http://under.the.sea/'
+ name = 'ext0'
+ value = 'snarfblat'
+
+ m = OpenID::Message.from_openid_args({
+ 'mode' => 'id_res',
+ 'ns' => OPENID2_NS,
+ 'ns.ax' => AXMessage::NS_URI,
+ 'ax.update_url' => 'http://example.com/realm/update_path',
+ 'ax.mode' => 'fetch_response',
+ 'ax.type.' + name => uri,
+ 'ax.count.' + name => '1',
+ 'ax.value.' + name + '.1' => value,
+ })
+
+ e = OpenID::OpenIDServiceEndpoint.new()
+ resp = OpenID::Consumer::SuccessResponse.new(e, m, [])
+
+ ax_resp = FetchResponse.from_success_response(resp, false)
+
+ values = ax_resp[uri]
+ assert_equal(values, [value])
+ end
+
+ def test_from_success_response_empty
+ e = OpenID::OpenIDServiceEndpoint.new()
+ m = OpenID::Message.from_openid_args({'mode' => 'id_res'})
+ resp = OpenID::Consumer::SuccessResponse.new(e, m, [])
+ ax_resp = FetchResponse.from_success_response(resp)
+ assert(ax_resp.nil?)
+ end
+ end
+
+ class StoreRequestTest < Test::Unit::TestCase
+ def setup
+ @msg = StoreRequest.new
+ @type_a = 'http://oranges.are.for/'
+ @name_a = 'juggling'
+ end
+
+ def test_construct
+ assert_equal({}, @msg.data)
+ end
+
+ def test_get_extension_args_empty
+ eargs = {
+ 'mode' => 'store_request'
+ }
+ assert_equal(eargs, @msg.get_extension_args)
+ end
+
+ def test_get_extension_args_nonempty
+ @msg.set_values(@type_a, ['foo','bar'])
+ aliases = NamespaceMap.new
+ aliases.add_alias(@type_a, @name_a)
+ eargs = {
+ 'mode' => 'store_request',
+ 'type.' + @name_a => @type_a,
+ 'value.' + @name_a + '.1' => 'foo',
+ 'value.' + @name_a + '.2' => 'bar',
+ 'count.' + @name_a => '2'
+ }
+ assert_equal(eargs, @msg.get_extension_args(aliases))
+ end
+ end
+
+ class StoreResponseTest < Test::Unit::TestCase
+ def test_success
+ msg = StoreResponse.new
+ assert(msg.succeeded?)
+ assert(!msg.error_message)
+ assert_equal({'mode' => 'store_response_success'},
+ msg.get_extension_args)
+ end
+
+ def test_fail_nomsg
+ msg = StoreResponse.new(false)
+ assert(! msg.succeeded? )
+ assert(! msg.error_message )
+ assert_equal({'mode' => 'store_response_failure'},
+ msg.get_extension_args)
+ end
+
+ def test_fail_msg
+ reason = "because I said so"
+ msg = StoreResponse.new(false, reason)
+ assert(! msg.succeeded? )
+ assert_equal(reason, msg.error_message)
+ assert_equal({'mode' => 'store_response_failure', 'error' => reason},
+ msg.get_extension_args)
+ end
+ end
+ end
+end