diff options
Diffstat (limited to 'vendor/gems/ruby-openid-2.1.4/test/test_accept.rb')
-rw-r--r-- | vendor/gems/ruby-openid-2.1.4/test/test_accept.rb | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/vendor/gems/ruby-openid-2.1.4/test/test_accept.rb b/vendor/gems/ruby-openid-2.1.4/test/test_accept.rb new file mode 100644 index 000000000..06db85bfa --- /dev/null +++ b/vendor/gems/ruby-openid-2.1.4/test/test_accept.rb @@ -0,0 +1,170 @@ + +require 'test/unit' +require 'openid/yadis/accept' +require 'openid/extras' +require 'openid/util' + +module OpenID + + class AcceptTest < Test::Unit::TestCase + include TestDataMixin + + def getTestData() + # Read the test data off of disk + # + # () -> [(int, str)] + lines = read_data_file('accept.txt') + line_no = 1 + return lines.collect { |line| + pair = [line_no, line] + line_no += 1 + pair + } + end + + def chunk(lines) + # Return groups of lines separated by whitespace or comments + # + # [(int, str)] -> [[(int, str)]] + chunks = [] + chunk = [] + lines.each { |lineno, line| + stripped = line.strip() + if (stripped == '') or stripped.starts_with?('#') + if chunk.length > 0 + chunks << chunk + chunk = [] + end + else + chunk << [lineno, stripped] + end + } + + if chunk.length > 0 + chunks << chunk + end + + return chunks + end + + def parseLines(chunk) + # Take the given chunk of lines and turn it into a test data + # dictionary + # + # [(int, str)] -> {str:(int, str)} + items = {} + chunk.each { |lineno, line| + header, data = line.split(':', 2) + header = header.downcase + items[header] = [lineno, data.strip] + } + return items + end + + def parseAvailable(available_text) + # Parse an Available: line's data + # + # str -> [str] + return available_text.split(',', -1).collect { |s| s.strip } + end + + def parseExpected(expected_text) + # Parse an Expected: line's data + # + # str -> [(str, float)] + expected = [] + if expected_text != '' + expected_text.split(',', -1).each { |chunk| + chunk = chunk.strip + mtype, qstuff = chunk.split(';', -1) + mtype = mtype.strip + Util.assert(!mtype.index('/').nil?) + qstuff = qstuff.strip + q, qstr = qstuff.split('=', -1) + Util.assert(q == 'q') + qval = qstr.to_f + expected << [mtype, qval] + } + end + + return expected + end + + def test_accept_headers + lines = getTestData() + chunks = chunk(lines) + data_sets = chunks.collect { |chunk| parseLines(chunk) } + cases = [] + data_sets.each { |data| + lnos = [] + lno, header = data['accept'] + lnos << lno + lno, avail_data = data['available'] + lnos << lno + begin + available = parseAvailable(avail_data) + rescue + print 'On line', lno + raise + end + + lno, exp_data = data['expected'] + lnos << lno + begin + expected = parseExpected(exp_data) + rescue + print 'On line', lno + raise + end + + descr = sprintf('MatchAcceptTest for lines %s', lnos) + + # Test: + accepted = Yadis.parse_accept_header(header) + actual = Yadis.match_types(accepted, available) + assert_equal(expected, actual) + + assert_equal(Yadis.get_acceptable(header, available), + expected.collect { |mtype, _| mtype }) + } + end + + def test_generate_accept_header + # TODO: move this into a test case file and write parsing code + # for it. + + # Form: [input_array, expected_header_string] + cases = [ + # Empty input list + [[], ""], + # Content type name only; no q value + [["test"], "test"], + # q = 1.0 should be omitted from the header + [[["test", 1.0]], "test"], + # Test conversion of float to string + [["test", ["with_q", 0.8]], "with_q; q=0.8, test"], + # Allow string q values, too + [["test", ["with_q_str", "0.7"]], "with_q_str; q=0.7, test"], + # Test q values out of bounds + [[["test", -1.0]], nil], + [[["test", 1.1]], nil], + # Test sorting of types by q value + [[["middle", 0.5], ["min", 0.1], "max"], + "min; q=0.1, middle; q=0.5, max"], + + ].each { |input, expected_header| + + if expected_header.nil? + assert_raise(ArgumentError) { + Yadis.generate_accept_header(*input) + } + else + assert_equal(expected_header, Yadis.generate_accept_header(*input), + [input, expected_header].inspect) + end + } + end + + end + +end |