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.

test_auth.py 5.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. import re
  2. from django.core import mail
  3. from django.urls import reverse
  4. from django_webtest import WebTest
  5. from oscar.core.compat import get_user_model
  6. from oscar.test import factories
  7. from oscar.test.testcases import WebTestCase
  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 redirected
  28. reset_page_redirect = self.app.get(path)
  29. # The link in the email will redirect us to the password reset view
  30. reset_page = self.app.get(reset_page_redirect.location)
  31. form = reset_page.forms['password_reset_form']
  32. form['new_password1'] = 'crazymonkey'
  33. form['new_password2'] = 'crazymonkey'
  34. response = form.submit()
  35. self.assertEqual(302, response.status_code)
  36. # Now attempt to login with new password
  37. url = reverse('customer:login')
  38. form = self.app.get(url).forms['login_form']
  39. form['login-username'] = email
  40. form['login-password'] = 'crazymonkey'
  41. response = form.submit('login_submit')
  42. self.assertEqual(302, response.status_code)
  43. class TestAnAuthenticatedUser(WebTestCase):
  44. is_anonymous = False
  45. def test_receives_an_email_when_their_password_is_changed(self):
  46. page = self.get(reverse('customer:change-password'))
  47. form = page.forms['change_password_form']
  48. form['old_password'] = self.password
  49. form['new_password1'] = 'anotherfancypassword'
  50. form['new_password2'] = 'anotherfancypassword'
  51. page = form.submit()
  52. self.assertEqual(len(mail.outbox), 1)
  53. self.assertIn("your password has been changed", mail.outbox[0].body)
  54. def test_cannot_access_reset_password_page(self):
  55. response = self.get(reverse('password-reset'), status=403)
  56. self.assertEqual(403, response.status_code)
  57. def test_does_not_receive_an_email_when_their_profile_is_updated_but_email_address_not_changed(self):
  58. page = self.get(reverse('customer:profile-update'))
  59. form = page.forms['profile_form']
  60. form['first_name'] = "Terry"
  61. form.submit()
  62. self.assertEqual(len(mail.outbox), 0)
  63. def test_receives_an_email_when_their_email_address_is_changed(self):
  64. page = self.get(reverse('customer:profile-update'))
  65. form = page.forms['profile_form']
  66. new_email = 'a.new.email@user.com'
  67. form['email'] = new_email
  68. page = form.submit()
  69. self.assertEqual(len(mail.outbox), 1)
  70. self.assertEqual(mail.outbox[0].to[0], self.email)
  71. self.assertEqual(User.objects.get(id=self.user.id).email, new_email)
  72. self.assertIn("your email address has been changed",
  73. mail.outbox[0].body)
  74. class TestAnAnonymousUser(WebTestCase):
  75. is_anonymous = True
  76. def assertCanLogin(self, email, password):
  77. url = reverse('customer:login')
  78. form = self.app.get(url).forms['login_form']
  79. form['login-username'] = email
  80. form['login-password'] = password
  81. response = form.submit('login_submit')
  82. self.assertRedirectsTo(response, 'customer:summary')
  83. def test_can_login(self):
  84. email, password = 'd@d.com', 'mypassword'
  85. User.objects.create_user('_', email, password)
  86. self.assertCanLogin(email, password)
  87. def test_can_login_with_email_containing_capitals_in_local_part(self):
  88. email, password = 'Andrew.Smith@test.com', 'mypassword'
  89. User.objects.create_user('_', email, password)
  90. self.assertCanLogin(email, password)
  91. def test_can_login_with_email_containing_capitals_in_host(self):
  92. email, password = 'Andrew.Smith@teSt.com', 'mypassword'
  93. User.objects.create_user('_', email, password)
  94. self.assertCanLogin(email, password)
  95. def test_can_register(self):
  96. url = reverse('customer:register')
  97. form = self.app.get(url).forms['register_form']
  98. form['email'] = 'terry@boom.com'
  99. form['password1'] = form['password2'] = 'hedgehog'
  100. response = form.submit()
  101. self.assertRedirectsTo(response, 'customer:summary')
  102. def test_casing_of_local_part_of_email_is_preserved(self):
  103. url = reverse('customer:register')
  104. form = self.app.get(url).forms['register_form']
  105. form['email'] = 'Terry@Boom.com'
  106. form['password1'] = form['password2'] = 'hedgehog'
  107. form.submit()
  108. user = User.objects.all()[0]
  109. self.assertEqual(user.email, 'Terry@boom.com')
  110. class TestAStaffUser(WebTestCase):
  111. is_anonymous = True
  112. password = 'testing'
  113. def setUp(self):
  114. self.staff = factories.UserFactory.create(
  115. password=self.password, is_staff=True)
  116. super().setUp()
  117. def test_gets_redirected_to_the_dashboard_when_they_login(self):
  118. page = self.get(reverse('customer:login'))
  119. form = page.forms['login_form']
  120. form['login-username'] = self.staff.email
  121. form['login-password'] = self.password
  122. response = form.submit('login_submit')
  123. self.assertRedirectsTo(response, 'dashboard:index')