mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	 3e92b635fb
			
		
	
	
		3e92b635fb
		
	
	
	
	
		
			
			When you change this to true, you may need to add more tests. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@53141 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			412 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			412 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # frozen_string_literal: false
 | |
| require "rexml/document"
 | |
| 
 | |
| require_relative "rss-testcase"
 | |
| 
 | |
| module RSS
 | |
|   class TestRSS20Core < TestCase
 | |
| 
 | |
|     def setup
 | |
|       @rss_version = "2.0"
 | |
|     end
 | |
| 
 | |
|     def test_Rss
 | |
|       version = "1.0"
 | |
|       encoding = "UTF-8"
 | |
|       standalone = false
 | |
| 
 | |
|       rss = Rss.new(@rss_version, version, encoding, standalone)
 | |
|       setup_rss20(rss)
 | |
| 
 | |
|       doc = REXML::Document.new(rss.to_s(false))
 | |
| 
 | |
|       xmldecl = doc.xml_decl
 | |
| 
 | |
|       assert_equal(version, xmldecl.version)
 | |
|       assert_equal(encoding, xmldecl.encoding.to_s)
 | |
|       assert_equal(standalone, !xmldecl.standalone.nil?)
 | |
| 
 | |
|       assert_equal("", doc.root.namespace)
 | |
|       assert_equal(@rss_version, doc.root.attributes["version"])
 | |
|     end
 | |
| 
 | |
|     def test_not_displayed_xml_stylesheets
 | |
|       rss = Rss.new(@rss_version)
 | |
|       plain_rss = rss.to_s
 | |
|       3.times do
 | |
|         rss.xml_stylesheets.push(XMLStyleSheet.new)
 | |
|         assert_equal(plain_rss, rss.to_s)
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     def test_xml_stylesheets
 | |
|       [
 | |
|         [{:href => "a.xsl", :type => "text/xsl"}],
 | |
|         [
 | |
|           {:href => "a.xsl", :type => "text/xsl"},
 | |
|           {:href => "a.css", :type => "text/css"},
 | |
|         ],
 | |
|       ].each do |attrs_ary|
 | |
|         rss = Rss.new(@rss_version)
 | |
|         setup_rss20(rss)
 | |
|         assert_xml_stylesheet_pis(attrs_ary, rss)
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     def test_channel
 | |
|       h = {
 | |
|         'title' => "fugafuga",
 | |
|         'link' => "http://hoge.com",
 | |
|         'description' => "fugafugafugafuga",
 | |
| 
 | |
|         'language' => "en-us",
 | |
|         'copyright' => "Copyright 2002, Spartanburg Herald-Journal",
 | |
|         'managingEditor' => "geo@herald.com (George Matesky)",
 | |
|         'webMaster' => "betty@herald.com (Betty Guernsey)",
 | |
|         'pubDate' => Time.parse("Sat, 07 Sep 2002 00:00:01 GMT"),
 | |
|         'lastBuildDate' => Time.parse("Sat, 07 Sep 2002 09:42:31 GMT"),
 | |
|         'generator' => "MightyInHouse Content System v2.3",
 | |
|         'docs' => "http://blogs.law.harvard.edu/tech/rss",
 | |
|         'ttl' => "60",
 | |
|         'rating' => '(PICS-1.1 "http://www.rsac.org/ratingsv01.html" l gen true comment "RSACi North America Server" for "http://www.rsac.org" on "1996.04.16T08:15-0500" r (n 0 s 0 v 0 l 0))',
 | |
|       }
 | |
|       categories = [
 | |
|         {
 | |
|           :content => "Newspapers",
 | |
|         },
 | |
|         {
 | |
|           :domain => "Syndic8",
 | |
|           :content => "1765",
 | |
|         }
 | |
|       ]
 | |
| 
 | |
|       channel = Rss::Channel.new
 | |
| 
 | |
|       elems = %w(title link description language copyright
 | |
|                  managingEditor webMaster pubDate lastBuildDate
 | |
|                  generator docs ttl rating)
 | |
|       elems.each do |x|
 | |
|         value = h[x]
 | |
|         value = value.rfc822 if %w(pubDate lastBuildDate).include?(x)
 | |
|         channel.__send__("#{x}=", value)
 | |
|       end
 | |
|       categories.each do |cat|
 | |
