rss-nokogiri 0.0.1

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