test_registration.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import pytest
  2. from pluggy import HookimplMarker
  3. from flaskbb.auth.services.registration import RegistrationService
  4. from flaskbb.core.auth.registration import (RegistrationFailureHandler,
  5. RegistrationPostProcessor,
  6. UserRegistrationInfo,
  7. UserValidator)
  8. from flaskbb.core.exceptions import (PersistenceError, StopValidation,
  9. ValidationError)
  10. from flaskbb.user.models import User
  11. pytestmark = pytest.mark.usefixtures('default_settings')
  12. class RaisingValidator(UserValidator):
  13. def validate(self, user_info):
  14. raise ValidationError('username', 'nope')
  15. class TestRegistrationService(object):
  16. fred = UserRegistrationInfo(
  17. username='Fred',
  18. password='Fred',
  19. email='fred@fred.com',
  20. language='fred',
  21. group=4
  22. )
  23. def test_raises_stop_validation_if_validators_fail(
  24. self, plugin_manager, database
  25. ):
  26. service = self._get_service(plugin_manager, database)
  27. plugin_manager.register(self.impls(validator=RaisingValidator()))
  28. with pytest.raises(StopValidation) as excinfo:
  29. service.register(self.fred)
  30. assert ('username', 'nope') in excinfo.value.reasons
  31. def test_calls_failure_handlers_if_validation_fails(
  32. self, plugin_manager, database, mocker
  33. ):
  34. service = self._get_service(plugin_manager, database)
  35. failure = mocker.MagicMock(spec=RegistrationFailureHandler)
  36. plugin_manager.register(
  37. self.impls(validator=RaisingValidator(), failure=failure)
  38. )
  39. with pytest.raises(StopValidation) as excinfo:
  40. service.register(self.fred)
  41. failure.assert_called_once_with(self.fred, excinfo.value.reasons)
  42. def test_registers_user_if_everything_is_good(
  43. self, database, plugin_manager
  44. ):
  45. service = self._get_service(plugin_manager, database)
  46. service.register(self.fred)
  47. actual_fred = User.query.filter(User.username == 'Fred').one()
  48. assert actual_fred.id is not None
  49. def test_calls_post_processors_if_user_registration_works(
  50. self, database, plugin_manager, mocker
  51. ):
  52. service = self._get_service(plugin_manager, database)
  53. post_process = mocker.MagicMock(spec=RegistrationPostProcessor)
  54. plugin_manager.register(self.impls(post_process=post_process))
  55. fred = service.register(self.fred)
  56. post_process.assert_called_once_with(fred)
  57. def test_raises_persistenceerror_if_saving_user_goes_wrong(
  58. self, database, plugin_manager, Fred
  59. ):
  60. service = self._get_service(plugin_manager, database)
  61. with pytest.raises(PersistenceError):
  62. service.register(self.fred)
  63. @staticmethod
  64. def _get_service(plugin_manager, db):
  65. return RegistrationService(plugins=plugin_manager, users=User, db=db)
  66. @staticmethod
  67. def impls(validator=None, failure=None, post_process=None):
  68. impl = HookimplMarker('flaskbb')
  69. class Impls:
  70. if validator is not None:
  71. @impl
  72. def flaskbb_gather_registration_validators(self):
  73. return [validator]
  74. if failure is not None:
  75. @impl
  76. def flaskbb_registration_failure_handler(
  77. self, user_info, failures
  78. ):
  79. failure(user_info, failures)
  80. if post_process is not None:
  81. @impl
  82. def flaskbb_registration_post_processor(self, user):
  83. post_process(user)
  84. return Impls()