obsolete.ChilliProject/vendor/gems/ruby-openid-2.1.4/test/test_yadis_discovery.rb

221 lines
6.3 KiB
Ruby

require 'test/unit'
require 'uri'
require 'testutil'
require 'openid/yadis/discovery'
require 'openid/fetchers'
require 'openid/util'
require 'discoverdata'
module OpenID
module YadisDiscovery
include FetcherMixin
include DiscoverData
STATUS_HEADER_RE = /Status: (\d+) .*?$/m
four04_pat = "\nContent-Type: text/plain\n\nNo such file %s"
def self.mkResponse(data)
status_mo = data.scan(STATUS_HEADER_RE)
headers_str, body = data.split("\n\n", 2)
headers = {}
headers_str.split("\n", -1).each { |line|
k, v = line.split(':', 2)
k = k.strip().downcase
v = v.strip()
headers[k] = v
}
status = status_mo[0][0].to_i
return HTTPResponse._from_raw_data(status, body,
headers)
end
class TestFetcher
include DiscoverData
def initialize(base_url)
@base_url = base_url
end
def fetch(url, headers, body, redirect_limit=nil)
current_url = url
while true
parsed = URI::parse(current_url)
# parsed[2][1:]
path = parsed.path[1..-1]
begin
data = generateSample(path, @base_url)
rescue ArgumentError
return HTTPResponse._from_raw_data(404, '', {},
current_url)
end
response = YadisDiscovery.mkResponse(data)
if ["301", "302", "303", "307"].member?(response.code)
current_url = response['location']
else
response.final_url = current_url
return response
end
end
end
end
class MockFetcher
def initialize
@count = 0
end
def fetch(uri, headers=nil, body=nil, redirect_limit=nil)
@count += 1
if @count == 1
headers = {
'X-XRDS-Location'.downcase => 'http://unittest/404',
}
return HTTPResponse._from_raw_data(200, '', headers, uri)
else
return HTTPResponse._from_raw_data(404, '', {}, uri)
end
end
end
class TestSecondGet < Test::Unit::TestCase
include FetcherMixin
def test_404
uri = "http://something.unittest/"
assert_raise(DiscoveryFailure) {
with_fetcher(MockFetcher.new) { Yadis.discover(uri) }
}
end
end
class DiscoveryTestCase
include DiscoverData
include FetcherMixin
def initialize(testcase, input_name, id_name, result_name, success)
@base_url = 'http://invalid.unittest/'
@testcase = testcase
@input_name = input_name
@id_name = id_name
@result_name = result_name
@success = success
end
def setup
@input_url, @expected = generateResult(@base_url,
@input_name,
@id_name,
@result_name,
@success)
end
def do_discovery
with_fetcher(TestFetcher.new(@base_url)) do
Yadis.discover(@input_url)
end
end
def runCustomTest
setup
if @expected.respond_to?("ancestors") and @expected.ancestors.member?(DiscoveryFailure)
@testcase.assert_raise(DiscoveryFailure) {
do_discovery
}
else
result = do_discovery
@testcase.assert_equal(@input_url, result.request_uri)
msg = sprintf("Identity URL mismatch: actual = %s, expected = %s",
result.normalized_uri, @expected.normalized_uri)
@testcase.assert_equal(@expected.normalized_uri, result.normalized_uri, msg)
msg = sprintf("Content mismatch: actual = %s, expected = %s",
result.response_text, @expected.response_text)
@testcase.assert_equal(@expected.response_text, result.response_text, msg)
expected_keys = @expected.instance_variables
expected_keys.sort!
actual_keys = result.instance_variables
actual_keys.sort!
@testcase.assert_equal(actual_keys, expected_keys)
@expected.instance_variables.each { |k|
exp_v = @expected.instance_variable_get(k)
act_v = result.instance_variable_get(k)
@testcase.assert_equal(act_v, exp_v, [k, exp_v, act_v])
}
end
end
end
class NoContentTypeFetcher
def fetch(url, body=nil, headers=nil, redirect_limit=nil)
return OpenID::HTTPResponse._from_raw_data(200, "", {}, nil)
end
end
class BlankContentTypeFetcher
def fetch(url, body=nil, headers=nil, redirect_limit=nil)
return OpenID::HTTPResponse._from_raw_data(200, "", {"Content-Type" => ""}, nil)
end
end
class TestYadisDiscovery < Test::Unit::TestCase
include FetcherMixin
def test_yadis_discovery
DiscoverData::TESTLIST.each { |success, input_name, id_name, result_name|
test = DiscoveryTestCase.new(self, input_name, id_name, result_name, success)
test.runCustomTest
}
end
def test_is_xrds_yadis_location
result = Yadis::DiscoveryResult.new('http://request.uri/')
result.normalized_uri = "http://normalized/"
result.xrds_uri = "http://normalized/xrds"
assert(result.is_xrds)
end
def test_is_xrds_content_type
result = Yadis::DiscoveryResult.new('http://request.uri/')
result.normalized_uri = result.xrds_uri = "http://normalized/"
result.content_type = Yadis::YADIS_CONTENT_TYPE
assert(result.is_xrds)
end
def test_is_xrds_neither
result = Yadis::DiscoveryResult.new('http://request.uri/')
result.normalized_uri = result.xrds_uri = "http://normalized/"
result.content_type = "another/content-type"
assert(!result.is_xrds)
end
def test_no_content_type
with_fetcher(NoContentTypeFetcher.new) do
result = Yadis.discover("http://bogus")
assert_equal(nil, result.content_type)
end
end
def test_blank_content_type
with_fetcher(BlankContentTypeFetcher.new) do
result = Yadis.discover("http://bogus")
assert_equal("", result.content_type)
end
end
end
end
end