|         channel.categories << Rss::Channel::Category.new(cat[:domain],
 | |
|                                                          cat[:content])
 | |
|       end
 | |
| 
 | |
|       doc = REXML::Document.new(make_rss20(channel.to_s))
 | |
|       c = doc.root.elements[1]
 | |
| 
 | |
|       elems.each do |x|
 | |
|         elem = c.elements[x]
 | |
|         assert_equal(x, elem.name)
 | |
|         assert_equal("", elem.namespace)
 | |
|         expected = h[x]
 | |
|         case x
 | |
|         when "pubDate", "lastBuildDate"
 | |
|           assert_equal(expected, Time.parse(elem.text))
 | |
|         when "ttl"
 | |
|           expected = channel.__send__(x)
 | |
|           assert_equal(expected, elem.text.to_i)
 | |
|         else
 | |
|           assert_equal(expected, elem.text)
 | |
|         end
 | |
|       end
 | |
|       categories.each_with_index do |cat, i|
 | |
|         cat = cat.dup
 | |
|         cat[:domain] ||= nil
 | |
|         category = c.elements["category[#{i+1}]"]
 | |
|         actual = {
 | |
|           :domain => category.attributes["domain"],
 | |
|           :content => category.text,
 | |
|         }
 | |
|         assert_equal(cat, actual)
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     def test_channel_cloud
 | |
|       cloud_params = {
 | |
|         :domain => "rpc.sys.com",
 | |
|         :port => "80",
 | |
|         :path => "/RPC2",
 | |
|         :registerProcedure => "myCloud.rssPleaseNotify",
 | |
|         :protocol => "xml-rpc",
 | |
|       }
 | |
|       cloud = Rss::Channel::Cloud.new(cloud_params[:domain],
 | |
|                                       cloud_params[:port],
 | |
|                                       cloud_params[:path],
 | |
|                                       cloud_params[:registerProcedure],
 | |
|                                       cloud_params[:protocol])
 | |
|       cloud_params[:port] = cloud.port
 | |
| 
 | |
|       doc = REXML::Document.new(cloud.to_s)
 | |
|       cloud_elem = doc.root
 | |
| 
 | |
|       actual = {}
 | |
|       cloud_elem.attributes.each do |name, value|
 | |
|         value = value.to_i if name == "port"
 | |
|         actual[name.intern] = value
 | |
|       end
 | |
|       assert_equal(cloud_params, actual)
 | |
|     end
 | |
| 
 | |
|     def test_channel_image
 | |
|       image_params = {
 | |
|         :url => "http://hoge.com/hoge.png",
 | |
|         :title => "fugafuga",
 | |
|         :link => "http://hoge.com",
 | |
|         :width => "144",
 | |
|         :height => "400",
 | |
|         :description => "an image",
 | |
|       }
 | |
|       image = Rss::Channel::Image.new(image_params[:url],
 | |
|                                       image_params[:title],
 | |
|                                       image_params[:link],
 | |
|                                       image_params[:width],
 | |
|                                       image_params[:height],
 | |
|                                       image_params[:description])
 | |
| 
 | |
|       doc = REXML::Document.new(image.to_s)
 | |
|       image_elem = doc.root
 | |
| 
 | |
|       image_params.each do |name, value|
 | |
|         value = image.__send__(name)
 | |
|         actual = image_elem.elements[name.to_s].text
 | |
|         actual = actual.to_i if [:width, :height].include?(name)
 | |
|         assert_equal(value, actual)
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     def test_channel_textInput
 | |
|       textInput_params = {
 | |
|         :title => "fugafuga",
 | |
|         :description => "text hoge fuga",
 | |
|         :name => "hoge",
 | |
|         :link => "http://hoge.com",
 | |
|       }
 | |
|       textInput = Rss::Channel::TextInput.new(textInput_params[:title],
 | |
|                                               textInput_params[:description],
 | |
|                                               textInput_params[:name],
 | |
|                                               textInput_params[:link])
 | |
| 
 | |
|       doc = REXML::Document.new(textInput.to_s)
 | |
|       input_elem = doc.root
 | |
| 
 | |
|       textInput_params.each do |name, value|
 | |
|         actual = input_elem.elements[name.to_s].text
 | |
|         assert_equal(value, actual)
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     def test_channel_skip_days
 | |
