test_user_changepassword_api.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. from django.core import mail
  2. from django.urls import reverse
  3. from misago.users.testutils import AuthenticatedUserTestCase
  4. class UserChangePasswordTests(AuthenticatedUserTestCase):
  5. """tests for user change password RPC (/api/users/1/change-password/)"""
  6. def setUp(self):
  7. super(UserChangePasswordTests, self).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. 'new_password': ["This field is required."],
  20. 'password': ["This field is required."],
  21. }
  22. )
  23. def test_invalid_password(self):
  24. """api errors correctly for invalid password"""
  25. response = self.client.post(
  26. self.link,
  27. data={
  28. 'new_password': 'N3wP@55w0rd',
  29. 'password': 'Lor3mIpsum',
  30. },
  31. )
  32. self.assertEqual(response.status_code, 400)
  33. self.assertEqual(response.json(), {
  34. 'password': ["Entered password is invalid."],
  35. })
  36. def test_blank_input(self):
  37. """api errors correctly for blank input"""
  38. response = self.client.post(
  39. self.link,
  40. data={
  41. 'new_password': '',
  42. 'password': self.USER_PASSWORD,
  43. },
  44. )
  45. self.assertEqual(response.status_code, 400)
  46. self.assertEqual(response.json(), {
  47. 'new_password': ["This field may not be blank."],
  48. })
  49. def test_short_new_pasword(self):
  50. """api errors correctly for short new password"""
  51. response = self.client.post(
  52. self.link,
  53. data={
  54. 'new_password': 'n',
  55. 'password': self.USER_PASSWORD,
  56. },
  57. )
  58. self.assertEqual(response.status_code, 400)
  59. self.assertEqual(
  60. response.json(), {
  61. 'new_password':
  62. ["This password is too short. It must contain at least 7 characters."],
  63. }
  64. )
  65. def test_change_password(self):
  66. """api allows users to change their passwords"""
  67. new_password = 'N3wP@55w0rd'
  68. response = self.client.post(
  69. self.link,
  70. data={
  71. 'new_password': new_password,
  72. 'password': self.USER_PASSWORD,
  73. },
  74. )
  75. self.assertEqual(response.status_code, 200)
  76. self.assertIn('Confirm password change', mail.outbox[0].subject)
  77. for line in [l.strip() for l in mail.outbox[0].body.splitlines()]:
  78. if line.startswith('http://'):
  79. token = line.rstrip('/').split('/')[-1]
  80. break
  81. else:
  82. self.fail("E-mail sent didn't contain confirmation url")
  83. response = self.client.get(
  84. reverse('misago:options-confirm-password-change', kwargs={
  85. 'token': token,
  86. })
  87. )
  88. self.assertEqual(response.status_code, 200)
  89. self.reload_user()
  90. self.assertTrue(self.user.check_password(new_password))