MediaGoblin 0.7.2 development cycle
[mediagoblin.git] / mediagoblin / tests / test_modelmethods.py
1 # GNU MediaGoblin -- federated, autonomous media hosting
2 # Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
3 #
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU Affero General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
17 # Maybe not every model needs a test, but some models have special
18 # methods, and so it makes sense to test them here.
19
20 from mediagoblin.db.base import Session
21 from mediagoblin.db.models import MediaEntry, User, Privilege
22
23 from mediagoblin.tests import MGClientTestCase
24 from mediagoblin.tests.tools import fixture_add_user
25
26 import mock
27 import pytest
28
29
30 class FakeUUID(object):
31 hex = 'testtest-test-test-test-testtesttest'
32
33 UUID_MOCK = mock.Mock(return_value=FakeUUID())
34
35 REQUEST_CONTEXT = ['mediagoblin/root.html', 'request']
36
37
38 class TestMediaEntrySlugs(object):
39 def _setup(self):
40 self.chris_user = fixture_add_user(u'chris')
41 self.emily_user = fixture_add_user(u'emily')
42 self.existing_entry = self._insert_media_entry_fixture(
43 title=u"Beware, I exist!",
44 slug=u"beware-i-exist")
45
46 def _insert_media_entry_fixture(self, title=None, slug=None, this_id=None,
47 uploader=None, save=True):
48 entry = MediaEntry()
49 entry.title = title or u"Some title"
50 entry.slug = slug
51 entry.id = this_id
52 entry.uploader = uploader or self.chris_user.id
53 entry.media_type = u'image'
54
55 if save:
56 entry.save()
57
58 return entry
59
60 def test_unique_slug_from_title(self, test_app):
61 self._setup()
62
63 entry = self._insert_media_entry_fixture(u"Totally unique slug!", save=False)
64 entry.generate_slug()
65 assert entry.slug == u'totally-unique-slug'
66
67 def test_old_good_unique_slug(self, test_app):
68 self._setup()
69
70 entry = self._insert_media_entry_fixture(
71 u"A title here", u"a-different-slug-there", save=False)
72 entry.generate_slug()
73 assert entry.slug == u"a-different-slug-there"
74
75 def test_old_weird_slug(self, test_app):
76 self._setup()
77
78 entry = self._insert_media_entry_fixture(
79 slug=u"wowee!!!!!", save=False)
80 entry.generate_slug()
81 assert entry.slug == u"wowee"
82
83 def test_existing_slug_use_id(self, test_app):
84 self._setup()
85
86 entry = self._insert_media_entry_fixture(
87 u"Beware, I exist!!", this_id=9000, save=False)
88 entry.generate_slug()
89 assert entry.slug == u"beware-i-exist-9000"
90
91 def test_existing_slug_cant_use_id(self, test_app):
92 self._setup()
93
94 # Getting tired of dealing with test_app and this mock.patch
95 # thing conflicting, getting lazy.
96 @mock.patch('uuid.uuid4', UUID_MOCK)
97 def _real_test():
98 # This one grabs the nine thousand slug
99 self._insert_media_entry_fixture(
100 slug=u"beware-i-exist-9000")
101
102 entry = self._insert_media_entry_fixture(
103 u"Beware, I exist!!", this_id=9000, save=False)
104 entry.generate_slug()
105 assert entry.slug == u"beware-i-exist-test"
106
107 _real_test()
108
109 def test_existing_slug_cant_use_id_extra_junk(self, test_app):
110 self._setup()
111
112 # Getting tired of dealing with test_app and this mock.patch
113 # thing conflicting, getting lazy.
114 @mock.patch('uuid.uuid4', UUID_MOCK)
115 def _real_test():
116 # This one grabs the nine thousand slug
117 self._insert_media_entry_fixture(
118 slug=u"beware-i-exist-9000")
119
120 # This one grabs makes sure the annoyance doesn't stop
121 self._insert_media_entry_fixture(
122 slug=u"beware-i-exist-test")
123
124 entry = self._insert_media_entry_fixture(
125 u"Beware, I exist!!", this_id=9000, save=False)
126 entry.generate_slug()
127 assert entry.slug == u"beware-i-exist-testtest"
128
129 _real_test()
130
131 def test_garbage_slug(self, test_app):
132 """
133 Titles that sound totally like Q*Bert shouldn't have slugs at
134 all. We'll just reference them by id.
135
136 ,
137 / \ (@!#?@!)
138 |\,/| ,-, /
139 | |#| ( ")~
140 / \|/ \ L L
141 |\,/|\,/|
142 | |#, |#|
143 / \|/ \|/ \
144 |\,/|\,/|\,/|
145 | |#| |#| |#|
146 / \|/ \|/ \|/ \
147 |\,/|\,/|\,/|\,/|
148 | |#| |#| |#| |#|
149 \|/ \|/ \|/ \|/
150 """
151 self._setup()
152
153 qbert_entry = self._insert_media_entry_fixture(
154 u"@!#?@!", save=False)
155 qbert_entry.generate_slug()
156 assert qbert_entry.slug is None
157
158 class TestUserHasPrivilege:
159 def _setup(self):
160 fixture_add_user(u'natalie',
161 privileges=[u'admin',u'moderator',u'active'])
162 fixture_add_user(u'aeva',
163 privileges=[u'moderator',u'active'])
164 self.natalie_user = User.query.filter(
165 User.username==u'natalie').first()
166 self.aeva_user = User.query.filter(
167 User.username==u'aeva').first()
168
169 def test_privilege_added_correctly(self, test_app):
170 self._setup()
171 admin = Privilege.query.filter(
172 Privilege.privilege_name == u'admin').one()
173 # first make sure the privileges were added successfully
174
175 assert admin in self.natalie_user.all_privileges
176 assert admin not in self.aeva_user.all_privileges
177
178 def test_user_has_privilege_one(self, test_app):
179 self._setup()
180
181 # then test out the user.has_privilege method for one privilege
182 assert not self.aeva_user.has_privilege(u'admin')
183 assert self.natalie_user.has_privilege(u'active')
184
185 def test_allow_admin(self, test_app):
186 self._setup()
187
188 # This should work because she is an admin.
189 assert self.natalie_user.has_privilege(u'commenter')
190
191 # Test that we can look this out ignoring that she's an admin
192 assert not self.natalie_user.has_privilege(u'commenter', allow_admin=False)
193
194 def test_media_data_init(test_app):
195 Session.rollback()
196 Session.remove()
197 media = MediaEntry()
198 media.media_type = u"mediagoblin.media_types.image"
199 assert media.media_data is None
200 media.media_data_init()
201 assert media.media_data is not None
202 obj_in_session = 0
203 for obj in Session():
204 obj_in_session += 1
205 print repr(obj)
206 assert obj_in_session == 0
207
208
209 class TestUserUrlForSelf(MGClientTestCase):
210
211 usernames = [(u'lindsay', dict(privileges=[u'active']))]
212
213 def test_url_for_self(self):
214 _, request = self.do_get('/', *REQUEST_CONTEXT)
215
216 assert self.user(u'lindsay').url_for_self(request.urlgen) == '/u/lindsay/'
217
218 def test_url_for_self_not_callable(self):
219 _, request = self.do_get('/', *REQUEST_CONTEXT)
220
221 def fake_urlgen():
222 pass
223
224 with pytest.raises(TypeError) as excinfo:
225 self.user(u'lindsay').url_for_self(fake_urlgen())
226 assert excinfo.errisinstance(TypeError)
227 assert 'object is not callable' in str(excinfo)