Просмотр исходного кода

Concede in the view layer rather than the service layer

Alec Nikolas Reiter 7 лет назад
Родитель
Сommit
b226d6fc58
3 измененных файлов с 18 добавлено и 14 удалено
  1. 11 7
      flaskbb/auth/views.py
  2. 3 3
      flaskbb/core/auth/registration.py
  3. 4 4
      tests/core/auth/test_registration.py

+ 11 - 7
flaskbb/auth/views.py

@@ -110,8 +110,8 @@ class Reauth(MethodView):
 class Register(MethodView):
     decorators = [anonymous_required, registration_enabled]
 
-    def __init__(self, registration_service):
-        self.registration_service = registration_service
+    def __init__(self, registration_service_factory):
+        self.registration_service_factory = registration_service_factory
 
     def form(self):
         form = RegisterForm()
@@ -135,8 +135,9 @@ class Register(MethodView):
                 language=form.language.data
             )
 
+            service = self.registration_service_factory()
             try:
-                self.registration_service.register(registration_info)
+                service.register(registration_info)
             except StopRegistration as e:
                 form.populate_errors(e.reasons)
                 return render_template("auth/register.html", form=form)
@@ -362,7 +363,7 @@ def flaskbb_load_blueprints(app):
             "errors/too_many_logins.html", timeout=error.description
         )
 
-    def validators_factory():
+    def registration_service_factory():
         with app.app_context():
             requirements = services.UsernameRequirements(
                 min=flaskbb_config["AUTH_USERNAME_MIN_LENGTH"],
@@ -373,13 +374,13 @@ def flaskbb_load_blueprints(app):
                 ]
             )
 
-        return [
+        validators = [
             services.EmailUniquenessValidator(User),
             services.UsernameUniquenessValidator(User),
             services.UsernameValidator(requirements)
         ]
 
-    service = RegistrationService(validators_factory, UserRepository(db))
+        return RegistrationService(validators, UserRepository(db))
 
     # Activate rate limiting on the whole blueprint
     limiter.limit(
@@ -392,7 +393,10 @@ def flaskbb_load_blueprints(app):
     register_view(
         auth,
         routes=['/register'],
-        view_func=Register.as_view('register', registration_service=service)
+        view_func=Register.as_view(
+            'register',
+            registration_service=registration_service_factory
+        )
     )
     register_view(
         auth,

+ 3 - 3
flaskbb/core/auth/registration.py

@@ -67,14 +67,14 @@ class UserValidator(ABC):
 
 
 class RegistrationService(object):
-    def __init__(self, validators_factory, user_repo):
-        self.validators_factory = validators_factory
+    def __init__(self, validators, user_repo):
+        self.validators = validators
         self.user_repo = user_repo
 
     def register(self, user_info):
         failures = []
 
-        for v in self.validators_factory():
+        for v in self.validators:
             try:
                 v(user_info)
             except UserRegistrationError as e:

+ 4 - 4
tests/core/auth/test_registration.py

@@ -1,4 +1,5 @@
 import pytest
+
 from flaskbb.core.auth import registration
 from flaskbb.core.user.repo import UserRepository
 
@@ -12,8 +13,7 @@ class RaisingValidator(registration.UserValidator):
 def test_doesnt_register_user_if_validator_fails_with_UserRegistrationError(
         mocker):
     repo = mocker.Mock(UserRepository)
-    service = registration.RegistrationService(lambda: [RaisingValidator()],
-                                               repo)
+    service = registration.RegistrationService([RaisingValidator()], repo)
 
     with pytest.raises(registration.StopRegistration):
         service.register(
@@ -30,7 +30,7 @@ def test_doesnt_register_user_if_validator_fails_with_UserRegistrationError(
 def test_gathers_up_all_errors_during_registration(mocker):
     repo = mocker.Mock(UserRepository)
     service = registration.RegistrationService(
-        lambda: [RaisingValidator(), RaisingValidator()], repo)
+        [RaisingValidator(), RaisingValidator()], repo)
 
     with pytest.raises(registration.StopRegistration) as excinfo:
         service.register(
@@ -49,7 +49,7 @@ def test_gathers_up_all_errors_during_registration(mocker):
 
 def test_registers_user_if_no_errors_occurs(mocker):
     repo = mocker.Mock(UserRepository)
-    service = registration.RegistrationService(lambda: [], repo)
+    service = registration.RegistrationService([], repo)
     user_info = registration.UserRegistrationInfo(
         username='fred',
         password='lol',