test_password.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import json
  2. import pytest
  3. from werkzeug.security import check_password_hash
  4. from flaskbb.core.auth import password
  5. from flaskbb.core.tokens import (StopTokenVerification, Token, TokenActions,
  6. TokenError, TokenVerificationError)
  7. from flaskbb.user.models import User
  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(SimpleTokenSerializer, User,
  19. [])
  20. raw_token = SimpleTokenSerializer.dumps(
  21. Token(user_id=1, operation=TokenActions.ACTIVATE_ACCOUNT))
  22. with pytest.raises(TokenError) as excinfo:
  23. service.reset_password(raw_token, "some@e.mail",
  24. "a great password!")
  25. assert "invalid" in str(excinfo.value)
  26. def test_raises_StopTokenVerification_if_verifiers_fail(self):
  27. token = SimpleTokenSerializer.dumps(
  28. Token(user_id=1, operation=TokenActions.RESET_PASSWORD))
  29. def verifier(*a, **k):
  30. raise TokenVerificationError('attr', 'no')
  31. service = password.ResetPasswordService(SimpleTokenSerializer, User,
  32. [verifier])
  33. with pytest.raises(StopTokenVerification) as excinfo:
  34. service.reset_password(token, "an@e.mail", "great password!")
  35. assert ("attr", "no") in excinfo.value.reasons
  36. def test_sets_user_password_to_provided_if_verifiers_pass(self, Fred):
  37. token = SimpleTokenSerializer.dumps(
  38. Token(user_id=Fred.id, operation=TokenActions.RESET_PASSWORD))
  39. service = password.ResetPasswordService(SimpleTokenSerializer, User,
  40. [])
  41. service.reset_password(token, Fred.email, "newpasswordwhodis")
  42. assert check_password_hash(Fred.password, "newpasswordwhodis")