mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	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
		
			
				
	
	
		
			479 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			479 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
# frozen_string_literal: false
 | 
						|
require "erb"
 | 
						|
 | 
						|
require "test/unit"
 | 
						|
require_relative 'rss-assertions'
 | 
						|
 | 
						|
require "rss"
 | 
						|
 | 
						|
module RSS
 | 
						|
  class TestCase < Test::Unit::TestCase
 | 
						|
    include ERB::Util
 | 
						|
 | 
						|
    include RSS
 | 
						|
    include Assertions
 | 
						|
 | 
						|
    XMLDECL_VERSION = "1.0"
 | 
						|
    XMLDECL_ENCODING = "UTF-8"
 | 
						|
    XMLDECL_STANDALONE = "no"
 | 
						|
 | 
						|
    RDF_ABOUT = "http://www.xml.com/xml/news.rss"
 | 
						|
    RDF_RESOURCE = "http://xml.com/universal/images/xml_tiny.gif"
 | 
						|
    TITLE_VALUE = "XML.com"
 | 
						|
    LINK_VALUE = "http://xml.com/pub"
 | 
						|
    URL_VALUE = "http://xml.com/universal/images/xml_tiny.gif"
 | 
						|
    NAME_VALUE = "hogehoge"
 | 
						|
    LANGUAGE_VALUE = "ja"
 | 
						|
    DESCRIPTION_VALUE = "
 | 
						|
    XML.com features a rich mix of information and services
 | 
						|
    for the XML community.
 | 
						|
    "
 | 
						|
    RESOURCES = [
 | 
						|
      "http://xml.com/pub/2000/08/09/xslt/xslt.html",
 | 
						|
      "http://xml.com/pub/2000/08/09/rdfdb/index.html",
 | 
						|
    ]
 | 
						|
 | 
						|
    CLOUD_DOMAIN = "data.ourfavoritesongs.com"
 | 
						|
    CLOUD_PORT = "80"
 | 
						|
    CLOUD_PATH = "/RPC2"
 | 
						|
    CLOUD_REGISTER_PROCEDURE = "ourFavoriteSongs.rssPleaseNotify"
 | 
						|
    CLOUD_PROTOCOL = "xml-rpc"
 | 
						|
 | 
						|
    ENCLOSURE_URL = "http://www.scripting.com/mp3s/weatherReportSuite.mp3"
 | 
						|
    ENCLOSURE_LENGTH = "12216320"
 | 
						|
    ENCLOSURE_TYPE = "audio/mpeg"
 | 
						|
 | 
						|
    CATEGORY_DOMAIN = "http://www.superopendirectory.com/"
 | 
						|
 | 
						|
    FEED_TITLE = "dive into mark"
 | 
						|
    FEED_UPDATED = "2003-12-13T18:30:02Z"
 | 
						|
    FEED_AUTHOR_NAME = "John Doe"
 | 
						|
    FEED_ID = "urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6"
 | 
						|
 | 
						|
    ENTRY_TITLE = "Atom-Powered Robots Run Amok"
 | 
						|
    ENTRY_LINK = "http://example.org/2003/12/13/atom03"
 | 
						|
    ENTRY_ID = "urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a"
 | 
						|
    ENTRY_UPDATED = "2003-12-13T18:30:02Z"
 | 
						|
    ENTRY_SUMMARY = "Some text."
 | 
						|
 | 
						|
    t = Time.iso8601("2000-01-01T12:00:05+00:00")
 | 
						|
    class << t
 | 
						|
      alias_method(:to_s, :iso8601)
 | 
						|
    end
 | 
						|
 | 
						|
    DC_ELEMENTS = {
 | 
						|
      :title => "hoge",
 | 
						|
      :description =>
 | 
						|
        " XML is placing increasingly heavy loads on
 | 
						|
          the existing technical infrastructure of the Internet.",
 | 
						|
      :creator => "Rael Dornfest (mailto:rael@oreilly.com)",
 | 
						|
      :subject => "XML",
 | 
						|
      :publisher => "The O'Reilly Network",
 | 
						|
      :contributor => "hogehoge",
 | 
						|
      :type => "fugafuga",
 | 
						|
      :format => "hohoho",
 | 
						|
      :identifier => "fufufu",
 | 
						|
      :source => "barbar",
 | 
						|
      :language => "ja",
 | 
						|
      :relation => "cococo",
 | 
						|
      :rights => "Copyright (c) 2000 O'Reilly & Associates, Inc.",
 | 
						|
      :date => t,
 | 
						|
    }
 | 
						|
 | 
						|
    DC_NODES = DC_ELEMENTS.collect do |name, value|
 | 
						|
      "<#{DC_PREFIX}:#{name}>#{value}</#{DC_PREFIX}:#{name}>"
 | 
						|
    end.join("\n")
 | 
						|
 | 
						|
    def default_test
 | 
						|
      # This class isn't tested
 | 
						|
    end
 | 
						|
 | 
						|
    private
 | 
						|
    def make_xmldecl(v=XMLDECL_VERSION, e=XMLDECL_ENCODING, s=XMLDECL_STANDALONE)
 | 
						|
      rv = "<?xml version='#{v}'"
 | 
						|
      rv << " encoding='#{e}'" if e
 | 
						|
      rv << " standalone='#{s}'" if s
 | 
						|
      rv << "?>"
 | 
						|
      rv
 | 
						|
    end
 | 
						|
 | 
						|
    def make_RDF(content=nil, xmlns=[])
 | 
						|
      <<-EORSS
 | 
						|
