bgneal@463
|
1 """
|
bgneal@463
|
2 View tests for the bio application.
|
bgneal@463
|
3
|
bgneal@463
|
4 """
|
bgneal@767
|
5 from io import BytesIO
|
bgneal@767
|
6 import os
|
bgneal@767
|
7
|
bgneal@463
|
8 from django.contrib.auth.models import User
|
bgneal@463
|
9 from django.test import TestCase
|
bgneal@463
|
10 from django.core.urlresolvers import reverse, NoReverseMatch
|
bgneal@768
|
11 from django.core import mail
|
bgneal@463
|
12
|
bgneal@767
|
13 from PIL import Image
|
bgneal@767
|
14
|
bgneal@768
|
15 from bio.models import UserProfile, UserProfileFlag
|
bgneal@767
|
16
|
bgneal@1219
|
17 from elsewhere.models import (SocialNetworkProfile, InstantMessengerProfile,
|
bgneal@1219
|
18 WebsiteProfile)
|
bgneal@1219
|
19
|
bgneal@463
|
20
|
bgneal@463
|
21 class MemberSearchTest(TestCase):
|
bgneal@463
|
22
|
bgneal@463
|
23 USERNAME = u'John'
|
bgneal@463
|
24
|
bgneal@463
|
25 def setUp(self):
|
bgneal@463
|
26 user = User.objects.create_user(self.USERNAME, '', 'password')
|
bgneal@463
|
27 user.save()
|
bgneal@463
|
28
|
bgneal@463
|
29 self.username = 'test_user'
|
bgneal@463
|
30 self.pw = 'password'
|
bgneal@463
|
31 self.user = User.objects.create_user(self.username, '', self.pw)
|
bgneal@463
|
32 self.user.save()
|
bgneal@463
|
33 self.assertTrue(self.client.login(username=self.username,
|
bgneal@463
|
34 password=self.pw))
|
bgneal@463
|
35
|
bgneal@463
|
36 def tearDown(self):
|
bgneal@463
|
37 self.client.logout()
|
bgneal@463
|
38
|
bgneal@463
|
39 def testValidName(self):
|
bgneal@463
|
40 """
|
bgneal@463
|
41 Test a valid username.
|
bgneal@463
|
42 """
|
bgneal@463
|
43
|
bgneal@769
|
44 response = self.client.get(reverse('bio-member_search'),
|
bgneal@463
|
45 {'username': self.USERNAME},
|
bgneal@463
|
46 follow=True)
|
bgneal@463
|
47
|
bgneal@463
|
48 self.assertEqual(len(response.redirect_chain), 1)
|
bgneal@463
|
49 if response.redirect_chain:
|
bgneal@1206
|
50 self.assertEqual(
|
bgneal@1206
|
51 response.redirect_chain[0][0],
|
bgneal@1206
|
52 reverse(
|
bgneal@1206
|
53 'bio-view_profile',
|
bgneal@463
|
54 kwargs={'username': self.USERNAME}))
|
bgneal@463
|
55 self.assertEqual(response.redirect_chain[0][1], 302)
|
bgneal@463
|
56
|
bgneal@463
|
57 self.assertEqual(response.status_code, 200)
|
bgneal@463
|
58
|
bgneal@463
|
59 def testInvalidName(self):
|
bgneal@463
|
60 """
|
bgneal@463
|
61 Test a invalid username.
|
bgneal@463
|
62 """
|
bgneal@463
|
63
|
bgneal@769
|
64 response = self.client.get(reverse('bio-member_search'),
|
bgneal@463
|
65 {'username': self.USERNAME + '!'})
|
bgneal@463
|
66
|
bgneal@463
|
67 self.assertEqual(response.status_code, 200)
|
bgneal@463
|
68 self.assertContains(response, "That username does not exist.")
|
bgneal@463
|
69
|
bgneal@463
|
70 def testTrailingSpace(self):
|
bgneal@463
|
71 """
|
bgneal@463
|
72 Test a username with a trailing space.
|
bgneal@463
|
73 """
|
bgneal@463
|
74
|
bgneal@463
|
75 try:
|
bgneal@769
|
76 response = self.client.get(reverse('bio-member_search'),
|
bgneal@463
|
77 {'username': self.USERNAME + ' '},
|
bgneal@463
|
78 follow=True)
|
bgneal@463
|
79 except NoReverseMatch:
|
bgneal@463
|
80 self.fail('bit by a MySQL bug?')
|
bgneal@463
|
81
|
bgneal@463
|
82 self.assertEqual(len(response.redirect_chain), 1)
|
bgneal@463
|
83 if response.redirect_chain:
|
bgneal@1206
|
84 self.assertEqual(
|
bgneal@1206
|
85 response.redirect_chain[0][0],
|
bgneal@1206
|
86 reverse(
|
bgneal@1206
|
87 'bio-view_profile',
|
bgneal@463
|
88 kwargs={'username': self.USERNAME}))
|
bgneal@463
|
89 self.assertEqual(response.redirect_chain[0][1], 302)
|
bgneal@463
|
90
|
bgneal@463
|
91 self.assertEqual(response.status_code, 200)
|
bgneal@765
|
92
|
bgneal@765
|
93
|
bgneal@765
|
94 class AnonMemberListTest(TestCase):
|
bgneal@765
|
95
|
bgneal@765
|
96 def _test_login_required(self, list_by):
|
bgneal@765
|
97
|
bgneal@765
|
98 member_list_url = reverse('bio-member_list', kwargs={'type': list_by})
|
bgneal@765
|
99 response = self.client.get(member_list_url, follow=True)
|
bgneal@765
|
100 login_url = reverse('accounts-login') + '?next=' + member_list_url
|
bgneal@765
|
101 self.assertRedirects(response, login_url)
|
bgneal@765
|
102
|
bgneal@765
|
103 def test_login_required(self):
|
bgneal@765
|
104 self._test_login_required('user')
|
bgneal@765
|
105 self._test_login_required('date')
|
bgneal@765
|
106
|
bgneal@765
|
107
|
bgneal@765
|
108 class MemberListTest(TestCase):
|
bgneal@765
|
109
|
bgneal@765
|
110 def setUp(self):
|
bgneal@765
|
111 u1 = User.objects.create_user('paul', '', 'pw')
|
bgneal@765
|
112 u1.save()
|
bgneal@765
|
113 u2 = User.objects.create_user('eddie', '', 'pw')
|
bgneal@765
|
114 u2.save()
|
bgneal@765
|
115
|
bgneal@765
|
116 self.user = u1
|
bgneal@765
|
117 self.client.login(username=u1.username, password='pw')
|
bgneal@765
|
118
|
bgneal@765
|
119 def _test_get(self, list_by, page=None, code=200):
|
bgneal@765
|
120
|
bgneal@765
|
121 member_list_url = reverse('bio-member_list', kwargs={'type': list_by})
|
bgneal@765
|
122 if page is not None:
|
bgneal@765
|
123 member_list_url += '?page=%d' % page
|
bgneal@765
|
124 response = self.client.get(member_list_url)
|
bgneal@765
|
125 self.assertEqual(response.status_code, code)
|
bgneal@765
|
126
|
bgneal@765
|
127 def test_get(self):
|
bgneal@765
|
128 self._test_get('user')
|
bgneal@765
|
129 self._test_get('date')
|
bgneal@765
|
130 self._test_get('user', page=1)
|
bgneal@765
|
131 self._test_get('date', page=1)
|
bgneal@765
|
132
|
bgneal@765
|
133 def test_invalid_page(self):
|
bgneal@765
|
134 self._test_get('user', page=99, code=404)
|
bgneal@765
|
135 self._test_get('date', page=99, code=404)
|
bgneal@765
|
136
|
bgneal@765
|
137
|
bgneal@766
|
138 class ProfileTest(TestCase):
|
bgneal@765
|
139
|
bgneal@765
|
140 def setUp(self):
|
bgneal@765
|
141 u1 = User.objects.create_user('paul', '', 'pw')
|
bgneal@765
|
142 u1.save()
|
bgneal@765
|
143 u2 = User.objects.create_user('eddie', '', 'pw')
|
bgneal@765
|
144 u2.save()
|
bgneal@765
|
145
|
bgneal@767
|
146 def tearDown(self):
|
bgneal@767
|
147 profile = UserProfile.objects.get(user__username='paul')
|
bgneal@767
|
148 if profile.avatar:
|
bgneal@767
|
149 os.remove(profile.avatar.path)
|
bgneal@767
|
150
|
bgneal@766
|
151 def test_anon_my_profile(self):
|
bgneal@765
|
152 my_url = reverse('bio-me')
|
bgneal@765
|
153 response = self.client.get(my_url)
|
bgneal@765
|
154 login_url = reverse('accounts-login') + '?next=' + my_url
|
bgneal@765
|
155 self.assertRedirects(response, login_url)
|
bgneal@765
|
156
|
bgneal@766
|
157 def test_authenticated_my_profile(self):
|
bgneal@765
|
158 self.client.login(username='paul', password='pw')
|
bgneal@765
|
159 response = self.client.get(reverse('bio-me'))
|
bgneal@765
|
160 self.assertEqual(response.status_code, 200)
|
bgneal@766
|
161
|
bgneal@766
|
162 def test_anon_other_profile(self):
|
bgneal@766
|
163 url = reverse('bio-view_profile', kwargs={'username': 'eddie'})
|
bgneal@766
|
164 response = self.client.get(url)
|
bgneal@766
|
165 login_url = reverse('accounts-login') + '?next=' + url
|
bgneal@766
|
166 self.assertRedirects(response, login_url)
|
bgneal@766
|
167
|
bgneal@766
|
168 def test_authenticated_other_profile(self):
|
bgneal@766
|
169 self.client.login(username='paul', password='pw')
|
bgneal@766
|
170 url = reverse('bio-view_profile', kwargs={'username': 'eddie'})
|
bgneal@766
|
171 response = self.client.get(url)
|
bgneal@766
|
172 self.assertEqual(response.status_code, 200)
|
bgneal@766
|
173
|
bgneal@766
|
174 def test_view_profile_as_me_redirects(self):
|
bgneal@766
|
175 self.client.login(username='paul', password='pw')
|
bgneal@766
|
176 url = reverse('bio-view_profile', kwargs={'username': 'paul'})
|
bgneal@766
|
177 response = self.client.get(url)
|
bgneal@766
|
178 self.assertRedirects(response, reverse('bio-me'))
|
bgneal@766
|
179
|
bgneal@766
|
180 def test_edit_anon(self):
|
bgneal@766
|
181 url = reverse('bio-edit_profile')
|
bgneal@766
|
182 response = self.client.get(url)
|
bgneal@766
|
183 login_url = reverse('accounts-login') + '?next=' + url
|
bgneal@766
|
184 self.assertRedirects(response, login_url)
|
bgneal@766
|
185
|
bgneal@766
|
186 def test_edit_profile(self):
|
bgneal@766
|
187 self.client.login(username='paul', password='pw')
|
bgneal@766
|
188 url = reverse('bio-edit_profile')
|
bgneal@766
|
189 response = self.client.get(url)
|
bgneal@766
|
190 self.assertEqual(response.status_code, 200)
|
bgneal@766
|
191
|
bgneal@766
|
192 # Save some new data. We don't exhaustively test every field.
|
bgneal@766
|
193 response = self.client.post(url, {
|
bgneal@766
|
194 'first_name': 'Paul',
|
bgneal@766
|
195 'last_name': 'Johnson',
|
bgneal@766
|
196 'email': 'pjmoto@example.com',
|
bgneal@766
|
197 'occupation': 'Surf Guitar Pioneer',
|
bgneal@766
|
198 'profile_text': 'Wrote Mr. Moto at age 15.',
|
bgneal@766
|
199 'submit_button': 'Save',
|
bgneal@766
|
200 })
|
bgneal@766
|
201 self.assertRedirects(response, reverse('bio-me'))
|
bgneal@766
|
202
|
bgneal@766
|
203 u = User.objects.get(username='paul')
|
bgneal@766
|
204 self.assertEqual(u.first_name, 'Paul')
|
bgneal@766
|
205 self.assertEqual(u.last_name, 'Johnson')
|
bgneal@766
|
206 self.assertEqual(u.email, 'pjmoto@example.com')
|
bgneal@789
|
207 profile = u.profile
|
bgneal@766
|
208 self.assertEqual(profile.occupation, 'Surf Guitar Pioneer')
|
bgneal@766
|
209 self.assertEqual(profile.profile_text, 'Wrote Mr. Moto at age 15.')
|
bgneal@767
|
210
|
bgneal@767
|
211 def test_avatar_change(self):
|
bgneal@767
|
212 self.client.login(username='paul', password='pw')
|
bgneal@767
|
213 url = reverse('bio-change_avatar')
|
bgneal@767
|
214 response = self.client.get(url)
|
bgneal@767
|
215 self.assertEqual(response.status_code, 200)
|
bgneal@767
|
216
|
bgneal@767
|
217 # Create an in-memory image for a dummy avatar
|
bgneal@767
|
218 file_obj = BytesIO()
|
bgneal@767
|
219 image = Image.new('RGBA', size=(100, 100))
|
bgneal@767
|
220 image.save(file_obj, 'png')
|
bgneal@767
|
221 file_obj.name = 'avatar.png'
|
bgneal@767
|
222 file_obj.seek(0)
|
bgneal@767
|
223
|
bgneal@767
|
224 response = self.client.post(url, {'avatar_file': file_obj}, follow=True)
|
bgneal@767
|
225 self.assertRedirects(response, reverse('bio-me'))
|
bgneal@767
|
226
|
bgneal@768
|
227 profile = UserProfile.objects.get(user__username='paul')
|
bgneal@768
|
228 self.assertTrue(profile.avatar.path)
|
bgneal@768
|
229 self.assertTrue(profile.avatar.name)
|
bgneal@768
|
230 self.assertTrue(os.path.exists(profile.avatar.path))
|
bgneal@768
|
231
|
bgneal@768
|
232 def test_flag_profile_get(self):
|
bgneal@768
|
233 paul = User.objects.get(username='paul')
|
bgneal@768
|
234 eddie = User.objects.get(username='eddie')
|
bgneal@768
|
235 url = reverse('bio-flag_profile', args=[eddie.pk])
|
bgneal@768
|
236
|
bgneal@768
|
237 # not logged in, wrong request method:
|
bgneal@768
|
238 response = self.client.get(url)
|
bgneal@768
|
239 self.assertEqual(response.status_code, 405)
|
bgneal@768
|
240
|
bgneal@768
|
241 # logged in, wrong request method
|
bgneal@768
|
242 self.client.login(username='paul', password='pw')
|
bgneal@768
|
243 response = self.client.get(url)
|
bgneal@768
|
244 self.assertEqual(response.status_code, 405)
|
bgneal@768
|
245
|
bgneal@768
|
246 # logged out, right request method
|
bgneal@768
|
247 self.client.logout()
|
bgneal@768
|
248 response = self.client.post(url)
|
bgneal@768
|
249 self.assertEqual(response.status_code, 200)
|
bgneal@768
|
250 self.assertEqual(UserProfileFlag.objects.all().count(), 0)
|
bgneal@768
|
251
|
bgneal@768
|
252 # logged in, right request method
|
bgneal@768
|
253 self.client.login(username='paul', password='pw')
|
bgneal@768
|
254 response = self.client.post(url)
|
bgneal@768
|
255 self.assertEqual(response.status_code, 200)
|
bgneal@768
|
256 self.assertEqual(UserProfileFlag.objects.all().count(), 1)
|
bgneal@768
|
257
|
bgneal@768
|
258 flag = UserProfileFlag.objects.first()
|
bgneal@768
|
259 self.assertEqual(flag.user, paul)
|
bgneal@789
|
260 self.assertEqual(flag.profile, eddie.profile)
|
bgneal@768
|
261
|
bgneal@768
|
262 self.assertEqual(len(mail.outbox), 1)
|
bgneal@768
|
263 self.assertTrue('A Profile Has Been Flagged' in mail.outbox[0].subject)
|
bgneal@1219
|
264
|
bgneal@1219
|
265
|
bgneal@1219
|
266 class EditElsewhereTestCase(TestCase):
|
bgneal@1219
|
267 def setUp(self):
|
bgneal@1219
|
268 self.user = User.objects.create_user('paul', '', 'pw')
|
bgneal@1219
|
269 self.user.save()
|
bgneal@1219
|
270 self.client.login(username='paul', password='pw')
|
bgneal@1219
|
271 self.url = reverse('bio-edit_elsewhere')
|
bgneal@1219
|
272
|
bgneal@1219
|
273 def test_get_view(self):
|
bgneal@1219
|
274 response = self.client.get(reverse('bio-edit_elsewhere'))
|
bgneal@1219
|
275 self.assertEqual(response.status_code, 200)
|
bgneal@1219
|
276
|
bgneal@1219
|
277 def test_add_social_network(self):
|
bgneal@1219
|
278 response = self.client.post(self.url, {
|
bgneal@1219
|
279 'network_id': 'catster',
|
bgneal@1219
|
280 'username': 'pjmoto',
|
bgneal@1219
|
281 'sn-form': 'Add Social Network',
|
bgneal@1219
|
282 })
|
bgneal@1219
|
283 self.assertRedirects(response, self.url)
|
bgneal@1219
|
284 user_networks = self.user.social_network_profiles.all()
|
bgneal@1219
|
285 self.assertEquals(user_networks.count(), 1)
|
bgneal@1219
|
286 self.assertEquals(user_networks[0].network_id, 'catster')
|
bgneal@1219
|
287
|
bgneal@1219
|
288 def test_add_instant_messenger(self):
|
bgneal@1219
|
289 response = self.client.post(self.url, {
|
bgneal@1219
|
290 'network_id': 'aim',
|
bgneal@1219
|
291 'username': 'pjmoto',
|
bgneal@1219
|
292 'im-form': 'Add Instant Messenger',
|
bgneal@1219
|
293 })
|
bgneal@1219
|
294 self.assertRedirects(response, self.url)
|
bgneal@1219
|
295 user_networks = self.user.instant_messenger_profiles.all()
|
bgneal@1219
|
296 self.assertEquals(user_networks.count(), 1)
|
bgneal@1219
|
297 self.assertEquals(user_networks[0].network_id, 'aim')
|
bgneal@1219
|
298
|
bgneal@1219
|
299 def test_add_website(self):
|
bgneal@1219
|
300 response = self.client.post(self.url, {
|
bgneal@1219
|
301 'name': 'pjmoto.com',
|
bgneal@1219
|
302 'url': 'https://example.com/pjmoto',
|
bgneal@1219
|
303 'w-form': 'Add Website',
|
bgneal@1219
|
304 })
|
bgneal@1219
|
305 self.assertRedirects(response, self.url)
|
bgneal@1219
|
306 websites = self.user.website_profiles.all()
|
bgneal@1219
|
307 self.assertEquals(websites.count(), 1)
|
bgneal@1219
|
308 self.assertEquals(websites[0].name, 'pjmoto.com')
|
bgneal@1219
|
309 self.assertEquals(websites[0].url, 'https://example.com/pjmoto')
|
bgneal@1219
|
310
|
bgneal@1219
|
311 def test_delete_social_network(self):
|
bgneal@1219
|
312 profile = SocialNetworkProfile(user=self.user, network_id='catster',
|
bgneal@1219
|
313 username='pjmoto')
|
bgneal@1219
|
314 profile.save()
|
bgneal@1219
|
315 self.assertEquals(self.user.social_network_profiles.count(), 1)
|
bgneal@1219
|
316 response = self.client.post(self.url, {
|
bgneal@1219
|
317 'delete_id': profile.id,
|
bgneal@1219
|
318 'delete-sn-form': 'Delete',
|
bgneal@1219
|
319 })
|
bgneal@1219
|
320 self.assertRedirects(response, self.url)
|
bgneal@1219
|
321 self.assertEquals(self.user.social_network_profiles.count(), 0)
|
bgneal@1219
|
322
|
bgneal@1219
|
323 def test_delete_instant_messenger(self):
|
bgneal@1219
|
324 profile = InstantMessengerProfile(user=self.user, network_id='aim',
|
bgneal@1219
|
325 username='pjmoto')
|
bgneal@1219
|
326 profile.save()
|
bgneal@1219
|
327 self.assertEquals(self.user.instant_messenger_profiles.count(), 1)
|
bgneal@1219
|
328 response = self.client.post(self.url, {
|
bgneal@1219
|
329 'delete_id': profile.id,
|
bgneal@1219
|
330 'delete-im-form': 'Delete',
|
bgneal@1219
|
331 })
|
bgneal@1219
|
332 self.assertRedirects(response, self.url)
|
bgneal@1219
|
333 self.assertEquals(self.user.instant_messenger_profiles.count(), 0)
|
bgneal@1219
|
334
|
bgneal@1219
|
335 def test_delete_website(self):
|
bgneal@1219
|
336 profile = WebsiteProfile(user=self.user, name='pjmoto.com',
|
bgneal@1219
|
337 url='https://example.com/pjmoto')
|
bgneal@1219
|
338 profile.save()
|
bgneal@1219
|
339 self.assertEquals(self.user.website_profiles.count(), 1)
|
bgneal@1219
|
340 response = self.client.post(self.url, {
|
bgneal@1219
|
341 'delete_id': profile.id,
|
bgneal@1219
|
342 'delete-w-form': 'Delete',
|
bgneal@1219
|
343 })
|
bgneal@1219
|
344 self.assertRedirects(response, self.url)
|
bgneal@1219
|
345 self.assertEquals(self.user.website_profiles.count(), 0)
|