0
# This is based off of Sam Ruby's xml_filetest.rb
0
-# I've adapted it for
feedparser.rb0
+# I've adapted it for
rfeedparser0
# http://intertwingly.net/blog/2005/10/30/Testing-FeedTools-Dynamically/
0
-require File.dirname(__FILE__)+'/../lib/rfeedparser'
0
- STDERR.puts "Whoops, had an error with loading mongrel as a gem. Trying just 'require'. Mongrel is required for testing."
0
-def uconvert(one, two, three); FeedParser::uconvert(one, two, three); end
0
-def _ebcdic_to_ascii(one); FeedParser::_ebcdic_to_ascii(one); end
0
-$PORT = 8097 # Not configurable, hard coded in the xml files
0
-def translate_data(data)
0
- if data[0..3] == "\x4c\x6f\xa7\x94"
0
- data = _ebcdic_to_ascii(data)
0
- elsif data[0..3] == "\x00\x3c\x00\x3f"
0
- data = uconvert(data, 'utf-16be', 'utf-8')
0
- elsif data.size >= 4 and data[0..1] == "\xfe\xff" and data[2..3] != "\x00\x00"
0
- data = uconvert(data[2..-1], 'utf-16be', 'utf-8')
0
- elsif data[0..3] == "\x3c\x00\x3f\x00"
0
- data = uconvert(data, 'utf-16le', 'utf-8')
0
- elsif data.size >=4 and data[0..1] == "\xff\xfe" and data[2..3] != "\x00\x00"
0
- data = uconvert(data[2..-1], 'utf-16le', 'utf-8')
0
- elsif data[0..3] == "\x00\x00\x00\x3c"
0
- data = uconvert(data, 'utf-32be', 'utf-8')
0
- elsif data[0..3] == "\x3c\x00\x00\x00"
0
- data = uconvert(data, 'utf-32le', 'utf-8')
0
- elsif data[0..3] == "\x00\x00\xfe\xff"
0
- data = uconvert(data[4..-1], 'utf-32BE', 'utf-8')
0
- elsif data[0..3] == "\xff\xfe\x00\x00"
0
- data = uconvert(data[4..-1], 'utf-32LE', 'utf-8')
0
- elsif data[0..2] == "\xef\xbb\xbf"
0
-def scrape_headers(xmlfile)
0
- # Called by the server
0
- htaccess = File.dirname(xmlfile)+"/.htaccess"
0
- if File.exists? htaccess
0
- fn = xm.path.split(File::Separator)[-1] # I can't find the right method for this
0
- ht_file = open(htaccess)
0
- type_match = ht_file.read.match(/^\s*<Files\s+#{fn}>\s*\n\s*AddType\s+(.*?)\s+.xml/m)
0
- the_type = type_match[1].strip.gsub(/^("|')/,'').gsub(/("|')$/,'').strip if type_match and type_match[1]
0
- if type_match and the_type
0
- #content_type, charset = type_match[1].split(';')
0
- server_headers["Content-Type"] = the_type
0
- data = translate_data(data)
0
- da = data.scan /^Header:\s*([^:]+):(.+)\s$/
0
- unless da.nil? or da.empty?
0
- da.each{|e| e.strip!;e.gsub!(/(Content-type|content-type|content-Type)/, "Content-Type")}
0
- xml_headers = Hash[*da] # Asterisk magic!
0
- return xml_headers.merge(server_headers)
0
-def scrape_assertion_strings(xmlfile)
0
- # Called by the testing client
0
- data = open(xmlfile).read
0
- data = translate_data(data)
0
- test = data.scan /Description:\s*(.*?)\s*Expect:\s*(.*)\s*-->/
0
- description, evalString = test.first.map{ |s| s.strip }
0
- # Here we translate the expected values in Python to Ruby
0
- evalString.gsub!(/\bu'(.*?)'/) do |m|
0
- esc.gsub!(/\\u([0-9a-fA-F]{4})/){ |m| [$1.hex].pack('U*') }
0
- evalString.gsub!(/\bu"(.*?)"/) do |m|
0
- esc.gsub!(/\\u([0-9a-fA-F]{4})/){ |m| [$1.hex].pack('U*') }
0
- # The above does the following: u'string' => 'string'
0
- # u'ba\u20acha' => 'ba€ha' # Same for double quoted strings
0
- evalString.gsub!(/\\x([0-9a-fA-F]{2})/){ |m| [$1.hex].pack('U*') } # "ba\xa3la" => "ba£la"
0
- evalString.gsub! /'\s*:\s+/, "' => " # {'foo': 'bar'} => {'foo' => 'bar'}
0
- evalString.gsub! /"\s*:\s+/, "\" => " # {"foo": 'bar'} => {"foo" => 'bar'}
0
- evalString.gsub! /\=\s*\((.*?)\)/, '= [\1]' # = (2004, 12, 4) => = [2004, 12, 4]
0
- evalString.gsub!(/"""(.*?)"""/) do # """<a b="foo">""" => "<a b="foo">"
0
- "\""+$1.gsub!(/"/,"\\\"")+"\"" # haha, ugly!
0
- evalString.gsub! /(\w|\])\s*\=\= 0\s*$/, '\1 == false' # ] == 0 => ] == false
0
- evalString.gsub! /(\w|\])\s*\=\= 1\s*$/, '\1 == true' # ] == 1 => ] == true
0
- evalString.gsub! /len\((.*?)\)\s*\=\=\s*(\d{1,3})/, '\1.length == \2' # len(ary) == 1 => ary.length == 1
0
- evalString.gsub! /None/, "nil" # None => nil # well, duh
0
- return description, evalString
0
-class FeedParserTestRequestHandler < Mongrel::DirHandler
0
- def process(request, response)
0
- req_method = request.params[Mongrel::Const::REQUEST_METHOD] || Mongrel::Const::GET
0
- req_path = can_serve request.params[Mongrel::Const::PATH_INFO]
0
- # not found, return a 404
0
- response.start(404) do |head, out|
0
- out << "File not found"
0
- if File.directory? req_path
0
- send_dir_listing(request.params[Mongrel::Const::REQUEST_URI], req_path, response)
0
- elsif req_method == Mongrel::Const::HEAD
0
- response.start do |head,out|
0
- xml_head = scrape_headers(req_path)
0
- xml_head.each_key{|k| head[k] = xml_head[k] }
0
- send_file(req_path, request, response, true)
0
- elsif req_method == Mongrel::Const::GET
0
- response.start do |head,out|
0
- xml_head = scrape_headers(req_path)
0
- xml_head.each_key{|k| head[k] = xml_head[k] }
0
- send_file(req_path, request, response, false)
0
- response.start(403) {|head,out| out.write(ONLY_HEAD_GET) }
0
- STDERR.puts "Error sending file #{req_path}: #{details}"
0
-class XMLTests < Test::Unit::TestCase
0
- # Empty, but here for clarity
0
+require File.join(File.dirname(__FILE__),'rfeedparser_test_helper')
0
# default methods to be public
0
# Start up the mongrel server and tell it how to send the tests
0
server = Mongrel::HttpServer.new("0.0.0.0",$PORT)
0
Mongrel::DirHandler::add_mime_type('.xml','application/xml')
0
+Mongrel::DirHandler::add_mime_type('.xml_redirect','application/xml')
0
server.register("/", FeedParserTestRequestHandler.new("."))
Comments
No one has commented yet.