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,478 @@
1
+ require "erb"
2
+
3
+ require "test/unit"
4
+ require 'rss-assertions'
5
+
6
+ require "rss"
7
+
8
+ module RSS
9
+ class TestCase < Test::Unit::TestCase
10
+ include ERB::Util
11
+
12
+ include RSS
13
+ include Assertions
14
+
15
+ XMLDECL_VERSION = "1.0"
16
+ XMLDECL_ENCODING = "UTF-8"
17
+ XMLDECL_STANDALONE = "no"
18
+
19
+ RDF_ABOUT = "http://www.xml.com/xml/news.rss"
20
+ RDF_RESOURCE = "http://xml.com/universal/images/xml_tiny.gif"
21
+ TITLE_VALUE = "XML.com"
22
+ LINK_VALUE = "http://xml.com/pub"
23
+ URL_VALUE = "http://xml.com/universal/images/xml_tiny.gif"
24
+ NAME_VALUE = "hogehoge"
25
+ LANGUAGE_VALUE = "ja"
26
+ DESCRIPTION_VALUE = "
27
+ XML.com features a rich mix of information and services
28
+ for the XML community.
29
+ "
30
+ RESOURCES = [
31
+ "http://xml.com/pub/2000/08/09/xslt/xslt.html",
32
+ "http://xml.com/pub/2000/08/09/rdfdb/index.html",
33
+ ]
34
+
35
+ CLOUD_DOMAIN = "data.ourfavoritesongs.com"
36
+ CLOUD_PORT = "80"
37
+ CLOUD_PATH = "/RPC2"
38
+ CLOUD_REGISTER_PROCEDURE = "ourFavoriteSongs.rssPleaseNotify"
39
+ CLOUD_PROTOCOL = "xml-rpc"
40
+
41
+ ENCLOSURE_URL = "http://www.scripting.com/mp3s/weatherReportSuite.mp3"
42
+ ENCLOSURE_LENGTH = "12216320"
43
+ ENCLOSURE_TYPE = "audio/mpeg"
44
+
45
+ CATEGORY_DOMAIN = "http://www.superopendirectory.com/"
46
+
47
+ FEED_TITLE = "dive into mark"
48
+ FEED_UPDATED = "2003-12-13T18:30:02Z"
49
+ FEED_AUTHOR_NAME = "John Doe"
50
+ FEED_ID = "urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6"
51
+
52
+ ENTRY_TITLE = "Atom-Powered Robots Run Amok"
53
+ ENTRY_LINK = "http://example.org/2003/12/13/atom03"
54
+ ENTRY_ID = "urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a"
55
+ ENTRY_UPDATED = "2003-12-13T18:30:02Z"
56
+ ENTRY_SUMMARY = "Some text."
57
+
58
+ t = Time.iso8601("2000-01-01T12:00:05+00:00")
59
+ class << t
60
+ alias_method(:to_s, :iso8601)
61
+ end
62
+
63
+ DC_ELEMENTS = {
64
+ :title => "hoge",
65
+ :description =>
66
+ " XML is placing increasingly heavy loads on
67
+ the existing technical infrastructure of the Internet.",
68
+ :creator => "Rael Dornfest (mailto:rael@oreilly.com)",
69
+ :subject => "XML",
70
+ :publisher => "The O'Reilly Network",
71
+ :contributor => "hogehoge",
72
+ :type => "fugafuga",
73
+ :format => "hohoho",
74
+ :identifier => "fufufu",
75
+ :source => "barbar",
76
+ :language => "ja",
77
+ :relation => "cococo",
78
+ :rights => "Copyright (c) 2000 O'Reilly &amp; Associates, Inc.",
79
+ :date => t,
80
+ }
81
+
82
+ DC_NODES = DC_ELEMENTS.collect do |name, value|
83
+ "<#{DC_PREFIX}:#{name}>#{value}</#{DC_PREFIX}:#{name}>"
84
+ end.join("\n")
85
+
86
+ def default_test
87
+ # This class isn't tested
88
+ end
89
+
90
+ private
91
+ def make_xmldecl(v=XMLDECL_VERSION, e=XMLDECL_ENCODING, s=XMLDECL_STANDALONE)
92
+ rv = "<?xml version='#{v}'"
93
+ rv << " encoding='#{e}'" if e
94
+ rv << " standalone='#{s}'" if s
95
+ rv << "?>"
96
+ rv
97
+ end
98
+
99
+ def make_RDF(content=nil, xmlns=[])
100
+ <<-EORSS
101
+ #{make_xmldecl}
102
+ <rdf:RDF xmlns="#{URI}" xmlns:rdf="#{RDF::URI}"
103
+ #{xmlns.collect {|pre, uri| "xmlns:#{pre}='#{uri}'"}.join(' ')}>
104
+ #{block_given? ? yield : content}
105
+ </rdf:RDF>
106
+ EORSS
107
+ end
108
+
109
+ def make_channel(content=nil)
110
+ <<-EOC
111
+ <channel rdf:about="#{RDF_ABOUT}">
112
+ <title>#{TITLE_VALUE}</title>
113
+ <link>#{LINK_VALUE}</link>
114
+ <description>#{DESCRIPTION_VALUE}</description>
115
+
116
+ <image rdf:resource="#{RDF_RESOURCE}" />
117
+
118
+ <items>
119
+ <rdf:Seq>
120
+ #{RESOURCES.collect do |res| '<rdf:li resource="' + res + '" />' end.join("\n")}
121
+ </rdf:Seq>
122
+ </items>
123
+
124
+ <textinput rdf:resource="#{RDF_RESOURCE}" />
125
+
126
+ #{block_given? ? yield : content}
127
+ </channel>
128
+ EOC
129
+ end
130
+
131
+ def make_image(content=nil)
132
+ <<-EOI
133
+ <image rdf:about="#{RDF_ABOUT}">
134
+ <title>#{TITLE_VALUE}</title>
135
+ <url>#{URL_VALUE}</url>
136
+ <link>#{LINK_VALUE}</link>
137
+ #{block_given? ? yield : content}
138
+ </image>
139
+ EOI
140
+ end
141
+
142
+ def make_item(content=nil)
143
+ <<-EOI
144
+ <item rdf:about="#{RDF_ABOUT}">
145
+ <title>#{TITLE_VALUE}</title>
146
+ <link>#{LINK_VALUE}</link>
147
+ <description>#{DESCRIPTION_VALUE}</description>
148
+ #{block_given? ? yield : content}
149
+ </item>
150
+ EOI
151
+ end
152
+
153
+ def make_textinput(content=nil)
154
+ <<-EOT
155
+ <textinput rdf:about="#{RDF_ABOUT}">
156
+ <title>#{TITLE_VALUE}</title>
157
+ <description>#{DESCRIPTION_VALUE}</description>
158
+ <name>#{NAME_VALUE}</name>
159
+ <link>#{LINK_VALUE}</link>
160
+ #{block_given? ? yield : content}
161
+ </textinput>
162
+ EOT
163
+ end
164
+
165
+ def make_sample_RDF
166
+ make_RDF(<<-EOR)
167
+ #{make_channel}
168
+ #{make_image}
169
+ #{make_item}
170
+ #{make_textinput}
171
+ EOR
172
+ end
173
+
174
+ def make_rss20(content=nil, xmlns=[])
175
+ <<-EORSS
176
+ #{make_xmldecl}
177
+ <rss version="2.0"
178
+ #{xmlns.collect {|pre, uri| "xmlns:#{pre}='#{uri}'"}.join(' ')}>
179
+ #{block_given? ? yield : content}
180
+ </rss>
181
+ EORSS
182
+ end
183
+
184
+ def make_sample_items20
185
+ RESOURCES.collect do |res|
186
+ elems = ["<link>#{res}</link>"]
187
+ elems << "<title>title of #{res}</title>"
188
+ elems = elems.join("\n")
189
+ item = "<item>\n#{elems}\n</item>"
190
+ end.join("\n")
191
+ end
192
+
193
+ def make_channel20(content=nil)
194
+ <<-EOC
195
+ <channel>
196
+ <title>#{TITLE_VALUE}</title>
197
+ <link>#{LINK_VALUE}</link>
198
+ <description>#{DESCRIPTION_VALUE}</description>
199
+ <language>#{LANGUAGE_VALUE}</language>
200
+
201
+ <image>
202
+ <url>#{RDF_RESOURCE}</url>
203
+ <title>#{TITLE_VALUE}</title>
204
+ <link>#{LINK_VALUE}</link>
205
+ </image>
206
+
207
+ #{make_sample_items20}
208
+
209
+ <textInput>
210
+ <title>#{TITLE_VALUE}</title>
211
+ <description>#{DESCRIPTION_VALUE}</description>
212
+ <name>#{NAME_VALUE}</name>
213
+ <link>#{RDF_RESOURCE}</link>
214
+ </textInput>
215
+
216
+ #{block_given? ? yield : content}
217
+ </channel>
218
+ EOC
219
+ end
220
+
221
+ def make_item20(content=nil)
222
+ <<-EOI
223
+ <item>
224
+ <title>#{TITLE_VALUE}</title>
225
+ <link>#{LINK_VALUE}</link>
226
+ <description>#{DESCRIPTION_VALUE}</description>
227
+ #{block_given? ? yield : content}
228
+ </item>
229
+ EOI
230
+ end
231
+
232
+ def make_cloud20
233
+ <<-EOC
234
+ <cloud
235
+ domain="#{CLOUD_DOMAIN}"
236
+ port="#{CLOUD_PORT}"
237
+ path="#{CLOUD_PATH}"
238
+ registerProcedure="#{CLOUD_REGISTER_PROCEDURE}"
239
+ protocol="#{CLOUD_PROTOCOL}" />
240
+ EOC
241
+ end
242
+
243
+ def make_sample_rss20
244
+ make_rss20(<<-EOR)
245
+ #{make_channel20}
246
+ EOR
247
+ end
248
+
249
+ def make_feed_without_entry(content=nil, xmlns=[])
250
+ <<-EOA
251
+ <feed xmlns="#{Atom::URI}"
252
+ #{xmlns.collect {|pre, uri| "xmlns:#{pre}='#{uri}'"}.join(' ')}>
253
+ <id>#{FEED_ID}</id>
254
+ <title>#{FEED_TITLE}</title>
255
+ <updated>#{FEED_UPDATED}</updated>
256
+ <author>
257
+ <name>#{FEED_AUTHOR_NAME}</name>
258
+ </author>
259
+ #{block_given? ? yield : content}
260
+ </feed>
261
+ EOA
262
+ end
263
+
264
+ def make_entry(content=nil)
265
+ <<-EOA
266
+ <entry>
267
+ <title>#{ENTRY_TITLE}</title>
268
+ <id>#{ENTRY_ID}</id>
269
+ <updated>#{ENTRY_UPDATED}</updated>
270
+ #{block_given? ? yield : content}
271
+ </entry>
272
+ EOA
273
+ end
274
+
275
+ def make_feed_with_open_entry(content=nil, xmlns=[], &block)
276
+ make_feed_without_entry(<<-EOA, xmlns)
277
+ #{make_entry(content, &block)}
278
+ EOA
279
+ end
280
+
281
+ def make_feed_with_open_entry_source(content=nil, xmlns=[])
282
+ make_feed_with_open_entry(<<-EOA, xmlns)
283
+ <source>
284
+ #{block_given? ? yield : content}
285
+ </source>
286
+ EOA
287
+ end
288
+
289
+ def make_feed(content=nil, xmlns=[])
290
+ make_feed_without_entry(<<-EOA, xmlns)
291
+ <entry>
292
+ <title>#{ENTRY_TITLE}</title>
293
+ <link href="#{ENTRY_LINK}"/>
294
+ <id>#{ENTRY_ID}</id>
295
+ <updated>#{ENTRY_UPDATED}</updated>
296
+ <summary>#{ENTRY_SUMMARY}</summary>
297
+ </entry>
298
+ #{block_given? ? yield : content}
299
+ EOA
300
+ end
301
+
302
+ def make_entry_document(content=nil, xmlns=[])
303
+ <<-EOA
304
+ <entry xmlns="#{Atom::URI}"
305
+ #{xmlns.collect {|pre, uri| "xmlns:#{pre}='#{uri}'"}.join(' ')}>
306
+ <id>#{ENTRY_ID}</id>
307
+ <title>#{ENTRY_TITLE}</title>
308
+ <updated>#{ENTRY_UPDATED}</updated>
309
+ <author>
310
+ <name>#{FEED_AUTHOR_NAME}</name>
311
+ </author>
312
+ #{block_given? ? yield : content}
313
+ </entry>
314
+ EOA
315
+ end
316
+
317
+ def make_entry_document_with_open_source(content=nil, xmlns=[])
318
+ make_entry_document(<<-EOA, xmlns)
319
+ <source>
320
+ #{block_given? ? yield : content}
321
+ </source>
322
+ EOA
323
+ end
324
+
325
+ def make_element(elem_name, attrs, contents)
326
+ attrs_str = attrs.collect do |name, value|
327
+ "#{h name}='#{h value}'"
328
+ end.join(" ")
329
+ attrs_str = " #{attrs_str}" unless attrs_str.empty?
330
+
331
+ if contents.is_a?(String)
332
+ contents_str = h(contents)
333
+ else
334
+ contents_str = contents.collect do |name, value|
335
+ "#{Element::INDENT}<#{h name}>#{h value}</#{h name}>"
336
+ end.join("\n")
337
+ contents_str = "\n#{contents_str}\n"
338
+ end
339
+
340
+ "<#{h elem_name}#{attrs_str}>#{contents_str}</#{h elem_name}>"
341
+ end
342
+
343
+ def xmlns_container(xmlns_decls, content)
344
+ attributes = xmlns_decls.collect do |prefix, uri|
345
+ "xmlns:#{h prefix}=\"#{h uri}\""
346
+ end.join(" ")
347
+ "<dummy #{attributes}>#{content}</dummy>"
348
+ end
349
+
350
+ private
351
+ def setup_rss10(rdf)
352
+ assert_equal("", rdf.to_s)
353
+
354
+ channel = RDF::Channel.new
355
+ assert_equal("", channel.to_s)
356
+ channel.about = "http://example.com/index.rdf"
357
+ channel.title = "title"
358
+ channel.link = "http://example.com/"
359
+ channel.description = "description"
360
+ assert_equal("", channel.to_s)
361
+
362
+ item_title = "item title"
363
+ item_link = "http://example.com/item"
364
+ channel.items = RDF::Channel::Items.new
365
+ channel.items.Seq.lis << RDF::Channel::Items::Seq::Li.new(item_link)
366
+ assert_not_equal("", channel.to_s)
367
+
368
+ rdf.channel = channel
369
+ assert_equal("", rdf.to_s)
370
+
371
+ item = RDF::Item.new
372
+ item.title = item_title
373
+ item.link = item_link
374
+ item.about = item_link
375
+ rdf.items << item
376
+ assert_not_equal("", rdf.to_s)
377
+ end
378
+
379
+ def setup_rss20(rss)
380
+ assert_equal("", rss.to_s)
381
+
382
+ channel = Rss::Channel.new
383
+ assert_equal("", channel.to_s)
384
+ channel.title = "title"
385
+ channel.link = "http://example.com/"
386
+ channel.description = "description"
387
+ assert_not_equal("", channel.to_s)
388
+
389
+ rss.channel = channel
390
+ assert_not_equal("", rss.to_s)
391
+ end
392
+
393
+ def setup_dummy_channel(maker)
394
+ about = "http://hoge.com"
395
+ title = "fugafuga"
396
+ link = "http://hoge.com/feed.xml"
397
+ description = "fugafugafugafuga"
398
+ language = "ja"
399
+
400
+ maker.channel.about = about
401
+ maker.channel.title = title
402
+ maker.channel.link = link
403
+ maker.channel.description = description
404
+ maker.channel.language = language
405
+ end
406
+
407
+ def setup_dummy_channel_atom(maker)
408
+ updated = Time.now
409
+ author = "Foo"
410
+
411
+ setup_dummy_channel(maker)
412
+ maker.channel.links.first.rel = "self"
413
+ maker.channel.links.first.type = "application/atom+xml"
414
+ maker.channel.updated = updated
415
+ maker.channel.author = author
416
+ end
417
+
418
+ def setup_dummy_image(maker)
419
+ title = "fugafuga"
420
+ link = "http://hoge.com"
421
+ url = "http://hoge.com/hoge.png"
422
+
423
+ maker.channel.link = link if maker.channel.link.nil?
424
+
425
+ maker.image.title = title
426
+ maker.image.url = url
427
+ end
428
+
429
+ def setup_dummy_textinput(maker)
430
+ title = "fugafuga"
431
+ description = "text hoge fuga"
432
+ name = "hoge"
433
+ link = "http://hoge.com/search.cgi"
434
+
435
+ maker.textinput.title = title
436
+ maker.textinput.description = description
437
+ maker.textinput.name = name
438
+ maker.textinput.link = link
439
+ end
440
+
441
+ def setup_dummy_item(maker)
442
+ title = "TITLE"
443
+ link = "http://hoge.com/"
444
+
445
+ item = maker.items.new_item
446
+ item.title = title
447
+ item.link = link
448
+ end
449
+
450
+ def setup_dummy_item_atom(maker)
451
+ setup_dummy_item(maker)
452
+
453
+ item = maker.items.first
454
+ item.id = "http://example.net/xxx"
455
+ item.updated = Time.now
456
+ end
457
+
458
+ def setup_taxo_topic(target, topics)
459
+ topics.each do |topic|
460
+ taxo_topic = target.taxo_topics.new_taxo_topic
461
+ topic.each do |name, value|
462
+ case name
463
+ when :link
464
+ taxo_topic.taxo_link = value
465
+ when :topics
466
+ value.each do |t|
467
+ taxo_topic.taxo_topics << t
468
+ end
469
+ else
470
+ dc_elems = taxo_topic.__send__("dc_#{name}s")
471
+ dc_elem = dc_elems.__send__("new_#{name}")
472
+ dc_elem.value = value
473
+ end
474
+ end
475
+ end
476
+ end
477
+ end
478
+ end