1require "rss-testcase"
2
3require "rss/maker"
4
5module RSS
6  class TestMaker20 < TestCase
7    def test_supported?
8      assert(RSS::Maker.supported?("2.0"))
9      assert(RSS::Maker.supported?("rss2.0"))
10      assert(!RSS::Maker.supported?("2.2"))
11      assert(!RSS::Maker.supported?("rss2.2"))
12    end
13
14    def test_find_class
15      assert_equal(RSS::Maker::RSS20, RSS::Maker["2.0"])
16      assert_equal(RSS::Maker::RSS20, RSS::Maker["rss2.0"])
17    end
18
19    def test_rss
20      assert_raise(LocalJumpError) do
21        RSS::Maker.make("2.0")
22      end
23
24      rss = RSS::Maker.make("2.0") do |maker|
25        setup_dummy_channel(maker)
26      end
27      assert_equal("2.0", rss.rss_version)
28
29      rss = RSS::Maker.make("2.0") do |maker|
30        setup_dummy_channel(maker)
31
32        maker.encoding = "EUC-JP"
33      end
34      assert_equal("2.0", rss.rss_version)
35      assert_equal("EUC-JP", rss.encoding)
36
37      rss = RSS::Maker.make("2.0") do |maker|
38        setup_dummy_channel(maker)
39
40        maker.standalone = "yes"
41      end
42      assert_equal("2.0", rss.rss_version)
43      assert_equal("yes", rss.standalone)
44
45      rss = RSS::Maker.make("2.0") do |maker|
46        setup_dummy_channel(maker)
47
48        maker.encoding = "EUC-JP"
49        maker.standalone = "yes"
50      end
51      assert_equal("2.0", rss.rss_version)
52      assert_equal("EUC-JP", rss.encoding)
53      assert_equal("yes", rss.standalone)
54    end
55
56    def test_channel
57      title = "fugafuga"
58      link = "http://hoge.com"
59      description = "fugafugafugafuga"
60      language = "ja"
61      copyright = "foo"
62      managingEditor = "bar"
63      webMaster = "web master"
64      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))'
65      docs = "http://foo.com/doc"
66      skipDays = [
67        "Sunday",
68        "Monday",
69      ]
70      skipHours = [
71        "0",
72        "13",
73      ]
74      pubDate = Time.now
75      lastBuildDate = Time.now
76      categories = [
77        "Nespapers",
78        "misc",
79      ]
80      generator = "RSS Maker"
81      ttl = "60"
82
83      rss = RSS::Maker.make("2.0") do |maker|
84        maker.channel.title = title
85        maker.channel.link = link
86        maker.channel.description = description
87        maker.channel.language = language
88        maker.channel.copyright = copyright
89        maker.channel.managingEditor = managingEditor
90        maker.channel.webMaster = webMaster
91        maker.channel.rating = rating
92        maker.channel.docs = docs
93        maker.channel.pubDate = pubDate
94        maker.channel.lastBuildDate = lastBuildDate
95
96        skipDays.each do |day|
97          maker.channel.skipDays.new_day do |new_day|
98            new_day.content = day
99          end
100        end
101        skipHours.each do |hour|
102          maker.channel.skipHours.new_hour do |new_hour|
103            new_hour.content = hour
104          end
105        end
106
107        categories.each do |category|
108          maker.channel.categories.new_category do |new_category|
109            new_category.content = category
110          end
111        end
112
113        maker.channel.generator = generator
114        maker.channel.ttl = ttl
115      end
116      channel = rss.channel
117
118      assert_equal(title, channel.title)
119      assert_equal(link, channel.link)
120      assert_equal(description, channel.description)
121      assert_equal(language, channel.language)
122      assert_equal(copyright, channel.copyright)
123      assert_equal(managingEditor, channel.managingEditor)
124      assert_equal(webMaster, channel.webMaster)
125      assert_equal(rating, channel.rating)
126      assert_equal(docs, channel.docs)
127      assert_equal(pubDate, channel.pubDate)
128      assert_equal(pubDate, channel.date)
129      assert_equal(lastBuildDate, channel.lastBuildDate)
130
131      skipDays.each_with_index do |day, i|
132        assert_equal(day, channel.skipDays.days[i].content)
133      end
134      skipHours.each_with_index do |hour, i|
135        assert_equal(hour.to_i, channel.skipHours.hours[i].content)
136      end
137
138      channel.categories.each_with_index do |category, i|
139        assert_equal(categories[i], category.content)
140      end
141
142      assert_equal(generator, channel.generator)
143      assert_equal(ttl.to_i, channel.ttl)
144
145      assert(channel.items.empty?)
146      assert_nil(channel.image)
147      assert_nil(channel.textInput)
148    end
149
150    def test_not_valid_channel
151      title = "fugafuga"
152      link = "http://hoge.com"
153      description = "fugafugafugafuga"
154      language = "ja"
155
156      assert_not_set_error("maker.channel", %w(title)) do
157        RSS::Maker.make("2.0") do |maker|
158          # maker.channel.title = title
159          maker.channel.link = link
160          maker.channel.description = description
161          maker.channel.language = language
162        end
163      end
164
165      assert_not_set_error("maker.channel", %w(link)) do
166        RSS::Maker.make("2.0") do |maker|
167          maker.channel.title = title
168          # maker.channel.link = link
169          maker.channel.description = description
170          maker.channel.language = language
171        end
172      end
173
174      assert_not_set_error("maker.channel", %w(description)) do
175        RSS::Maker.make("2.0") do |maker|
176          maker.channel.title = title
177          maker.channel.link = link
178          # maker.channel.description = description
179          maker.channel.language = language
180        end
181      end
182
183      rss = RSS::Maker.make("2.0") do |maker|
184        maker.channel.title = title
185        maker.channel.link = link
186        maker.channel.description = description
187        # maker.channel.language = language
188      end
189      assert_not_nil(rss)
190    end
191
192
193    def test_cloud
194      domain = "rpc.sys.com"
195      port = "80"
196      path = "/RPC2"
197      registerProcedure = "myCloud.rssPleaseNotify"
198      protocol = "xml-rpc"
199
200      rss = RSS::Maker.make("2.0") do |maker|
201        setup_dummy_channel(maker)
202
203        maker.channel.cloud.domain = domain
204        maker.channel.cloud.port = port
205        maker.channel.cloud.path = path
206        maker.channel.cloud.registerProcedure = registerProcedure
207        maker.channel.cloud.protocol = protocol
208      end
209      cloud = rss.channel.cloud
210      assert_equal(domain, cloud.domain)
211      assert_equal(port.to_i, cloud.port)
212      assert_equal(path, cloud.path)
213      assert_equal(registerProcedure, cloud.registerProcedure)
214      assert_equal(protocol, cloud.protocol)
215    end
216
217    def test_not_valid_cloud
218      domain = "rpc.sys.com"
219      port = "80"
220      path = "/RPC2"
221      registerProcedure = "myCloud.rssPleaseNotify"
222      protocol = "xml-rpc"
223
224      rss = RSS::Maker.make("2.0") do |maker|
225        setup_dummy_channel(maker)
226
227        # maker.channel.cloud.domain = domain
228        maker.channel.cloud.port = port
229        maker.channel.cloud.path = path
230        maker.channel.cloud.registerProcedure = registerProcedure
231        maker.channel.cloud.protocol = protocol
232      end
233      assert_nil(rss.channel.cloud)
234
235      rss = RSS::Maker.make("2.0") do |maker|
236        setup_dummy_channel(maker)
237
238        maker.channel.cloud.domain = domain
239        # maker.channel.cloud.port = port
240        maker.channel.cloud.path = path
241        maker.channel.cloud.registerProcedure = registerProcedure
242        maker.channel.cloud.protocol = protocol
243      end
244      assert_nil(rss.channel.cloud)
245
246      rss = RSS::Maker.make("2.0") do |maker|
247        setup_dummy_channel(maker)
248
249        maker.channel.cloud.domain = domain
250        maker.channel.cloud.port = port
251        # maker.channel.cloud.path = path
252        maker.channel.cloud.registerProcedure = registerProcedure
253        maker.channel.cloud.protocol = protocol
254      end
255      assert_nil(rss.channel.cloud)
256
257      rss = RSS::Maker.make("2.0") do |maker|
258        setup_dummy_channel(maker)
259
260        maker.channel.cloud.domain = domain
261        maker.channel.cloud.port = port
262        maker.channel.cloud.path = path
263        # maker.channel.cloud.registerProcedure = registerProcedure
264        maker.channel.cloud.protocol = protocol
265      end
266      assert_nil(rss.channel.cloud)
267
268      rss = RSS::Maker.make("2.0") do |maker|
269        setup_dummy_channel(maker)
270
271        maker.channel.cloud.domain = domain
272        maker.channel.cloud.port = port
273        maker.channel.cloud.path = path
274        maker.channel.cloud.registerProcedure = registerProcedure
275        # maker.channel.cloud.protocol = protocol
276      end
277      assert_nil(rss.channel.cloud)
278    end
279
280
281    def test_image
282      title = "fugafuga"
283      link = "http://hoge.com"
284      url = "http://hoge.com/hoge.png"
285      width = "144"
286      height = "400"
287      description = "an image"
288
289      rss = RSS::Maker.make("2.0") do |maker|
290        setup_dummy_channel(maker)
291        maker.channel.link = link
292
293        maker.image.title = title
294        maker.image.url = url
295        maker.image.width = width
296        maker.image.height = height
297        maker.image.description = description
298      end
299      image = rss.image
300      assert_equal(title, image.title)
301      assert_equal(link, image.link)
302      assert_equal(url, image.url)
303      assert_equal(width.to_i, image.width)
304      assert_equal(height.to_i, image.height)
305      assert_equal(description, image.description)
306
307      assert_not_set_error("maker.channel", %w(title description)) do
308        RSS::Maker.make("2.0") do |maker|
309          # setup_dummy_channel(maker)
310          maker.channel.link = link
311
312          maker.image.title = title
313          maker.image.url = url
314          maker.image.width = width
315          maker.image.height = height
316          maker.image.description = description
317        end
318      end
319    end
320
321    def test_not_valid_image
322      title = "fugafuga"
323      link = "http://hoge.com"
324      url = "http://hoge.com/hoge.png"
325      width = "144"
326      height = "400"
327      description = "an image"
328
329      rss = RSS::Maker.make("2.0") do |maker|
330        setup_dummy_channel(maker)
331        maker.channel.link = link
332
333        # maker.image.title = title
334        maker.image.url = url
335        maker.image.width = width
336        maker.image.height = height
337        maker.image.description = description
338      end
339      assert_nil(rss.image)
340
341      assert_not_set_error("maker.channel", %w(link)) do
342        RSS::Maker.make("2.0") do |maker|
343          setup_dummy_channel(maker)
344          # maker.channel.link = link
345          maker.channel.link = nil
346
347          maker.image.title = title
348          maker.image.url = url
349          maker.image.width = width
350          maker.image.height = height
351          maker.image.description = description
352        end
353      end
354
355      rss = RSS::Maker.make("2.0") do |maker|
356        setup_dummy_channel(maker)
357        maker.channel.link = link
358
359        maker.image.title = title
360        # maker.image.url = url
361        maker.image.width = width
362        maker.image.height = height
363        maker.image.description = description
364      end
365      assert_nil(rss.image)
366    end
367
368    def test_items(with_convenience_way=true)
369      title = "TITLE"
370      link = "http://hoge.com/"
371      description = "text hoge fuga"
372      author = "oprah@oxygen.net"
373      comments = "http://www.myblog.org/cgi-local/mt/mt-comments.cgi?entry_id=290"
374      pubDate = Time.now
375
376      rss = RSS::Maker.make("2.0") do |maker|
377        setup_dummy_channel(maker)
378      end
379      assert(rss.channel.items.empty?)
380
381      item_size = 5
382      rss = RSS::Maker.make("2.0") do |maker|
383        setup_dummy_channel(maker)
384
385        item_size.times do |i|
386          maker.items.new_item do |item|
387            item.title = "#{title}#{i}"
388            item.link = "#{link}#{i}"
389            item.description = "#{description}#{i}"
390            item.author = "#{author}#{i}"
391            item.comments = "#{comments}#{i}"
392            item.date = pubDate
393          end
394        end
395        maker.items.do_sort = true
396      end
397      assert_equal(item_size, rss.items.size)
398      rss.channel.items.each_with_index do |item, i|
399        assert_equal("#{title}#{i}", item.title)
400        assert_equal("#{link}#{i}", item.link)
401        assert_equal("#{description}#{i}", item.description)
402        assert_equal("#{author}#{i}", item.author)
403        assert_equal("#{comments}#{i}", item.comments)
404        assert_equal(pubDate, item.pubDate)
405        assert_equal(pubDate, item.date)
406      end
407
408      rss = RSS::Maker.make("2.0") do |maker|
409        setup_dummy_channel(maker)
410
411        item_size.times do |i|
412          maker.items.new_item do |item|
413            item.title = "#{title}#{i}"
414            item.link = "#{link}#{i}"
415            item.description = "#{description}#{i}"
416            item.author = "#{author}#{i}"
417            item.comments = "#{comments}#{i}"
418            item.date = pubDate
419          end
420        end
421        maker.items.do_sort = Proc.new do |x, y|
422          if with_convenience_way
423            y.title[-1] <=> x.title[-1]
424          else
425            y.title {|t| t.content[-1]} <=> x.title {|t| t.content[-1]}
426          end
427        end
428      end
429      assert_equal(item_size, rss.items.size)
430      rss.channel.items.reverse.each_with_index do |item, i|
431        assert_equal("#{title}#{i}", item.title)
432        assert_equal("#{link}#{i}", item.link)
433        assert_equal("#{description}#{i}", item.description)
434        assert_equal("#{author}#{i}", item.author)
435        assert_equal("#{comments}#{i}", item.comments)
436        assert_equal(pubDate, item.pubDate)
437        assert_equal(pubDate, item.date)
438      end
439    end
440
441    def test_items_with_new_api_since_018
442      test_items(false)
443    end
444
445    def test_pubDate_without_description
446      title = "TITLE"
447      link = "http://hoge.com/"
448      # description = "text hoge fuga"
449      author = "oprah@oxygen.net"
450      pubDate = Time.now
451
452      rss = RSS::Maker.make("2.0") do |maker|
453        setup_dummy_channel(maker)
454
455        maker.items.new_item do |item|
456          item.title = title
457          item.link = link
458          # item.description = description
459          item.author = author
460          item.pubDate = pubDate
461        end
462      end
463      assert_equal(1, rss.items.size)
464      rss.channel.items.each_with_index do |item, i|
465        assert_equal(title, item.title)
466        assert_equal(link, item.link)
467        # assert_equal(description, item.description)
468        assert_equal(author, item.author)
469        assert_equal(pubDate, item.pubDate)
470        assert_equal(pubDate, item.date)
471      end
472    end
473
474    def test_guid
475      isPermaLink = "true"
476      content = "http://inessential.com/2002/09/01.php#a2"
477
478      rss = RSS::Maker.make("2.0") do |maker|
479        setup_dummy_channel(maker)
480        setup_dummy_item(maker)
481
482        guid = maker.items.last.guid
483        guid.isPermaLink = isPermaLink
484        guid.content = content
485      end
486      guid = rss.channel.items.last.guid
487      assert_equal(isPermaLink == "true", guid.isPermaLink)
488      assert_equal(content, guid.content)
489    end
490
491    def test_guid_permanent_link
492      content = "http://inessential.com/2002/09/01.php#a2"
493
494      rss = RSS::Maker.make("2.0") do |maker|
495        setup_dummy_channel(maker)
496        setup_dummy_item(maker)
497
498        guid = maker.items.last.guid
499        assert_equal(nil, guid.permanent_link?)
500        assert_equal(guid.isPermaLink, guid.permanent_link?)
501        guid.permanent_link = true
502        assert_equal(true, guid.permanent_link?)
503        assert_equal(guid.isPermaLink, guid.permanent_link?)
504        guid.content = content
505      end
506      guid = rss.channel.items.last.guid
507      assert_equal(true, guid.isPermaLink)
508      assert_equal(content, guid.content)
509    end
510
511    def test_guid_permanent_link_false
512      content = "http://inessential.com/2002/09/01.php#a2"
513
514      rss = RSS::Maker.make("2.0") do |maker|
515        setup_dummy_channel(maker)
516        setup_dummy_item(maker)
517
518        guid = maker.items.last.guid
519        assert_equal(nil, guid.permanent_link?)
520        assert_equal(guid.isPermaLink, guid.permanent_link?)
521        guid.permanent_link = false
522        assert_equal(false, guid.permanent_link?)
523        assert_equal(guid.isPermaLink, guid.permanent_link?)
524        guid.content = content
525      end
526      guid = rss.channel.items.last.guid
527      assert_equal(false, guid.isPermaLink)
528      assert_equal(content, guid.content)
529    end
530
531    def test_not_valid_guid
532      # content = "http://inessential.com/2002/09/01.php#a2"
533
534      rss = RSS::Maker.make("2.0") do |maker|
535        setup_dummy_channel(maker)
536        setup_dummy_item(maker)
537
538        # guid = maker.items.last.guid
539        # guid.content = content
540      end
541      assert_nil(rss.channel.items.last.guid)
542    end
543
544    def test_enclosure
545      url = "http://www.scripting.com/mp3s/weatherReportSuite.mp3"
546      length = "12216320"
547      type = "audio/mpeg"
548
549      rss = RSS::Maker.make("2.0") do |maker|
550        setup_dummy_channel(maker)
551        setup_dummy_item(maker)
552
553        enclosure = maker.items.last.enclosure
554        enclosure.url = url
555        enclosure.length = length
556        enclosure.type = type
557      end
558      enclosure = rss.channel.items.last.enclosure
559      assert_equal(url, enclosure.url)
560      assert_equal(length.to_i, enclosure.length)
561      assert_equal(type, enclosure.type)
562    end
563
564    def test_not_valid_enclosure
565      url = "http://www.scripting.com/mp3s/weatherReportSuite.mp3"
566      length = "12216320"
567      type = "audio/mpeg"
568
569      rss = RSS::Maker.make("2.0") do |maker|
570        setup_dummy_channel(maker)
571        setup_dummy_item(maker)
572
573        enclosure = maker.items.last.enclosure
574        # enclosure.url = url
575        enclosure.length = length
576        enclosure.type = type
577      end
578      assert_nil(rss.channel.items.last.enclosure)
579
580      rss = RSS::Maker.make("2.0") do |maker|
581        setup_dummy_channel(maker)
582        setup_dummy_item(maker)
583
584        enclosure = maker.items.last.enclosure
585        enclosure.url = url
586        # enclosure.length = length
587        enclosure.type = type
588      end
589      assert_nil(rss.channel.items.last.enclosure)
590
591      rss = RSS::Maker.make("2.0") do |maker|
592        setup_dummy_channel(maker)
593        setup_dummy_item(maker)
594
595        enclosure = maker.items.last.enclosure
596        enclosure.url = url
597        enclosure.length = length
598        # enclosure.type = type
599      end
600      assert_nil(rss.channel.items.last.enclosure)
601    end
602
603
604    def test_source
605      url = "http://static.userland.com/tomalak/links2.xml"
606      content = "Tomalak's Realm"
607
608      rss = RSS::Maker.make("2.0") do |maker|
609        setup_dummy_channel(maker)
610        setup_dummy_item(maker)
611
612        source = maker.items.last.source
613        source.url = url
614        source.content = content
615      end
616      source = rss.channel.items.last.source
617      assert_equal(url, source.url)
618      assert_equal(content, source.content)
619    end
620
621    def test_not_valid_source
622      url = "http://static.userland.com/tomalak/links2.xml"
623      content = "Tomalak's Realm"
624
625      rss = RSS::Maker.make("2.0") do |maker|
626        setup_dummy_channel(maker)
627        setup_dummy_item(maker)
628
629        source = maker.items.last.source
630        # source.url = url
631        source.content = content
632      end
633      assert_nil(rss.channel.items.last.source)
634
635      rss = RSS::Maker.make("2.0") do |maker|
636        setup_dummy_channel(maker)
637        setup_dummy_item(maker)
638
639        source = maker.items.last.source
640        source.url = url
641        # source.content = content
642      end
643      assert_nil(rss.channel.items.last.source)
644    end
645
646    def test_category
647      domain = "http://www.fool.com/cusips"
648      content = "MSFT"
649
650      rss = RSS::Maker.make("2.0") do |maker|
651        setup_dummy_channel(maker)
652        setup_dummy_item(maker)
653
654        maker.items.last.categories.new_category do |category|
655          category.domain = domain
656          category.content = content
657        end
658      end
659      category = rss.channel.items.last.categories.last
660      assert_equal(domain, category.domain)
661      assert_equal(content, category.content)
662    end
663
664    def test_not_valid_category
665      # content = "Grateful Dead"
666
667      rss = RSS::Maker.make("2.0") do |maker|
668        setup_dummy_channel(maker)
669        setup_dummy_item(maker)
670
671        maker.items.last.categories.new_category do |category|
672          # category.content = content
673        end
674      end
675      assert(rss.channel.items.last.categories.empty?)
676    end
677
678    def test_textInput
679      title = "fugafuga"
680      description = "text hoge fuga"
681      name = "hoge"
682      link = "http://hoge.com"
683
684      rss = RSS::Maker.make("2.0") do |maker|
685        setup_dummy_channel(maker)
686
687        maker.textinput.title = title
688        maker.textinput.description = description
689        maker.textinput.name = name
690        maker.textinput.link = link
691      end
692      textInput = rss.channel.textInput
693      assert_equal(title, textInput.title)
694      assert_equal(description, textInput.description)
695      assert_equal(name, textInput.name)
696      assert_equal(link, textInput.link)
697
698      assert_not_set_error("maker.channel", %w(link description title)) do
699        RSS::Maker.make("2.0") do |maker|
700          # setup_dummy_channel(maker)
701
702          maker.textinput.title = title
703          maker.textinput.description = description
704          maker.textinput.name = name
705          maker.textinput.link = link
706        end
707      end
708    end
709
710    def test_not_valid_textInput
711      title = "fugafuga"
712      description = "text hoge fuga"
713      name = "hoge"
714      link = "http://hoge.com"
715
716      rss = RSS::Maker.make("2.0") do |maker|
717        setup_dummy_channel(maker)
718
719        # maker.textinput.title = title
720        maker.textinput.description = description
721        maker.textinput.name = name
722        maker.textinput.link = link
723      end
724      assert_nil(rss.channel.textInput)
725
726      rss = RSS::Maker.make("2.0") do |maker|
727        setup_dummy_channel(maker)
728
729        maker.textinput.title = title
730        # maker.textinput.description = description
731        maker.textinput.name = name
732        maker.textinput.link = link
733      end
734      assert_nil(rss.channel.textInput)
735
736      rss = RSS::Maker.make("2.0") do |maker|
737        setup_dummy_channel(maker)
738
739        maker.textinput.title = title
740        maker.textinput.description = description
741        # maker.textinput.name = name
742        maker.textinput.link = link
743      end
744      assert_nil(rss.channel.textInput)
745
746      rss = RSS::Maker.make("2.0") do |maker|
747        setup_dummy_channel(maker)
748
749        maker.textinput.title = title
750        maker.textinput.description = description
751        maker.textinput.name = name
752        # maker.textinput.link = link
753      end
754      assert_nil(rss.channel.textInput)
755    end
756  end
757end
758