Put user_db_model as attribute of UserManager

This commit is contained in:
François Voron
2021-09-17 11:24:49 +02:00
parent 913cd5cb2a
commit 69f18cff47
2 changed files with 21 additions and 16 deletions

View File

@@ -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:

View File

@@ -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