#{make_xmldecl}
 | 
						|
<rdf:RDF xmlns="#{URI}" xmlns:rdf="#{RDF::URI}"
 | 
						|
#{xmlns.collect {|pre, uri| "xmlns:#{pre}='#{uri}'"}.join(' ')}>
 | 
						|
#{block_given? ? yield : content}
 | 
						|
</rdf:RDF>
 | 
						|
EORSS
 | 
						|
    end
 | 
						|
 | 
						|
    def make_channel(content=nil)
 | 
						|
      <<-EOC
 | 
						|
<channel rdf:about="#{RDF_ABOUT}">
 | 
						|
  <title>#{TITLE_VALUE}</title>
 | 
						|
  <link>#{LINK_VALUE}</link>
 | 
						|
  <description>#{DESCRIPTION_VALUE}</description>
 | 
						|
 | 
						|
  <image rdf:resource="#{RDF_RESOURCE}" />
 | 
						|
 | 
						|
  <items>
 | 
						|
    <rdf:Seq>
 | 
						|
#{RESOURCES.collect do |res| '<rdf:li resource="' + res + '" />' end.join("\n")}
 | 
						|
    </rdf:Seq>
 | 
						|
  </items>
 | 
						|
 | 
						|
  <textinput rdf:resource="#{RDF_RESOURCE}" />
 | 
						|
 | 
						|
#{block_given? ? yield : content}
 | 
						|
</channel>
 | 
						|
EOC
 | 
						|
    end
 | 
						|
 | 
						|
    def make_image(content=nil)
 | 
						|
      <<-EOI
 | 
						|
<image rdf:about="#{RDF_ABOUT}">
 | 
						|
  <title>#{TITLE_VALUE}</title>
 | 
						|
  <url>#{URL_VALUE}</url>
 | 
						|
  <link>#{LINK_VALUE}</link>
 | 
						|
#{block_given? ? yield : content}
 | 
						|
</image>
 | 
						|
EOI
 | 
						|
    end
 | 
						|
 | 
						|
    def make_item(content=nil)
 | 
						|
      <<-EOI
 | 
						|
<item rdf:about="#{RDF_ABOUT}">
 | 
						|
  <title>#{TITLE_VALUE}</title>
 | 
						|
  <link>#{LINK_VALUE}</link>
 | 
						|
  <description>#{DESCRIPTION_VALUE}</description>
 | 
						|
#{block_given? ? yield : content}
 | 
						|
</item>
 | 
						|
EOI
 | 
						|
    end
 | 
						|
 | 
						|
    def make_textinput(content=nil)
 | 
						|
      <<-EOT
 | 
						|
<textinput rdf:about="#{RDF_ABOUT}">
 | 
						|
  <title>#{TITLE_VALUE}</title>
 | 
						|
  <description>#{DESCRIPTION_VALUE}</description>
 | 
						|
  <name>#{NAME_VALUE}</name>
 | 
						|
  <link>#{LINK_VALUE}</link>
 | 
						|
#{block_given? ? yield : content}
 | 
						|
</textinput>
 | 
						|
EOT
 | 
						|
    end
 | 
						|
 | 
						|
    def make_sample_RDF
 | 
						|
      make_RDF(<<-EOR)
 | 
						|
#{make_channel}
 | 
						|
#{make_image}
 | 
						|
#{make_item}
 | 
						|
#{make_textinput}
 | 
						|
EOR
 | 
						|
    end
 | 
						|
 | 
						|
    def make_rss20(content=nil, xmlns=[])
 | 
						|
      <<-EORSS
 | 
						|
#{make_xmldecl}
 | 
						|
<rss version="2.0"
 | 
						|
