rss-nokogiri 0.0.1

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 (58) hide show
  1. data/.gemtest +0 -0
  2. data/.gitignore +19 -0
  3. data/.gitmodules +3 -0
  4. data/BSDL +22 -0
  5. data/COPYING +56 -0
  6. data/COPYING.ja +51 -0
  7. data/Gemfile +4 -0
  8. data/LEGAL +8 -0
  9. data/README.markdown +51 -0
  10. data/Rakefile +12 -0
  11. data/lib/rss/nokogiri.rb +92 -0
  12. data/rss-nokogiri.gemspec +24 -0
  13. data/test/regression/dot.png +0 -0
  14. data/test/regression/rss-assertions.rb +2090 -0
  15. data/test/regression/rss-testcase.rb +478 -0
  16. data/test/regression/test_1.0.rb +295 -0
  17. data/test/regression/test_2.0.rb +409 -0
  18. data/test/regression/test_accessor.rb +103 -0
  19. data/test/regression/test_atom.rb +681 -0
  20. data/test/regression/test_content.rb +104 -0
  21. data/test/regression/test_dublincore.rb +279 -0
  22. data/test/regression/test_image.rb +214 -0
  23. data/test/regression/test_inherit.rb +40 -0
  24. data/test/regression/test_itunes.rb +347 -0
  25. data/test/regression/test_maker_0.9.rb +474 -0
  26. data/test/regression/test_maker_1.0.rb +516 -0
  27. data/test/regression/test_maker_2.0.rb +757 -0
  28. data/test/regression/test_maker_atom_entry.rb +393 -0
  29. data/test/regression/test_maker_atom_feed.rb +454 -0
  30. data/test/regression/test_maker_content.rb +47 -0
  31. data/test/regression/test_maker_dc.rb +149 -0
  32. data/test/regression/test_maker_image.rb +62 -0
  33. data/test/regression/test_maker_itunes.rb +471 -0
  34. data/test/regression/test_maker_slash.rb +37 -0
  35. data/test/regression/test_maker_sy.rb +44 -0
  36. data/test/regression/test_maker_taxo.rb +81 -0
  37. data/test/regression/test_maker_trackback.rb +41 -0
  38. data/test/regression/test_maker_xml-stylesheet.rb +83 -0
  39. data/test/regression/test_parser.rb +62 -0
  40. data/test/regression/test_parser_1.0.rb +528 -0
  41. data/test/regression/test_parser_2.0.rb +122 -0
  42. data/test/regression/test_parser_atom_entry.rb +163 -0
  43. data/test/regression/test_parser_atom_feed.rb +276 -0
  44. data/test/regression/test_setup_maker_0.9.rb +246 -0
  45. data/test/regression/test_setup_maker_1.0.rb +550 -0
  46. data/test/regression/test_setup_maker_2.0.rb +308 -0
  47. data/test/regression/test_setup_maker_atom_entry.rb +409 -0
  48. data/test/regression/test_setup_maker_atom_feed.rb +445 -0
  49. data/test/regression/test_setup_maker_itunes.rb +144 -0
  50. data/test/regression/test_setup_maker_slash.rb +38 -0
  51. data/test/regression/test_slash.rb +64 -0
  52. data/test/regression/test_syndication.rb +125 -0
  53. data/test/regression/test_taxonomy.rb +172 -0
  54. data/test/regression/test_to_s.rb +670 -0
  55. data/test/regression/test_trackback.rb +135 -0
  56. data/test/regression/test_version.rb +9 -0
  57. data/test/regression/test_xml-stylesheet.rb +108 -0
  58. metadata +220 -0
