integration tests

This commit is contained in:
2026-07-30 15:49:08 +03:00
parent f87f54de55
commit 439d57554c
5 changed files with 130 additions and 40 deletions

View File

@@ -2,8 +2,10 @@
from uuid import UUID
from sqlalchemy import and_, not_, select
from sqlalchemy.exc import NoResultFound
from sqlalchemy.orm import sessionmaker
from src.errors.http_errors.errors import Errors
from src.models.database_models.model import RefreshTokens, engine
from src.models.pydantic_models.model import RefreshTokensOut
@@ -11,6 +13,7 @@ from src.models.pydantic_models.model import RefreshTokensOut
class JwtCrudActions:
def __init__(self) -> None:
self.Session=sessionmaker(bind=engine)
self.error=Errors()
def get_token_by_user_id(self, user_id:UUID)->RefreshTokensOut|None:
with self.Session() as session: # noqa: SIM117
@@ -45,6 +48,23 @@ class JwtCrudActions:
response.is_revoked=True
response.replaced_by=new_jti
return True
def create_and_update_token(self,data:dict, old_jti:UUID, new_jti:UUID)->bool:
with self.Session() as session: #noqa:SIM117
with session.begin():
new_token=RefreshTokens(**data)
session.add(new_token)
query=select(RefreshTokens).where(RefreshTokens.id==old_jti)
try:
response = session.scalars(query).one()
except NoResultFound as e:
raise self.error.not_found_error(detail="Token not found") from e
response.is_revoked=True
response.replaced_by=new_jti
return True
def revoke_all(self, user_id:UUID)->bool:
with self.Session() as session: # noqa: SIM117

View File

@@ -146,10 +146,8 @@ class CurrentUser:
ip_address=request.headers.get("x-forwarded-for", "").split(",")[0].strip() or (request.client.host if request.client else "unknown"),
expires_at=datetime.now(UTC)+timedelta(days=env_settings.REFRESH_TOKEN_EXPIRE_DAYS),
)
self.jwt_db_actions.create_token(RefreshTokensCreate.model_dump(new_token_record))
'''update old token to deactivate it and assign replaced_by'''
self.jwt_db_actions.update_token(old_jti, new_jti)
self.jwt_db_actions.create_and_update_token(RefreshTokensCreate.model_dump(new_token_record), old_jti, new_jti)
return (new_access_token,new_refresh_token)

View File

@@ -34,6 +34,8 @@ class Jwt:
def create_access_token(self, data:dict)->str:
user_info=data.copy()
if not (user_info.get("sub")) or user_info.get("sub") == "":
raise self.error.credentials_error(detail="Jwt token is incorrect")
user_info.update({"exp": datetime.now(UTC)+timedelta(minutes=env_settings.ACCESS_TOKEN_EXPIRE_MINUTES),
"token_type":"access"})
return jwt.encode(user_info, env_settings.SECRET_KEY, env_settings.ALGORITHM)
@@ -43,6 +45,8 @@ class Jwt:
user_info=data.copy()
jti=str(uuid4())
if not (user_info.get("sub")) or user_info.get("sub") == "":
raise self.error.credentials_error(detail="Jwt token is incorrect")
user_info.update({"exp":datetime.now(UTC)+timedelta(days=env_settings.REFRESH_TOKEN_EXPIRE_DAYS),
"token_type":"refresh",
"jti":jti