#{xmlns.collect {|pre, uri| "xmlns:#{pre}='#{uri}'"}.join(' ')}>
 | 
						|
#{block_given? ? yield : content}
 | 
						|
</rss>
 | 
						|
EORSS
 | 
						|
    end
 | 
						|
 | 
						|
    def make_sample_items20
 | 
						|
      RESOURCES.collect do |res|
 | 
						|
        elems = ["<link>#{res}</link>"]
 | 
						|
        elems << "<title>title of #{res}</title>"
 | 
						|
        elems = elems.join("\n")
 | 
						|
        "<item>\n#{elems}\n</item>"
 | 
						|
      end.join("\n")
 | 
						|
    end
 | 
						|
 | 
						|
    def make_channel20(content=nil)
 | 
						|
      <<-EOC
 | 
						|
<channel>
 | 
						|
  <title>#{TITLE_VALUE}</title>
 | 
						|
  <link>#{LINK_VALUE}</link>
 | 
						|
  <description>#{DESCRIPTION_VALUE}</description>
 | 
						|
  <language>#{LANGUAGE_VALUE}</language>
 | 
						|
 | 
						|
  <image>
 | 
						|
    <url>#{RDF_RESOURCE}</url>
 | 
						|
    <title>#{TITLE_VALUE}</title>
 | 
						|
    <link>#{LINK_VALUE}</link>
 | 
						|
  </image>
 | 
						|
 | 
						|
#{make_sample_items20}
 | 
						|
 | 
						|
  <textInput>
 | 
						|
    <title>#{TITLE_VALUE}</title>
 | 
						|
    <description>#{DESCRIPTION_VALUE}</description>
 | 
						|
    <name>#{NAME_VALUE}</name>
 | 
						|
    <link>#{RDF_RESOURCE}</link>
 | 
						|
  </textInput>
 | 
						|
 | 
						|
#{block_given? ? yield : content}
 | 
						|
</channel>
 | 
						|
EOC
 | 
						|
    end
 | 
						|
 | 
						|
    def make_item20(content=nil)
 | 
						|
      <<-EOI
 | 
						|
<item>
 | 
						|
  <title>#{TITLE_VALUE}</title>
 | 
						|
  <link>#{LINK_VALUE}</link>
 | 
						|
  <description>#{DESCRIPTION_VALUE}</description>
 | 
						|
#{block_given? ? yield : content}
 | 
						|
</item>
 | 
						|
EOI
 | 
						|
    end
 | 
						|
 | 
						|
    def make_cloud20
 | 
						|
      <<-EOC
 | 
						|
<cloud
 | 
						|
  domain="#{CLOUD_DOMAIN}"
 | 
						|
  port="#{CLOUD_PORT}"
 | 
						|
  path="#{CLOUD_PATH}"
 | 
						|
  registerProcedure="#{CLOUD_REGISTER_PROCEDURE}"
 | 
						|
  protocol="#{CLOUD_PROTOCOL}" />
 | 
						|
EOC
 | 
						|
    end
 | 
						|
 | 
						|
    def make_sample_rss20
 | 
						|
      make_rss20(<<-EOR)
 | 
						|
#{make_channel20}
 | 
						|
EOR
 | 
						|
    end
 | 
						|
 | 
						|
    def make_feed_without_entry(content=nil, xmlns=[])
 | 
						|
      <<-EOA
 | 
						|
<feed xmlns="#{Atom::URI}"
 | 
						|
#{xmlns.collect {|pre, uri| "xmlns:#{pre}='#{uri}'"}.join(' ')}>
 | 
						|
  <id>#{FEED_ID}</id>
 | 
						|
  <title>#{FEED_TITLE}</title>
 | 
						|
  <updated>#{FEED_UPDATED}</updated>
 | 
						|
  <author>
 | 
						|
    <name>#{FEED_AUTHOR_NAME}</name>
 | 
						|
  </author>
 | 
						|
#{block_given? ? yield : content}
 | 
						|
</feed>
 | 
						|
EOA
 | 
						|
    end
 | 
						|
 | 
						|
    def make_entry(content=nil)
 | 
						|
      <<-EOA
 | 
						|
  <entry>
 | 
						|
    <title>#{ENTRY_TITLE}</title>
 | 
						|
    <id>#{ENTRY_ID}</id>
 | 
						|
    <updated>#{ENTRY_UPDATED}</updated>
 | 
						|
#{block_given? ? yield : content}
 | 
						|
  </entry>
 | 
						|
EOA
 | 
						|
    end
 | 
						|
 | 
						|
    def make_feed_with_open_entry(content=nil, xmlns=[], &block)
 | 
						|
      make_feed_without_entry(<<-EOA, xmlns)
 | 
						|
