1require "rss-testcase"
2
3require "rss/maker"
4
5module RSS
6  class TestSetupMakerITunes < TestCase
7    def test_setup_maker_simple
8      author = "John Doe"
9      block = true
10      categories = ["Audio Blogs"]
11      image = "http://example.com/podcasts/everything/AllAboutEverything.jpg"
12      duration = "4:05"
13      duration_components = [0, 4, 5]
14      explicit = true
15      keywords = ["salt", "pepper", "shaker", "exciting"]
16      new_feed_url = "http://newlocation.com/example.rss"
17      owner = {:name => "John Doe", :email => "john.doe@example.com"}
18      subtitle = "A show about everything"
19      summary = "All About Everything is a show about " +
20        "everything. Each week we dive into any " +
21        "subject known to man and talk about it " +
22        "as much as we can. Look for our Podcast " +
23        "in the iTunes Music Store"
24
25      feed = RSS::Maker.make("rss2.0") do |maker|
26        setup_dummy_channel(maker)
27        setup_dummy_item(maker)
28
29        channel = maker.channel
30        channel.itunes_author = author
31        channel.itunes_block = block
32        categories.each do |category|
33          channel.itunes_categories.new_category.text = category
34        end
35        channel.itunes_image = image
36        channel.itunes_explicit = explicit
37        channel.itunes_keywords = keywords
38        channel.itunes_owner.itunes_name = owner[:name]
39        channel.itunes_owner.itunes_email = owner[:email]
40        channel.itunes_subtitle = subtitle
41        channel.itunes_summary = summary
42
43        item = maker.items.last
44        item.itunes_author = author
45        item.itunes_block = block
46        item.itunes_duration = duration
47        item.itunes_explicit = explicit
48        item.itunes_keywords = keywords
49        item.itunes_subtitle = subtitle
50        item.itunes_summary = summary
51      end
52      assert_not_nil(feed)
53
54      new_feed = RSS::Maker.make("rss2.0") do |maker|
55        feed.setup_maker(maker)
56      end
57      assert_not_nil(new_feed)
58
59      channel = new_feed.channel
60      item = new_feed.items.last
61
62      assert_equal(author, channel.itunes_author)
63      assert_equal(author, item.itunes_author)
64
65      assert_equal(block, channel.itunes_block?)
66      assert_equal(block, item.itunes_block?)
67
68      assert_equal(categories,
69                   collect_itunes_categories(channel.itunes_categories))
70
71      assert_equal(image, channel.itunes_image.href)
72
73      assert_equal(duration_components,
74                   [item.itunes_duration.hour,
75                    item.itunes_duration.minute,
76                    item.itunes_duration.second])
77
78      assert_equal(explicit, channel.itunes_explicit?)
79      assert_equal(explicit, item.itunes_explicit?)
80
81      assert_equal(keywords, channel.itunes_keywords)
82      assert_equal(keywords, item.itunes_keywords)
83
84      assert_equal(owner,
85                   {
86                     :name => channel.itunes_owner.itunes_name,
87                     :email => channel.itunes_owner.itunes_email
88                   })
89
90      assert_equal(subtitle, channel.itunes_subtitle)
91      assert_equal(subtitle, item.itunes_subtitle)
92
93      assert_equal(summary, channel.itunes_summary)
94      assert_equal(summary, item.itunes_summary)
95    end
96
97    def test_setup_maker_with_nested_categories
98      categories = [["Arts & Entertainment", "Games"],
99                    ["Technology", "Computers"],
100                    "Audio Blogs"]
101
102      feed = RSS::Maker.make("rss2.0") do |maker|
103        setup_dummy_channel(maker)
104        setup_dummy_item(maker)
105
106        channel = maker.channel
107        categories.each do |category|
108          target = channel.itunes_categories
109          if category.is_a?(Array)
110            category.each do |sub_category|
111              target = target.new_category
112              target.text = sub_category
113            end
114          else
115            target.new_category.text = category
116          end
117        end
118      end
119      assert_not_nil(feed)
120
121      new_feed = RSS::Maker.make("rss2.0") do |maker|
122        feed.setup_maker(maker)
123      end
124      assert_not_nil(new_feed)
125
126      channel = new_feed.channel
127
128      assert_equal(categories,
129                   collect_itunes_categories(channel.itunes_categories))
130    end
131
132    private
133    def collect_itunes_categories(categories)
134      categories.collect do |c|
135        rest = collect_itunes_categories(c.itunes_categories)
136        if rest.empty?
137          c.text
138        else
139          [c.text, *rest]
140        end
141      end
142    end
143  end
144end
145