1require "rss-testcase"
2
3require "rss/maker"
4
5module RSS
6  class TestMaker09 < TestCase
7    def test_supported?
8      assert(RSS::Maker.supported?("0.9"))
9      assert(RSS::Maker.supported?("rss0.9"))
10      assert(RSS::Maker.supported?("0.91"))
11      assert(RSS::Maker.supported?("rss0.91"))
12      assert(RSS::Maker.supported?("0.92"))
13      assert(RSS::Maker.supported?("rss0.92"))
14      assert(!RSS::Maker.supported?("0.93"))
15      assert(!RSS::Maker.supported?("rss0.93"))
16    end
17
18    def test_find_class
19      assert_equal(RSS::Maker::RSS091, RSS::Maker["0.91"])
20      assert_equal(RSS::Maker::RSS091, RSS::Maker["rss0.91"])
21      assert_equal(RSS::Maker::RSS092, RSS::Maker["0.9"])
22      assert_equal(RSS::Maker::RSS092, RSS::Maker["0.92"])
23      assert_equal(RSS::Maker::RSS092, RSS::Maker["rss0.92"])
24    end
25
26    def test_rss
27      assert_raise(LocalJumpError) do
28        RSS::Maker.make("0.91")
29      end
30
31      rss = RSS::Maker.make("0.9") do |maker|
32        setup_dummy_channel(maker)
33        setup_dummy_image(maker)
34      end
35      assert_equal("0.92", rss.rss_version)
36
37      rss = RSS::Maker.make("0.91") do |maker|
38        setup_dummy_channel(maker)
39        setup_dummy_image(maker)
40      end
41      assert_equal("0.91", rss.rss_version)
42
43
44      rss = RSS::Maker.make("0.91") do |maker|
45        setup_dummy_channel(maker)
46        setup_dummy_image(maker)
47
48        maker.encoding = "EUC-JP"
49      end
50      assert_equal("0.91", rss.rss_version)
51      assert_equal("EUC-JP", rss.encoding)
52
53      rss = RSS::Maker.make("0.91") do |maker|
54        setup_dummy_channel(maker)
55        setup_dummy_image(maker)
56
57        maker.standalone = "yes"
58      end
59      assert_equal("0.91", rss.rss_version)
60      assert_equal("yes", rss.standalone)
61
62      rss = RSS::Maker.make("0.91") do |maker|
63        setup_dummy_channel(maker)
64        setup_dummy_image(maker)
65
66        maker.encoding = "EUC-JP"
67        maker.standalone = "yes"
68      end
69      assert_equal("0.91", rss.rss_version)
70      assert_equal("EUC-JP", rss.encoding)
71      assert_equal("yes", rss.standalone)
72    end
73
74    def test_channel
75      title = "fugafuga"
76      link = "http://hoge.com"
77      description = "fugafugafugafuga"
78      language = "ja"
79      copyright = "foo"
80      managingEditor = "bar"
81      webMaster = "web master"
82      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))'
83      docs = "http://foo.com/doc"
84      skipDays = [
85        "Sunday",
86        "Monday",
87      ]
88      skipHours = [
89        "0",
90        "13",
91      ]
92      pubDate = Time.now
93      lastBuildDate = Time.now
94
95      image_url = "http://example.com/logo.png"
96      image_title = "Logo"
97
98      rss = RSS::Maker.make("0.91") do |maker|
99        maker.channel.title = title
100        maker.channel.link = link
101        maker.channel.description = description
102        maker.channel.language = language
103        maker.channel.copyright = copyright
104        maker.channel.managingEditor = managingEditor
105        maker.channel.webMaster = webMaster
106        maker.channel.rating = rating
107        maker.channel.docs = docs
108        maker.channel.pubDate = pubDate
109        maker.channel.lastBuildDate = lastBuildDate
110
111        skipDays.each do |day|
112          maker.channel.skipDays.new_day do |new_day|
113            new_day.content = day
114          end
115        end
116        skipHours.each do |hour|
117          maker.channel.skipHours.new_hour do |new_hour|
118            new_hour.content = hour
119          end
120        end
121
122        maker.image.url = image_url
123        maker.image.title = image_title
124      end
125      channel = rss.channel
126
127      assert_equal(title, channel.title)
128      assert_equal(link, channel.link)
129      assert_equal(description, channel.description)
130      assert_equal(language, channel.language)
131      assert_equal(copyright, channel.copyright)
132      assert_equal(managingEditor, channel.managingEditor)
133      assert_equal(webMaster, channel.webMaster)
134      assert_equal(rating, channel.rating)
135      assert_equal(docs, channel.docs)
136      assert_equal(pubDate, channel.pubDate)
137      assert_equal(pubDate, channel.date)
138      assert_equal(lastBuildDate, channel.lastBuildDate)
139
140      skipDays.each_with_index do |day, i|
141        assert_equal(day, channel.skipDays.days[i].content)
142      end
143      skipHours.each_with_index do |hour, i|
144        assert_equal(hour.to_i, channel.skipHours.hours[i].content)
145      end
146
147      assert(channel.items.empty?)
148
149      assert_equal(image_url, channel.image.url)
150      assert_equal(image_title, channel.image.title)
151      assert_equal(link, channel.image.link)
152
153      assert_nil(channel.textInput)
154    end
155
156    def test_not_valid_channel
157      title = "fugafuga"
158      link = "http://hoge.com"
159      description = "fugafugafugafuga"
160      language = "ja"
161
162      assert_not_set_error("maker.channel", %w(title)) do
163        RSS::Maker.make("0.91") do |maker|
164          # maker.channel.title = title
165          maker.channel.link = link
166          maker.channel.description = description
167          maker.channel.language = language
168        end
169      end
170
171      assert_not_set_error("maker.channel", %w(link)) do
172        RSS::Maker.make("0.91") do |maker|
173          maker.channel.title = title
174          # maker.channel.link = link
175          maker.channel.link = nil
176          maker.channel.description = description
177          maker.channel.language = language
178        end
179      end
180
181      assert_not_set_error("maker.channel", %w(description)) do
182        RSS::Maker.make("0.91") do |maker|
183          maker.channel.title = title
184          maker.channel.link = link
185          # maker.channel.description = description
186          maker.channel.language = language
187        end
188      end
189
190      assert_not_set_error("maker.channel", %w(language)) do
191        RSS::Maker.make("0.91") do |maker|
192          maker.channel.title = title
193          maker.channel.link = link
194          maker.channel.description = description
195          # maker.channel.language = language
196        end
197      end
198    end
199
200    def test_image
201      title = "fugafuga"
202      link = "http://hoge.com"
203      url = "http://hoge.com/hoge.png"
204      width = "144"
205      height = "400"
206      description = "an image"
207
208      rss = RSS::Maker.make("0.91") do |maker|
209        setup_dummy_channel(maker)
210        maker.channel.link = link
211
212        maker.image.title = title
213        maker.image.url = url
214        maker.image.width = width
215        maker.image.height = height
216        maker.image.description = description
217      end
218      image = rss.image
219      assert_equal(title, image.title)
220      assert_equal(link, image.link)
221      assert_equal(url, image.url)
222      assert_equal(width.to_i, image.width)
223      assert_equal(height.to_i, image.height)
224      assert_equal(description, image.description)
225
226      assert_not_set_error("maker.channel", %w(description title language)) do
227        RSS::Maker.make("0.91") do |maker|
228          # setup_dummy_channel(maker)
229          maker.channel.link = link
230
231          maker.image.title = title
232          maker.image.url = url
233          maker.image.width = width
234          maker.image.height = height
235          maker.image.description = description
236        end
237      end
238    end
239
240    def test_not_valid_image
241      title = "fugafuga"
242      link = "http://hoge.com"
243      url = "http://hoge.com/hoge.png"
244      width = "144"
245      height = "400"
246      description = "an image"
247
248      assert_not_set_error("maker.image", %w(title)) do
249        RSS::Maker.make("0.91") do |maker|
250          setup_dummy_channel(maker)
251          maker.channel.link = link
252
253          # maker.image.title = title
254          maker.image.url = url
255          maker.image.width = width
256          maker.image.height = height
257          maker.image.description = description
258        end
259      end
260
261      assert_not_set_error("maker.channel", %w(link)) do
262        RSS::Maker.make("0.91") do |maker|
263          setup_dummy_channel(maker)
264          # maker.channel.link = link
265          maker.channel.link = nil
266
267          maker.image.title = title
268          maker.image.url = url
269          maker.image.width = width
270          maker.image.height = height
271          maker.image.description = description
272        end
273      end
274
275      assert_not_set_error("maker.image", %w(url)) do
276        RSS::Maker.make("0.91") do |maker|
277          setup_dummy_channel(maker)
278          maker.channel.link = link
279
280          maker.image.title = title
281          # maker.image.url = url
282          maker.image.width = width
283          maker.image.height = height
284          maker.image.description = description
285        end
286      end
287    end
288
289    def test_items(with_convenience_way=true)
290      title = "TITLE"
291      link = "http://hoge.com/"
292      description = "text hoge fuga"
293
294      rss = RSS::Maker.make("0.91") do |maker|
295        setup_dummy_channel(maker)
296        setup_dummy_image(maker)
297      end
298      assert(rss.channel.items.empty?)
299
300      rss = RSS::Maker.make("0.91") do |maker|
301        setup_dummy_channel(maker)
302
303        maker.items.new_item do |item|
304          item.title = title
305          item.link = link
306          # item.description = description
307        end
308
309        setup_dummy_image(maker)
310      end
311      assert_equal(1, rss.channel.items.size)
312      item = rss.channel.items.first
313      assert_equal(title, item.title)
314      assert_equal(link, item.link)
315      assert_nil(item.description)
316
317
318      item_size = 5
319      rss = RSS::Maker.make("0.91") do |maker|
320        setup_dummy_channel(maker)
321
322        item_size.times do |i|
323          maker.items.new_item do |_item|
324            _item.title = "#{title}#{i}"
325            _item.link = "#{link}#{i}"
326            _item.description = "#{description}#{i}"
327          end
328        end
329        maker.items.do_sort = true
330
331        setup_dummy_image(maker)
332      end
333      assert_equal(item_size, rss.items.size)
334      rss.channel.items.each_with_index do |_item, i|
335        assert_equal("#{title}#{i}", _item.title)
336        assert_equal("#{link}#{i}", _item.link)
337        assert_equal("#{description}#{i}", _item.description)
338      end
339
340      rss = RSS::Maker.make("0.91") do |maker|
341        setup_dummy_channel(maker)
342
343        item_size.times do |i|
344          maker.items.new_item do |_item|
345            _item.title = "#{title}#{i}"
346            _item.link = "#{link}#{i}"
347            _item.description = "#{description}#{i}"
348          end
349        end
350        maker.items.do_sort = Proc.new do |x, y|
351          if with_convenience_way
352            y.title[-1] <=> x.title[-1]
353          else
354            y.title {|t| t.content[-1]} <=> x.title {|t| t.content[-1]}
355          end
356        end
357
358        setup_dummy_image(maker)
359      end
360      assert_equal(item_size, rss.items.size)
361      rss.channel.items.reverse.each_with_index do |_item, i|
362        assert_equal("#{title}#{i}", _item.title)
363        assert_equal("#{link}#{i}", _item.link)
364        assert_equal("#{description}#{i}", _item.description)
365      end
366    end
367
368    def test_items_with_new_api_since_018
369      test_items(false)
370    end
371
372    def test_textInput
373      title = "fugafuga"
374      description = "text hoge fuga"
375      name = "hoge"
376      link = "http://hoge.com"
377
378      rss = RSS::Maker.make("0.91") do |maker|
379        setup_dummy_channel(maker)
380        setup_dummy_image(maker)
381
382        maker.textinput.title = title
383        maker.textinput.description = description
384        maker.textinput.name = name
385        maker.textinput.link = link
386      end
387      textInput = rss.channel.textInput
388      assert_equal(title, textInput.title)
389      assert_equal(description, textInput.description)
390      assert_equal(name, textInput.name)
391      assert_equal(link, textInput.link)
392
393      assert_not_set_error("maker.channel",
394                           %w(link language description title)) do
395        RSS::Maker.make("0.91") do |maker|
396          # setup_dummy_channel(maker)
397
398          maker.textinput.title = title
399          maker.textinput.description = description
400          maker.textinput.name = name
401          maker.textinput.link = link
402        end
403      end
404    end
405
406    def test_not_valid_textInput
407      title = "fugafuga"
408      description = "text hoge fuga"
409      name = "hoge"
410      link = "http://hoge.com"
411
412      rss = RSS::Maker.make("0.91") do |maker|
413        setup_dummy_channel(maker)
414        setup_dummy_image(maker)
415
416        # maker.textinput.title = title
417        maker.textinput.description = description
418        maker.textinput.name = name
419        maker.textinput.link = link
420      end
421      assert_nil(rss.channel.textInput)
422
423      rss = RSS::Maker.make("0.91") do |maker|
424        setup_dummy_channel(maker)
425        setup_dummy_image(maker)
426
427        maker.textinput.title = title
428        # maker.textinput.description = description
429        maker.textinput.name = name
430        maker.textinput.link = link
431      end
432      assert_nil(rss.channel.textInput)
433
434      rss = RSS::Maker.make("0.91") do |maker|
435        setup_dummy_channel(maker)
436        setup_dummy_image(maker)
437
438        maker.textinput.title = title
439        maker.textinput.description = description
440        # maker.textinput.name = name
441        maker.textinput.link = link
442      end
443      assert_nil(rss.channel.textInput)
444
445      rss = RSS::Maker.make("0.91") do |maker|
446        setup_dummy_channel(maker)
447        setup_dummy_image(maker)
448
449        maker.textinput.title = title
450        maker.textinput.description = description
451        maker.textinput.name = name
452        # maker.textinput.link = link
453      end
454      assert_nil(rss.channel.textInput)
455    end
456
457    def test_date_in_string
458      date = Time.now
459
460      rss = RSS::Maker.make("0.91") do |maker|
461        setup_dummy_channel(maker)
462        setup_dummy_image(maker)
463
464        maker.items.new_item do |item|
465          item.title = "The first item"
466          item.link = "http://example.com/blog/1.html"
467          item.date = date.rfc822
468        end
469      end
470
471      assert_equal(date.iso8601, rss.items[0].date.iso8601)
472    end
473  end
474end
475