test_forgottenpassword_views.py 4.5 KB

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