test_user_changeemail_api.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. from django.contrib.auth import get_user_model
  2. from django.core import mail
  3. from django.urls import reverse
  4. from misago.users.testutils import AuthenticatedUserTestCase
  5. UserModel = get_user_model()
  6. class UserChangeEmailTests(AuthenticatedUserTestCase):
  7. """tests for user change email RPC (/api/users/1/change-email/)"""
  8. def setUp(self):
  9. super().setUp()
  10. self.link = "/api/users/%s/change-email/" % self.user.pk
  11. def test_unsupported_methods(self):
  12. """api isn't supporting GET"""
  13. response = self.client.get(self.link)
  14. self.assertEqual(response.status_code, 405)
  15. def test_empty_input(self):
  16. """api errors correctly for empty input"""
  17. response = self.client.post(self.link, data={})
  18. self.assertEqual(response.status_code, 400)
  19. self.assertEqual(
  20. response.json(),
  21. {
  22. "new_email": ["This field is required."],
  23. "password": ["This field is required."],
  24. },
  25. )
  26. def test_invalid_password(self):
  27. """api errors correctly for invalid password"""
  28. response = self.client.post(
  29. self.link, data={"new_email": "new@email.com", "password": "Lor3mIpsum"}
  30. )
  31. self.assertEqual(response.status_code, 400)
  32. self.assertEqual(
  33. response.json(), {"password": ["Entered password is invalid."]}
  34. )
  35. def test_invalid_input(self):
  36. """api errors correctly for invalid input"""
  37. response = self.client.post(
  38. self.link, data={"new_email": "", "password": self.USER_PASSWORD}
  39. )
  40. self.assertEqual(response.status_code, 400)
  41. self.assertEqual(
  42. response.json(), {"new_email": ["This field may not be blank."]}
  43. )
  44. response = self.client.post(
  45. self.link, data={"new_email": "newmail", "password": self.USER_PASSWORD}
  46. )
  47. self.assertEqual(response.status_code, 400)
  48. self.assertEqual(
  49. response.json(), {"new_email": ["Enter a valid email address."]}
  50. )
  51. def test_email_taken(self):
  52. """api validates email usage"""
  53. UserModel.objects.create_user("BobBoberson", "new@email.com", "Pass.123")
  54. response = self.client.post(
  55. self.link,
  56. data={"new_email": "new@email.com", "password": self.USER_PASSWORD},
  57. )
  58. self.assertEqual(response.status_code, 400)
  59. self.assertEqual(
  60. response.json(), {"new_email": ["This e-mail address is not available."]}
  61. )
  62. def test_change_email(self):
  63. """api allows users to change their e-mail addresses"""
  64. new_email = "new@email.com"
  65. response = self.client.post(
  66. self.link, data={"new_email": new_email, "password": self.USER_PASSWORD}
  67. )
  68. self.assertEqual(response.status_code, 200)
  69. self.assertIn("Confirm e-mail change", mail.outbox[0].subject)
  70. for line in [l.strip() for l in mail.outbox[0].body.splitlines()]:
  71. if line.startswith("http://"):
  72. token = line.rstrip("/").split("/")[-1]
  73. break
  74. else:
  75. self.fail("E-mail sent didn't contain confirmation url")
  76. response = self.client.get(
  77. reverse("misago:options-confirm-email-change", kwargs={"token": token})
  78. )
  79. self.assertEqual(response.status_code, 200)
  80. self.reload_user()
  81. self.assertEqual(self.user.email, new_email)
  82. def test_change_email_user_password_whitespace(self):
  83. """api supports users with whitespace around their passwords"""
  84. user_password = " old password "
  85. new_password = " N3wP@55w0rd "
  86. new_email = "new@email.com"
  87. self.user.set_password(user_password)
  88. self.user.save()
  89. self.login_user(self.user)
  90. response = self.client.post(
  91. self.link, data={"new_email": new_email, "password": user_password}
  92. )
  93. self.assertEqual(response.status_code, 200)
  94. self.assertIn("Confirm e-mail change", mail.outbox[0].subject)
  95. for line in [l.strip() for l in mail.outbox[0].body.splitlines()]:
  96. if line.startswith("http://"):
  97. token = line.rstrip("/").split("/")[-1]
  98. break
  99. else:
  100. self.fail("E-mail sent didn't contain confirmation url")
  101. response = self.client.get(
  102. reverse("misago:options-confirm-email-change", kwargs={"token": token})
  103. )
  104. self.assertEqual(response.status_code, 200)
  105. self.reload_user()
  106. self.assertEqual(self.user.email, new_email)