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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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(
  58. self,
  59. ):
  60. page = self.get(reverse("customer:profile-update"))
  61. form = page.forms["profile_form"]
  62. form["first_name"] = "Terry"
  63. form.submit()
  64. self.assertEqual(len(mail.outbox), 0)
  65. def test_receives_an_email_when_their_email_address_is_changed(self):
  66. page = self.get(reverse("customer:profile-update"))
  67. form = page.forms["profile_form"]
  68. new_email = "a.new.email@user.com"
  69. form["email"] = new_email
  70. page = form.submit()
  71. self.assertEqual(len(mail.outbox), 1)
  72. self.assertEqual(mail.outbox[0].to[0], self.email)
  73. self.assertEqual(User.objects.get(id=self.user.id).email, new_email)
  74. self.assertIn("your email address has been changed", mail.outbox[0].body)
  75. class TestAnAnonymousUser(WebTestCase):
  76. is_anonymous = True
  77. def assertCanLogin(self, email, password):
  78. url = reverse("customer:login")
  79. form = self.app.get(url).forms["login_form"]
  80. form["login-username"] = email
  81. form["login-password"] = password
  82. response = form.submit("login_submit")
  83. self.assertRedirectsTo(response, "customer:summary")
  84. def test_can_login(self):
  85. email, password = "d@d.com", "mypassword"
  86. User.objects.create_user("_", email, password)
  87. self.assertCanLogin(email, password)
  88. def test_can_login_with_email_containing_capitals_in_local_part(self):
  89. email, password = "Andrew.Smith@test.com", "mypassword"
  90. User.objects.create_user("_", email, password)
  91. self.assertCanLogin(email, password)
  92. def test_can_login_with_email_containing_capitals_in_host(self):
  93. email, password = "Andrew.Smith@teSt.com", "mypassword"
  94. User.objects.create_user("_", email, password)
  95. self.assertCanLogin(email, password)
  96. def test_can_register(self):
  97. url = reverse("customer:register")
  98. form = self.app.get(url).forms["register_form"]
  99. form["email"] = "terry@boom.com"
  100. form["password1"] = form["password2"] = "hedgehog"
  101. response = form.submit()
  102. self.assertRedirectsTo(response, "customer:summary")
  103. def test_casing_of_local_part_of_email_is_preserved(self):
  104. url = reverse("customer:register")
  105. form = self.app.get(url).forms["register_form"]
  106. form["email"] = "Terry@Boom.com"
  107. form["password1"] = form["password2"] = "hedgehog"
  108. form.submit()
  109. user = User.objects.all()[0]
  110. self.assertEqual(user.email, "Terry@boom.com")
  111. class TestAStaffUser(WebTestCase):
  112. is_anonymous = True
  113. password = "testing"
  114. def setUp(self):
  115. self.staff = factories.UserFactory.create(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")