Skip to content

Commit

Permalink
fix test cleanup (#5)
Browse files Browse the repository at this point in the history
  • Loading branch information
dansan committed Jun 1, 2023
1 parent 1d4fe23 commit c09d370
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 34 deletions.
53 changes: 29 additions & 24 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -377,8 +377,9 @@ def http_headers_write():


@pytest.fixture
def user_created_via_http(http_headers_write, udm_kwargs, user_resource_kwargs, delete_user_via_http):
created_user_dns = []
def user_created_via_http(
http_headers_write, udm_kwargs, user_resource_kwargs, schedule_delete_object_via_http
):
auth = (udm_kwargs["username"], udm_kwargs["password"])
url = f"{udm_kwargs['url']}/users/user/"
if udm_kwargs.get("verify_ssl", True):
Expand All @@ -396,16 +397,13 @@ def _func(**user_kwargs) -> Tuple[str, str, Dict[str, Any]]:
print(resp.json())
except (AttributeError, ValueError): # pragma: no cover
print(resp.text)
assert resp.status_code in (201, 204)
assert resp.status_code in {201, 204}
obj_url = resp.headers["Location"]
dn = unquote(obj_url.rsplit("/", 1)[-1])
created_user_dns.append(dn)
schedule_delete_object_via_http("users/user", dn)
return dn, obj_url, data

yield _func

for dn in created_user_dns:
delete_user_via_http(dn)
return _func


@pytest.fixture
Expand All @@ -429,19 +427,32 @@ def _func(dn: str, user: User) -> None:


@pytest.fixture
def delete_user_via_http(base_dn, http_headers_read, udm_kwargs):
def delete_object_via_http(http_headers_read, udm_kwargs) -> Callable[[str, str], None]:
auth = (udm_kwargs["username"], udm_kwargs["password"])
if udm_kwargs.get("verify_ssl", True):
verify_ssl = udm_kwargs.get("ssl_ca_cert", False) # pragma: no cover
else:
verify_ssl = False

def _func(dn: str) -> None:
url = f"{udm_kwargs['url']}/users/user/{dn}"
def _delete_object_via_http(udm_module: str, dn: str) -> None:
url = f"{udm_kwargs['url']}/{udm_module}/{dn}"
resp = requests.delete(url, headers=http_headers_read, auth=auth, verify=verify_ssl)
assert resp.status_code in (204, 404)
assert resp.status_code in {204, 404}

return _func
return _delete_object_via_http


@pytest.fixture
def schedule_delete_object_via_http(delete_object_via_http) -> Callable[[str, str], None]:
objects: List[Tuple[str, str]] = []

def _schedule_delete_object_via_http(udm_module: str, dn: str) -> None:
objects.append((udm_module, dn))

yield _schedule_delete_object_via_http

for udm_module, dn in objects:
delete_object_via_http(udm_module, dn)


def pytest_generate_tests(metafunc):
Expand Down Expand Up @@ -497,17 +508,16 @@ def pytest_generate_tests(metafunc):


@pytest.fixture
def new_cn(base_dn, http_headers_read, http_headers_write, udm_kwargs):
def new_cn(base_dn, http_headers_read, http_headers_write, schedule_delete_object_via_http, udm_kwargs):
"""Create a new container"""
created_cn_dns = []
auth = (udm_kwargs["username"], udm_kwargs["password"])
url = f"{udm_kwargs['url']}/container/cn/"
if udm_kwargs.get("verify_ssl", True):
verify_ssl = udm_kwargs.get("ssl_ca_cert", False) # pragma: no cover
else:
verify_ssl = False

def _func(**cn_kwargs) -> Tuple[str, str, Dict[str, str]]:
def _new_cn(**cn_kwargs) -> Tuple[str, str, Dict[str, str]]:
data = {"properties": {"name": fake.city()}, "position": base_dn}
data.update(cn_kwargs)
resp = requests.post(url, headers=http_headers_write, json=data, auth=auth, verify=verify_ssl)
Expand All @@ -516,16 +526,11 @@ def _func(**cn_kwargs) -> Tuple[str, str, Dict[str, str]]:
print(resp.json())
except (AttributeError, ValueError): # pragma: no cover
print(resp.text)
assert resp.status_code in (201, 204)
assert resp.status_code in {201, 204}
obj_url = resp.headers["Location"]
dn = unquote(obj_url.rsplit("/", 1)[-1])
created_cn_dns.append(dn)
schedule_delete_object_via_http("container/cn", dn)
assert dn == f"cn={data['properties']['name']},{data['position']}"
return dn, obj_url, data

yield _func

for dn in created_cn_dns:
url = f"{url}{dn}"
resp = requests.delete(url, headers=http_headers_read, auth=auth, verify=verify_ssl)
assert resp.status_code in (204, 404)
return _new_cn
30 changes: 20 additions & 10 deletions tests/test_base_http.py
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,7 @@ async def test_reload_new_obj(udm_kwargs):


@pytest.mark.asyncio
async def test_create_user(fake_user, udm_kwargs):
async def test_create_user(fake_user, schedule_delete_object_via_http, udm_kwargs):
user_data = fake_user()
async with UDM(**udm_kwargs) as udm:
mod = udm.get("users/user")
Expand All @@ -375,6 +375,7 @@ async def test_create_user(fake_user, udm_kwargs):

res = await obj.save()

schedule_delete_object_via_http("users/user", obj.dn)
assert res is obj
assert obj.dn not in (None, "")
assert obj.uri not in (None, "")
Expand All @@ -386,8 +387,6 @@ async def test_create_user(fake_user, udm_kwargs):
assert obj_new.props.lastname == obj.props.lastname
assert obj_new.props.birthday == obj.props.birthday

await obj.delete()


@pytest.mark.asyncio
async def test_creating_obj_with_bad_property_value(faker, fake_user, udm_kwargs):
Expand Down Expand Up @@ -452,9 +451,8 @@ async def test_modify_user(fake_user, user_created_via_http, udm_kwargs):

@pytest.mark.asyncio
async def test_add_attribute_of_previously_deactivated_option(
faker, http_headers_write, test_server_configuration, udm_kwargs
faker, http_headers_write, schedule_delete_object_via_http, test_server_configuration, udm_kwargs
):
# TODO: ensure deletion of share using a fixture
async with UDM(**udm_kwargs) as udm:
mod = udm.get("shares/share")
obj = await mod.new()
Expand All @@ -463,6 +461,7 @@ async def test_add_attribute_of_previously_deactivated_option(
obj.props.host = "file.example.com"
obj.props.path = f"/home/share{faker.first_name()}"
await obj.save()
schedule_delete_object_via_http("shares/share", obj.dn)

obj_new = await mod.get(obj.dn)
assert obj_new.props.name == obj.props.name
Expand Down Expand Up @@ -503,11 +502,11 @@ async def test_add_attribute_of_previously_deactivated_option(
assert hasattr(obj_new2.props, "root_squash")
assert obj.props.root_squash is True

await obj_new2.delete()


@pytest.mark.asyncio
async def test_move_user_no_props_changed(new_cn, user_created_via_http, udm_kwargs):
async def test_move_user_no_props_changed(
new_cn, schedule_delete_object_via_http, user_created_via_http, udm_kwargs
):
old_user_dn, old_user_url, old_user_data = user_created_via_http()
cn_dn, cn_obj_url, cn_data = new_cn()
async with UDM(**udm_kwargs) as udm:
Expand All @@ -520,6 +519,7 @@ async def test_move_user_no_props_changed(new_cn, user_created_via_http, udm_kwa

obj.position = cn_dn
res = await obj.save()
schedule_delete_object_via_http("users/user", obj.dn)
assert res is obj
assert obj.dn != old_user_dn
assert obj.dn == f"uid={obj.props.username},{cn_dn}"
Expand All @@ -535,7 +535,9 @@ async def test_move_user_no_props_changed(new_cn, user_created_via_http, udm_kwa


@pytest.mark.asyncio
async def test_move_and_modify_user(faker, new_cn, user_created_via_http, udm_kwargs):
async def test_move_and_modify_user(
faker, new_cn, schedule_delete_object_via_http, user_created_via_http, udm_kwargs
):
old_user_dn, old_user_url, old_user_data = user_created_via_http()
cn_dn, cn_obj_url, cn_data = new_cn()
async with UDM(**udm_kwargs) as udm:
Expand All @@ -552,6 +554,7 @@ async def test_move_and_modify_user(faker, new_cn, user_created_via_http, udm_kw
new_lastname = faker.unique.last_name()
obj.props.lastname = new_lastname
res = await obj.save()
schedule_delete_object_via_http("users/user", obj.dn)
assert res is obj
assert obj.dn != old_user_dn
assert obj.dn == f"uid={obj.props.username},{cn_dn}"
Expand All @@ -569,7 +572,9 @@ async def test_move_and_modify_user(faker, new_cn, user_created_via_http, udm_kw


@pytest.mark.asyncio
async def test_move_multiple_objects(base_dn, new_cn, user_created_via_http, udm_kwargs):
async def test_move_multiple_objects(
base_dn, new_cn, schedule_delete_object_via_http, user_created_via_http, udm_kwargs
):
top_cn_dn, top_cn_obj_url, top_cn_data = new_cn()
old_cn_dn, old_cn_obj_url, old_cn_data = new_cn(position=top_cn_dn)
cn_name = old_cn_data["properties"]["name"]
Expand All @@ -586,10 +591,15 @@ async def test_move_multiple_objects(base_dn, new_cn, user_created_via_http, udm
assert cn_obj.dn != base_dn
cn_obj.position = base_dn
await cn_obj.save()
schedule_delete_object_via_http("container/cn", cn_obj.dn)
assert cn_obj.dn == f"cn={cn_name},{base_dn}"
for dn, url, data in users.values():
query = dn.split(",", 1)[0]
objs = [] # schedule deletion for all objects before testing them
async for obj in mod_user.search(query):
schedule_delete_object_via_http("users/user", obj.dn)
objs.append(obj)
for obj in objs:
assert old_cn_dn not in obj.dn
assert obj.position == cn_obj.dn
assert obj.dn == f"uid={data['properties']['username']},{cn_obj.dn}"
Expand Down

0 comments on commit c09d370

Please sign in to comment.