Merge branch 'pete'
[xmltvtotgd.git] / test_icetotgd.py
blob3d5e3ea83d2b395929d104b9bee0f96e8447c234
1 #!/usr/bin/env python
2 import unittest
3 import icetotgd
4 import datetime
6 class T(unittest.TestCase):
8 fake_files = {
9 'trivial.xml': '''<?xml version="1.0" encoding="ISO-8859-1"?>
10 <!DOCTYPE tv SYSTEM "http://iceguide.icetv.com.au/iceguide/iceguide.dtd">
11 <tv>
12 <channel id="2300">
13 <display-name>TwentyThree</display-name>
14 <region-name>Melbourne</region-name>
15 <lcn>23</lcn>
16 </channel>
17 <programme start="20091030110000 +0000" stop="20091030113000 +0000" channel="2300">
18 <title lang="en">Spiderman</title>
19 <sub-title lang="en">The One Where Spiderman Eats Salad</sub-title>
20 <desc lang="en">Action is his reward.</desc>
21 <category lang="en">News</category>
22 <category lang="en">Sport</category>
23 <episode-num system="icetv">169-0</episode-num>
24 </programme>
25 <programme start="20091104093500 +0000" stop="20091104110500 +0000" channel="32">
26 <title lang="en">Soccer: UEFA Champions League</title>
27 <sub-title lang="en">TBA</sub-title>
28 <category lang="en">Football</category>
29 <category lang="en">Soccer</category>
30 <category lang="en">Sport</category>
31 <episode-num system="icetv">14328-72386</episode-num>
32 <previously-shown start="20090917"/>
33 </programme>
34 <programme start="20091105093500 +0000" stop="20091105110500 +0000" channel="32">
35 <title lang="en">Suburb of the Moths</title>
36 <desc lang="en">A suburb is terrorised by shrimp moths from hell.</desc>
37 <credits>
38 <director>Dave Keenan</director>
39 <actor>Marvin O'Gravel Ballon-Face</actor>
40 <actor>Oliver Boliver Butt</actor>
41 <actor>Zanzibar Buck-Buck McBean</actor>
42 </credits>
43 <date>1996</date>
44 <category lang="en">Movie</category>
45 <subtitles type="teletext"/>
46 <rating system="">
47 <value>M</value>
48 </rating>
49 <previously-shown/>
50 </programme>
52 </tv>
53 '''}
55 programme = \
56 {'title': 'Spiderman',
57 'subtitle': 'The One Where Spiderman Eats Salad',
58 'desc': 'Action is his reward.',
59 'categories': ['News', 'Sport'],
60 'channel': '2300',
61 'start': datetime.datetime(2009, 10, 30, 11, 0),
62 'stop': datetime.datetime(2009, 10, 30, 11, 30)}
64 def open_fake(self, filename):
65 from StringIO import StringIO
66 return StringIO(self.fake_files[filename])
68 def setUp(self):
69 self.parser = icetotgd.IceToTgd()
70 self.parser.use_xml_file(self.open_fake('trivial.xml'))
72 def test_can_load_channels(self):
73 self.assertEqual(self.parser.channels,
74 {'2300': {'lcn': '23',
75 'display-name': 'TwentyThree'}})
77 def test_can_load_one_programme(self):
78 p = self.parser.programmes[0]
79 self.assertEqual(p['title'], 'Spiderman')
80 self.assertEqual(p['subtitle'], 'The One Where Spiderman Eats Salad')
81 self.assertEqual(p['desc'], 'Action is his reward.')
82 self.assertEqual(p['categories'], ['News', 'Sport'])
83 self.assertEqual(p['channel'], '2300')
84 self.assertEqual(p['rating'], None)
85 self.assertEqual(p['start'], datetime.datetime(2009, 10, 30, 11, 0))
86 self.assertEqual(p['stop'], datetime.datetime(2009, 10, 30, 11, 30))
88 def test_time_to_tgd(self):
89 start = datetime.datetime(2009, 10, 30, 11, 30)
90 tgd_start = icetotgd.tgd_time_from_timestamp(start)
91 self.assertEqual(tgd_start, '2009/10/30 22:30')
93 def test_duration_to_tgd(self):
94 start = datetime.datetime(2009, 10, 30, 11, 00)
95 stop = datetime.datetime(2009, 10, 30, 11, 30)
96 duration = stop - start
97 tgd_duration = icetotgd.tgd_duration_from_timedelta(duration)
98 self.assertEqual(tgd_duration, '30')
100 def test_programme_to_tgd(self):
101 tgd_line = self.parser.programme_to_tgd(self.programme)
102 self.assertEqual(tgd_line,
103 '23\t2009/10/30 22:00\t30\tSpiderman\tThe One Where Spiderman Eats Salad [News/Sport]\tAction is his reward.\tX\tN')
105 def test_can_parse_programme_xml_without_desc(self):
106 p = self.parser.programmes[1]
107 self.assertEqual(p['desc'], None)
109 def test_programme_xml_with_year(self):
110 p = self.parser.programmes[2]
111 self.assertEqual(p['date'], '1996')
113 def test_tgd_title_includes_year(self):
114 p = self.parser.programmes[2]
115 title = self.parser.tgd_title(p)
116 self.assertEqual(title, 'Suburb of the Moths (1996)')
118 def test_unrated_programmes_are_rated_x(self):
119 p = self.parser.programmes[0]
120 rating = self.parser.tgd_rating(p)
121 self.assertEqual(rating, 'X')
123 def test_can_get_programme_rating(self):
124 p = self.parser.programmes[2]
125 rating = self.parser.tgd_rating(p)
126 self.assertEqual(rating, 'M')
128 def test_description_says_subtitles_if_they_exist(self):
129 p = self.parser.programmes[2]
130 description = self.parser.tgd_description(p)
131 self.assertTrue(description.index('[Subtitles]'))
133 def test_description_doesnt_say_repeat_if_its_not_a_repeat(self):
134 p = self.parser.programmes[0]
135 description = self.parser.tgd_description(p)
136 self.assertTrue(description.find('[Repeat]') == -1)
138 def test_description_says_repeat_if_its_a_repeat(self):
139 p = self.parser.programmes[2]
140 description = self.parser.tgd_description(p)
141 self.assertTrue(description.find('[Repeat]') != -1)
143 def test_description_says_repeat_with_date_if_its_a_repeat_with_a_known_date(self):
144 p = self.parser.programmes[1]
145 description = self.parser.tgd_description(p)
146 date = datetime.date(2009, 9, 17).strftime('%x')
147 self.assertTrue(description.find('[Repeat, last shown ' + date + ']') != -1)
149 def test_tgd_short_description_includes_category(self):
150 p = self.parser.programmes[0]
151 short_desc = self.parser.tgd_short_description(p)
152 self.assertEqual(short_desc, 'The One Where Spiderman Eats Salad [News/Sport]')
154 def test_can_convert_programme_xml_without_desc(self):
155 p = self.programme.copy()
156 p['desc'] = None
157 tgd_line = self.parser.programme_to_tgd(p)
158 self.assertEqual(tgd_line,
159 '23\t2009/10/30 22:00\t30\tSpiderman\tThe One Where Spiderman Eats Salad [News/Sport]\t\tX\tN')
161 def test_str_or_empty(self):
162 from icetotgd import str_or_empty
163 self.assertEqual('', str_or_empty(None))
164 self.assertEqual('', str_or_empty(''))
165 self.assertEqual('foo', str_or_empty('foo'))
167 def test_filename_from_programme(self):
168 filename = icetotgd.tgd_filename_from_programme(self.programme)
169 self.assertEqual(filename, '20091030.tgd')
171 if __name__=='__main__':
172 unittest.main()