annotate accounts/tests/test_views.py @ 886:3d635fd53ef0

Merge with upstream.
author Brian Neal <bgneal@gmail.com>
date Tue, 03 Feb 2015 19:52:09 -0600
parents 9133b4626a4b
children be233ba7ca31
rev   line source
bgneal@565 1 """
bgneal@565 2 View tests for the accounts application.
bgneal@565 3
bgneal@565 4 """
bgneal@565 5 import datetime
bgneal@762 6 import re
bgneal@565 7
bgneal@565 8 from django.test import TestCase
bgneal@565 9 from django.core.urlresolvers import reverse
bgneal@659 10 from django.core import mail
bgneal@576 11 from django.contrib.auth.models import User
bgneal@576 12 from django.contrib.auth.hashers import check_password
bgneal@565 13
bgneal@565 14 from accounts.models import PendingUser
bgneal@565 15 from accounts.models import IllegalUsername
bgneal@565 16 from accounts.models import IllegalEmail
bgneal@565 17
bgneal@565 18
bgneal@565 19 class RegistrationTest(TestCase):
bgneal@565 20
bgneal@565 21 def setUp(self):
bgneal@565 22 u = User.objects.create_user('existing_user', 'existing_user@example.com', 'pw')
bgneal@565 23 u.save()
bgneal@565 24
bgneal@565 25 # a 2nd user has the same email as another
bgneal@565 26 u = User.objects.create_user('existing_user2', 'existing_user@example.com', 'pw')
bgneal@565 27 u.save()
bgneal@565 28
bgneal@565 29 PendingUser.objects.create(username='pending_user',
bgneal@565 30 email='pending_user@example.com',
bgneal@565 31 password='pw',
bgneal@565 32 date_joined=datetime.datetime.now(),
bgneal@565 33 key='key')
bgneal@565 34
bgneal@565 35 IllegalUsername.objects.create(username='illegalusername')
bgneal@565 36 IllegalEmail.objects.create(email='illegal@example.com')
bgneal@565 37
bgneal@782 38 self.post_vals = {
bgneal@782 39 'username': 'a_new_user',
bgneal@782 40 'email': 'test@example.com',
bgneal@782 41 'password1': 'my_password',
bgneal@782 42 'password2': 'my_password',
bgneal@782 43 'agree_age': 'on',
bgneal@782 44 'agree_tos': 'on',
bgneal@782 45 'agree_privacy': 'on',
bgneal@782 46 'question1': '101',
bgneal@782 47 'question2': '',
bgneal@782 48 'question3': '',
bgneal@782 49 'question4': u'2',
bgneal@782 50 'question5': u'328',
bgneal@782 51 'question6': u'4',
bgneal@782 52 'question7': [u'2', u'4', u'5', u'7'],
bgneal@782 53 }
bgneal@782 54
bgneal@565 55 def test_get_view(self):
bgneal@565 56 """
bgneal@565 57 Test a simple get of the registration view
bgneal@565 58
bgneal@565 59 """
bgneal@565 60 response = self.client.get(reverse('accounts-register'))
bgneal@565 61 self.assertEqual(response.status_code, 200)
bgneal@565 62
bgneal@565 63 def test_existing_user(self):
bgneal@565 64 """
bgneal@565 65 Ensure we can't register with an existing username.
bgneal@565 66
bgneal@565 67 """
bgneal@565 68 response = self.client.post(reverse('accounts-register'), {
bgneal@565 69 'username': 'existing_user',
bgneal@565 70 'email': 'test@example.com',
bgneal@565 71 'password1': 'my_password',
bgneal@565 72 'password2': 'my_password',
bgneal@565 73 'agree_age': 'on',
bgneal@565 74 'agree_tos': 'on',
bgneal@565 75 'agree_privacy': 'on',
bgneal@565 76 'question1': '101',
bgneal@565 77 'question2': '',
bgneal@565 78 })
bgneal@565 79
bgneal@565 80 self.assertEqual(response.status_code, 200)
bgneal@565 81 self.assertContains(response, 'A user with that username already exists')
bgneal@565 82
bgneal@565 83 def test_pending_user(self):
bgneal@565 84 """
bgneal@565 85 Ensure we can't register with a pending username.
bgneal@565 86
bgneal@565 87 """
bgneal@782 88 self.post_vals['username'] = 'pending_user'
bgneal@782 89 response = self.client.post(reverse('accounts-register'),
bgneal@782 90 self.post_vals)
bgneal@565 91 self.assertEqual(response.status_code, 200)
bgneal@565 92 self.assertContains(response, 'A pending user with that username already exists')
bgneal@565 93
bgneal@565 94 def test_illegal_username(self):
bgneal@565 95 """
bgneal@565 96 Ensure we can't register with a banned username.
bgneal@565 97
bgneal@565 98 """
bgneal@782 99 self.post_vals['username'] = 'illegalusername'
bgneal@782 100 response = self.client.post(reverse('accounts-register'),
bgneal@782 101 self.post_vals)
bgneal@565 102 self.assertEqual(response.status_code, 200)
bgneal@565 103 self.assertContains(response, 'That username is not allowed')
bgneal@565 104
bgneal@565 105 def test_duplicate_existing_email(self):
bgneal@565 106 """
bgneal@565 107 Ensure we can't register with a duplicate email address.
bgneal@565 108
bgneal@565 109 """
bgneal@782 110 self.post_vals['email'] = 'existing_user@example.com'
bgneal@782 111 response = self.client.post(reverse('accounts-register'),
bgneal@782 112 self.post_vals)
bgneal@565 113 self.assertEqual(response.status_code, 200)
bgneal@565 114 self.assertContains(response, 'A user with that email address already exists')
bgneal@565 115
bgneal@565 116 def test_duplicate_pending_email(self):
bgneal@565 117 """
bgneal@565 118 Ensure we can't register with a duplicate email address.
bgneal@565 119
bgneal@565 120 """
bgneal@782 121 self.post_vals['email'] = 'pending_user@example.com'
bgneal@782 122 response = self.client.post(reverse('accounts-register'),
bgneal@782 123 self.post_vals)
bgneal@565 124 self.assertEqual(response.status_code, 200)
bgneal@565 125 self.assertContains(response, 'A pending user with that email address already exists')
bgneal@565 126
bgneal@565 127 def test_illegal_email(self):
bgneal@565 128 """
bgneal@565 129 Ensure we can't register with a banned email address.
bgneal@565 130
bgneal@565 131 """
bgneal@782 132 self.post_vals['email'] = 'illegal@example.com'
bgneal@782 133 response = self.client.post(reverse('accounts-register'),
bgneal@782 134 self.post_vals)
bgneal@565 135 self.assertEqual(response.status_code, 200)
bgneal@565 136 self.assertContains(response, 'That email address is not allowed')
bgneal@565 137
bgneal@565 138 def test_password_match(self):
bgneal@565 139 """
bgneal@565 140 Ensure the passwords match.
bgneal@565 141
bgneal@565 142 """
bgneal@782 143 self.post_vals['password2'] = "doesn't match"
bgneal@782 144 response = self.client.post(reverse('accounts-register'),
bgneal@782 145 self.post_vals)
bgneal@565 146 self.assertEqual(response.status_code, 200)
bgneal@565 147 self.assertContains(response, "The two password fields didn&#39;t match")
bgneal@565 148
bgneal@565 149 def test_question1(self):
bgneal@565 150 """
bgneal@565 151 Ensure our anti-spam question is answered.
bgneal@565 152
bgneal@565 153 """
bgneal@782 154 self.post_vals['question1'] = 'huh'
bgneal@782 155 response = self.client.post(reverse('accounts-register'),
bgneal@782 156 self.post_vals)
bgneal@565 157 self.assertEqual(response.status_code, 200)
bgneal@565 158 self.assertContains(response, "Incorrect answer to our anti-spam question")
bgneal@565 159
bgneal@565 160 def test_question2(self):
bgneal@565 161 """
bgneal@565 162 Ensure our honeypot question check works.
bgneal@565 163
bgneal@565 164 """
bgneal@782 165 self.post_vals['question2'] = 'non blank'
bgneal@782 166 response = self.client.post(reverse('accounts-register'),
bgneal@782 167 self.post_vals)
bgneal@782 168 self.assertEqual(response.status_code, 200)
bgneal@565 169
bgneal@782 170 def test_question3(self):
bgneal@782 171 """
bgneal@782 172 Ensure our non-hidden honeypot question check works.
bgneal@782 173
bgneal@782 174 """
bgneal@782 175 self.post_vals['question3'] = 'non blank'
bgneal@782 176 response = self.client.post(reverse('accounts-register'),
bgneal@782 177 self.post_vals)
bgneal@782 178 self.assertEqual(response.status_code, 200)
bgneal@782 179
bgneal@782 180 def test_question4(self):
bgneal@782 181 """
bgneal@782 182 Ensure our security question 4 works
bgneal@782 183
bgneal@782 184 """
bgneal@782 185 self.post_vals['question4'] = u'1'
bgneal@782 186 response = self.client.post(reverse('accounts-register'),
bgneal@782 187 self.post_vals)
bgneal@782 188 self.assertEqual(response.status_code, 200)
bgneal@782 189
bgneal@782 190 self.post_vals['question4'] = u'4'
bgneal@782 191 response = self.client.post(reverse('accounts-register'),
bgneal@782 192 self.post_vals)
bgneal@782 193 self.assertEqual(response.status_code, 200)
bgneal@782 194
bgneal@782 195 self.post_vals['question4'] = u'8'
bgneal@782 196 response = self.client.post(reverse('accounts-register'),
bgneal@782 197 self.post_vals)
bgneal@782 198 self.assertEqual(response.status_code, 200)
bgneal@782 199
bgneal@782 200 def test_question5(self):
bgneal@782 201 """
bgneal@782 202 Ensure our security question 5 works
bgneal@782 203
bgneal@782 204 """
bgneal@782 205 self.post_vals['question5'] = u'1'
bgneal@782 206 response = self.client.post(reverse('accounts-register'),
bgneal@782 207 self.post_vals)
bgneal@782 208 self.assertEqual(response.status_code, 200)
bgneal@782 209
bgneal@782 210 self.post_vals['question5'] = u'X'
bgneal@782 211 response = self.client.post(reverse('accounts-register'),
bgneal@782 212 self.post_vals)
bgneal@782 213 self.assertEqual(response.status_code, 200)
bgneal@782 214
bgneal@782 215 self.post_vals['question5'] = u'2983'
bgneal@782 216 response = self.client.post(reverse('accounts-register'),
bgneal@782 217 self.post_vals)
bgneal@782 218 self.assertEqual(response.status_code, 200)
bgneal@782 219
bgneal@782 220 def test_question6(self):
bgneal@782 221 """
bgneal@782 222 Ensure our security question 6 works
bgneal@782 223
bgneal@782 224 """
bgneal@782 225 self.post_vals['question6'] = u'1'
bgneal@782 226 response = self.client.post(reverse('accounts-register'),
bgneal@782 227 self.post_vals)
bgneal@782 228 self.assertEqual(response.status_code, 200)
bgneal@782 229
bgneal@782 230 self.post_vals['question6'] = u'2'
bgneal@782 231 response = self.client.post(reverse('accounts-register'),
bgneal@782 232 self.post_vals)
bgneal@782 233 self.assertEqual(response.status_code, 200)
bgneal@782 234
bgneal@782 235 self.post_vals['question6'] = u'8'
bgneal@782 236 response = self.client.post(reverse('accounts-register'),
bgneal@782 237 self.post_vals)
bgneal@782 238 self.assertEqual(response.status_code, 200)
bgneal@782 239
bgneal@782 240 def test_question7(self):
bgneal@782 241 """Test security question 7"""
bgneal@782 242
bgneal@782 243 self.post_vals['question7'] = []
bgneal@782 244 response = self.client.post(reverse('accounts-register'),
bgneal@782 245 self.post_vals)
bgneal@782 246 self.assertEqual(response.status_code, 200)
bgneal@782 247
bgneal@782 248 self.post_vals['question7'] = [u'1']
bgneal@782 249 response = self.client.post(reverse('accounts-register'),
bgneal@782 250 self.post_vals)
bgneal@782 251 self.assertEqual(response.status_code, 200)
bgneal@782 252
bgneal@782 253 self.post_vals['question7'] = [u'6', u'2', u'4', u'5', u'7']
bgneal@782 254 response = self.client.post(reverse('accounts-register'),
bgneal@782 255 self.post_vals)
bgneal@782 256 self.assertEqual(response.status_code, 200)
bgneal@782 257
bgneal@782 258 self.post_vals['question7'] = [u'4', u'3', u'7']
bgneal@782 259 response = self.client.post(reverse('accounts-register'),
bgneal@782 260 self.post_vals)
bgneal@690 261 self.assertEqual(response.status_code, 200)
bgneal@565 262
bgneal@565 263 def test_success(self):
bgneal@565 264 """
bgneal@565 265 Ensure we can successfully register.
bgneal@565 266
bgneal@565 267 """
bgneal@782 268 response = self.client.post(reverse('accounts-register'),
bgneal@782 269 self.post_vals)
bgneal@565 270 self.assertEqual(response.status_code, 302)
bgneal@565 271
bgneal@565 272 try:
bgneal@565 273 pending = PendingUser.objects.get(username='a_new_user')
bgneal@565 274 except PendingUser.DoesNotExist:
bgneal@565 275 self.fail("PendingUser was not created")
bgneal@565 276
bgneal@565 277 self.assertEqual(pending.email, 'test@example.com')
bgneal@565 278 self.assertTrue(datetime.datetime.now() - pending.date_joined <
bgneal@565 279 datetime.timedelta(minutes=1))
bgneal@565 280 self.assertTrue(check_password('my_password', pending.password))
bgneal@659 281
bgneal@659 282
bgneal@659 283 class ForgotUsernameTest(TestCase):
bgneal@659 284
bgneal@659 285 def setUp(self):
bgneal@659 286 u = User.objects.create_user('existing_user', 'existing_user@example.com', 'pw')
bgneal@659 287 u.save()
bgneal@659 288
bgneal@659 289 def test_get_query_view(self):
bgneal@659 290 """Test a simple get of the username query view"""
bgneal@659 291 response = self.client.get(reverse('accounts-username_query'))
bgneal@659 292 self.assertEqual(response.status_code, 200)
bgneal@659 293
bgneal@659 294 def test_get_username_sent_view(self):
bgneal@659 295 """Test a simple get of the username sent view"""
bgneal@659 296 response = self.client.get(reverse('accounts-username_sent'))
bgneal@659 297 self.assertEqual(response.status_code, 200)
bgneal@659 298
bgneal@659 299 def test_invalid_email(self):
bgneal@659 300 """Test form submittal of unknown email address."""
bgneal@659 301 response = self.client.post(reverse('accounts-username_query'), {
bgneal@659 302 'email': 'bad_address@example.com',
bgneal@659 303 },
bgneal@659 304 follow=True)
bgneal@659 305
bgneal@659 306 self.assertRedirects(response, reverse('accounts-username_sent'))
bgneal@659 307
bgneal@659 308 self.assertEqual(len(mail.outbox), 0)
bgneal@659 309
bgneal@659 310 def test_valid_email(self):
bgneal@659 311 """Test form submittal of valid email address."""
bgneal@659 312 response = self.client.post(reverse('accounts-username_query'), {
bgneal@659 313 'email': 'existing_user@example.com',
bgneal@659 314 },
bgneal@659 315 follow=True)
bgneal@659 316
bgneal@659 317 self.assertRedirects(response, reverse('accounts-username_sent'))
bgneal@659 318
bgneal@659 319 self.assertEqual(len(mail.outbox), 1)
bgneal@659 320 if len(mail.outbox):
bgneal@659 321 self.assertTrue(mail.outbox[0].subject.startswith('Forgotten username'))
bgneal@762 322
bgneal@762 323
bgneal@762 324 class ForgotEmailTest(TestCase):
bgneal@762 325 """Because we use a custom URL its important to test this. This got broken
bgneal@762 326 in Django 1.6 when the URL pattern changed.
bgneal@762 327
bgneal@762 328 """
bgneal@762 329
bgneal@762 330 def setUp(self):
bgneal@762 331 u = User.objects.create_user('user1', 'user1@example.com', 'pw')
bgneal@762 332 u.save()
bgneal@762 333
bgneal@762 334 def test_nominal_case(self):
bgneal@762 335 """Test a full forgot password scenario."""
bgneal@762 336
bgneal@762 337 # GET password reset page
bgneal@762 338 response = self.client.get(reverse('accounts-password_reset'))
bgneal@762 339 self.assertEqual(response.status_code, 200)
bgneal@762 340
bgneal@762 341 # POST email address
bgneal@762 342 args = {'email': 'user1@example.com'}
bgneal@762 343 response = self.client.post(reverse('accounts-password_reset'), args,
bgneal@762 344 follow=True)
bgneal@762 345 self.assertRedirects(response, reverse('accounts-password_reset_sent'))
bgneal@762 346
bgneal@762 347 # Ensure the email was sent
bgneal@762 348 self.assertEqual(len(mail.outbox), 1)
bgneal@762 349 if (len(mail.outbox)):
bgneal@762 350 msg = mail.outbox[0]
bgneal@762 351 self.assertTrue(msg.subject.startswith('Password reset'))
bgneal@762 352 self.assertTrue(len(msg.to) == 1 and msg.to[0] == 'user1@example.com')
bgneal@762 353 msg_text = msg.message().as_string()
bgneal@762 354 m = re.search(r'http://example.com/accounts/password/reset/confirm/'
bgneal@762 355 r'(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9a-z]+-\w+)/',
bgneal@762 356 msg_text)
bgneal@762 357 self.assertTrue(m is not None)
bgneal@762 358 if m:
bgneal@762 359 uidb64, token = m.group('uidb64'), m.group('token')
bgneal@762 360
bgneal@762 361 # visit the password reset page
bgneal@762 362 response = self.client.get(
bgneal@762 363 reverse('accounts-password_reset_confirm',
bgneal@762 364 kwargs={'uidb64': uidb64, 'token': token}))
bgneal@762 365 self.assertEqual(response.status_code, 200)
bgneal@762 366
bgneal@762 367 # POST new password
bgneal@762 368 args = {'new_password1': 'pw2', 'new_password2': 'pw2'}
bgneal@762 369 response = self.client.post(
bgneal@762 370 reverse('accounts-password_reset_confirm',
bgneal@762 371 kwargs={'uidb64': uidb64, 'token': token}),
bgneal@762 372 args, follow=True)
bgneal@762 373 self.assertRedirects(response,
bgneal@762 374 reverse('accounts-password_reset_success'))
bgneal@762 375 self.assertEqual(response.status_code, 200)
bgneal@762 376
bgneal@762 377 # Check new password
bgneal@762 378 u = User.objects.get(username='user1')
bgneal@762 379 self.assertTrue(check_password('pw2', u.password))