from types import SimpleNamespace from unittest.mock import AsyncMock import allure import pytest from fastapi import HTTPException from src.models.pydantic_models.model import UserCreate, UserUpdate from src.service.users_crud.users_crud import CrudService @pytest.mark.integra class TestCrud: @pytest.mark.parametrize("user_data", [ pytest.param(SimpleNamespace(first_name="test",last_name="test",middle_name="test",email="d@d.d",direct_permissions=[],group=[], plain_password="Test1234!"),id="Create_user_positive") ]) async def test_create_user_positive(self, crud_service:CrudService, monkeypatch, user_data:SimpleNamespace)->None: with allure.step("Patching functions"): monkeypatch.setattr(crud_service.crud_db_actions, "create_user", AsyncMock(return_value=user_data)) with allure.step("Test Create User"): await crud_service.create_user(UserCreate.model_validate(user_data)) @pytest.mark.parametrize("user_data,expected_exception,expected_status ", [ pytest.param(SimpleNamespace(first_name="test",last_name="test",middle_name="test",email="d@d.d",direct_permissions=[],group=[], plain_password="Test1234!"),HTTPException,422,id="Create_user_None") ]) async def test_create_user_negative(self, crud_service:CrudService, monkeypatch, user_data:SimpleNamespace, expected_exception, expected_status:int)->None: with allure.step("Patching functions"): monkeypatch.setattr(crud_service.crud_db_actions, "create_user", AsyncMock(return_value=None)) with allure.step("Test Create User"), pytest.raises(expected_exception) as exc_info: await crud_service.create_user(UserCreate.model_validate(user_data)) if expected_exception is HTTPException: assert exc_info.value.status_code == expected_status @pytest.mark.parametrize("user_data", [ pytest.param(SimpleNamespace(first_name="test",last_name="test",middle_name="test",email="d@d.d",direct_permissions=[],group=[], plain_password="Test1234!"),id="Create_user_positive") ]) async def test_update_user_positive(self, crud_service:CrudService, monkeypatch, user_data:SimpleNamespace)->None: with allure.step("Patching functions"): monkeypatch.setattr(crud_service.crud_db_actions, "update_user_partially", AsyncMock(return_value=user_data)) with allure.step("Test Update User"): await crud_service.update_user(user_data.email,UserUpdate.model_validate(user_data)) @pytest.mark.parametrize("user_data,expected_exception,expected_status ", [ pytest.param(SimpleNamespace(first_name="test",last_name="test",middle_name="test",email="d@d.d",direct_permissions=[],group=[], plain_password="Test1234!"),HTTPException,404,id="Update_user_None"), pytest.param(SimpleNamespace(),HTTPException,400,id="Empty_user_data") ]) async def test_update_user_negative(self, crud_service:CrudService, monkeypatch, user_data:SimpleNamespace, expected_exception, expected_status:int)->None: with allure.step("Patching functions"): monkeypatch.setattr(crud_service.crud_db_actions, "update_user_partially", AsyncMock(return_value=None)) with allure.step("Test Update User"), pytest.raises(expected_exception) as exc_info: await crud_service.update_user("d@d.d",UserUpdate.model_validate(user_data)) if expected_exception is HTTPException: assert exc_info.value.status_code == expected_status