test_update_password_handler.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. from uuid import uuid4
  2. import pytest
  3. from pluggy import HookimplMarker
  4. from flaskbb.core.changesets import ChangeSetPostProcessor, ChangeSetValidator
  5. from flaskbb.core.exceptions import (PersistenceError, StopValidation,
  6. ValidationError)
  7. from flaskbb.core.user.update import PasswordUpdate
  8. from flaskbb.user.models import User
  9. from flaskbb.user.services.update import DefaultPasswordUpdateHandler
  10. class TestDefaultPasswordUpdateHandler(object):
  11. def test_raises_stop_validation_if_errors_occur(
  12. self, mocker, user, database, plugin_manager
  13. ):
  14. validator = mocker.Mock(spec=ChangeSetValidator)
  15. validator.validate.side_effect = ValidationError(
  16. "new_password", "Don't use that password"
  17. )
  18. password_change = PasswordUpdate(str(uuid4()), str(uuid4()))
  19. hook_impl = mocker.MagicMock(spec=ChangeSetPostProcessor)
  20. plugin_manager.register(self.impl(hook_impl))
  21. handler = DefaultPasswordUpdateHandler(
  22. db=database, plugin_manager=plugin_manager, validators=[validator]
  23. )
  24. with pytest.raises(StopValidation) as excinfo:
  25. handler.apply_changeset(user, password_change)
  26. assert excinfo.value.reasons == [
  27. ("new_password", "Don't use that password")
  28. ]
  29. hook_impl.post_process_changeset.assert_not_called()
  30. def test_raises_persistence_error_if_save_fails(
  31. self, mocker, user, plugin_manager
  32. ):
  33. password_change = PasswordUpdate(str(uuid4()), str(uuid4()))
  34. db = mocker.Mock()
  35. db.session.commit.side_effect = Exception("no")
  36. hook_impl = mocker.MagicMock(spec=ChangeSetPostProcessor)
  37. plugin_manager.register(self.impl(hook_impl))
  38. handler = DefaultPasswordUpdateHandler(
  39. db=db, plugin_manager=plugin_manager, validators=[]
  40. )
  41. with pytest.raises(PersistenceError) as excinfo:
  42. handler.apply_changeset(user, password_change)
  43. assert "Could not update password" in str(excinfo.value)
  44. hook_impl.post_process_changeset.assert_not_called()
  45. def test_actually_updates_password(
  46. self, user, database, plugin_manager, mocker
  47. ):
  48. new_password = str(uuid4())
  49. password_change = PasswordUpdate("test", new_password)
  50. hook_impl = mocker.MagicMock(spec=ChangeSetPostProcessor)
  51. plugin_manager.register(self.impl(hook_impl))
  52. handler = DefaultPasswordUpdateHandler(
  53. db=database, plugin_manager=plugin_manager, validators=[]
  54. )
  55. handler.apply_changeset(user, password_change)
  56. same_user = User.query.get(user.id)
  57. assert same_user.check_password(new_password)
  58. hook_impl.post_process_changeset.assert_called_once_with(user=user)
  59. @staticmethod
  60. def impl(post_processor):
  61. class Impl:
  62. @HookimplMarker("flaskbb")
  63. def flaskbb_password_updated(self, user):
  64. post_processor.post_process_changeset(user=user)
  65. return Impl()