@@ -0,0 +1,295 @@
1
+ require "rexml/document"
2
+
3
+ require "rss-testcase"
4
+
5
+ require "rss/1.0"
6
+
7
+ module RSS
8
+ class TestRSS10Core < TestCase
9
+
10
+ def setup
11
+ @rdf_prefix = "rdf"
12
+ @rdf_uri = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
13
+ @uri = "http://purl.org/rss/1.0/"
14
+ end
15
+
16
+ def test_RDF
17
+ version = "1.0"
18
+ encoding = "UTF-8"
19
+ standalone = false
20
+
21
+ rdf = RDF.new(version, encoding, standalone)
22
+ setup_rss10(rdf)
23
+ doc = REXML::Document.new(rdf.to_s)
24
+
25
+ xmldecl = doc.xml_decl
26
+
27
+ assert_equal(version, xmldecl.version)
28
+ assert_equal(encoding, xmldecl.encoding.to_s)
29
+ assert_equal(standalone, !xmldecl.standalone.nil?)
30
+
31
+ assert_equal(@rdf_uri, doc.root.namespace)
32
+ end
33
+
34
+ def test_not_displayed_xml_stylesheets
35
+ rdf = RDF.new()
36
+ plain_rdf = rdf.to_s
37
+ 3.times do
38
+ rdf.xml_stylesheets.push(XMLStyleSheet.new)
39
+ assert_equal(plain_rdf, rdf.to_s)
40
+ end
41
+ end
42
+
43
+ def test_xml_stylesheets
44
+ [
45
+ [{:href => "a.xsl", :type => "text/xsl"}],
46
+ [
47
+ {:href => "a.xsl", :type => "text/xsl"},
48
+ {:href => "a.css", :type => "text/css"},
49
+ ],
50
+ ].each do |attrs_ary|
51
+ assert_xml_stylesheet_pis(attrs_ary)
52
+ end
53
+ end
54
+
55
+ def test_channel
56
+ about = "http://hoge.com"
57
+ title = "fugafuga"
58
+ link = "http://hoge.com"
59
+ description = "fugafugafugafuga"
60
+ resource = "http://hoge.com/hoge.png"
61
+
62
+ item_title = "item title"
63
+ item_link = "http://hoge.com/item"
64
+
65
+ image = RDF::Channel::Image.new(resource)
66
+ items = RDF::Channel::Items.new
67
+ items.Seq.lis << items.class::Seq::Li.new(item_link)
68
+ textinput = RDF::Channel::Textinput.new(resource)
69
+
70
+ rss_item = RDF::Item.new
71
+ rss_item.title = item_title
72
+ rss_item.link = item_link
73
+ rss_item.about = item_link
74
+
75
+ channel = RDF::Channel.new(about)
76
+ %w(title link description image items textinput).each do |x|
77
+ channel.__send__("#{x}=", instance_eval(x))
78
+ end
79
+
80
+ doc = REXML::Document.new(make_RDF(<<-EOR))
81
+ #{channel}
82
+ <items>
83
+ #{rss_item}
84
+ </items>
85
+ EOR
86
+ c = doc.root.elements[1]
87
+
88
+ assert_equal(about, c.attributes["about"])
89
+ %w(title link description image textinput).each do |x|
90
+ elem = c.elements[x]
91
+ assert_equal(x, elem.name)
92
+ assert_equal(@uri, elem.namespace)
93
+ if x == "image" or x == "textinput"
94
+ excepted = resource
95
+ res = elem.attributes.get_attribute("resource")
96
+ assert_equal(@rdf_uri, res.namespace)
97
+ value = res.value
98
+ else
99
+ excepted = instance_eval(x)
100
+ value = elem.text
101
+ end
102
+ assert_equal(excepted, value)
103
+ end
104
+ assert_equal(@uri, c.elements["items"].namespace)
105
+ assert_equal("items", c.elements["items"].name)
106
+ end
107
+
108
+ def test_channel_image
109
+ resource = "http://hoge.com/hoge.png"
110
+ image = RDF::Channel::Image.new(resource)
111
+
112
+ doc = REXML::Document.new(make_RDF(image.to_s))
113
+ i = doc.root.elements[1]
114
+
115
+ assert_equal("image", i.name)
116
+ assert_equal(@uri, i.namespace)
117
+
118
+ res = i.attributes.get_attribute("resource")
119
+
120
+ assert_equal(@rdf_uri, res.namespace)
121
+ assert_equal(resource, res.value)
122
+ end
123
+
124
+ def test_channel_textinput
125
+ resource = "http://hoge.com/hoge.png"
126
+ textinput = RDF::Channel::Textinput.new(resource)
127
+
128
+ doc = REXML::Document.new(make_RDF(textinput.to_s))
129
+ t = doc.root.elements[1]
130
+
131
+ assert_equal("textinput", t.name)
132
+ assert_equal(@uri, t.namespace)
133
+
134
+ res = t.attributes.get_attribute("resource")
135
+
136
+ assert_equal(@rdf_uri, res.namespace)
137
+ assert_equal(resource, res.value)
138
+ end
139
+
140
+ def test_channel_items
141
+ item_link = "http://example.com/item"
142
+
143
+ items = RDF::Channel::Items.new
144
+ li = items.Seq.class::Li.new(item_link)
145
+ items.Seq.lis << li
146
+
147
+ doc = REXML::Document.new(make_RDF(items.to_s))
148
+ i = doc.root.elements[1]
149
+
150
+ assert_equal("items", i.name)
151
+ assert_equal(@uri, i.namespace)
152
+
153
+ assert_equal(1, i.elements.size)
154
+ seq = i.elements[1]
155
+ assert_equal("Seq", seq.name)
156
+ assert_equal(@rdf_uri, seq.namespace)
157
+
158
+ assert_equal(1, seq.elements.size)
159
+ l = seq.elements[1]
160
+ assert_equal("li", l.name)
161
+ assert_equal(@rdf_uri, l.namespace)
162
+ assert_equal(item_link, l.attributes["resource"])
163
+ end
164
+
165
+ def test_seq
166
+ item_link = "http://example.com/item"
167
+ seq = RDF::Seq.new
168
+ li = seq.class::Li.new(item_link)
169
+ seq.lis << li
170
+
171
+ doc = REXML::Document.new(make_RDF(seq.to_s))
172
+ s = doc.root.elements[1]
173
+
174
+ assert_equal("Seq", s.name)
175
+ assert_equal(@rdf_uri, s.namespace)
176
+
177
+ assert_equal(1, s.elements.size)
178
+ l = s.elements[1]
179
+ assert_equal("li", l.name)
180
+ assert_equal(@rdf_uri, l.namespace)
181
+ assert_equal(item_link, l.attributes["resource"])
182
+ end
183
+
184
+ def test_li
185
+ resource = "http://hoge.com/"
186
+ li = RDF::Li.new(resource)
187
+
188
+ doc = REXML::Document.new(make_RDF(li.to_s))
189
+ l = doc.root.elements[1]
190
+
191
+ assert_equal("li", l.name)
192
+ assert_equal(@rdf_uri, l.namespace(l.prefix))
193
+
194
+ res = l.attributes.get_attribute("resource")
195
+
196
+ assert_equal('', res.instance_eval("@prefix"))
197
+ assert_equal(resource, res.value)
198
+ end
199
+
200
+ def test_image
201
+ about = "http://hoge.com"
202
+ title = "fugafuga"
203
+ url = "http://hoge.com/hoge"
204
+ link = "http://hoge.com/fuga"
205
+
206
+ image = RDF::Image.new(about)
207
+ %w(title url link).each do |x|
208
+ image.__send__("#{x}=", instance_eval(x))
209
+ end
210
+
211
+ doc = REXML::Document.new(make_RDF(image.to_s))
212
+ i = doc.root.elements[1]
213
+
214
+ assert_equal(about, i.attributes["about"])
215
+ %w(title url link).each do |x|
216
+ elem = i.elements[x]
217
+ assert_equal(x, elem.name)
218
+ assert_equal(@uri, elem.namespace)
219
+ assert_equal(instance_eval(x), elem.text)
220
+ end
221
+ end
222
+
223
+ def test_item
224
+ about = "http://hoge.com"
225
+ title = "fugafuga"
226
+ link = "http://hoge.com/fuga"
227
+ description = "hogehogehoge"
228
+
229
+ item = RDF::Item.new(about)
230
+ %w(title link description).each do |x|
231
+ item.__send__("#{x}=", instance_eval(x))
232
+ end
233
+
234
+ doc = REXML::Document.new(make_RDF(item.to_s))
235
+ i = doc.root.elements[1]
236
+
237
+ assert_equal(about, i.attributes["about"])
238
+ %w(title link description).each do |x|
239
+ elem = i.elements[x]
240
+ assert_equal(x, elem.name)
241
+ assert_equal(@uri, elem.namespace)
242
+ assert_equal(instance_eval(x), elem.text)
243
+ end
244
+ end
245
+
246
+ def test_textinput
247
+ about = "http://hoge.com"
248
+ title = "fugafuga"
249
+ link = "http://hoge.com/fuga"
250
+ name = "foo"
251
+ description = "hogehogehoge"
252
+
253
+ textinput = RDF::Textinput.new(about)
254
+ %w(title link name description).each do |x|
255
+ textinput.__send__("#{x}=", instance_eval(x))
256
+ end
257
+
258
+ doc = REXML::Document.new(make_RDF(textinput.to_s))
259
+ t = doc.root.elements[1]
260
+
261
+ assert_equal(about, t.attributes["about"])
262
+ %w(title link name description).each do |x|
263
+ elem = t.elements[x]
264
+ assert_equal(x, elem.name)
265
+ assert_equal(@uri, elem.namespace)
266
+ assert_equal(instance_eval(x), elem.text)
267
+ end
268
+ end
269
+
270
+ def test_to_xml
271
+ rss = RSS::Parser.parse(make_sample_RDF)
272
+ assert_equal(rss.to_s, rss.to_xml)
273
+ assert_equal(rss.to_s, rss.to_xml("1.0"))
274
+ rss09 = rss.to_xml("0.91") do |maker|
275
+ maker.channel.language = "en-us"
276
+ end
277
+ rss09 = RSS::Parser.parse(rss09)
278
+ assert_equal("0.91", rss09.rss_version)
279
+ assert_equal(["rss", "0.91", nil], rss09.feed_info)
280
+ rss20 = RSS::Parser.parse(rss.to_xml("2.0"))
281
+ assert_equal("2.0", rss20.rss_version)
282
+ assert_equal(["rss", "2.0", nil], rss20.feed_info)
283
+
284
+ atom_xml = rss.to_xml("atom") do |maker|
285
+ maker.channel.author = "Alice"
286
+ maker.channel.updated ||= Time.now
287
+ maker.items.each do |item|
288
+ item.updated ||= Time.now
289
+ end
290
+ end
291
+ atom = RSS::Parser.parse(atom_xml)
292
+ assert_equal(["atom", "1.0", "feed"], atom.feed_info)
293
+ end
294
+ end
295
+ end
@@ -0,0 +1,409 @@
1
+ require "rexml/document"
2
+
3
+ require "rss-testcase"
4
+
5
+ module RSS
6
+ class TestRSS20Core < TestCase
7
+
8
+ def setup
9
+ @rss_version = "2.0"
10
+ end
11
+
12
+ def test_Rss
13
+ version = "1.0"
14
+ encoding = "UTF-8"
15
+ standalone = false
16
+
17
+ rss = Rss.new(@rss_version, version, encoding, standalone)
18
+ setup_rss20(rss)
19
+
20
+ doc = REXML::Document.new(rss.to_s(false))
21
+
22
+ xmldecl = doc.xml_decl
23
+
24
+ assert_equal(version, xmldecl.version)
25
+ assert_equal(encoding, xmldecl.encoding.to_s)
26
+ assert_equal(standalone, !xmldecl.standalone.nil?)
27
+
28
+ assert_equal("", doc.root.namespace)
29
+ assert_equal(@rss_version, doc.root.attributes["version"])
30
+ end
31
+
32
+ def test_not_displayed_xml_stylesheets
33
+ rss = Rss.new(@rss_version)
34
+ plain_rss = rss.to_s
35
+ 3.times do
36
+ rss.xml_stylesheets.push(XMLStyleSheet.new)
37
+ assert_equal(plain_rss, rss.to_s)
38
+ end
39
+ end
40
+
41
+ def test_xml_stylesheets
42
+ [
43
+ [{:href => "a.xsl", :type => "text/xsl"}],
44
+ [
45
+ {:href => "a.xsl", :type => "text/xsl"},
46
+ {:href => "a.css", :type => "text/css"},
47
+ ],
48
+ ].each do |attrs_ary|
49
+ rss = Rss.new(@rss_version)
50
+ setup_rss20(rss)
51
+ assert_xml_stylesheet_pis(attrs_ary, rss)
52
+ end
53
+ end
54
+
55
+ def test_channel
56
+ title = "fugafuga"
57
+ link = "http://hoge.com"
58
+ description = "fugafugafugafuga"
59
+
60
+ language = "en-us"
61
+ copyright = "Copyright 2002, Spartanburg Herald-Journal"
62
+ managingEditor = "geo@herald.com (George Matesky)"
63
+ webMaster = "betty@herald.com (Betty Guernsey)"
64
+ pubDate = Time.parse("Sat, 07 Sep 2002 00:00:01 GMT")
65
+ lastBuildDate = Time.parse("Sat, 07 Sep 2002 09:42:31 GMT")
66
+ categories = [
67
+ {
68
+ :content => "Newspapers",
69
+ },
70
+ {
71
+ :domain => "Syndic8",
72
+ :content => "1765",
73
+ }
74
+ ]
75
+ generator = "MightyInHouse Content System v2.3"
76
+ docs = "http://blogs.law.harvard.edu/tech/rss"
77
+
78
+ ttl = "60"
79
+
80
+ 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))'
81
+
82
+ channel = Rss::Channel.new
83
+
84
+ elems = %w(title link description language copyright
85
+ managingEditor webMaster pubDate lastBuildDate
86
+ generator docs ttl rating)
87
+ elems.each do |x|
88
+ value = instance_eval(x)
89
+ value = value.rfc822 if %w(pubDate lastBuildDate).include?(x)
90
+ channel.__send__("#{x}=", value)
91
+ end
92
+ categories.each do |cat|
93
+ channel.categories << Rss::Channel::Category.new(cat[:domain],
94
+ cat[:content])
95
+ end
96
+
97
+ doc = REXML::Document.new(make_rss20(channel.to_s))
98
+ c = doc.root.elements[1]
99
+
100
+ elems.each do |x|
101
+ elem = c.elements[x]
102
+ assert_equal(x, elem.name)
103
+ assert_equal("", elem.namespace)
104
+ expected = instance_eval(x)
105
+ case x
106
+ when "pubDate", "lastBuildDate"
107
+ assert_equal(expected, Time.parse(elem.text))
108
+ when "ttl"
109
+ expected = channel.__send__(x)
110
+ assert_equal(expected, elem.text.to_i)
111
+ else
112
+ assert_equal(expected, elem.text)
113
+ end
114
+ end
115
+ categories.each_with_index do |cat, i|
116
+ cat = cat.dup
117
+ cat[:domain] ||= nil
118
+ category = c.elements["category[#{i+1}]"]
119
+ actual = {
120
+ :domain => category.attributes["domain"],
121
+ :content => category.text,
122
+ }
123
+ assert_equal(cat, actual)
124
+ end
125
+ end
126
+
127
+ def test_channel_cloud
128
+ cloud_params = {
129
+ :domain => "rpc.sys.com",
130
+ :port => "80",
131
+ :path => "/RPC2",
132
+ :registerProcedure => "myCloud.rssPleaseNotify",
133
+ :protocol => "xml-rpc",
134
+ }
135
+ cloud = Rss::Channel::Cloud.new(cloud_params[:domain],
136
+ cloud_params[:port],
137
+ cloud_params[:path],
138
+ cloud_params[:registerProcedure],
139
+ cloud_params[:protocol])
140
+ cloud_params[:port] = cloud.port
141
+
142
+ doc = REXML::Document.new(cloud.to_s)
143
+ cloud_elem = doc.root
144
+
145
+ actual = {}
146
+ cloud_elem.attributes.each do |name, value|
147
+ value = value.to_i if name == "port"
148
+ actual[name.intern] = value
149
+ end
150
+ assert_equal(cloud_params, actual)
151
+ end
152
+
153
+ def test_channel_image
154
+ image_params = {
155
+ :url => "http://hoge.com/hoge.png",
156
+ :title => "fugafuga",
157
+ :link => "http://hoge.com",
158
+ :width => "144",
159
+ :height => "400",
160
+ :description => "an image",
161
+ }
162
+ image = Rss::Channel::Image.new(image_params[:url],
163
+ image_params[:title],
164
+ image_params[:link],
165
+ image_params[:width],
166
+ image_params[:height],
167
+ image_params[:description])
168
+
169
+ doc = REXML::Document.new(image.to_s)
170
+ image_elem = doc.root
171
+
172
+ image_params.each do |name, value|
173
+ value = image.__send__(name)
174
+ actual = image_elem.elements[name.to_s].text
175
+ actual = actual.to_i if [:width, :height].include?(name)
176
+ assert_equal(value, actual)
177
+ end
178
+ end
179
+
180
+ def test_channel_textInput
181
+ textInput_params = {
182
+ :title => "fugafuga",
183
+ :description => "text hoge fuga",
184
+ :name => "hoge",
185
+ :link => "http://hoge.com",
186
+ }
187
+ textInput = Rss::Channel::TextInput.new(textInput_params[:title],
188
+ textInput_params[:description],
189
+ textInput_params[:name],
190
+ textInput_params[:link])
191
+
192
+ doc = REXML::Document.new(textInput.to_s)
193
+ input_elem = doc.root
194
+
195
+ textInput_params.each do |name, value|
196
+ actual = input_elem.elements[name.to_s].text
197
+ assert_equal(value, actual)
198
+ end
199
+ end
200
+
201
+ def test_channel_skip_days
202
+ skipDays_values = [
203
+ "Sunday",
204
+ "Monday",
205
+ ]
206
+ skipDays = Rss::Channel::SkipDays.new
207
+ skipDays_values.each do |value|
208
+ skipDays.days << Rss::Channel::SkipDays::Day.new(value)
209
+ end
210
+
211
+ doc = REXML::Document.new(skipDays.to_s)
212
+ days_elem = doc.root
213
+
214
+ skipDays_values.each_with_index do |value, i|
215
+ assert_equal(value, days_elem.elements[i + 1].text)
216
+ end
217
+ end
218
+
219
+ def test_channel_skip_hours
220
+ skipHours_values = [
221
+ "0",
222
+ "13",
223
+ ]
224
+ skipHours = Rss::Channel::SkipHours.new
225
+ skipHours_values.each do |value|
226
+ skipHours.hours << Rss::Channel::SkipHours::Hour.new(value)
227
+ end
228
+
229
+ doc = REXML::Document.new(skipHours.to_s)
230
+ hours_elem = doc.root
231
+
232
+ skipHours_values.each_with_index do |value, i|
233
+ expected = skipHours.hours[i].content
234
+ assert_equal(expected, hours_elem.elements[i + 1].text.to_i)
235
+ end
236
+ end
237
+
238
+ def test_item
239
+ title = "fugafuga"
240
+ link = "http://hoge.com/"
241
+ description = "text hoge fuga"
242
+ author = "oprah@oxygen.net"
243
+ categories = [
244
+ {
245
+ :content => "Newspapers",
246
+ },
247
+ {
248
+ :domain => "Syndic8",
249
+ :content => "1765",
250
+ }
251
+ ]
252
+ comments = "http://www.myblog.org/cgi-local/mt/mt-comments.cgi?entry_id=290"
253
+ pubDate = Time.parse("Sat, 07 Sep 2002 00:00:01 GMT")
254
+
255
+ channel = Rss::Channel.new
256
+ channel.title = "title"
257
+ channel.link = "http://example.com/"
258
+ channel.description = "description"
259
+
260
+ item = Rss::Channel::Item.new
261
+ channel.items << item
262
+
263
+ elems = %w(title link description author comments pubDate)
264
+ elems.each do |x|
265
+ value = instance_eval(x)
266
+ value = value.rfc822 if x == "pubDate"
267
+ item.__send__("#{x}=", value)
268
+ end
269
+ categories.each do |cat|
270
+ item.categories << Rss::Channel::Category.new(cat[:domain],
271
+ cat[:content])
272
+ end
273
+
274
+ doc = REXML::Document.new(channel.to_s)
275
+ channel_elem = doc.root
276
+
277
+ item_elem = channel_elem.elements["item[1]"]
278
+ elems.each do |x|
279
+ elem = item_elem.elements[x]
280
+ assert_equal(x, elem.name)
281
+ assert_equal("", elem.namespace)
282
+ expected = instance_eval(x)
283
+ case x
284
+ when "pubDate"
285
+ assert_equal(expected, Time.parse(elem.text))
286
+ else
287
+ assert_equal(expected, elem.text)
288
+ end
289
+ end
290
+ categories.each_with_index do |cat, i|
291
+ cat = cat.dup
292
+ cat[:domain] ||= nil
293
+ category = item_elem.elements["category[#{i+1}]"]
294
+ actual = {
295
+ :domain => category.attributes["domain"],
296
+ :content => category.text,
297
+ }
298
+ assert_equal(cat, actual)
299
+ end
300
+ end
301
+
302
+ def test_item_enclosure
303
+ enclosure_params = {
304
+ :url => "http://www.scripting.com/mp3s/weatherReportSuite.mp3",
305
+ :length => "12216320",
306
+ :type => "audio/mpeg",
307
+ }
308
+
309
+ enclosure = Rss::Channel::Item::Enclosure.new(enclosure_params[:url],
310
+ enclosure_params[:length],
311
+ enclosure_params[:type])
312
+ enclosure_params[:length] = enclosure.length
313
+
314
+ doc = REXML::Document.new(enclosure.to_s)
315
+ enclosure_elem = doc.root
316
+
317
+ actual = {}
318
+ enclosure_elem.attributes.each do |name, value|
319
+ value = value.to_i if name == "length"
320
+ actual[name.intern] = value
321
+ end
322
+ assert_equal(enclosure_params, actual)
323
+ end
324
+
325
+ def test_item_guid
326
+ test_params = [
327
+ {
328
+ :content => "http://some.server.com/weblogItem3207",
329
+ },
330
+ {
331
+ :isPermaLink => "true",
332
+ :content => "http://inessential.com/2002/09/01.php#a2",
333
+ },
334
+ ]
335
+
336
+ test_params.each do |guid_params|
337
+ guid = Rss::Channel::Item::Guid.new(guid_params[:isPermaLink],
338
+ guid_params[:content])
339
+ if guid_params.has_key?(:isPermaLink)
340
+ guid_params[:isPermaLink] = guid.isPermaLink
341
+ end
342
+ if guid.isPermaLink.nil?
343
+ assert_equal(true, guid.PermaLink?)
344
+ else
345
+ assert_equal(guid.isPermaLink, guid.PermaLink?)
346
+ end
347
+
348
+ doc = REXML::Document.new(guid.to_s)
349
+ guid_elem = doc.root
350
+
351
+ actual = {}
352
+ actual[:content] = guid_elem.text if guid_elem.text
353
+ guid_elem.attributes.each do |name, value|
354
+ value = value == "true" if name == "isPermaLink"
355
+ actual[name.intern] = value
356
+ end
357
+ assert_equal(guid_params, actual)
358
+ end
359
+ end
360
+
361
+ def test_item_source
362
+ source_params = {
363
+ :url => "http://www.tomalak.org/links2.xml",
364
+ :content => "Tomalak's Realm",
365
+ }
366
+
367
+ source = Rss::Channel::Item::Source.new(source_params[:url],
368
+ source_params[:content])
369
+
370
+ doc = REXML::Document.new(source.to_s)
371
+ source_elem = doc.root
372
+
373
+ actual = {}
374
+ actual[:content] = source_elem.text
375
+ source_elem.attributes.each do |name, value|
376
+ actual[name.intern] = value
377
+ end
378
+ assert_equal(source_params, actual)
379
+ end
380
+
381
+ def test_to_xml
382
+ rss = RSS::Parser.parse(make_sample_rss20)
383
+ assert_equal(rss.to_s, rss.to_xml)
384
+ assert_equal(rss.to_s, rss.to_xml("2.0"))
385
+ rss09_xml = rss.to_xml("0.91") do |maker|
386
+ setup_dummy_image(maker)
387
+ end
388
+ rss09 = RSS::Parser.parse(rss09_xml)
389
+ assert_equal("0.91", rss09.rss_version)
390
+ rss10 = rss.to_xml("1.0") do |maker|
391
+ maker.channel.about = "http://www.example.com/index.rdf"
392
+ end
393
+ rss10 = RSS::Parser.parse(rss10)
394
+ assert_equal("1.0", rss10.rss_version)
395
+
396
+ atom_xml = rss.to_xml("atom1.0") do |maker|
397
+ maker.channel.id = "http://www.example.com/atom.xml"
398
+ maker.channel.author = "Alice"
399
+ maker.channel.updated = Time.now
400
+ maker.items.each do |item|
401
+ item.author = "Bob"
402
+ item.updated = Time.now
403
+ end
404
+ end
405
+ atom = RSS::Parser.parse(atom_xml)
406
+ assert_equal(["atom", "1.0", "feed"], atom.feed_info)
407
+ end
408
+ end
409
+ end