|       skipDays_values = [
 | |
|         "Sunday",
 | |
|         "Monday",
 | |
|       ]
 | |
|       skipDays = Rss::Channel::SkipDays.new
 | |
|       skipDays_values.each do |value|
 | |
|         skipDays.days << Rss::Channel::SkipDays::Day.new(value)
 | |
|       end
 | |
| 
 | |
|       doc = REXML::Document.new(skipDays.to_s)
 | |
|       days_elem = doc.root
 | |
| 
 | |
|       skipDays_values.each_with_index do |value, i|
 | |
|         assert_equal(value, days_elem.elements[i + 1].text)
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     def test_channel_skip_hours
 | |
|       skipHours_values = [
 | |
|         "0",
 | |
|         "13",
 | |
|       ]
 | |
|       skipHours = Rss::Channel::SkipHours.new
 | |
|       skipHours_values.each do |value|
 | |
|         skipHours.hours << Rss::Channel::SkipHours::Hour.new(value)
 | |
|       end
 | |
| 
 | |
|       doc = REXML::Document.new(skipHours.to_s)
 | |
|       hours_elem = doc.root
 | |
| 
 | |
|       skipHours_values.each_with_index do |value, i|
 | |
|         expected = skipHours.hours[i].content
 | |
|         assert_equal(expected, hours_elem.elements[i + 1].text.to_i)
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     def test_item
 | |
|       h = {
 | |
|         'title' => "fugafuga",
 | |
|         'link' => "http://hoge.com/",
 | |
|         'description' => "text hoge fuga",
 | |
|         'author' => "oprah@oxygen.net",
 | |
|         'comments' => "http://www.myblog.org/cgi-local/mt/mt-comments.cgi?entry_id=290",
 | |
|         'pubDate' => Time.parse("Sat, 07 Sep 2002 00:00:01 GMT"),
 | |
|       }
 | |
|       categories = [
 | |
|         {
 | |
|           :content => "Newspapers",
 | |
|         },
 | |
|         {
 | |
|           :domain => "Syndic8",
 | |
|           :content => "1765",
 | |
|         }
 | |
|       ]
 | |
| 
 | |
|       channel = Rss::Channel.new
 | |
|       channel.title = "title"
 | |
|       channel.link = "http://example.com/"
 | |
|       channel.description = "description"
 | |
| 
 | |
|       item = Rss::Channel::Item.new
 | |
|       channel.items << item
 | |
| 
 | |
|       elems = %w(title link description author comments pubDate)
 | |
|       elems.each do |x|
 | |
|         value = h[x]
 | |
|         value = value.rfc822 if x == "pubDate"
 | |
|         item.__send__("#{x}=", value)
 | |
|       end
 | |
|       categories.each do |cat|
 | |
|         item.categories << Rss::Channel::Category.new(cat[:domain],
 | |
|                                                       cat[:content])
 | |
|       end
 | |
| 
 | |
|       doc = REXML::Document.new(channel.to_s)
 | |
|       channel_elem = doc.root
 | |
| 
 | |
|       item_elem = channel_elem.elements["item[1]"]
 | |
|       elems.each do |x|
 | |
|         elem = item_elem.elements[x]
 | |
|         assert_equal(x, elem.name)
 | |
|         assert_equal("", elem.namespace)
 | |
|         expected = h[x]
 | |
|         case x
 | |
|         when "pubDate"
 | |
|           assert_equal(expected, Time.parse(elem.text))
 | |
|         else
 | |
|           assert_equal(expected, elem.text)
 | |
|         end
 | |
|       end
 | |
|       categories.each_with_index do |cat, i|
 | |
|         cat = cat.dup
 | |
|         cat[:domain] ||= nil
 | |
|         category = item_elem.elements["category[#{i+1}]"]
 | |
|         actual = {
 | |
|           :domain => category.attributes["domain"],
 | |
|           :content => category.text,
 | |
|         }
 | |
|         assert_equal(cat, actual)
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     def test_item_enclosure
 | |
|       enclosure_params = {
 | |
|         :url => "http://www.scripting.com/mp3s/weatherReportSuite.mp3",
 | |
|         :length => "12216320",
 | |
|         :type => "audio/mpeg",
 | |
|       }
 | |
| 
 | |
|       enclosure = Rss::Channel::Item::Enclosure.new(enclosure_params[:url],
 | |
|                                                     enclosure_params[:length],
 | |
|                                                     enclosure_params[:type])
 | |
