test_password.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import pytest
  2. from werkzeug.security import check_password_hash
  3. from flaskbb.auth.services import password
  4. from flaskbb.core.exceptions import StopValidation, ValidationError
  5. from flaskbb.core.tokens import Token, TokenActions, TokenError
  6. from flaskbb.user.models import User
  7. class TestPasswordReset(object):
  8. def test_raises_token_error_if_not_a_password_reset(
  9. self, token_serializer
  10. ):
  11. service = password.ResetPasswordService(token_serializer, User, [])
  12. raw_token = token_serializer.dumps(
  13. Token(user_id=1, operation=TokenActions.ACTIVATE_ACCOUNT)
  14. )
  15. with pytest.raises(TokenError) as excinfo:
  16. service.reset_password(
  17. raw_token, "some@e.mail", "a great password!"
  18. )
  19. assert "invalid" in str(excinfo.value)
  20. def test_raises_StopValidation_if_verifiers_fail(self, token_serializer):
  21. token = token_serializer.dumps(
  22. Token(user_id=1, operation=TokenActions.RESET_PASSWORD)
  23. )
  24. def verifier(*a, **k):
  25. raise ValidationError('attr', 'no')
  26. service = password.ResetPasswordService(
  27. token_serializer, User, [verifier]
  28. )
  29. with pytest.raises(StopValidation) as excinfo:
  30. service.reset_password(token, "an@e.mail", "great password!")
  31. assert ("attr", "no") in excinfo.value.reasons
  32. def test_sets_user_password_to_provided_if_verifiers_pass(
  33. self, token_serializer, Fred
  34. ):
  35. token = token_serializer.dumps(
  36. Token(user_id=Fred.id, operation=TokenActions.RESET_PASSWORD)
  37. )
  38. service = password.ResetPasswordService(token_serializer, User, [])
  39. service.reset_password(token, Fred.email, "newpasswordwhodis")
  40. assert check_password_hash(Fred.password, "newpasswordwhodis")
  41. # need fred to initiate Users
  42. def test_initiate_raises_if_user_doesnt_exist(
  43. self, token_serializer, Fred
  44. ):
  45. service = password.ResetPasswordService(token_serializer, User, [])
  46. with pytest.raises(ValidationError) as excinfo:
  47. service.initiate_password_reset('lol@doesnt.exist')
  48. assert excinfo.value.attribute == 'email'
  49. assert excinfo.value.reason == 'Invalid email'
  50. def test_calls_send_reset_token_successfully_if_user_exists(
  51. self, Fred, mocker, token_serializer
  52. ):
  53. service = password.ResetPasswordService(token_serializer, User, [])
  54. mock = mocker.MagicMock()
  55. with mocker.patch(
  56. 'flaskbb.auth.services.password.send_reset_token.delay', mock):
  57. service.initiate_password_reset(Fred.email)
  58. token = token_serializer.dumps(
  59. Token(user_id=Fred.id, operation=TokenActions.RESET_PASSWORD)
  60. )
  61. mock.assert_called_once_with(
  62. token=token, username=Fred.username, email=Fred.email
  63. )