#{make_entry(content, &block)}
 | 
						|
EOA
 | 
						|
    end
 | 
						|
 | 
						|
    def make_feed_with_open_entry_source(content=nil, xmlns=[])
 | 
						|
      make_feed_with_open_entry(<<-EOA, xmlns)
 | 
						|
  <source>
 | 
						|
#{block_given? ? yield : content}
 | 
						|
  </source>
 | 
						|
EOA
 | 
						|
    end
 | 
						|
 | 
						|
    def make_feed(content=nil, xmlns=[])
 | 
						|
      make_feed_without_entry(<<-EOA, xmlns)
 | 
						|
  <entry>
 | 
						|
    <title>#{ENTRY_TITLE}</title>
 | 
						|
    <link href="#{ENTRY_LINK}"/>
 | 
						|
    <id>#{ENTRY_ID}</id>
 | 
						|
    <updated>#{ENTRY_UPDATED}</updated>
 | 
						|
    <summary>#{ENTRY_SUMMARY}</summary>
 | 
						|
  </entry>
 | 
						|
#{block_given? ? yield : content}
 | 
						|
EOA
 | 
						|
    end
 | 
						|
 | 
						|
    def make_entry_document(content=nil, xmlns=[])
 | 
						|
      <<-EOA
 | 
						|
<entry xmlns="#{Atom::URI}"
 | 
						|
#{xmlns.collect {|pre, uri| "xmlns:#{pre}='#{uri}'"}.join(' ')}>
 | 
						|
  <id>#{ENTRY_ID}</id>
 | 
						|
  <title>#{ENTRY_TITLE}</title>
 | 
						|
  <updated>#{ENTRY_UPDATED}</updated>
 | 
						|
  <author>
 | 
						|
    <name>#{FEED_AUTHOR_NAME}</name>
 | 
						|
  </author>
 | 
						|
#{block_given? ? yield : content}
 | 
						|
</entry>
 | 
						|
EOA
 | 
						|
    end
 | 
						|
 | 
						|
    def make_entry_document_with_open_source(content=nil, xmlns=[])
 | 
						|
      make_entry_document(<<-EOA, xmlns)
 | 
						|
  <source>
 | 
						|
#{block_given? ? yield : content}
 | 
						|
  </source>
 | 
						|
