test_forgottenpassword_views.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. from django.contrib.auth import get_user_model
  2. from django.urls import reverse
  3. from misago.core.utils import encode_json_html
  4. from misago.users.models import Ban
  5. from misago.users.testutils import UserTestCase
  6. from misago.users.tokens import make_password_change_token
  7. UserModel = get_user_model()
  8. class ForgottenPasswordViewsTests(UserTestCase):
  9. def test_guest_request_view_returns_200(self):
  10. """request new password view returns 200 for guests"""
  11. response = self.client.get(reverse("misago:forgotten-password"))
  12. self.assertEqual(response.status_code, 200)
  13. def test_authenticated_request_view_returns_200(self):
  14. """request new password view returns 200 for authenticated"""
  15. self.login_user(self.get_authenticated_user())
  16. response = self.client.get(reverse("misago:forgotten-password"))
  17. self.assertEqual(response.status_code, 200)
  18. def test_authenticated_request_unusable_password_view_returns_200(self):
  19. """request new password view returns 200 for authenticated with unusable password"""
  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. test_user = UserModel.objects.create_user("Bob", "bob@test.com", "Pass.123")
  30. Ban.objects.create(
  31. check_type=Ban.USERNAME, banned_value="bob", user_message="Nope!"
  32. )
  33. password_token = make_password_change_token(test_user)
  34. response = self.client.get(
  35. reverse(
  36. "misago:forgotten-password-change-form",
  37. kwargs={"pk": test_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. test_user = UserModel.objects.create_user("Bob", "bob@test.com", "Pass.123")
  44. password_token = make_password_change_token(test_user)
  45. self.login_user(self.get_authenticated_user())
  46. response = self.client.get(
  47. reverse(
  48. "misago:forgotten-password-change-form",
  49. kwargs={"pk": test_user.pk, "token": password_token},
  50. )
  51. )
  52. self.assertContains(response, "your link has expired", status_code=400)
  53. def test_change_password_invalid_token(self):
  54. """invalid form token errors"""
  55. test_user = UserModel.objects.create_user("Bob", "bob@test.com", "Pass.123")
  56. response = self.client.get(
  57. reverse(
  58. "misago:forgotten-password-change-form",
  59. kwargs={"pk": test_user.pk, "token": "abcdfghqsads"},
  60. )
  61. )
  62. self.assertContains(response, "your link is invalid", status_code=400)
  63. def test_change_password_form(self):
  64. """change user password form displays for valid token"""
  65. test_user = UserModel.objects.create_user("Bob", "bob@test.com", "Pass.123")
  66. password_token = make_password_change_token(test_user)
  67. response = self.client.get(
  68. reverse(
  69. "misago:forgotten-password-change-form",
  70. kwargs={"pk": test_user.pk, "token": password_token},
  71. )
  72. )
  73. self.assertContains(response, password_token)
  74. def test_change_password_unusable_password_form(self):
  75. """set user first password form displays for valid token"""
  76. test_user = UserModel.objects.create_user("Bob", "bob@test.com")
  77. password_token = make_password_change_token(test_user)
  78. response = self.client.get(
  79. reverse(
  80. "misago:forgotten-password-change-form",
  81. kwargs={"pk": test_user.pk, "token": password_token},
  82. )
  83. )
  84. self.assertContains(response, password_token)