annotate bio/tests/test_views.py @ 1219:f354554afb6e modernize tip

Add more bio unit tests.
author Brian Neal <bgneal@gmail.com>
date Sat, 22 Feb 2025 17:17:09 -0600
parents 02181fa5ac9d
children
rev   line source
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)