|       enclosure_params[:length] = enclosure.length
 | |
| 
 | |
|       doc = REXML::Document.new(enclosure.to_s)
 | |
|       enclosure_elem = doc.root
 | |
| 
 | |
|       actual = {}
 | |
|       enclosure_elem.attributes.each do |name, value|
 | |
|         value = value.to_i if name == "length"
 | |
|         actual[name.intern] = value
 | |
|       end
 | |
|       assert_equal(enclosure_params, actual)
 | |
|     end
 | |
| 
 | |
|     def test_item_guid
 | |
|       test_params = [
 | |
|         {
 | |
|           :content => "http://some.server.com/weblogItem3207",
 | |
|         },
 | |
|         {
 | |
|           :isPermaLink => "true",
 | |
|           :content => "http://inessential.com/2002/09/01.php#a2",
 | |
|         },
 | |
|       ]
 | |
| 
 | |
|       test_params.each do |guid_params|
 | |
|         guid = Rss::Channel::Item::Guid.new(guid_params[:isPermaLink],
 | |
|                                             guid_params[:content])
 | |
|         if guid_params.has_key?(:isPermaLink)
 | |
|           guid_params[:isPermaLink] = guid.isPermaLink
 | |
|         end
 | |
|         if guid.isPermaLink.nil?
 | |
|           assert_equal(true, guid.PermaLink?)
 | |
|         else
 | |
|           assert_equal(guid.isPermaLink, guid.PermaLink?)
 | |
|         end
 | |
| 
 | |
|         doc = REXML::Document.new(guid.to_s)
 | |
|         guid_elem = doc.root
 | |
| 
 | |
|         actual = {}
 | |
|         actual[:content] = guid_elem.text if guid_elem.text
 | |
|         guid_elem.attributes.each do |name, value|
 | |
|           value = value == "true" if name == "isPermaLink"
 | |
|           actual[name.intern] = value
 | |
|         end
 | |
|         assert_equal(guid_params, actual)
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     def test_item_source
 | |
|       source_params = {
 | |
|         :url => "http://www.tomalak.org/links2.xml",
 | |
|         :content => "Tomalak's Realm",
 | |
|       }
 | |
| 
 | |
|       source = Rss::Channel::Item::Source.new(source_params[:url],
 | |
|                                               source_params[:content])
 | |
| 
 | |
|       doc = REXML::Document.new(source.to_s)
 | |
|       source_elem = doc.root
 | |
| 
 | |
|       actual = {}
 | |
|       actual[:content] = source_elem.text
 | |
|       source_elem.attributes.each do |name, value|
 | |
|         actual[name.intern] = value
 | |
|       end
 | |
|       assert_equal(source_params, actual)
 | |
|     end
 | |
| 
 | |
|     def test_to_xml
 | |
|       rss = RSS::Parser.parse(make_sample_rss20)
 | |
|       assert_equal(rss.to_s, rss.to_xml)
 | |
|       assert_equal(rss.to_s, rss.to_xml("2.0"))
 | |
|       rss09_xml = rss.to_xml("0.91") do |maker|
 | |
|         setup_dummy_image(maker)
 | |
|       end
 | |
|       rss09 = RSS::Parser.parse(rss09_xml)
 | |
|       assert_equal("0.91", rss09.rss_version)
 | |
|       rss10 = rss.to_xml("1.0") do |maker|
 | |
|         maker.channel.about = "http://www.example.com/index.rdf"
 | |
|       end
 | |
|       rss10 = RSS::Parser.parse(rss10)
 | |
|       assert_equal("1.0", rss10.rss_version)
 | |
| 
 | |
|       atom_xml = rss.to_xml("atom1.0") do |maker|
 | |
|         maker.channel.id = "http://www.example.com/atom.xml"
 | |
|         maker.channel.author = "Alice"
 | |
|         maker.channel.updated = Time.now
 | |
|         maker.items.each do |item|
 | |
|           item.author = "Bob"
 | |
|           item.updated = Time.now
 | |
|         end
 | |
|       end
 | |
|       atom = RSS::Parser.parse(atom_xml)
 | |
|       assert_equal(["atom", "1.0", "feed"], atom.feed_info)
 | |
|     end
 | |
|   end
 | |
| end
 |