test_user_changepassword_api.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. from django.core import mail
  2. from django.urls import reverse
  3. from ..test import AuthenticatedUserTestCase
  4. class UserChangePasswordTests(AuthenticatedUserTestCase):
  5. """tests for user change password RPC (/api/users/1/change-password/)"""
  6. def setUp(self):
  7. super().setUp()
  8. self.link = "/api/users/%s/change-password/" % self.user.pk
  9. def test_unsupported_methods(self):
  10. """api isn't supporting GET"""
  11. response = self.client.get(self.link)
  12. self.assertEqual(response.status_code, 405)
  13. def test_empty_input(self):
  14. """api errors correctly for empty input"""
  15. response = self.client.post(self.link, data={})
  16. self.assertEqual(response.status_code, 400)
  17. self.assertEqual(
  18. response.json(),
  19. {
  20. "new_password": ["This field is required."],
  21. "password": ["This field is required."],
  22. },
  23. )
  24. def test_invalid_password(self):
  25. """api errors correctly for invalid password"""
  26. response = self.client.post(
  27. self.link, data={"new_password": "N3wP@55w0rd", "password": "Lor3mIpsum"}
  28. )
  29. self.assertEqual(response.status_code, 400)
  30. self.assertEqual(
  31. response.json(), {"password": ["Entered password is invalid."]}
  32. )
  33. def test_blank_input(self):
  34. """api errors correctly for blank input"""
  35. response = self.client.post(
  36. self.link, data={"new_password": "", "password": self.USER_PASSWORD}
  37. )
  38. self.assertEqual(response.status_code, 400)
  39. self.assertEqual(
  40. response.json(), {"new_password": ["This field may not be blank."]}
  41. )
  42. def test_short_new_pasword(self):
  43. """api errors correctly for short new password"""
  44. response = self.client.post(
  45. self.link, data={"new_password": "n", "password": self.USER_PASSWORD}
  46. )
  47. self.assertEqual(response.status_code, 400)
  48. self.assertEqual(
  49. response.json(),
  50. {
  51. "new_password": [
  52. "This password is too short. It must contain at least 7 characters."
  53. ]
  54. },
  55. )
  56. def test_change_password(self):
  57. """api allows users to change their passwords"""
  58. new_password = "N3wP@55w0rd"
  59. response = self.client.post(
  60. self.link,
  61. data={"new_password": new_password, "password": self.USER_PASSWORD},
  62. )
  63. self.assertEqual(response.status_code, 200)
  64. self.assertIn("Confirm password change", mail.outbox[0].subject)
  65. for line in [l.strip() for l in mail.outbox[0].body.splitlines()]:
  66. if line.startswith("http://"):
  67. token = line.rstrip("/").split("/")[-1]
  68. break
  69. else:
  70. self.fail("E-mail sent didn't contain confirmation url")
  71. response = self.client.get(
  72. reverse("misago:options-confirm-password-change", kwargs={"token": token})
  73. )
  74. self.assertEqual(response.status_code, 200)
  75. self.reload_user()
  76. self.assertTrue(self.user.check_password(new_password))
  77. def test_change_password_with_whitespaces(self):
  78. """api handles users with whitespaces around their passwords"""
  79. old_password = " old password "
  80. new_password = " N3wP@55w0rd "
  81. self.user.set_password(old_password)
  82. self.user.save()
  83. self.login_user(self.user)
  84. response = self.client.post(
  85. self.link, data={"new_password": new_password, "password": old_password}
  86. )
  87. self.assertEqual(response.status_code, 200)
  88. self.assertIn("Confirm password change", mail.outbox[0].subject)
  89. for line in [l.strip() for l in mail.outbox[0].body.splitlines()]:
  90. if line.startswith("http://"):
  91. token = line.rstrip("/").split("/")[-1]
  92. break
  93. else:
  94. self.fail("E-mail sent didn't contain confirmation url")
  95. response = self.client.get(
  96. reverse("misago:options-confirm-password-change", kwargs={"token": token})
  97. )
  98. self.assertEqual(response.status_code, 200)
  99. self.reload_user()
  100. self.assertTrue(self.user.check_password(new_password))