diff --git a/src/service/users_crud/users_crud.py b/src/service/users_crud/users_crud.py index d187bea..dbf2c89 100644 --- a/src/service/users_crud/users_crud.py +++ b/src/service/users_crud/users_crud.py @@ -1,5 +1,6 @@ import asyncio +from src.database.auth.refresh_tokens import JwtCrudActions from src.database.users.crud import UsersCrudActions from src.errors.http_errors.errors import Errors from src.models.pydantic_models.model import UserCreate, UserOut, UserUpdate @@ -12,6 +13,7 @@ class CrudService: self.errors=Errors() self.crud_db_actions=UsersCrudActions() self.hash_service=HashService() + self.jwt_db_actions=JwtCrudActions() async def _plain_to_hash(self, user_data:dict)->dict: @@ -78,6 +80,8 @@ class CrudService: async def reset_password(self, email:str)->str: new_password=await self.hash_service.generate_temp_password() + + await self.update_user(email, UserUpdate(plain_password=new_password)) # type: ignore[call-arg] return new_password diff --git a/tests/unit/test_jwt.py b/tests/unit/test_jwt.py index 614d3f0..47f145e 100644 --- a/tests/unit/test_jwt.py +++ b/tests/unit/test_jwt.py @@ -6,6 +6,7 @@ from fastapi import HTTPException from jose import jwt from src.models.configs_read.env import env_settings +from src.models.pydantic_models.model import validate_password from src.service.auth.jwt import HashService, JwtService @@ -146,3 +147,30 @@ class TestJwt: async def test_token_to_hash_different_input(self, hash_service:HashService)->None: assert hash_service.token_to_hash("abc")!=hash_service.token_to_hash("xyz") + + @pytest.mark.parametrize("complexity",[ + pytest.param(8,id="low_edge"), + pytest.param(9,id="low_edge+1"), + pytest.param(16,id="default"), + pytest.param(72,id="high_edge"), + pytest.param(71,id="high_edge-1") + ]) + async def test_generate_temp_password_positive(self, hash_service:HashService, complexity:int)->None: + + for _ in range(10000): + password=await hash_service.generate_temp_password(complexity) + try: + validate_password(password) + except ValueError as e: + pytest.fail(f"{password!r}: {e}") + + + @pytest.mark.parametrize("complexity", [ + pytest.param(73,id="too_long"), + pytest.param(7,id="too_short") + ]) + async def test_generate_temp_password_negative(self, hash_service:HashService, complexity:int)->None: + + password = await hash_service.generate_temp_password(complexity) + with pytest.raises(ValueError, match="8-72"): + validate_password(password) \ No newline at end of file