test_password.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import json
  2. import pytest
  3. from flaskbb.core.auth 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. from werkzeug.security import check_password_hash
  8. class SimpleTokenSerializer:
  9. @staticmethod
  10. def dumps(token):
  11. return json.dumps({'user_id': token.user_id, 'op': token.operation})
  12. @staticmethod
  13. def loads(raw_token):
  14. loaded = json.loads(raw_token)
  15. return Token(user_id=loaded['user_id'], operation=loaded['op'])
  16. class TestPasswordReset(object):
  17. def test_raises_token_error_if_not_a_password_reset(self):
  18. service = password.ResetPasswordService(
  19. SimpleTokenSerializer, User, []
  20. )
  21. raw_token = SimpleTokenSerializer.dumps(
  22. Token(user_id=1, operation=TokenActions.ACTIVATE_ACCOUNT)
  23. )
  24. with pytest.raises(TokenError) as excinfo:
  25. service.reset_password(
  26. raw_token, "some@e.mail", "a great password!"
  27. )
  28. assert "invalid" in str(excinfo.value)
  29. def test_raises_StopValidation_if_verifiers_fail(self):
  30. token = SimpleTokenSerializer.dumps(
  31. Token(user_id=1, operation=TokenActions.RESET_PASSWORD)
  32. )
  33. def verifier(*a, **k):
  34. raise ValidationError('attr', 'no')
  35. service = password.ResetPasswordService(
  36. SimpleTokenSerializer, User, [verifier]
  37. )
  38. with pytest.raises(StopValidation) as excinfo:
  39. service.reset_password(token, "an@e.mail", "great password!")
  40. assert ("attr", "no") in excinfo.value.reasons
  41. def test_sets_user_password_to_provided_if_verifiers_pass(self, Fred):
  42. token = SimpleTokenSerializer.dumps(
  43. Token(user_id=Fred.id, operation=TokenActions.RESET_PASSWORD)
  44. )
  45. service = password.ResetPasswordService(
  46. SimpleTokenSerializer, User, []
  47. )
  48. service.reset_password(token, Fred.email, "newpasswordwhodis")
  49. assert check_password_hash(Fred.password, "newpasswordwhodis")