1
from datetime import datetime, timedelta
6
from miro import config, prefs
7
from miro.feed import Feed
8
from miro.item import Item, FileItem, FeedParserValues
9
from miro.downloader import RemoteDownloader
10
from miro.test.framework import MiroTestCase
11
from miro.singleclick import _build_entry
12
from miro.plat.utils import FilenameType
14
def fp_values_for_url(url):
15
return FeedParserValues(_build_entry(url, 'video/x-unknown'))
17
class ContainerItemTest(MiroTestCase):
19
MiroTestCase.setUp(self)
20
self.feed = Feed(u'dtv:manualFeed', initiallyAutoDownloadable=False)
21
self.tempdir = FilenameType(tempfile.mkdtemp())
22
self._make_fake_item("pcf.avi")
23
self._make_fake_item("dean.avi")
24
self._make_fake_item("npr.txt")
25
self.container_item = FileItem(self.tempdir, self.feed.id)
26
for child in self.container_item.getChildren():
27
if child.filename.endswith("avi"):
28
child.file_type = u'video'
30
child.file_type = u'other'
31
child.media_type_checked = True
35
shutil.rmtree(self.tempdir, ignore_errors=True)
36
MiroTestCase.tearDown(self)
38
def _make_fake_item(self, filename):
39
f = open(os.path.join(self.tempdir, filename), 'wb')
43
class ItemSeenTest(ContainerItemTest):
44
def test_seen_attribute(self):
45
# parents should be consider "seen" when all of their
46
# audio/video children are marked seen.
47
children = list(self.container_item.getChildren())
48
media_children = [i for i in children if i.is_playable()]
49
other_children = [i for i in children if not i.is_playable()]
50
self.assertEquals(len(media_children), 2)
51
self.assertEquals(len(other_children), 1)
52
self.assert_(not self.container_item.seen)
53
media_children[0].mark_item_seen()
54
self.assert_(not self.container_item.seen)
55
media_children[1].mark_item_seen()
56
self.assert_(self.container_item.seen)
57
media_children[1].mark_item_unseen()
58
self.assert_(not self.container_item.seen)
59
media_children[1].mark_item_seen()
60
self.assert_(self.container_item.seen)
62
class ChildRemoveTest(ContainerItemTest):
63
def test_expire_all_children(self):
64
children = list(self.container_item.getChildren())
65
for child in children[1:]:
67
self.assert_(self.container_item.id_exists())
69
self.assert_(not self.container_item.id_exists())
71
def test_remove_parent(self):
72
# test for the conditions that caused #11941
73
self.container_item.remove()
75
def test_parent_delete_files(self):
76
# test for the conditions that caused #11941
77
self.container_item.delete_files()
78
self.container_item.remove()
80
class ExpiredViewTest(MiroTestCase):
82
MiroTestCase.setUp(self)
83
self._expire_after_x_days_value = config.get(prefs.EXPIRE_AFTER_X_DAYS)
84
config.set(prefs.EXPIRE_AFTER_X_DAYS, 6)
87
MiroTestCase.tearDown(self)
88
config.set(prefs.EXPIRE_AFTER_X_DAYS, self._expire_after_x_days_value)
90
def test_expired_view_1(self):
91
f1 = Feed(u'http://example.com/1')
93
i1 = Item(fp_values_for_url(u'http://example.com/1/item1'),
95
i2 = Item(fp_values_for_url(u'http://example.com/1/item2'),
98
f1.setExpiration(u'never', 0)
99
i1.watchedTime = i2.watchedTime = datetime.now()
101
for obj in (f1, i1, i2):
104
self.assertEquals(list(f1.expiring_items()), [])
106
def test_expired_view_2(self):
107
f2 = Feed(u'http://example.com/2')
109
i3 = Item(fp_values_for_url(u'http://example.com/2/item1'),
111
i4 = Item(fp_values_for_url(u'http://example.com/2/item2'),
114
f2.setExpiration(u'system', 0)
115
# system default is 6 days as set in setUp, so i3 should expire,
117
i3.watchedTime = datetime.now() - timedelta(days=12)
118
i4.watchedTime = datetime.now() - timedelta(days=3)
120
for obj in (f2, i3, i4):
123
self.assertEquals(list(f2.expiring_items()), [i3])
125
def test_expired_view_3(self):
126
f3 = Feed(u'http://example.com/3')
128
i5 = Item(fp_values_for_url(u'http://example.com/3/item1'),
130
i6 = Item(fp_values_for_url(u'http://example.com/3/item2'),
133
f3.setExpiration(u'feed', 24)
134
i5.watchedTime = datetime.now() - timedelta(days=3)
135
i6.watchedTime = datetime.now() - timedelta(hours=12)
137
for obj in (f3, i5, i6):
140
self.assertEquals(list(f3.expiring_items()), [i5])
142
class ItemRemoveTest(MiroTestCase):
143
def test_watched_time_reset(self):
144
feed = Feed(u'http://example.com/1')
145
item = Item(fp_values_for_url(u'http://example.com/1/item1'),
147
item.watchedTime = datetime.now()
149
self.assertEquals(item.watchedTime, None)
151
def test_remove_before_downloader_referenced(self):
152
# when items are restored from the DB, the downloader
153
# attribute is loaded lazily. Make sure that if we remove the
154
# item, the downloader is still removed.
155
feed = Feed(u'http://example.com/1')
156
item = Item(fp_values_for_url(u'http://example.com/1/item1'),
158
item.set_downloader(RemoteDownloader(
159
u'http://example.com/1/item1/movie.mpeg', item))
160
downloader = item.downloader
162
feed = self.reload_object(feed)
163
downloader = self.reload_object(downloader)
164
item = self.reload_object(item)
167
self.assert_(not downloader.id_exists())