1require "rss-testcase"
2
3require "rss/maker"
4
5module RSS
6  class TestSetupMaker10 < TestCase
7
8    def setup
9      t = Time.iso8601("2000-01-01T12:00:05+00:00")
10      class << t
11        alias_method(:to_s, :iso8601)
12      end
13
14      @dc_elems = {
15        :title => "hoge",
16        :description =>
17          " XML is placing increasingly heavy loads on
18          the existing technical infrastructure of the Internet.",
19        :creator => "Rael Dornfest (mailto:rael@oreilly.com)",
20        :subject => "XML",
21        :publisher => "The O'Reilly Network",
22        :contributor => "hogehoge",
23        :type => "fugafuga",
24        :format => "hohoho",
25        :identifier => "fufufu",
26        :source => "barbar",
27        :language => "ja",
28        :relation => "cococo",
29        :rights => "Copyright (c) 2000 O'Reilly &amp; Associates, Inc.",
30        :date => t,
31      }
32
33      @sy_elems = {
34        :updatePeriod => "hourly",
35        :updateFrequency => "2",
36        :updateBase => t,
37      }
38
39      @content_elems = {
40        :encoded => "<em>ATTENTION</em>",
41      }
42
43      @trackback_elems = {
44        :ping => "http://bar.com/tb.cgi?tb_id=rssplustrackback",
45        :about => [
46          "http://foo.com/trackback/tb.cgi?tb_id=20020923",
47          "http://foo.com/trackback/tb.cgi?tb_id=20021010",
48        ],
49      }
50
51      @taxo_topic_elems = [
52        {
53          :link => "http://meerkat.oreillynet.com/?c=cat23",
54          :title => "Data: XML",
55          :description => "A Meerkat channel",
56        },
57        {
58          :link => "http://dmoz.org/Computers/Data_Formats/Markup_Languages/XML/",
59          :title => "XML",
60          :subject => "XML",
61          :description => "DMOZ category",
62          :topics => [
63            "http://meerkat.oreillynet.com/?c=cat23",
64            "http://dmoz.org/Computers/Data_Formats/Markup_Languages/SGML/",
65            "http://dmoz.org/Computers/Programming/Internet/",
66          ]
67        },
68      ]
69    end
70
71    def test_setup_maker_channel
72      about = "http://hoge.com"
73      title = "fugafuga"
74      link = "http://hoge.com"
75      description = "fugafugafugafuga"
76
77      rss = RSS::Maker.make("1.0") do |maker|
78        maker.channel.about = about
79        maker.channel.title = title
80        maker.channel.link = link
81        maker.channel.description = description
82
83        @dc_elems.each do |var, value|
84          maker.channel.__send__("dc_#{var}=", value)
85        end
86
87        @sy_elems.each do |var, value|
88          maker.channel.__send__("sy_#{var}=", value)
89        end
90
91        setup_dummy_item(maker)
92      end
93
94      new_rss = RSS::Maker.make("1.0") do |maker|
95        rss.channel.setup_maker(maker)
96        rss.items.each do |item|
97          item.setup_maker(maker)
98        end
99      end
100      channel = new_rss.channel
101
102      assert_equal(about, channel.about)
103      assert_equal(title, channel.title)
104      assert_equal(link, channel.link)
105      assert_equal(description, channel.description)
106      assert_equal(1, channel.items.Seq.lis.size)
107      assert_nil(channel.image)
108      assert_nil(channel.textinput)
109
110      @dc_elems.each do |var, value|
111        assert_equal(value, channel.__send__("dc_#{var}"))
112      end
113
114      @sy_elems.each do |var, value|
115        value = value.to_i if var == :updateFrequency
116        assert_equal(value, channel.__send__("sy_#{var}"))
117      end
118
119    end
120
121    def test_setup_maker_image
122      title = "fugafuga"
123      link = "http://hoge.com"
124      url = "http://hoge.com/hoge.png"
125
126      rss = RSS::Maker.make("1.0") do |maker|
127        setup_dummy_channel(maker)
128        maker.channel.link = link
129
130        maker.image.title = title
131        maker.image.url = url
132
133        @dc_elems.each do |var, value|
134          maker.image.__send__("dc_#{var}=", value)
135        end
136
137        setup_dummy_item(maker)
138      end
139
140      new_rss = RSS::Maker.make("1.0") do |maker|
141        rss.channel.setup_maker(maker)
142        rss.image.setup_maker(maker)
143        rss.items.each do |item|
144          item.setup_maker(maker)
145        end
146      end
147
148      image = new_rss.image
149      assert_equal(url, image.about)
150      assert_equal(url, new_rss.channel.image.resource)
151      assert_equal(title, image.title)
152      assert_equal(link, image.link)
153      assert_equal(url, image.url)
154
155      @dc_elems.each do |var, value|
156        assert_equal(image.__send__("dc_#{var}"), value)
157      end
158    end
159
160    def test_setup_maker_textinput
161      title = "fugafuga"
162      description = "text hoge fuga"
163      name = "hoge"
164      link = "http://hoge.com"
165
166      rss = RSS::Maker.make("1.0") do |maker|
167        setup_dummy_channel(maker)
168
169        maker.textinput.link = link
170        maker.textinput.title = title
171        maker.textinput.description = description
172        maker.textinput.name = name
173
174        @dc_elems.each do |var, value|
175          maker.textinput.__send__("dc_#{var}=", value)
176        end
177
178        setup_dummy_item(maker)
179      end
180
181      new_rss = RSS::Maker.make("1.0") do |maker|
182        rss.channel.setup_maker(maker)
183        rss.textinput.setup_maker(maker)
184        rss.items.each do |item|
185          item.setup_maker(maker)
186        end
187      end
188
189      textinput = new_rss.textinput
190      assert_equal(link, textinput.about)
191      assert_equal(link, new_rss.channel.textinput.resource)
192      assert_equal(title, textinput.title)
193      assert_equal(name, textinput.name)
194      assert_equal(description, textinput.description)
195      assert_equal(link, textinput.link)
196
197      @dc_elems.each do |var, value|
198        assert_equal(textinput.__send__("dc_#{var}"), value)
199      end
200    end
201
202    def test_setup_maker_items(for_backward_compatibility=false)
203      title = "TITLE"
204      link = "http://hoge.com/"
205      description = "text hoge fuga"
206
207      item_size = 5
208
209      rss = RSS::Maker.make("1.0") do |maker|
210        setup_dummy_channel(maker)
211
212        item_size.times do |i|
213          maker.items.new_item do |item|
214            item.title = "#{title}#{i}"
215            item.link = "#{link}#{i}"
216            item.description = "#{description}#{i}"
217
218            @dc_elems.each do |var, value|
219              item.__send__("dc_#{var}=", value)
220            end
221
222            @content_elems.each do |var, value|
223              item.__send__("content_#{var}=", value)
224            end
225
226            item.trackback_ping = @trackback_elems[:ping]
227            @trackback_elems[:about].each do |value|
228              item.trackback_abouts.new_about do |new_about|
229                new_about.value = value
230              end
231            end
232          end
233        end
234      end
235
236      new_rss = RSS::Maker.make("1.0") do |maker|
237        rss.channel.setup_maker(maker)
238
239        rss.items.each do |item|
240          if for_backward_compatibility
241            item.setup_maker(maker)
242          else
243            item.setup_maker(maker.items)
244          end
245        end
246      end
247
248      assert_equal(item_size, new_rss.items.size)
249      new_rss.items.each_with_index do |item, i|
250        assert_equal("#{link}#{i}", item.about)
251        assert_equal("#{title}#{i}", item.title)
252        assert_equal("#{link}#{i}", item.link)
253        assert_equal("#{description}#{i}", item.description)
254
255        @dc_elems.each do |var, value|
256          assert_equal(item.__send__("dc_#{var}"), value)
257        end
258
259        @content_elems.each do |var, value|
260          assert_equal(item.__send__("content_#{var}"), value)
261        end
262
263        assert_equal(@trackback_elems[:ping], item.trackback_ping)
264        assert_equal(@trackback_elems[:about].size, item.trackback_abouts.size)
265        item.trackback_abouts.each_with_index do |about, j|
266          assert_equal(@trackback_elems[:about][j], about.value)
267        end
268      end
269    end
270
271    def test_setup_maker_items_sort
272      title = "TITLE"
273      link = "http://hoge.com/"
274      description = "text hoge fuga"
275
276      item_size = 5
277
278      rss = RSS::Maker.make("1.0") do |maker|
279        setup_dummy_channel(maker)
280
281        item_size.times do |i|
282          item = RSS::RDF::Item.new("#{link}#{i}")
283          item.title = "#{title}#{i}"
284          item.link = "#{link}#{i}"
285          item.description = "#{description}#{i}"
286          item.dc_date = Time.now + i * 60
287          item.setup_maker(maker.items)
288        end
289        maker.items.do_sort = false
290      end
291      assert_equal(item_size, rss.items.size)
292      rss.items.each_with_index do |item, i|
293        assert_equal("#{link}#{i}", item.about)
294        assert_equal("#{title}#{i}", item.title)
295        assert_equal("#{link}#{i}", item.link)
296        assert_equal("#{description}#{i}", item.description)
297      end
298
299
300      rss = RSS::Maker.make("1.0") do |maker|
301        setup_dummy_channel(maker)
302
303        item_size.times do |i|
304          item = RSS::RDF::Item.new("#{link}#{i}")
305          item.title = "#{title}#{i}"
306          item.link = "#{link}#{i}"
307          item.description = "#{description}#{i}"
308          item.dc_date = Time.now + i * 60
309          item.setup_maker(maker.items)
310        end
311        maker.items.do_sort = true
312      end
313      assert_equal(item_size, rss.items.size)
314      rss.items.reverse.each_with_index do |item, i|
315        assert_equal("#{link}#{i}", item.about)
316        assert_equal("#{title}#{i}", item.title)
317        assert_equal("#{link}#{i}", item.link)
318        assert_equal("#{description}#{i}", item.description)
319      end
320    end
321
322    def test_setup_maker_items_backward_compatibility
323      test_setup_maker_items(true)
324    end
325
326    def test_setup_maker
327      encoding = "EUC-JP"
328      standalone = true
329
330      href = 'a.xsl'
331      type = 'text/xsl'
332      title = 'sample'
333      media = 'printer'
334      charset = 'UTF-8'
335      alternate = 'yes'
336
337      rss = RSS::Maker.make("1.0") do |maker|
338        maker.encoding = encoding
339        maker.standalone = standalone
340
341        maker.xml_stylesheets.new_xml_stylesheet do |xss|
342          xss.href = href
343          xss.type = type
344          xss.title = title
345          xss.media = media
346          xss.charset = charset
347          xss.alternate = alternate
348        end
349
350        setup_dummy_channel(maker)
351        setup_dummy_item(maker)
352      end
353
354      new_rss = RSS::Maker.make("1.0") do |maker|
355        rss.setup_maker(maker)
356      end
357
358      assert_equal("1.0", new_rss.rss_version)
359      assert_equal(encoding, new_rss.encoding)
360      assert_equal(standalone, new_rss.standalone)
361
362      xss = new_rss.xml_stylesheets.first
363      assert_equal(1, new_rss.xml_stylesheets.size)
364      assert_equal(href, xss.href)
365      assert_equal(type, xss.type)
366      assert_equal(title, xss.title)
367      assert_equal(media, xss.media)
368      assert_equal(charset, xss.charset)
369      assert_equal(alternate, xss.alternate)
370    end
371
372    def test_setup_maker_full
373      encoding = "EUC-JP"
374      standalone = true
375
376      href = 'a.xsl'
377      type = 'text/xsl'
378      title = 'sample'
379      media = 'printer'
380      charset = 'UTF-8'
381      alternate = 'yes'
382
383      channel_about = "http://hoge.com"
384      channel_title = "fugafuga"
385      channel_link = "http://hoge.com"
386      channel_description = "fugafugafugafuga"
387
388      image_title = "fugafuga"
389      image_url = "http://hoge.com/hoge.png"
390
391      textinput_title = "fugafuga"
392      textinput_description = "text hoge fuga"
393      textinput_name = "hoge"
394      textinput_link = "http://hoge.com"
395
396      item_title = "TITLE"
397      item_link = "http://hoge.com/"
398      item_description = "text hoge fuga"
399
400      item_size = 5
401
402      rss = RSS::Maker.make("1.0") do |maker|
403        maker.encoding = encoding
404        maker.standalone = standalone
405
406        maker.xml_stylesheets.new_xml_stylesheet do |xss|
407          xss.href = href
408          xss.type = type
409          xss.title = title
410          xss.media = media
411          xss.charset = charset
412          xss.alternate = alternate
413        end
414
415        maker.channel.about = channel_about
416        maker.channel.title = channel_title
417        maker.channel.link = channel_link
418        maker.channel.description = channel_description
419        @dc_elems.each do |var, value|
420          maker.channel.__send__("dc_#{var}=", value)
421        end
422        @sy_elems.each do |var, value|
423          maker.channel.__send__("sy_#{var}=", value)
424        end
425
426        maker.image.title = image_title
427        maker.image.url = image_url
428        @dc_elems.each do |var, value|
429          maker.image.__send__("dc_#{var}=", value)
430        end
431
432        maker.textinput.link = textinput_link
433        maker.textinput.title = textinput_title
434        maker.textinput.description = textinput_description
435        maker.textinput.name = textinput_name
436        @dc_elems.each do |var, value|
437          maker.textinput.__send__("dc_#{var}=", value)
438        end
439
440        item_size.times do |i|
441          maker.items.new_item do |item|
442            item.title = "#{item_title}#{i}"
443            item.link = "#{item_link}#{i}"
444            item.description = "#{item_description}#{i}"
445
446            @dc_elems.each do |var, value|
447              item.__send__("dc_#{var}=", value)
448            end
449
450            @content_elems.each do |var, value|
451              item.__send__("content_#{var}=", value)
452            end
453
454            item.trackback_ping = @trackback_elems[:ping]
455            @trackback_elems[:about].each do |value|
456              item.trackback_abouts.new_about do |new_about|
457                new_about.value = value
458              end
459            end
460          end
461        end
462
463        setup_taxo_topic(maker, @taxo_topic_elems)
464      end
465
466      new_rss = RSS::Maker.make("1.0") do |maker|
467        rss.setup_maker(maker)
468      end
469
470      assert_equal("1.0", new_rss.rss_version)
471      assert_equal(encoding, new_rss.encoding)
472      assert_equal(standalone, new_rss.standalone)
473
474      xss = new_rss.xml_stylesheets.first
475      assert_equal(1, new_rss.xml_stylesheets.size)
476      assert_equal(href, xss.href)
477      assert_equal(type, xss.type)
478      assert_equal(title, xss.title)
479      assert_equal(media, xss.media)
480      assert_equal(charset, xss.charset)
481      assert_equal(alternate, xss.alternate)
482
483      channel = new_rss.channel
484      assert_equal(channel_about, channel.about)
485      assert_equal(channel_title, channel.title)
486      assert_equal(channel_link, channel.link)
487      assert_equal(channel_description, channel.description)
488      item_resources = []
489      item_size.times do |i|
490        item_resources << "#{item_link}#{i}"
491      end
492      assert_equal(item_resources, channel.items.resources)
493      assert_equal(image_url, channel.image.resource)
494      assert_equal(textinput_link, channel.textinput.resource)
495      @dc_elems.each do |var, value|
496        assert_equal(value, channel.__send__("dc_#{var}"))
497      end
498      @sy_elems.each do |var, value|
499        value = value.to_i if var == :updateFrequency
500        assert_equal(value, channel.__send__("sy_#{var}"))
501      end
502
503      image = new_rss.image
504      assert_equal(image_url, image.about)
505      assert_equal(image_url, new_rss.channel.image.resource)
506      assert_equal(image_title, image.title)
507      assert_equal(channel_link, image.link)
508      assert_equal(image_url, image.url)
509      @dc_elems.each do |var, value|
510        assert_equal(image.__send__("dc_#{var}"), value)
511      end
512
513      textinput = new_rss.textinput
514      assert_equal(textinput_link, textinput.about)
515      assert_equal(textinput_link, new_rss.channel.textinput.resource)
516      assert_equal(textinput_title, textinput.title)
517      assert_equal(textinput_name, textinput.name)
518      assert_equal(textinput_description, textinput.description)
519      assert_equal(textinput_link, textinput.link)
520      @dc_elems.each do |var, value|
521        assert_equal(textinput.__send__("dc_#{var}"), value)
522      end
523
524      assert_equal(item_size, new_rss.items.size)
525      new_rss.items.each_with_index do |item, i|
526        assert_equal("#{item_link}#{i}", item.about)
527        assert_equal("#{item_title}#{i}", item.title)
528        assert_equal("#{item_link}#{i}", item.link)
529        assert_equal("#{item_description}#{i}", item.description)
530
531        @dc_elems.each do |var, value|
532          assert_equal(item.__send__("dc_#{var}"), value)
533        end
534
535        @content_elems.each do |var, value|
536          assert_equal(item.__send__("content_#{var}"), value)
537        end
538
539        assert_equal(@trackback_elems[:ping], item.trackback_ping)
540        assert_equal(@trackback_elems[:about].size, item.trackback_abouts.size)
541        item.trackback_abouts.each_with_index do |about, j|
542          assert_equal(@trackback_elems[:about][j], about.value)
543        end
544      end
545
546      assert_taxo_topic(@taxo_topic_elems, new_rss)
547    end
548
549  end
550end
551