test_forgottenpassword_views.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. from django.urls import reverse
  2. from ...core.utils import encode_json_html
  3. from ..models import Ban
  4. from ..test import UserTestCase, create_test_user
  5. from ..tokens import make_password_change_token
  6. class ForgottenPasswordViewsTests(UserTestCase):
  7. def test_guest_request_view_returns_200(self):
  8. """request new password view returns 200 for guests"""
  9. response = self.client.get(reverse("misago:forgotten-password"))
  10. self.assertEqual(response.status_code, 200)
  11. def test_authenticated_request_view_returns_200(self):
  12. """request new password view returns 200 for authenticated"""
  13. self.login_user(self.get_authenticated_user())
  14. response = self.client.get(reverse("misago:forgotten-password"))
  15. self.assertEqual(response.status_code, 200)
  16. def test_authenticated_request_unusable_password_view_returns_200(self):
  17. """
  18. request new password view returns 200 for authenticated with unusable password
  19. """
  20. user = self.get_authenticated_user()
  21. user.set_password(None)
  22. user.save()
  23. self.assertFalse(user.has_usable_password())
  24. self.login_user(user)
  25. response = self.client.get(reverse("misago:forgotten-password"))
  26. self.assertEqual(response.status_code, 200)
  27. def test_change_password_on_banned(self):
  28. """change banned user password errors"""
  29. user = create_test_user(
  30. "OtherUser", "otheruser@example.com", self.USER_PASSWORD
  31. )
  32. Ban.objects.create(
  33. check_type=Ban.USERNAME, banned_value="OtherUser", user_message="Nope!"
  34. )
  35. password_token = make_password_change_token(user)
  36. response = self.client.get(
  37. reverse(
  38. "misago:forgotten-password-change-form",
  39. kwargs={"pk": user.pk, "token": password_token},
  40. )
  41. )
  42. self.assertContains(response, encode_json_html("<p>Nope!</p>"), status_code=403)
  43. def test_change_password_on_other_user(self):
  44. """change other user password errors"""
  45. user = create_test_user(
  46. "OtherUser", "otheruser@example.com", self.USER_PASSWORD
  47. )
  48. password_token = make_password_change_token(user)
  49. self.login_user(self.get_authenticated_user())
  50. response = self.client.get(
  51. reverse(
  52. "misago:forgotten-password-change-form",
  53. kwargs={"pk": user.pk, "token": password_token},
  54. )
  55. )
  56. self.assertContains(response, "your link has expired", status_code=400)
  57. def test_change_password_invalid_token(self):
  58. """invalid form token errors"""
  59. user = create_test_user(
  60. "OtherUser", "otheruser@example.com", self.USER_PASSWORD
  61. )
  62. response = self.client.get(
  63. reverse(
  64. "misago:forgotten-password-change-form",
  65. kwargs={"pk": user.pk, "token": "abcdfghqsads"},
  66. )
  67. )
  68. self.assertContains(response, "your link is invalid", status_code=400)
  69. def test_change_password_form(self):
  70. """change user password form displays for valid token"""
  71. user = create_test_user(
  72. "OtherUser", "otheruser@example.com", self.USER_PASSWORD
  73. )
  74. password_token = make_password_change_token(user)
  75. response = self.client.get(
  76. reverse(
  77. "misago:forgotten-password-change-form",
  78. kwargs={"pk": user.pk, "token": password_token},
  79. )
  80. )
  81. self.assertContains(response, password_token)
  82. def test_change_password_unusable_password_form(self):
  83. """set user first password form displays for valid token"""
  84. user = create_test_user("OtherUser", "otheruser@example.com")
  85. password_token = make_password_change_token(user)
  86. response = self.client.get(
  87. reverse(
  88. "misago:forgotten-password-change-form",
  89. kwargs={"pk": user.pk, "token": password_token},
  90. )
  91. )
  92. self.assertContains(response, password_token)