from datetime import UTC, datetime, timedelta from types import SimpleNamespace from uuid import uuid4 import allure import pytest from fastapi import HTTPException from jose import jwt from pydantic import ValidationError from src.models.configs_read.env import env_settings from src.service.auth.auth import CurrentUser from src.service.auth.jwt import Hashes, Jwt @pytest.mark.integra class TestAuth: @pytest.mark.parametrize("user_data",[ (SimpleNamespace(first_name="test",last_name="test",middle_name="test",email="d@d.d",direct_permissions=[],group=[],status=True)) ]) def test_get_current_user_positive(self,current_user_service:CurrentUser, jwt_service:Jwt, monkeypatch, user_data:SimpleNamespace)->None: with allure.step("create token"): token=jwt_service.create_access_token({"sub":str(uuid4())}) with allure.step("patching db call functions"): monkeypatch.setattr(current_user_service.crud_db_actions, "get_user_by_id", lambda user:user_data) with allure.step("test get_current_user_with_fake_token"): test_result= current_user_service.get_current_user(token) assert test_result.first_name==user_data.first_name assert test_result.last_name==user_data.last_name assert test_result.middle_name==user_data.middle_name assert test_result.email==user_data.email assert test_result.direct_permissions==user_data.direct_permissions assert test_result.group==user_data.group @pytest.mark.parametrize("user_data, uuid, expected_exception",[ (SimpleNamespace(first_name="test",last_name="test",middle_name="test",email="d@d.d",direct_permissions=[],group=[],status=False), uuid4(), HTTPException), (SimpleNamespace(first_name="test",last_name="test",middle_name="test",email="d@d.d",direct_permissions=[],group=[],status=True),1234, HTTPException), (SimpleNamespace(status=True),uuid4(), ValidationError) ]) def test_get_current_user_negative(self,current_user_service:CurrentUser, jwt_service:Jwt, monkeypatch, user_data:SimpleNamespace, expected_exception, uuid)->None: with allure.step("create token"): token=jwt_service.create_access_token({"sub":str(uuid)}) with allure.step("patching db call functions"): monkeypatch.setattr(current_user_service.crud_db_actions, "get_user_by_id", lambda user:user_data) with allure.step("test get_current_user_with_fake_token"), pytest.raises(expected_exception): current_user_service.get_current_user(token) @pytest.mark.parametrize("user_data, form_data_email,form_data_password",[ (SimpleNamespace(id=uuid4(),hashed_password="1234", first_name="test",last_name="test",middle_name="test",email="d@d.d",direct_permissions=[],group=[],status=True), "d@d.d", "1234"), ]) def test_login_positive(self, jwt_service:Jwt,current_user_service:CurrentUser, monkeypatch, user_data:SimpleNamespace, hash_service:Hashes, form_data_email:str, form_data_password:str, requests)->None: with allure.step("patching db call functions"): user_data.hashed_password=hash_service.plain_to_hash(user_data.hashed_password) monkeypatch.setattr(current_user_service.crud_db_actions, "get_user_by_email", lambda user:user_data) monkeypatch.setattr(current_user_service.jwt_db_actions, "revoke_all", lambda user_id: True) monkeypatch.setattr(current_user_service.jwt_db_actions, "create_token", lambda token: True ) fake_request = requests with allure.step("test login_with_fake_data"): access, refresh=current_user_service.login(form_data_email, form_data_password,fake_request) assert isinstance(access, str) assert isinstance(refresh, str) @pytest.mark.parametrize("user_data, form_data_email,form_data_password, expected_exception",[ (SimpleNamespace(id=uuid4(),hashed_password="1234", first_name="test",last_name="test",middle_name="test",email="d@d.d",direct_permissions=[],group=[],status=True), "d@d.d", "wrong_password", HTTPException), (SimpleNamespace(id=uuid4(),hashed_password="1234", first_name="test",last_name="test",middle_name="test",email="d@d.d",direct_permissions=[],group=[],status=False), "d@d.d", "1234",HTTPException), (SimpleNamespace(id=1234,hashed_password="1234", first_name="test",last_name="test",middle_name="test",email="d@d.d",direct_permissions=[],group=[],status=True), "d@d.d", "1234",ValidationError), ]) def test_login_negative(self, current_user_service:CurrentUser, user_data:SimpleNamespace, jwt_service:Jwt, monkeypatch, requests, hash_service:Hashes, form_data_email:str, form_data_password:str, expected_exception): with allure.step("patching db call functions"): user_data.hashed_password=hash_service.plain_to_hash(user_data.hashed_password) monkeypatch.setattr(current_user_service.crud_db_actions, "get_user_by_email", lambda user:user_data) monkeypatch.setattr(current_user_service.jwt_db_actions, "revoke_all", lambda user_id: True) monkeypatch.setattr(current_user_service.jwt_db_actions, "create_token", lambda token: True ) fake_request = requests with allure.step("test login_with_fake_data"), pytest.raises(expected_exception): current_user_service.login(form_data_email, form_data_password,fake_request) def test_logout_positive(self, jwt_service:Jwt, monkeypatch, current_user_service:CurrentUser)->None: with allure.step("create fake refresh token"): token=jwt_service.create_refresh_token({"sub":str(uuid4())}) with allure.step("patching db call functions"): monkeypatch.setattr(current_user_service.jwt_db_actions, "get_token_by_id", lambda jti: "test") monkeypatch.setattr(current_user_service.jwt_db_actions, "logout", lambda jti: True ) with allure.step("test logout with fake data"): current_user_service.logout(token[0]) @pytest.mark.parametrize("jti,db_result, expected_exception",[ pytest.param(None, True, HTTPException, id="jti_none"), pytest.param(1234, True, HTTPException, id="jti_int"), pytest.param(str(uuid4()), None, HTTPException, id="db_result_none"), ]) def test_logout_negative(self, jwt_service:Jwt, monkeypatch, current_user_service:CurrentUser, expected_exception, jti, db_result)->None: with allure.step("patching db call functions"): monkeypatch.setattr(current_user_service.jwt_db_actions, "get_token_by_id", lambda jti: db_result) monkeypatch.setattr(current_user_service.jwt_db_actions, "logout", lambda jti: True ) def fake_create_refresh_token(data:dict)->str: return jwt.encode(data, env_settings.SECRET_KEY, env_settings.ALGORITHM) monkeypatch.setattr(jwt_service, "create_refresh_token", fake_create_refresh_token) with allure.step("create fake refresh token"): token=fake_create_refresh_token({"sub":str(uuid4()), "jti":jti, "token_type":"refresh", "exp":datetime.now(UTC)+timedelta(days=45)}) with allure.step("test logout with fake data"), pytest.raises(expected_exception): current_user_service.logout(token)