test_forgottenpassword_views.py 4.1 KB

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