test_update_settings.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import pytest
  2. from pluggy import HookimplMarker
  3. from flaskbb.core.changesets import ChangeSetPostProcessor
  4. from flaskbb.core.exceptions import PersistenceError
  5. from flaskbb.core.user.update import SettingsUpdate
  6. from flaskbb.user.models import User
  7. from flaskbb.user.services.update import DefaultSettingsUpdateHandler
  8. class TestDefaultSettingsUpdateHandler(object):
  9. def test_raises_persistence_error_if_save_fails(
  10. self, mocker, user, plugin_manager
  11. ):
  12. settings_update = SettingsUpdate(language="python", theme="molokai")
  13. db = mocker.Mock()
  14. db.session.commit.side_effect = Exception("no")
  15. hook_impl = mocker.Mock(spec=ChangeSetPostProcessor)
  16. plugin_manager.register(self.impl(hook_impl))
  17. handler = DefaultSettingsUpdateHandler(
  18. db=db, plugin_manager=plugin_manager
  19. )
  20. with pytest.raises(PersistenceError) as excinfo:
  21. handler.apply_changeset(user, settings_update)
  22. assert "Could not update settings" in str(excinfo.value)
  23. hook_impl.post_process_changeset.assert_not_called()
  24. def test_actually_updates_password(
  25. self, user, database, mocker, plugin_manager
  26. ):
  27. settings_update = SettingsUpdate(language="python", theme="molokai")
  28. hook_impl = mocker.Mock(spec=ChangeSetPostProcessor)
  29. plugin_manager.register(self.impl(hook_impl))
  30. handler = DefaultSettingsUpdateHandler(
  31. db=database, plugin_manager=plugin_manager
  32. )
  33. handler.apply_changeset(user, settings_update)
  34. same_user = User.query.get(user.id)
  35. assert same_user.theme == "molokai"
  36. assert same_user.language == "python"
  37. hook_impl.post_process_changeset.assert_called_once_with(
  38. user=user, settings_update=settings_update
  39. )
  40. @staticmethod
  41. def impl(post_processor):
  42. class Impl:
  43. @HookimplMarker("flaskbb")
  44. def flaskbb_settings_updated(self, user, settings_update):
  45. post_processor.post_process_changeset(
  46. user=user, settings_update=settings_update
  47. )
  48. return Impl()