285 lines
13 KiB
Python
285 lines
13 KiB
Python
|
|
from uuid import uuid4
|
|
|
|
import allure
|
|
import pytest
|
|
from httpx import HTTPStatusError
|
|
|
|
from tests.e2e.conftest import MySession, e2e_settings
|
|
|
|
|
|
@pytest.mark.integra
|
|
class TestCrud:
|
|
|
|
@pytest.mark.parametrize("test_user_fixture", [(["admin"], ["admin_group"])], indirect=True)
|
|
async def test_get_user_by_email_positive(self,test_user_fixture)->None:
|
|
|
|
session, new_user_record=test_user_fixture
|
|
|
|
with allure.step("Get user by email"):
|
|
|
|
email = new_user_record.get("email") #get email from the fixture in yield sector
|
|
|
|
target_url=f"http://{e2e_settings.HOST}:{e2e_settings.PORT}"
|
|
response = await session.get(f"{target_url}/user/get_by_email",params={"email":email})
|
|
response.raise_for_status()
|
|
response=response.json()
|
|
|
|
with allure.step("Validate response"):
|
|
|
|
assert response.get("email")==email
|
|
assert "TEST_" in response.get("first_name")
|
|
assert "TEST_" in response.get("last_name")
|
|
assert "TEST_" in response.get("middle_name")
|
|
assert response.get("direct_permissions") != []
|
|
assert response.get("group") != []
|
|
assert not response.get("hashed_password") or not response.get("plain_password") or not response.get("password")
|
|
|
|
|
|
@pytest.mark.parametrize("email, expected_status", [
|
|
pytest.param("test@test.test", 404, id="non_existed_email"),
|
|
pytest.param("test",404, id="wrong_email"),
|
|
pytest.param("@d", 404, id="wrong_email")
|
|
])
|
|
async def test_get_user_by_email_negative(self, email:str, expected_status:int, auth_fixture:MySession)->None:
|
|
|
|
with allure.step("Get user by email"):
|
|
target_url = f"http://{e2e_settings.HOST}:{e2e_settings.PORT}"
|
|
|
|
with pytest.raises(HTTPStatusError) as exc_info:
|
|
response = await auth_fixture.get(f"{target_url}/user/get_by_email", params={"email": email})
|
|
response.raise_for_status()
|
|
|
|
assert exc_info.value.response.status_code == expected_status
|
|
|
|
|
|
@pytest.mark.parametrize("new_user_record",[
|
|
pytest.param({ "first_name":"TEST",
|
|
"last_name":"TEST",
|
|
"middle_name":"TEST",
|
|
"email":f"TEST_{uuid4()}@d.d",
|
|
"plain_password":"Test1234!",
|
|
"direct_permissions":[],
|
|
"group":[]}, id="Positive_user_creation_with_all_the_fields"),
|
|
|
|
pytest.param({ "first_name":"TEST",
|
|
"last_name":"TEST",
|
|
"middle_name":"TEST",
|
|
"email":f"TEST_{uuid4()}@d.d",
|
|
"plain_password":"Test1234!",
|
|
"direct_permissions":["WRONG_PERMISSIONS"],
|
|
"group":["WRONG_GROUP"]},id="Positive_wrong_permissions"),
|
|
])
|
|
async def test_create_delete_user_hard_positive(self, new_user_record:dict,auth_fixture:MySession)->None:
|
|
|
|
with allure.step("Setting target_url"):
|
|
|
|
target_url=f"http://{e2e_settings.HOST}:{e2e_settings.PORT}"
|
|
|
|
with allure.step("Create new test user and check for the new user"):
|
|
|
|
response=await auth_fixture.post(f"{target_url}/user/create_user", json=new_user_record)
|
|
response.raise_for_status()
|
|
|
|
try:
|
|
with allure.step("Check for the new user"):
|
|
|
|
response = await auth_fixture.get(f"{target_url}/user/get_by_email",params={"email":new_user_record.get("email")})
|
|
response.raise_for_status()
|
|
response=response.json()
|
|
|
|
assert response.get("email")==new_user_record["email"]
|
|
assert response.get("first_name")==new_user_record["first_name"]
|
|
assert response.get("last_name")==new_user_record["last_name"]
|
|
assert response.get("middle_name")==new_user_record["middle_name"]
|
|
assert response.get("direct_permissions") == new_user_record["direct_permissions"] or response.get("direct_permissions") == []
|
|
assert response.get("group") == new_user_record["group"] or response.get("group") == []
|
|
assert not response.get("hashed_password") or not response.get("plain_password") or not response.get("password")
|
|
|
|
finally:
|
|
with allure.step("delete new user"):
|
|
response=await auth_fixture.post(f"{target_url}/user/delete_user_hard", params={"email":new_user_record["email"]})
|
|
response.raise_for_status()
|
|
|
|
|
|
@pytest.mark.parametrize("new_user_record, expected_status", [
|
|
pytest.param({ "first_name":"TEST",
|
|
"last_name":"TEST",
|
|
"middle_name":"TEST",
|
|
"email":"WRONGEMAIL",
|
|
"plain_password":"Test1234!",
|
|
"direct_permissions":[],
|
|
"group":[]},422,id="Non_existed_email"),
|
|
|
|
pytest.param({ "first_name":"TEST",
|
|
"last_name":"TEST",
|
|
"middle_name":"TEST",
|
|
"email":"TEST1@d.d",
|
|
"plain_password":"1234",
|
|
"direct_permissions":[],
|
|
"group":[]},422,id="Wrong_password"),
|
|
|
|
pytest.param({ "first_name":"TEST",
|
|
"email":"TEST1@d.d",
|
|
"plain_password":"Test1234!",
|
|
},422,id="Not_all_the_fields"),
|
|
])
|
|
async def test_create_user_negative(self, new_user_record:dict, auth_fixture:MySession, expected_status:int):
|
|
|
|
with allure.step("Preparing data to create new user negative"):
|
|
|
|
user_created=False
|
|
target_url=f"http://{e2e_settings.HOST}:{e2e_settings.PORT}"
|
|
|
|
try:
|
|
with allure.step("Create new test user and check for the new user"):
|
|
|
|
response=await auth_fixture.post(f"{target_url}/user/create_user", json=new_user_record)
|
|
if response.status_code < 400:
|
|
user_created = True
|
|
|
|
with pytest.raises(HTTPStatusError) as exc_info:
|
|
response.raise_for_status()
|
|
|
|
assert exc_info.value.response.status_code == expected_status
|
|
|
|
finally:
|
|
if user_created:
|
|
with allure.step("delete new user"):
|
|
|
|
response = await auth_fixture.post(
|
|
f"{target_url}/user/delete_user_hard",
|
|
params={"email": new_user_record["email"]}
|
|
)
|
|
response.raise_for_status()
|
|
|
|
|
|
@pytest.mark.parametrize("new_user_record",[
|
|
pytest.param({ "first_name":"TEST",
|
|
"last_name":"TEST",
|
|
"middle_name":"TEST",
|
|
"email":f"TEST_{uuid4()}@d.d",
|
|
"plain_password":"Test1234!",
|
|
"direct_permissions":[],
|
|
"group":[]}, id="Positive_user_delete_soft"),
|
|
])
|
|
async def test_user_create_delete_soft_positive(self, new_user_record:dict, auth_fixture:MySession)->None:
|
|
with allure.step("Setting target_url"):
|
|
|
|
target_url=f"http://{e2e_settings.HOST}:{e2e_settings.PORT}"
|
|
|
|
with allure.step("Create new test user and check for the new user"):
|
|
|
|
response=await auth_fixture.post(f"{target_url}/user/create_user", json=new_user_record)
|
|
response.raise_for_status()
|
|
|
|
try:
|
|
with allure.step("Check for the new user"):
|
|
|
|
response = await auth_fixture.get(f"{target_url}/user/get_by_email",params={"email":new_user_record.get("email")})
|
|
response.raise_for_status()
|
|
|
|
with allure.step("Delete user soft"):
|
|
response=await auth_fixture.post(f"{target_url}/user/delete_user_soft", params={"email":new_user_record["email"]})
|
|
response.raise_for_status()
|
|
|
|
finally:
|
|
with allure.step("delete new user"):
|
|
response=await auth_fixture.post(f"{target_url}/user/delete_user_hard", params={"email":new_user_record["email"]})
|
|
response.raise_for_status()
|
|
|
|
@pytest.mark.parametrize("email, expected_status, ",[
|
|
pytest.param("Test", 404,id="Wrong_email")
|
|
])
|
|
async def test_user_delete_soft_negative(self, email:str,expected_status:int, auth_fixture:MySession)->None:
|
|
|
|
with allure.step("Delete user soft"):
|
|
|
|
target_url=f"http://{e2e_settings.HOST}:{e2e_settings.PORT}"
|
|
|
|
with pytest.raises(HTTPStatusError) as exc_info:
|
|
|
|
response=await auth_fixture.post(f"{target_url}/user/delete_user_soft", params={"email":email})
|
|
response.raise_for_status()
|
|
|
|
assert exc_info.value.response.status_code == expected_status
|
|
|
|
|
|
@pytest.mark.parametrize("email, expected_status, ",[
|
|
pytest.param("Test", 404,id="Wrong_email")
|
|
])
|
|
async def test_user_delete_hard_negative(self, email:str,expected_status:int, auth_fixture:MySession)->None:
|
|
|
|
with allure.step("Delete user hard"):
|
|
|
|
target_url=f"http://{e2e_settings.HOST}:{e2e_settings.PORT}"
|
|
|
|
with pytest.raises(HTTPStatusError) as exc_info:
|
|
|
|
response=await auth_fixture.post(f"{target_url}/user/delete_user_soft", params={"email":email})
|
|
response.raise_for_status()
|
|
|
|
assert exc_info.value.response.status_code == expected_status
|
|
|
|
|
|
|
|
@pytest.mark.parametrize("test_user_fixture", [
|
|
([], [])
|
|
], indirect=True)
|
|
@pytest.mark.parametrize("user_record_to_update",[
|
|
pytest.param({"first_name": "Test_New"},id="Positive_user_update_partially")
|
|
])
|
|
async def test_user_update_partially_positive(self, test_user_fixture, user_record_to_update:dict)->None:
|
|
|
|
session, new_user_record=test_user_fixture
|
|
|
|
with allure.step("Setting target_url"):
|
|
|
|
target_url=f"http://{e2e_settings.HOST}:{e2e_settings.PORT}"
|
|
|
|
with allure.step("Update user"):
|
|
response= await session.patch(f"{target_url}/user/patch_user", json=user_record_to_update, params={"email":new_user_record["email"]})
|
|
response.raise_for_status()
|
|
|
|
with allure.step("Check for the updated user"):
|
|
response=await session.get(f"{target_url}/user/get_by_email", params={"email":new_user_record["email"]})
|
|
response.raise_for_status()
|
|
response=response.json()
|
|
|
|
actual_permissions = [item.get("direct_permissions") for item in response.get("direct_permissions")] #unpacking json like {group:[{},{}]}
|
|
actual_groups =[item.get("group") for item in response.get("group")]
|
|
|
|
|
|
assert response.get("email")==new_user_record["email"]
|
|
assert response.get("first_name")==user_record_to_update["first_name"]
|
|
assert response.get("last_name")==new_user_record["last_name"]
|
|
assert response.get("middle_name")==new_user_record["middle_name"]
|
|
assert actual_permissions == new_user_record["direct_permissions"] or actual_permissions == [None]
|
|
assert actual_groups == new_user_record["group"] or actual_groups == [None]
|
|
assert not response.get("hashed_password") or not response.get("plain_password") or not response.get("password")
|
|
|
|
|
|
|
|
@pytest.mark.parametrize("test_user_fixture", [
|
|
([], [])
|
|
], indirect=True)
|
|
@pytest.mark.parametrize("user_record_to_update, expected_exception, expected_status",[
|
|
pytest.param({"plain_password": "Wrong_pass"},HTTPStatusError,422,id="Wrong_password"),
|
|
pytest.param({"email": "Wrong_email"},HTTPStatusError,422,id="Wrong_email"),
|
|
pytest.param({},HTTPStatusError, 400,id="Positive_user_update_nothing")
|
|
])
|
|
async def test_user_update_partially_negative(self, test_user_fixture, user_record_to_update:dict, expected_exception, expected_status:int)->None:
|
|
|
|
session, new_user_record=test_user_fixture
|
|
|
|
with allure.step("Setting target_url"):
|
|
|
|
target_url=f"http://{e2e_settings.HOST}:{e2e_settings.PORT}"
|
|
|
|
with allure.step("Update user"), pytest.raises(expected_exception) as exc_info:
|
|
|
|
response= await session.patch(f"{target_url}/user/patch_user", json=user_record_to_update, params={"email":new_user_record["email"]})
|
|
response.raise_for_status()
|
|
|
|
assert exc_info.value.response.status_code == expected_status
|