~ubuntu-branches/ubuntu/natty/miro/natty

« back to all changes in this revision

Viewing changes to portable/test/itemtest.py

  • Committer: Bazaar Package Importer
  • Author(s): Bryce Harrington
  • Date: 2011-01-22 02:46:33 UTC
  • mfrom: (1.4.10 upstream) (1.7.5 experimental)
  • Revision ID: james.westby@ubuntu.com-20110122024633-kjme8u93y2il5nmf
Tags: 3.5.1-1ubuntu1
* Merge from debian.  Remaining ubuntu changes:
  - Use python 2.7 instead of python 2.6
  - Relax dependency on python-dbus to >= 0.83.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
from datetime import datetime, timedelta
2
 
import os
3
 
import tempfile
4
 
import shutil
5
 
 
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
13
 
 
14
 
def fp_values_for_url(url):
15
 
    return FeedParserValues(_build_entry(url, 'video/x-unknown'))
16
 
 
17
 
class ContainerItemTest(MiroTestCase):
18
 
    def setUp(self):
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'
29
 
            else:
30
 
                child.file_type = u'other'
31
 
            child.media_type_checked = True
32
 
            child.signal_change()
33
 
 
34
 
    def tearDown(self):
35
 
        shutil.rmtree(self.tempdir, ignore_errors=True)
36
 
        MiroTestCase.tearDown(self)
37
 
 
38
 
    def _make_fake_item(self, filename):
39
 
        f = open(os.path.join(self.tempdir, filename), 'wb')
40
 
        f.write("FAKE DATA")
41
 
        f.close()
42
 
 
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)
61
 
 
62
 
class ChildRemoveTest(ContainerItemTest):
63
 
    def test_expire_all_children(self):
64
 
        children = list(self.container_item.getChildren())
65
 
        for child in children[1:]:
66
 
            child.expire()
67
 
            self.assert_(self.container_item.id_exists())
68
 
        children[0].expire()
69
 
        self.assert_(not self.container_item.id_exists())
70
 
 
71
 
    def test_remove_parent(self):
72
 
        # test for the conditions that caused #11941
73
 
        self.container_item.remove()
74
 
 
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()
79
 
 
80
 
class ExpiredViewTest(MiroTestCase):
81
 
    def setUp(self):
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)
85
 
 
86
 
    def tearDown(self):
87
 
        MiroTestCase.tearDown(self)
88
 
        config.set(prefs.EXPIRE_AFTER_X_DAYS, self._expire_after_x_days_value)
89
 
 
90
 
    def test_expired_view_1(self):
91
 
        f1 = Feed(u'http://example.com/1')
92
 
 
93
 
        i1 = Item(fp_values_for_url(u'http://example.com/1/item1'),
94
 
                feed_id=f1.id)
95
 
        i2 = Item(fp_values_for_url(u'http://example.com/1/item2'),
96
 
                feed_id=f1.id)
97
 
 
98
 
        f1.setExpiration(u'never', 0)
99
 
        i1.watchedTime = i2.watchedTime = datetime.now()
100
 
 
101
 
        for obj in (f1, i1, i2):
102
 
            obj.signal_change()
103
 
 
104
 
        self.assertEquals(list(f1.expiring_items()), [])
105
 
 
106
 
    def test_expired_view_2(self):
107
 
        f2 = Feed(u'http://example.com/2')
108
 
 
109
 
        i3 = Item(fp_values_for_url(u'http://example.com/2/item1'),
110
 
                feed_id=f2.id)
111
 
        i4 = Item(fp_values_for_url(u'http://example.com/2/item2'),
112
 
                feed_id=f2.id)
113
 
 
114
 
        f2.setExpiration(u'system', 0)
115
 
        # system default is 6 days as set in setUp, so i3 should expire,
116
 
        # but i4 should not.
117
 
        i3.watchedTime = datetime.now() - timedelta(days=12)
118
 
        i4.watchedTime = datetime.now() - timedelta(days=3)
119
 
 
120
 
        for obj in (f2, i3, i4):
121
 
            obj.signal_change()
122
 
 
123
 
        self.assertEquals(list(f2.expiring_items()), [i3])
124
 
 
125
 
    def test_expired_view_3(self):
126
 
        f3 = Feed(u'http://example.com/3')
127
 
 
128
 
        i5 = Item(fp_values_for_url(u'http://example.com/3/item1'),
129
 
                feed_id=f3.id)
130
 
        i6 = Item(fp_values_for_url(u'http://example.com/3/item2'),
131
 
                feed_id=f3.id)
132
 
 
133
 
        f3.setExpiration(u'feed', 24)
134
 
        i5.watchedTime = datetime.now() - timedelta(days=3)
135
 
        i6.watchedTime = datetime.now() - timedelta(hours=12)
136
 
 
137
 
        for obj in (f3, i5, i6):
138
 
            obj.signal_change()
139
 
 
140
 
        self.assertEquals(list(f3.expiring_items()), [i5])
141
 
 
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'),
146
 
                feed_id=feed.id)
147
 
        item.watchedTime = datetime.now()
148
 
        item.expire()
149
 
        self.assertEquals(item.watchedTime, None)
150
 
 
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'),
157
 
                feed_id=feed.id)
158
 
        item.set_downloader(RemoteDownloader(
159
 
            u'http://example.com/1/item1/movie.mpeg', item))
160
 
        downloader = item.downloader
161
 
 
162
 
        feed = self.reload_object(feed)
163
 
        downloader = self.reload_object(downloader)
164
 
        item = self.reload_object(item)
165
 
 
166
 
        item.remove()
167
 
        self.assert_(not downloader.id_exists())