test_password.py 2.9 KB

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