rss 0.2.8 → 0.2.9

Sign up to get free protection for your applications and to get access to all the features.
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
+