EOA
 | 
						|
    end
 | 
						|
 | 
						|
    def make_element(elem_name, attrs, contents)
 | 
						|
      attrs_str = attrs.collect do |name, value|
 | 
						|
        "#{h name}='#{h value}'"
 | 
						|
      end.join(" ")
 | 
						|
      attrs_str = " #{attrs_str}" unless attrs_str.empty?
 | 
						|
 | 
						|
      if contents.is_a?(String)
 | 
						|
        contents_str = h(contents)
 | 
						|
      else
 | 
						|
        contents_str = contents.collect do |name, value|
 | 
						|
          "#{Element::INDENT}<#{h name}>#{h value}</#{h name}>"
 | 
						|
        end.join("\n")
 | 
						|
        contents_str = "\n#{contents_str}\n"
 | 
						|
      end
 | 
						|
 | 
						|
      "<#{h elem_name}#{attrs_str}>#{contents_str}</#{h elem_name}>"
 | 
						|
    end
 | 
						|
 | 
						|
    def xmlns_container(xmlns_decls, content)
 | 
						|
      attributes = xmlns_decls.collect do |prefix, uri|
 | 
						|
        "xmlns:#{h prefix}=\"#{h uri}\""
 | 
						|
      end.join(" ")
 | 
						|
      "<dummy #{attributes}>#{content}</dummy>"
 | 
						|
    end
 | 
						|
 | 
						|
    private
 | 
						|
    def setup_rss10(rdf)
 | 
						|
      assert_equal("", rdf.to_s)
 | 
						|
 | 
						|
      channel = RDF::Channel.new
 | 
						|
      assert_equal("", channel.to_s)
 | 
						|
      channel.about = "http://example.com/index.rdf"
 | 
						|
      channel.title = "title"
 | 
						|
      channel.link = "http://example.com/"
 | 
						|
      channel.description = "description"
 | 
						|
      assert_equal("", channel.to_s)
 | 
						|
 | 
						|
      item_title = "item title"
 | 
						|
      item_link = "http://example.com/item"
 | 
						|
      channel.items = RDF::Channel::Items.new
 | 
						|
      channel.items.Seq.lis << RDF::Channel::Items::Seq::Li.new(item_link)
 | 
						|
      assert_not_equal("", channel.to_s)
 | 
						|
 | 
						|
      rdf.channel = channel
 | 
						|
      assert_equal("", rdf.to_s)
 | 
						|
 | 
						|
      item = RDF::Item.new
 | 
						|
      item.title = item_title
 | 
						|
      item.link = item_link
 | 
						|
      item.about = item_link
 | 
						|
      rdf.items << item
 | 
						|
      assert_not_equal("", rdf.to_s)
 | 
						|
    end
 | 
						|
 | 
						|
    def setup_rss20(rss)
 | 
						|
      assert_equal("", rss.to_s)
 | 
						|
 | 
						|
      channel = Rss::Channel.new
 | 
						|
      assert_equal("", channel.to_s)
 | 
						|
      channel.title = "title"
 | 
						|
      channel.link = "http://example.com/"
 | 
						|
      channel.description = "description"
 | 
						|
      assert_not_equal("", channel.to_s)
 | 
						|
 | 
						|
      rss.channel = channel
 | 
						|
      assert_not_equal("", rss.to_s)
 | 
						|
    end
 | 
						|
 | 
						|
    def setup_dummy_channel(maker)
 | 
						|
      about = "http://hoge.com"
 | 
						|
      title = "fugafuga"
 | 
						|
      link = "http://hoge.com/feed.xml"
 | 
						|
      description = "fugafugafugafuga"
 | 
						|
      language = "ja"
 | 
						|
 | 
						|
      maker.channel.about = about
 | 
						|
      maker.channel.title = title
 | 
						|
      maker.channel.link = link
 | 
						|
      maker.channel.description = description
 | 
						|
      maker.channel.language = language
 | 
						|
    end
 | 
						|
 | 
						|
    def setup_dummy_channel_atom(maker)
 | 
						|
      updated = Time.now
 | 
						|
      author = "Foo"
 | 
						|
 | 
						|
      setup_dummy_channel(maker)
 | 
						|
      maker.channel.links.first.rel = "self"
 | 
						|
      maker.channel.links.first.type = "application/atom+xml"
 | 
						|
      maker.channel.updated = updated
 | 
						|
      maker.channel.author = author
 | 
						|
    end
 | 
						|
 | 
						|
    def setup_dummy_image(maker)
 | 
						|
      title = "fugafuga"
 | 
						|
      link = "http://hoge.com"
 | 
						|
      url = "http://hoge.com/hoge.png"
 | 
						|
 | 
						|
      maker.channel.link = link if maker.channel.link.nil?
 | 
						|
 | 
						|
      maker.image.title = title
 | 
						|
      maker.image.url = url
 | 
						|
    end
 | 
						|
 | 
						|
    def setup_dummy_textinput(maker)
 | 
						|
      title = "fugafuga"
 | 
						|
      description = "text hoge fuga"
 | 
						|
      name = "hoge"
 | 
						|
      link = "http://hoge.com/search.cgi"
 | 
						|
 | 
						|
      maker.textinput.title = title
 | 
						|
      maker.textinput.description = description
 | 
						|
      maker.textinput.name = name
 | 
						|
      maker.textinput.link = link
 | 
						|
    end
 | 
						|
 | 
						|
    def setup_dummy_item(maker)
 | 
						|
      title = "TITLE"
 | 
						|
      link = "http://hoge.com/"
 | 
						|
 | 
						|
      item = maker.items.new_item
 | 
						|
      item.title = title
 | 
						|
      item.link = link
 | 
						|
    end
 | 
						|
 | 
						|
    def setup_dummy_item_atom(maker)
 | 
						|
      setup_dummy_item(maker)
 | 
						|
 | 
						|
      item = maker.items.first
 | 
						|
      item.id = "http://example.net/xxx"
 | 
						|
      item.updated = Time.now
 | 
						|
    end
 | 
						|
 | 
						|
    def setup_taxo_topic(target, topics)
 | 
						|
      topics.each do |topic|
 | 
						|
        taxo_topic = target.taxo_topics.new_taxo_topic
 | 
						|
        topic.each do |name, value|
 | 
						|
          case name
 | 
						|
          when :link
 | 
						|
            taxo_topic.taxo_link = value
 | 
						|
          when :topics
 | 
						|
            value.each do |t|
 | 
						|
              taxo_topic.taxo_topics << t
 | 
						|
            end
 | 
						|
          else
 | 
						|
            dc_elems = taxo_topic.__send__("dc_#{name}s")
 | 
						|
            dc_elem = dc_elems.__send__("new_#{name}")
 | 
						|
            dc_elem.value = value
 | 
						|
          end
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |