rss 0.2.8 → 0.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/NEWS.md +16 -0
  3. data/Rakefile +8 -1
  4. data/lib/rss/itunes.rb +49 -1
  5. data/lib/rss/maker/itunes.rb +13 -0
  6. data/lib/rss/parser.rb +1 -1
  7. data/lib/rss/version.rb +1 -1
  8. data/rss.gemspec +6 -56
  9. data/test/dot.png +0 -0
  10. data/test/rss-assertions.rb +2116 -0
  11. data/test/rss-testcase.rb +479 -0
  12. data/test/run-test.rb +15 -0
  13. data/test/test_1.0.rb +308 -0
  14. data/test/test_2.0.rb +412 -0
  15. data/test/test_accessor.rb +104 -0
  16. data/test/test_atom.rb +684 -0
  17. data/test/test_content.rb +105 -0
  18. data/test/test_dublincore.rb +270 -0
  19. data/test/test_image.rb +215 -0
  20. data/test/test_inherit.rb +41 -0
  21. data/test/test_itunes.rb +360 -0
  22. data/test/test_maker_0.9.rb +477 -0
  23. data/test/test_maker_1.0.rb +519 -0
  24. data/test/test_maker_2.0.rb +758 -0
  25. data/test/test_maker_atom_entry.rb +394 -0
  26. data/test/test_maker_atom_feed.rb +455 -0
  27. data/test/test_maker_content.rb +48 -0
  28. data/test/test_maker_dc.rb +150 -0
  29. data/test/test_maker_image.rb +63 -0
  30. data/test/test_maker_itunes.rb +488 -0
  31. data/test/test_maker_slash.rb +38 -0
  32. data/test/test_maker_sy.rb +45 -0
  33. data/test/test_maker_taxo.rb +82 -0
  34. data/test/test_maker_trackback.rb +42 -0
  35. data/test/test_maker_xml-stylesheet.rb +84 -0
  36. data/test/test_parser.rb +122 -0
  37. data/test/test_parser_1.0.rb +529 -0
  38. data/test/test_parser_2.0.rb +123 -0
  39. data/test/test_parser_atom_entry.rb +164 -0
  40. data/test/test_parser_atom_feed.rb +277 -0
  41. data/test/test_setup_maker_0.9.rb +247 -0
  42. data/test/test_setup_maker_1.0.rb +551 -0
  43. data/test/test_setup_maker_2.0.rb +309 -0
  44. data/test/test_setup_maker_atom_entry.rb +410 -0
  45. data/test/test_setup_maker_atom_feed.rb +446 -0
  46. data/test/test_setup_maker_itunes.rb +146 -0
  47. data/test/test_setup_maker_slash.rb +39 -0
  48. data/test/test_slash.rb +65 -0
  49. data/test/test_syndication.rb +126 -0
  50. data/test/test_taxonomy.rb +173 -0
  51. data/test/test_to_s.rb +701 -0
  52. data/test/test_trackback.rb +136 -0
  53. data/test/test_xml-stylesheet.rb +109 -0
  54. metadata +109 -7
  55. data/.gitignore +0 -9
  56. data/.travis.yml +0 -26
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: false
2
+ require_relative "rss-testcase"
3
+
4
+ require "rss/maker"
5
+
6
+ module RSS
7
+ class TestMakerSlash < TestCase
8
+ def setup
9
+ @elements = {
10
+ "section" => "articles",
11
+ "department" => "not-an-ocean-unless-there-are-lobsters",
12
+ "comments" => 177,
13
+ "hit_parades" => [177, 155, 105, 33, 6, 3, 0],
14
+ }
15
+ end
16
+
17
+ def test_rss10
18
+ rss = RSS::Maker.make("1.0") do |maker|
19
+ setup_dummy_channel(maker)
20
+
21
+ setup_dummy_item(maker)
22
+ item = maker.items.last
23
+ @elements.each do |name, value|
24
+ item.send("slash_#{name}=", value)
25
+ end
26
+ end
27
+
28
+ item = rss.items.last
29
+ assert_not_nil(item)
30
+ assert_slash_elements(item)
31
+ end
32
+
33
+ private
34
+ def assert_slash_elements(target)
35
+ super(@elements, target)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: false
2
+ require_relative "rss-testcase"
3
+
4
+ require "rss/maker"
5
+
6
+ module RSS
7
+ class TestMakerSyndication < TestCase
8
+
9
+ def setup
10
+ @uri = "http://purl.org/rss/1.0/modules/syndication/"
11
+
12
+ t = Time.iso8601("2000-01-01T12:00:05+00:00")
13
+ class << t
14
+ alias_method(:to_s, :iso8601)
15
+ end
16
+
17
+ @elements = {
18
+ :updatePeriod => "hourly",
19
+ :updateFrequency => "2",
20
+ :updateBase => t,
21
+ }
22
+ end
23
+
24
+ def test_rss10
25
+ rss = RSS::Maker.make("1.0") do |maker|
26
+ setup_dummy_channel(maker)
27
+ set_elements(maker.channel)
28
+ setup_dummy_item(maker)
29
+ end
30
+ assert_syndication(@elements, rss.channel)
31
+ end
32
+
33
+ private
34
+ def accessor_name(name)
35
+ "sy_#{name}"
36
+ end
37
+
38
+ def set_elements(target)
39
+ @elements.each do |name, value|
40
+ target.__send__("#{accessor_name(name)}=", value)
41
+ end
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: false
2
+ require_relative "rss-testcase"
3
+
4
+ require "rss/maker"
5
+
6
+ module RSS
7
+ class TestMakerTaxonomy < TestCase
8
+
9
+ def setup
10
+ @uri = "http://purl.org/rss/1.0/modules/taxonomy/"
11
+
12
+ @resources = [
13
+ "http://meerkat.oreillynet.com/?c=cat23",
14
+ "http://meerkat.oreillynet.com/?c=47",
15
+ "http://dmoz.org/Computers/Data_Formats/Markup_Languages/XML/",
16
+ ]
17
+
18
+ @topics = [
19
+ {
20
+ :link => "http://meerkat.oreillynet.com/?c=cat23",
21
+ :title => "Data: XML",
22
+ :description => "A Meerkat channel",
23
+ },
24
+ {
25
+ :link => "http://dmoz.org/Computers/Data_Formats/Markup_Languages/XML/",
26
+ :title => "XML",
27
+ :subject => "XML",
28
+ :description => "DMOZ category",
29
+ :topics => [
30
+ "http://meerkat.oreillynet.com/?c=cat23",
31
+ "http://dmoz.org/Computers/Data_Formats/Markup_Languages/SGML/",
32
+ "http://dmoz.org/Computers/Programming/Internet/",
33
+ ]
34
+ },
35
+ ]
36
+ end
37
+
38
+ def test_rss10
39
+ rss = RSS::Maker.make("1.0") do |maker|
40
+ setup_dummy_channel(maker)
41
+ set_topics(maker.channel)
42
+
43
+ setup_dummy_item(maker)
44
+ set_topics(maker.items.last)
45
+
46
+ setup_taxo_topic(maker, @topics)
47
+ end
48
+ assert_equal(@resources, rss.channel.taxo_topics.resources)
49
+ assert_equal(@resources, rss.items.last.taxo_topics.resources)
50
+ assert_taxo_topic(@topics, rss)
51
+ end
52
+
53
+ def _test_date
54
+ t1 = Time.iso8601("2000-01-01T12:00:05+00:00")
55
+ t2 = Time.iso8601("2005-01-01T12:00:05+00:00")
56
+
57
+ rss = RSS::Maker.make("1.0") do |maker|
58
+ setup_dummy_channel(maker)
59
+ maker.channel.date = t1
60
+ maker.channel.dc_dates.new_date do |date|
61
+ date.value = t2
62
+ end
63
+
64
+ setup_dummy_item(maker)
65
+ item = maker.items.last
66
+ item.date = t2
67
+ item.dc_dates.new_date do |date|
68
+ date.value = t1
69
+ end
70
+ end
71
+ assert_equal([t1, t2], rss.channel.dc_dates.collect{|x| x.value})
72
+ assert_equal([t2, t1], rss.items.last.dc_dates.collect{|x| x.value})
73
+ end
74
+
75
+ private
76
+ def set_topics(target, resources=@resources)
77
+ resources.each do |value|
78
+ target.taxo_topics << value
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: false
2
+ require_relative "rss-testcase"
3
+
4
+ require "rss/maker"
5
+
6
+ module RSS
7
+ class TestMakerTrackBack < TestCase
8
+
9
+ def setup
10
+ @uri = "http://madskills.com/public/xml/rss/module/trackback/"
11
+
12
+ @elements = {
13
+ :ping => "http://bar.com/tb.cgi?tb_id=rssplustrackback",
14
+ :abouts => [
15
+ "http://foo.com/trackback/tb.cgi?tb_id=20020923",
16
+ "http://bar.com/trackback/tb.cgi?tb_id=20041114",
17
+ ],
18
+ }
19
+ end
20
+
21
+ def test_rss10
22
+ rss = RSS::Maker.make("1.0") do |maker|
23
+ setup_dummy_channel(maker)
24
+
25
+ setup_dummy_item(maker)
26
+ item = maker.items.last
27
+ item.trackback_ping = @elements[:ping]
28
+ @elements[:abouts].each do |about|
29
+ item.trackback_abouts.new_about do |new_about|
30
+ new_about.value = about
31
+ end
32
+ end
33
+ end
34
+ assert_trackback(@elements, rss.items.last)
35
+ end
36
+
37
+ private
38
+ def accessor_name(name)
39
+ "trackback_#{name}"
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: false
2
+ require_relative "rss-testcase"
3
+
4
+ require "rss/maker"
5
+
6
+ module RSS
7
+ class TestMakerXMLStyleSheet < TestCase
8
+
9
+ def test_xml_stylesheet
10
+ href = 'a.xsl'
11
+ type = 'text/xsl'
12
+ title = 'sample'
13
+ media = 'printer'
14
+ charset = 'UTF-8'
15
+ alternate = 'yes'
16
+
17
+ rss = RSS::Maker.make("1.0") do |maker|
18
+ maker.xml_stylesheets.new_xml_stylesheet do |xss|
19
+ xss.href = href
20
+ xss.type = type
21
+ xss.title = title
22
+ xss.media = media
23
+ xss.charset = charset
24
+ xss.alternate = alternate
25
+ end
26
+
27
+ setup_dummy_channel(maker)
28
+ setup_dummy_item(maker)
29
+ end
30
+
31
+ xss = rss.xml_stylesheets.first
32
+ assert_equal(href, xss.href)
33
+ assert_equal(type, xss.type)
34
+ assert_equal(title, xss.title)
35
+ assert_equal(media, xss.media)
36
+ assert_equal(charset, xss.charset)
37
+ assert_equal(alternate, xss.alternate)
38
+
39
+
40
+ href = 'http://example.com/index.xsl'
41
+ type = 'text/xsl'
42
+ rss = RSS::Maker.make("1.0") do |maker|
43
+ maker.xml_stylesheets.new_xml_stylesheet do |_xss|
44
+ _xss.href = href
45
+ end
46
+
47
+ setup_dummy_channel(maker)
48
+ setup_dummy_item(maker)
49
+ end
50
+
51
+ xss = rss.xml_stylesheets.first
52
+ assert_equal(href, xss.href)
53
+ assert_equal(type, xss.type)
54
+ end
55
+
56
+ def test_not_valid_xml_stylesheet
57
+ href = 'xss.XXX'
58
+ type = "text/xsl"
59
+
60
+ rss = RSS::Maker.make("1.0") do |maker|
61
+ maker.xml_stylesheets.new_xml_stylesheet do |xss|
62
+ # xss.href = href
63
+ xss.type = type
64
+ end
65
+
66
+ setup_dummy_channel(maker)
67
+ setup_dummy_item(maker)
68
+ end
69
+ assert(rss.xml_stylesheets.empty?)
70
+
71
+ rss = RSS::Maker.make("1.0") do |maker|
72
+ maker.xml_stylesheets.new_xml_stylesheet do |xss|
73
+ xss.href = href
74
+ # xss.type = type
75
+ end
76
+
77
+ setup_dummy_channel(maker)
78
+ setup_dummy_item(maker)
79
+ end
80
+ assert(rss.xml_stylesheets.empty?)
81
+ end
82
+
83
+ end
84
+ end
@@ -0,0 +1,122 @@
1
+ # frozen_string_literal: false
2
+ require "tempfile"
3
+
4
+ require_relative "rss-testcase"
5
+
6
+ require "rss/1.0"
7
+ require "rss/dublincore"
8
+
9
+ module RSS
10
+ class TestParser < TestCase
11
+ def setup
12
+ @_default_parser = Parser.default_parser
13
+ @rss10 = make_RDF(<<-EOR)
14
+ #{make_channel}
15
+ #{make_item}
16
+ #{make_textinput}
17
+ #{make_image}
18
+ EOR
19
+ @rss_tmp = Tempfile.new(%w"rss10- .rdf")
20
+ @rss_tmp.print(@rss10)
21
+ @rss_tmp.close
22
+ @rss_file = @rss_tmp.path
23
+ @rss_file.untaint if RUBY_VERSION < '2.7'
24
+ end
25
+
26
+ def teardown
27
+ Parser.default_parser = @_default_parser
28
+ @rss_tmp.close(true)
29
+ end
30
+
31
+ def test_default_parser
32
+ assert_nothing_raised do
33
+ Parser.default_parser = RSS::AVAILABLE_PARSERS.first
34
+ end
35
+
36
+ assert_raise(RSS::NotValidXMLParser) do
37
+ Parser.default_parser = RSS::Parser
38
+ end
39
+ end
40
+
41
+ def test_parse
42
+ assert_not_nil(RSS::Parser.parse(@rss_file))
43
+
44
+ garbage_rss_file = @rss_file + "-garbage"
45
+ if RSS::Parser.default_parser.name == "RSS::XMLParserParser"
46
+ assert_raise(RSS::NotWellFormedError) do
47
+ RSS::Parser.parse(garbage_rss_file)
48
+ end
49
+ else
50
+ assert_nil(RSS::Parser.parse(garbage_rss_file))
51
+ end
52
+ end
53
+
54
+ def test_parse_tag_includes_hyphen
55
+ assert_nothing_raised do
56
+ RSS::Parser.parse(make_RDF(<<-EOR))
57
+ <xCal:x-calconnect-venue xmlns:xCal="urn:ietf:params:xml:ns:xcal" />
58
+ #{make_channel}
59
+ #{make_item}
60
+ #{make_textinput}
61
+ #{make_image}
62
+ EOR
63
+ end
64
+ end
65
+
66
+ def test_parse_option_validate_nil
67
+ assert_raise(RSS::MissingTagError) do
68
+ RSS::Parser.parse(make_RDF(<<-RDF), :validate => nil)
69
+ RDF
70
+ end
71
+ end
72
+
73
+ def test_parse_option_validate_true
74
+ assert_raise(RSS::MissingTagError) do
75
+ RSS::Parser.parse(make_RDF(<<-RDF), :validate => true)
76
+ RDF
77
+ end
78
+ end
79
+
80
+ def test_parse_option_validate_false
81
+ rdf = RSS::Parser.parse(make_RDF(<<-RDF), :validate => false)
82
+ RDF
83
+ assert_nil(rdf.channel)
84
+ end
85
+
86
+ def test_parse_option_ignore_unknown_element_nil
87
+ assert_nothing_raised do
88
+ RSS::Parser.parse(make_RDF(<<-RDF), :ignore_unknown_element => nil)
89
+ <unknown/>
90
+ #{make_channel}
91
+ #{make_item}
92
+ #{make_textinput}
93
+ #{make_image}
94
+ RDF
95
+ end
96
+ end
97
+
98
+ def test_parse_option_ignore_unknown_element_true
99
+ assert_nothing_raised do
100
+ RSS::Parser.parse(make_RDF(<<-RDF), :ignore_unknown_element => true)
101
+ <unknown/>
102
+ #{make_channel}
103
+ #{make_item}
104
+ #{make_textinput}
105
+ #{make_image}
106
+ RDF
107
+ end
108
+ end
109
+
110
+ def test_parse_option_ignore_unknown_element_false
111
+ assert_raise(RSS::NotExpectedTagError) do
112
+ RSS::Parser.parse(make_RDF(<<-RDF), :ignore_unknown_element => false)
113
+ <unknown/>
114
+ #{make_channel}
115
+ #{make_item}
116
+ #{make_textinput}
117
+ #{make_image}
118
+ RDF
119
+ end
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,529 @@
1
+ # frozen_string_literal: false
2
+ require_relative "rss-testcase"
3
+
4
+ require "rss/1.0"
5
+ require "rss/dublincore"
6
+
7
+ module RSS
8
+ class TestParser10 < TestCase
9
+ def test_RDF
10
+ assert_ns("", RDF::URI) do
11
+ Parser.parse(<<-EOR)
12
+ #{make_xmldecl}
13
+ <RDF/>
14
+ EOR
15
+ end
16
+
17
+ assert_ns("", RDF::URI) do
18
+ Parser.parse(<<-EOR)
19
+ #{make_xmldecl}
20
+ <RDF xmlns="hoge"/>
21
+ EOR
22
+ end
23
+
24
+ assert_ns("rdf", RDF::URI) do
25
+ Parser.parse(<<-EOR)
26
+ #{make_xmldecl}
27
+ <rdf:RDF xmlns:rdf="hoge"/>
28
+ EOR
29
+ end
30
+
31
+ assert_parse(<<-EOR, :missing_tag, "channel", "RDF")
32
+ #{make_xmldecl}
33
+ <rdf:RDF xmlns:rdf="#{RSS::RDF::URI}"/>
34
+ EOR
35
+
36
+ assert_parse(<<-EOR, :missing_tag, "channel", "RDF")
37
+ #{make_xmldecl}
38
+ <RDF xmlns="#{RSS::RDF::URI}"/>
39
+ EOR
40
+
41
+ assert_parse(<<-EOR, :missing_tag, "channel", "RDF")
42
+ #{make_xmldecl}
43
+ <RDF xmlns="#{RSS::RDF::URI}"/>
44
+ EOR
45
+
46
+ assert_parse(make_RDF(<<-EOR), :missing_tag, "item", "RDF")
47
+ #{make_channel}
48
+ EOR
49
+
50
+ assert_parse(make_RDF(<<-EOR), :missing_tag, "item", "RDF")
51
+ #{make_channel}
52
+ #{make_image}
53
+ EOR
54
+
55
+ assert_parse(make_RDF(<<-EOR), :missing_tag, "item", "RDF")
56
+ #{make_channel}
57
+ #{make_textinput}
58
+ EOR
59
+
60
+ assert_too_much_tag("image", "RDF") do
61
+ Parser.parse(make_RDF(<<-EOR))
62
+ #{make_channel}
63
+ #{make_image}
64
+ #{make_image}
65
+ #{make_item}
66
+ #{make_textinput}
67
+ EOR
68
+ end
69
+
70
+ assert_parse(make_RDF(<<-EOR), :nothing_raised)
71
+ #{make_channel}
72
+ #{make_item}
73
+ #{make_image}
74
+ #{make_textinput}
75
+ EOR
76
+
77
+ assert_parse(make_RDF(<<-EOR), :nothing_raised)
78
+ #{make_channel}
79
+ #{make_item}
80
+ #{make_textinput}
81
+ #{make_image}
82
+ EOR
83
+
84
+ assert_parse(make_RDF(<<-EOR), :nothing_raised)
85
+ #{make_channel}
86
+ #{make_image}
87
+ #{make_item}
88
+ EOR
89
+
90
+ assert_parse(make_RDF(<<-EOR), :nothing_raised)
91
+ #{make_channel}
92
+ #{make_image}
93
+ #{make_item}
94
+ #{make_textinput}
95
+ EOR
96
+
97
+ 1.step(15, 3) do |i|
98
+ rss = make_RDF() do
99
+ res = make_channel
100
+ i.times { res << make_item }
101
+ res
102
+ end
103
+ assert_parse(rss, :nothing_raised)
104
+ end
105
+ end
106
+
107
+ def test_undefined_entity
108
+ return unless RSS::Parser.default_parser.raise_for_undefined_entity?
109
+ assert_parse(make_RDF(<<-EOR), :raises, RSS::NotWellFormedError)
110
+ #{make_channel}
111
+ #{make_image}
112
+ <item rdf:about="#{RDF_ABOUT}">
113
+ <title>#{TITLE_VALUE} &UNKNOWN_ENTITY;</title>
114
+ <link>#{LINK_VALUE}</link>
115
+ <description>#{DESCRIPTION_VALUE}</description>
116
+ </item>
117
+ #{make_textinput}
118
+ EOR
119
+ end
120
+
121
+ def test_channel
122
+ assert_parse(make_RDF(<<-EOR), :missing_attribute, "channel", "rdf:about")
123
+ <channel />
124
+ EOR
125
+
126
+ assert_parse(make_RDF(<<-EOR), :missing_tag, "title", "channel")
127
+ <channel rdf:about="http://example.com/"/>
128
+ EOR
129
+
130
+ assert_parse(make_RDF(<<-EOR), :missing_tag, "link", "channel")
131
+ <channel rdf:about="http://example.com/">
132
+ <title>hoge</title>
133
+ </channel>
134
+ EOR
135
+
136
+ assert_parse(make_RDF(<<EOR), :missing_tag, "description", "channel")
137
+ <channel rdf:about="http://example.com/">
138
+ <title>hoge</title>
139
+ <link>http://example.com/</link>
140
+ </channel>
141
+ EOR
142
+
143
+ assert_parse(make_RDF(<<-EOR), :missing_tag, "items", "channel")
144
+ <channel rdf:about="http://example.com/">
145
+ <title>hoge</title>
146
+ <link>http://example.com/</link>
147
+ <description>hogehoge</description>
148
+ </channel>
149
+ EOR
150
+
151
+ assert_parse(make_RDF(<<-EOR), :missing_attribute, "image", "rdf:resource")
152
+ <channel rdf:about="http://example.com/">
153
+ <title>hoge</title>
154
+ <link>http://example.com/</link>
155
+ <description>hogehoge</description>
156
+ <image/>
157
+ </channel>
158
+ EOR
159
+
160
+ assert_parse(make_RDF(<<-EOR), :missing_tag, "items", "channel")
161
+ <channel rdf:about="http://example.com/">
162
+ <title>hoge</title>
163
+ <link>http://example.com/</link>
164
+ <description>hogehoge</description>
165
+ <image rdf:resource="http://example.com/hoge.png" />
166
+ </channel>
167
+ EOR
168
+
169
+ rss = make_RDF(<<-EOR)
170
+ <channel rdf:about="http://example.com/">
171
+ <title>hoge</title>
172
+ <link>http://example.com/</link>
173
+ <description>hogehoge</description>
174
+ <image rdf:resource="http://example.com/hoge.png" />
175
+ <items/>
176
+ </channel>
177
+ EOR
178
+
179
+ assert_missing_tag("Seq", "items") do
180
+ Parser.parse(rss)
181
+ end
182
+
183
+ assert_missing_tag("item", "RDF") do
184
+ Parser.parse(rss, false).validate
185
+ end
186
+
187
+ assert_parse(make_RDF(<<-EOR), :missing_tag, "item", "RDF")
188
+ <channel rdf:about="http://example.com/">
189
+ <title>hoge</title>
190
+ <link>http://example.com/</link>
191
+ <description>hogehoge</description>
192
+ <image rdf:resource="http://example.com/hoge.png" />
193
+ <items>
194
+ <rdf:Seq>
195
+ </rdf:Seq>
196
+ </items>
197
+ </channel>
198
+ EOR
199
+
200
+ assert_parse(make_RDF(<<-EOR), :missing_attribute, "textinput", "rdf:resource")
201
+ <channel rdf:about="http://example.com/">
202
+ <title>hoge</title>
203
+ <link>http://example.com/</link>
204
+ <description>hogehoge</description>
205
+ <image rdf:resource="http://example.com/hoge.png" />
206
+ <items>
207
+ <rdf:Seq>
208
+ </rdf:Seq>
209
+ </items>
210
+ <textinput/>
211
+ </channel>
212
+ EOR
213
+
214
+ assert_parse(make_RDF(<<-EOR), :missing_tag, "item", "RDF")
215
+ <channel rdf:about="http://example.com/">
216
+ <title>hoge</title>
217
+ <link>http://example.com/</link>
218
+ <description>hogehoge</description>
219
+ <image rdf:resource="http://example.com/hoge.png" />
220
+ <items>
221
+ <rdf:Seq>
222
+ </rdf:Seq>
223
+ </items>
224
+ <textinput rdf:resource="http://example.com/search" />
225
+ </channel>
226
+ EOR
227
+ end
228
+
229
+ def test_rdf_li
230
+ rss = make_RDF(<<-EOR)
231
+ <channel rdf:about="http://example.com/">
232
+ <title>hoge</title>
233
+ <link>http://example.com/</link>
234
+ <description>hogehoge</description>
235
+ <image rdf:resource="http://example.com/hoge.png" />
236
+ <items>
237
+ <rdf:Seq>
238
+ <rdf:li \#{rdf_li_attr}/>
239
+ </rdf:Seq>
240
+ </items>
241
+ <textinput rdf:resource="http://example.com/search" />
242
+ </channel>
243
+ #{make_item}
244
+ EOR
245
+
246
+ source = Proc.new do |rdf_li_attr|
247
+ eval(%Q[%Q[#{rss}]], binding)
248
+ end
249
+
250
+ attr = %q[resource="http://example.com/hoge"]
251
+ assert_parse(source.call(attr), :nothing_raised)
252
+
253
+ attr = %q[rdf:resource="http://example.com/hoge"]
254
+ assert_parse(source.call(attr), :nothing_raised)
255
+
256
+ assert_parse(source.call(""), :missing_attribute, "li", "resource")
257
+ end
258
+
259
+ def test_image
260
+ assert_parse(make_RDF(<<-EOR), :missing_attribute, "image", "rdf:about")
261
+ #{make_channel}
262
+ <image>
263
+ </image>
264
+ EOR
265
+
266
+ assert_parse(make_RDF(<<-EOR), :missing_tag, "title", "image")
267
+ #{make_channel}
268
+ <image rdf:about="http://example.com/hoge.png">
269
+ </image>
270
+ EOR
271
+
272
+ assert_parse(make_RDF(<<-EOR), :missing_tag, "url", "image")
273
+ #{make_channel}
274
+ <image rdf:about="http://example.com/hoge.png">
275
+ <title>hoge</title>
276
+ </image>
277
+ EOR
278
+
279
+ assert_parse(make_RDF(<<-EOR), :missing_tag, "link", "image")
280
+ #{make_channel}
281
+ <image rdf:about="http://example.com/hoge.png">
282
+ <title>hoge</title>
283
+ <url>http://example.com/hoge.png</url>
284
+ </image>
285
+ EOR
286
+
287
+ assert_parse(make_RDF(<<-EOR), :missing_tag, "item", "RDF")
288
+ #{make_channel}
289
+ <image rdf:about="http://example.com/hoge.png">
290
+ <title>hoge</title>
291
+ <url>http://example.com/hoge.png</url>
292
+ <link>http://example.com/</link>
293
+ </image>
294
+ EOR
295
+
296
+ rss = make_RDF(<<-EOR)
297
+ #{make_channel}
298
+ <image rdf:about="http://example.com/hoge.png">
299
+ <link>http://example.com/</link>
300
+ <url>http://example.com/hoge.png</url>
301
+ <title>hoge</title>
302
+ </image>
303
+ EOR
304
+
305
+ assert_missing_tag("item", "RDF") do
306
+ Parser.parse(rss)
307
+ end
308
+
309
+ assert_missing_tag("item", "RDF") do
310
+ Parser.parse(rss, false).validate
311
+ end
312
+ end
313
+
314
+ def test_item
315
+ assert_parse(make_RDF(<<-EOR), :missing_attribute, "item", "rdf:about")
316
+ #{make_channel}
317
+ #{make_image}
318
+ <item>
319
+ </item>
320
+ EOR
321
+
322
+ assert_parse(make_RDF(<<-EOR), :missing_tag, "title", "item")
323
+ #{make_channel}
324
+ #{make_image}
325
+ <item rdf:about="http://example.com/hoge.html">
326
+ </item>
327
+ EOR
328
+
329
+ assert_parse(make_RDF(<<-EOR), :missing_tag, "link", "item")
330
+ #{make_channel}
331
+ #{make_image}
332
+ <item rdf:about="http://example.com/hoge.html">
333
+ <title>hoge</title>
334
+ </item>
335
+ EOR
336
+
337
+ assert_too_much_tag("title", "item") do
338
+ Parser.parse(make_RDF(<<-EOR))
339
+ #{make_channel}
340
+ #{make_image}
341
+ <item rdf:about="http://example.com/hoge.html">
342
+ <title>hoge</title>
343
+ <title>hoge</title>
344
+ <link>http://example.com/hoge.html</link>
345
+ </item>
346
+ EOR
347
+ end
348
+
349
+ assert_parse(make_RDF(<<-EOR), :nothing_raised)
350
+ #{make_channel}
351
+ #{make_image}
352
+ <item rdf:about="http://example.com/hoge.html">
353
+ <title>hoge</title>
354
+ <link>http://example.com/hoge.html</link>
355
+ </item>
356
+ EOR
357
+
358
+ assert_parse(make_RDF(<<-EOR), :nothing_raised)
359
+ #{make_channel}
360
+ #{make_image}
361
+ <item rdf:about="http://example.com/hoge.html">
362
+ <title>hoge</title>
363
+ <link>http://example.com/hoge.html</link>
364
+ <description>hogehoge</description>
365
+ </item>
366
+ EOR
367
+ end
368
+
369
+ def test_textinput
370
+ assert_parse(make_RDF(<<-EOR), :missing_attribute, "textinput", "rdf:about")
371
+ #{make_channel}
372
+ #{make_image}
373
+ #{make_item}
374
+ <textinput>
375
+ </textinput>
376
+ EOR
377
+
378
+ assert_parse(make_RDF(<<-EOR), :missing_tag, "title", "textinput")
379
+ #{make_channel}
380
+ #{make_image}
381
+ #{make_item}
382
+ <textinput rdf:about="http://example.com/search.html">
383
+ </textinput>
384
+ EOR
385
+
386
+ assert_parse(make_RDF(<<-EOR), :missing_tag, "description", "textinput")
387
+ #{make_channel}
388
+ #{make_image}
389
+ #{make_item}
390
+ <textinput rdf:about="http://example.com/search.html">
391
+ <title>hoge</title>
392
+ </textinput>
393
+ EOR
394
+
395
+ assert_too_much_tag("title", "textinput") do
396
+ Parser.parse(make_RDF(<<-EOR))
397
+ #{make_channel}
398
+ #{make_image}
399
+ #{make_item}
400
+ <textinput rdf:about="http://example.com/search.html">
401
+ <title>hoge</title>
402
+ <title>hoge</title>
403
+ <description>hogehoge</description>
404
+ </textinput>
405
+ EOR
406
+ end
407
+
408
+ assert_parse(make_RDF(<<-EOR), :missing_tag, "name", "textinput")
409
+ #{make_channel}
410
+ #{make_image}
411
+ #{make_item}
412
+ <textinput rdf:about="http://example.com/search.html">
413
+ <title>hoge</title>
414
+ <description>hogehoge</description>
415
+ </textinput>
416
+ EOR
417
+
418
+ assert_parse(make_RDF(<<-EOR), :missing_tag, "link", "textinput")
419
+ #{make_channel}
420
+ #{make_image}
421
+ #{make_item}
422
+ <textinput rdf:about="http://example.com/search.html">
423
+ <title>hoge</title>
424
+ <description>hogehoge</description>
425
+ <name>key</name>
426
+ </textinput>
427
+ EOR
428
+
429
+ assert_parse(make_RDF(<<-EOR), :nothing_raised)
430
+ #{make_channel}
431
+ #{make_image}
432
+ #{make_item}
433
+ <textinput rdf:about="http://example.com/search.html">
434
+ <title>hoge</title>
435
+ <description>hogehoge</description>
436
+ <name>key</name>
437
+ <link>http://example.com/search.html</link>
438
+ </textinput>
439
+ EOR
440
+ end
441
+
442
+ def test_ignore
443
+ name = "a"
444
+ rss = make_RDF(<<-EOR)
445
+ #{make_channel}
446
+ #{make_item}
447
+ <#{name}/>
448
+ EOR
449
+ assert_not_expected_tag(name, ::RSS::URI, "RDF") do
450
+ Parser.parse(rss, true, false)
451
+ end
452
+
453
+ uri = ""
454
+ name = "a"
455
+ rss = make_RDF(<<-EOR)
456
+ #{make_channel}
457
+ #{make_item}
458
+ <#{name} xmlns=""/>
459
+ EOR
460
+ assert_parse(rss, :nothing_raised)
461
+ assert_not_expected_tag(name, uri, "RDF") do
462
+ Parser.parse(rss, true, false)
463
+ end
464
+
465
+ uri = "http://example.com/"
466
+ name = "a"
467
+ rss = make_RDF(<<-EOR)
468
+ #{make_channel}
469
+ #{make_item}
470
+ <x:#{name} xmlns:x="#{uri}"/>
471
+ EOR
472
+ assert_parse(rss, :nothing_raised)
473
+ assert_not_expected_tag(name, uri, "RDF") do
474
+ Parser.parse(rss, true, false)
475
+ end
476
+
477
+ uri = ::RSS::URI
478
+ name = "a"
479
+ rss = make_RDF(<<-EOR)
480
+ #{make_channel}
481
+ #{make_item}
482
+ #{make_image("<#{name}/>")}
483
+ EOR
484
+ assert_parse(rss, :nothing_raised)
485
+ assert_not_expected_tag(name, uri, "image") do
486
+ Parser.parse(rss, true, false)
487
+ end
488
+
489
+ uri = CONTENT_URI
490
+ name = "encoded"
491
+ elem = "<#{name} xmlns='#{uri}'/>"
492
+ rss = make_RDF(<<-EOR)
493
+ #{make_channel}
494
+ #{make_item}
495
+ #{make_image(elem)}
496
+ EOR
497
+ assert_parse(rss, :nothing_raised)
498
+ assert_not_expected_tag(name, uri, "image") do
499
+ Parser.parse(rss, true, false)
500
+ end
501
+ end
502
+
503
+ def test_unknown_duplicated_element
504
+ xmlns = {"test" => "http://localhost/test"}
505
+ assert_parse(make_RDF(<<-EOR, xmlns), :nothing_raised)
506
+ #{make_channel("<test:string/>")}
507
+ #{make_item}
508
+ #{make_image}
509
+ EOR
510
+ end
511
+
512
+ def test_unknown_case_insensitive_duplicated_element
513
+ xmlns = {
514
+ "foaf" => "http://xmlns.com/foaf/0.1/",
515
+ "dc" => "http://purl.org/dc/elements/1.1/",
516
+ }
517
+ assert_parse(make_RDF(<<-EOR, xmlns), :nothing_raised)
518
+ #{make_channel}
519
+ #{make_item}
520
+ #{make_image}
521
+ <foaf:Image rdf:about="http://example.com/myself.png">
522
+ <dc:title>Myself</dc:title>
523
+ <dc:link>http://example.com/</dc:link>
524
+ </foaf:Image>
525
+ EOR
526
+ end
527
+ end
528
+ end
529
+