e2e tests 0.1
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
from uuid import UUID
|
||||
|
||||
from sqlalchemy import select, update
|
||||
from sqlalchemy import delete, select, update
|
||||
from sqlalchemy.ext.asyncio import async_sessionmaker
|
||||
|
||||
from src.models.database_models.model import (
|
||||
@@ -71,7 +71,7 @@ class UsersCrudActions:
|
||||
await session.flush()
|
||||
return UserOutDB.model_validate(new_user)
|
||||
|
||||
async def delete_user(self, user_email:str)->bool|None:
|
||||
async def delete_user_soft(self, user_email:str)->bool|None:
|
||||
|
||||
async with self.Session() as session, session.begin():
|
||||
|
||||
@@ -84,7 +84,20 @@ class UsersCrudActions:
|
||||
response.status=False
|
||||
return True
|
||||
|
||||
async def update_user(self, user_email:str, data:dict)->UserOutDB|None:
|
||||
|
||||
async def delete_user_hard(self, user_email:str)->bool|None:
|
||||
|
||||
async with self.Session() as session, session.begin():
|
||||
|
||||
query=delete(User).where(User.email == user_email).returning(User)
|
||||
response=(await session.scalars(query)).one_or_none()
|
||||
|
||||
if response is None:
|
||||
return None
|
||||
|
||||
return True
|
||||
|
||||
async def update_user_partially(self, user_email:str, data:dict)->UserOutDB|None:
|
||||
|
||||
async with self.Session() as session, session.begin():
|
||||
|
||||
|
||||
@@ -12,4 +12,4 @@ class Env(Base):
|
||||
|
||||
model_config=SettingsConfigDict(env_file="configs/.env", extra=None)
|
||||
|
||||
env_settings=Env()
|
||||
env_settings=Env() # type: ignore[call-arg]
|
||||
@@ -5,7 +5,7 @@ from uuid import UUID
|
||||
from pydantic import AfterValidator, BaseModel, EmailStr, Field
|
||||
|
||||
|
||||
def validate_password(password: str) -> str:
|
||||
async def validate_password(password: str) -> str:
|
||||
PUNCTUATION: set[str] = {"$", "@", "#", "%", "!", "^", "&", "*", "(", ")", "-", "_", "+", "=", "{", "}", "[", "]"}
|
||||
if len(password) < 8 or len(password) > 72:
|
||||
raise ValueError("Password must be 8-72 characters")
|
||||
|
||||
@@ -12,6 +12,14 @@ class CrudService:
|
||||
self.hash_service=HashService()
|
||||
|
||||
|
||||
async def _plain_to_hash(self, user_data:dict)->dict:
|
||||
|
||||
user_data["hashed_password"]=user_data.pop("plain_password")
|
||||
user_data["hashed_password"]=self.hash_service.plain_to_hash(user_data["hashed_password"])
|
||||
|
||||
return user_data
|
||||
|
||||
|
||||
async def get_user_by_email(self, email:str)->UserOut:
|
||||
|
||||
user_entity=await self.crud_db_actions.get_user_by_email(email)
|
||||
@@ -25,8 +33,7 @@ class CrudService:
|
||||
|
||||
user_data=UserCreate.model_dump(data)
|
||||
|
||||
user_data["hashed_password"]=user_data.pop("plain_password")
|
||||
user_data["hashed_password"]=self.hash_service.plain_to_hash(user_data["hashed_password"])
|
||||
user_data=await self._plain_to_hash(user_data)
|
||||
|
||||
user_entity=await self.crud_db_actions.create_user(user_data)
|
||||
|
||||
@@ -35,14 +42,21 @@ class CrudService:
|
||||
return UserOut.model_validate(user_entity)
|
||||
|
||||
|
||||
async def delete_user(self, email:str)->bool:
|
||||
async def delete_user_soft(self, email:str)->bool:
|
||||
|
||||
user_entity=await self.crud_db_actions.delete_user(email)
|
||||
user_entity=await self.crud_db_actions.delete_user_soft(email)
|
||||
|
||||
if not user_entity:
|
||||
raise self.errors.not_found_error(detail="User not found")
|
||||
return user_entity
|
||||
|
||||
async def delete_user_hard(self, email:str, current_user:UserOut)->bool:
|
||||
|
||||
user_entity=await self.crud_db_actions.delete_user_hard(email)
|
||||
|
||||
if not user_entity:
|
||||
raise self.errors.not_found_error(detail="User not found")
|
||||
return user_entity
|
||||
|
||||
async def update_user(self, email:str, data:UserUpdate)->UserOut:
|
||||
|
||||
@@ -52,10 +66,9 @@ class CrudService:
|
||||
raise self.errors.bad_request_error(detail="User info to update can not be empty")
|
||||
|
||||
if user_data.get("plain_password"):
|
||||
user_data["hashed_password"]=user_data.pop("plain_password")
|
||||
user_data["hashed_password"]=self.hash_service.plain_to_hash(user_data["hashed_password"])
|
||||
user_data=await self._plain_to_hash(user_data)
|
||||
|
||||
user_entity=await self.crud_db_actions.update_user(email, user_data)
|
||||
user_entity=await self.crud_db_actions.update_user_partially(email, user_data)
|
||||
|
||||
if not user_entity:
|
||||
raise self.errors.not_found_error(detail="User not found")
|
||||
|
||||
@@ -14,9 +14,13 @@ async def get_current_user_by_email(email:str, crud:CrudService=Depends(crud_ser
|
||||
async def create_user(data:UserCreate, crud:CrudService=Depends(crud_service), current_user=Depends(get_current_user))->UserOut: #noqa: B008
|
||||
return await crud.create_user(data)
|
||||
|
||||
@router.post("/delete_user")
|
||||
async def delete_user(email:str, crud:CrudService=Depends(crud_service), current_user=Depends(get_current_user))->bool: #noqa: B008
|
||||
return await crud.delete_user(email)
|
||||
@router.post("/delete_user_soft")
|
||||
async def delete_user_soft(email:str, crud:CrudService=Depends(crud_service), current_user=Depends(get_current_user))->bool: #noqa: B008
|
||||
return await crud.delete_user_soft(email)
|
||||
|
||||
@router.post("/delete_user_hard")
|
||||
async def delete_user_hard(email:str, crud:CrudService=Depends(crud_service), current_user=Depends(get_current_user))->bool: #noqa: B008
|
||||
return await crud.delete_user_hard(email, current_user)
|
||||
|
||||
@router.post("/patch_user")
|
||||
async def patch_user(email:str, data:UserUpdate, crud:CrudService=Depends(crud_service), current_user=Depends(get_current_user))->UserOut: #noqa: B008
|
||||
|
||||
Reference in New Issue
Block a user