You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

auth_tests.py 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import re
  2. from django.core import mail
  3. from django.core.urlresolvers import reverse
  4. from django_webtest import WebTest
  5. from oscar.test.testcases import WebTestCase
  6. from oscar.test import factories
  7. from oscar.core.compat import get_user_model
  8. User = get_user_model()
  9. class TestAUserWhoseForgottenHerPassword(WebTest):
  10. def test_can_reset_her_password(self):
  11. username, email, password = 'lucy', 'lucy@example.com', 'password'
  12. User.objects.create_user(username, email, password)
  13. # Fill in password reset form
  14. page = self.app.get(reverse('password-reset'))
  15. form = page.forms['password_reset_form']
  16. form['email'] = email
  17. response = form.submit()
  18. # Response should be a redirect and an email should have been sent
  19. self.assertEqual(302, response.status_code)
  20. self.assertEqual(1, len(mail.outbox))
  21. # Extract URL from email
  22. email_body = mail.outbox[0].body
  23. urlfinder = re.compile(r"http://example.com(?P<path>[-A-Za-z0-9\/\._]+)")
  24. matches = urlfinder.search(email_body, re.MULTILINE)
  25. self.assertTrue('path' in matches.groupdict())
  26. path = matches.groupdict()['path']
  27. # Reset password and check we get redirect
  28. reset_page = self.app.get(path)
  29. form = reset_page.forms['password_reset_form']
  30. form['new_password1'] = 'crazymonkey'
  31. form['new_password2'] = 'crazymonkey'
  32. response = form.submit()
  33. self.assertEqual(302, response.status_code)
  34. # Now attempt to login with new password
  35. url = reverse('customer:login')
  36. form = self.app.get(url).forms['login_form']
  37. form['login-username'] = email
  38. form['login-password'] = 'crazymonkey'
  39. response = form.submit('login_submit')
  40. self.assertEqual(302, response.status_code)
  41. class TestAnAuthenticatedUser(WebTestCase):
  42. is_anonymous = False
  43. def test_receives_an_email_when_their_password_is_changed(self):
  44. page = self.get(reverse('customer:change-password'))
  45. form = page.forms['change_password_form']
  46. form['old_password'] = self.password
  47. form['new_password1'] = u'anotherfancypassword'
  48. form['new_password2'] = u'anotherfancypassword'
  49. page = form.submit()
  50. self.assertEqual(len(mail.outbox), 1)
  51. self.assertIn("your password has been changed", mail.outbox[0].body)
  52. def test_cannot_access_reset_password_page(self):
  53. response = self.get(reverse('password-reset'), status=403)
  54. self.assertEqual(403, response.status_code)
  55. def test_does_not_receive_an_email_when_their_profile_is_updated_but_email_address_not_changed(self):
  56. page = self.get(reverse('customer:profile-update'))
  57. form = page.forms['profile_form']
  58. form['first_name'] = "Terry"
  59. form.submit()
  60. self.assertEqual(len(mail.outbox), 0)
  61. def test_receives_an_email_when_their_email_address_is_changed(self):
  62. page = self.get(reverse('customer:profile-update'))
  63. form = page.forms['profile_form']
  64. new_email = 'a.new.email@user.com'
  65. form['email'] = new_email
  66. page = form.submit()
  67. self.assertEqual(len(mail.outbox), 1)
  68. self.assertEqual(mail.outbox[0].to[0], self.email)
  69. self.assertEqual(User.objects.get(id=self.user.id).email, new_email)
  70. self.assertIn("your email address has been changed",
  71. mail.outbox[0].body)
  72. class TestAnAnonymousUser(WebTestCase):
  73. is_anonymous = True
  74. def assertCanLogin(self, email, password):
  75. url = reverse('customer:login')
  76. form = self.app.get(url).forms['login_form']
  77. form['login-username'] = email
  78. form['login-password'] = password
  79. response = form.submit('login_submit')
  80. self.assertRedirectsTo(response, 'customer:summary')
  81. def test_can_login(self):
  82. email, password = 'd@d.com', 'mypassword'
  83. User.objects.create_user('_', email, password)
  84. self.assertCanLogin(email, password)
  85. def test_can_login_with_email_containing_capitals_in_local_part(self):
  86. email, password = 'Andrew.Smith@test.com', 'mypassword'
  87. User.objects.create_user('_', email, password)
  88. self.assertCanLogin(email, password)
  89. def test_can_login_with_email_containing_capitals_in_host(self):
  90. email, password = 'Andrew.Smith@teSt.com', 'mypassword'
  91. User.objects.create_user('_', email, password)
  92. self.assertCanLogin(email, password)
  93. def test_can_register(self):
  94. url = reverse('customer:register')
  95. form = self.app.get(url).forms['register_form']
  96. form['email'] = 'terry@boom.com'
  97. form['password1'] = form['password2'] = 'hedgehog'
  98. response = form.submit()
  99. self.assertRedirectsTo(response, 'customer:summary')
  100. def test_casing_of_local_part_of_email_is_preserved(self):
  101. url = reverse('customer:register')
  102. form = self.app.get(url).forms['register_form']
  103. form['email'] = 'Terry@Boom.com'
  104. form['password1'] = form['password2'] = 'hedgehog'
  105. form.submit()
  106. user = User.objects.all()[0]
  107. self.assertEqual(user.email, 'Terry@boom.com')
  108. class TestAStaffUser(WebTestCase):
  109. is_anonymous = True
  110. password = 'testing'
  111. def setUp(self):
  112. self.staff = factories.UserFactory.create(
  113. password=self.password, is_staff=True)
  114. super(TestAStaffUser, self).setUp()
  115. def test_gets_redirected_to_the_dashboard_when_they_login(self):
  116. page = self.get(reverse('customer:login'))
  117. form = page.forms['login_form']
  118. form['login-username'] = self.staff.email
  119. form['login-password'] = self.password
  120. response = form.submit('login_submit')
  121. self.assertRedirectsTo(response, 'dashboard:index')