From 69f18cff471c380d3d0c96d189610a20de109138 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Voron?= Date: Fri, 17 Sep 2021 11:24:49 +0200 Subject: [PATCH] Put user_db_model as attribute of UserManager --- fastapi_users/manager.py | 13 ++++--------- tests/conftest.py | 24 +++++++++++++++++------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/fastapi_users/manager.py b/fastapi_users/manager.py index 7e882883..8da3e423 100644 --- a/fastapi_users/manager.py +++ b/fastapi_users/manager.py @@ -51,6 +51,7 @@ class BaseUserManager(Generic[models.UC, models.UD]): """ User management logic. + :attribute user_db_model: Pydantic model of a DB representation of a user. :attribute reset_password_token_secret: Secret to encode reset password token. :attribute reset_password_token_lifetime_seconds: Lifetime of reset password token. :attribute reset_password_token_audience: JWT audience of reset password token. @@ -58,13 +59,10 @@ class BaseUserManager(Generic[models.UC, models.UD]): :attribute verification_token_lifetime_seconds: Lifetime of verification token. :attribute verification_token_audience: JWT audience of verification token. - :param user_db_model: Pydantic model of a DB representation of a user. :param user_db: Database adapter instance. """ user_db_model: Type[models.UD] - user_db: BaseUserDatabase[models.UD] - reset_password_token_secret: SecretType reset_password_token_lifetime_seconds: int = 3600 reset_password_token_audience: str = RESET_PASSWORD_TOKEN_AUDIENCE @@ -73,12 +71,9 @@ class BaseUserManager(Generic[models.UC, models.UD]): verification_token_lifetime_seconds: int = 3600 verification_token_audience: str = VERIFY_USER_TOKEN_AUDIENCE - def __init__( - self, - user_db_model: Type[models.UD], - user_db: BaseUserDatabase[models.UD], - ): - self.user_db_model = user_db_model + user_db: BaseUserDatabase[models.UD] + + def __init__(self, user_db: BaseUserDatabase[models.UD]): self.user_db = user_db async def get(self, id: UUID4) -> models.UD: diff --git a/tests/conftest.py b/tests/conftest.py index d03b6483..2accf651 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,5 +1,5 @@ import asyncio -from typing import Any, AsyncGenerator, Callable, List, Optional, Union +from typing import Any, AsyncGenerator, Callable, Generic, List, Optional, Type, Union from unittest.mock import MagicMock import httpx @@ -54,12 +54,14 @@ class UserDBOAuth(UserOAuth, UserDB): pass -class UserManager(BaseUserManager[UserCreate, UserDB]): +class BaseTestUserManager( + Generic[models.UC, models.UD], BaseUserManager[models.UC, models.UD] +): reset_password_token_secret = "SECRET" verification_token_secret = "SECRET" async def validate_password( - self, password: str, user: Union[UserCreate, UserDB] + self, password: str, user: Union[models.UC, models.UD] ) -> None: if len(password) < 3: raise InvalidPasswordException( @@ -67,6 +69,14 @@ class UserManager(BaseUserManager[UserCreate, UserDB]): ) +class UserManager(BaseTestUserManager[UserCreate, UserDB]): + user_db_model = UserDB + + +class UserManagerOAuth(BaseTestUserManager[UserCreate, UserDBOAuth]): + user_db_model = UserDBOAuth + + class UserManagerMock(UserManager): get_by_email: MagicMock request_verify: MagicMock @@ -381,8 +391,8 @@ def mock_user_db_oauth( @pytest.fixture def make_user_manager(mocker: MockerFixture): - def _make_user_manager(user_db_model, mock_user_db): - user_manager = UserManager(user_db_model, mock_user_db) + def _make_user_manager(user_manager_class: Type[BaseTestUserManager], mock_user_db): + user_manager = user_manager_class(mock_user_db) mocker.spy(user_manager, "get_by_email") mocker.spy(user_manager, "request_verify") mocker.spy(user_manager, "verify") @@ -402,12 +412,12 @@ def make_user_manager(mocker: MockerFixture): @pytest.fixture def user_manager(make_user_manager, mock_user_db): - return make_user_manager(UserDB, mock_user_db) + return make_user_manager(UserManager, mock_user_db) @pytest.fixture def user_manager_oauth(make_user_manager, mock_user_db_oauth): - return make_user_manager(UserDBOAuth, mock_user_db_oauth) + return make_user_manager(UserManagerOAuth, mock_user_db_oauth) @pytest.fixture