Skip to content

Commit 41f94eb

Browse files
chore: fixtures: after delete() wait to verify deleted
In our fixtures that create: - groups - project merge requests - projects - users They delete the created objects after use. Now wait to ensure the objects are deleted before continuing as having unexpected objects existing can impact some of our tests.
1 parent 97e0eb9 commit 41f94eb

File tree

2 files changed

+67
-24
lines changed

2 files changed

+67
-24
lines changed

tests/functional/conftest.py

+23-24
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@
99

1010
import gitlab
1111
import gitlab.base
12-
13-
SLEEP_INTERVAL = 0.5
14-
TIMEOUT = 60 # seconds before timeout will occur
12+
from tests.functional import helpers
1513

1614

1715
@pytest.fixture(scope="session")
@@ -49,7 +47,7 @@ def reset_gitlab(gl):
4947
logging.info(f"Marking for deletion user: {user.username!r}")
5048
user.delete(hard_delete=True)
5149

52-
max_iterations = int(TIMEOUT / SLEEP_INTERVAL)
50+
max_iterations = int(helpers.TIMEOUT / helpers.SLEEP_INTERVAL)
5351

5452
# Ensure everything has been reset
5553
start_time = time.perf_counter()
@@ -68,7 +66,7 @@ def wait_for_list_size(
6866
f"Iteration: {count} Waiting for {description!r} items to be deleted: "
6967
f"{[x.name for x in items]}"
7068
)
71-
time.sleep(SLEEP_INTERVAL)
69+
time.sleep(helpers.SLEEP_INTERVAL)
7270

7371
elapsed_time = time.perf_counter() - start_time
7472
error_message = (
@@ -277,13 +275,11 @@ def group(gl):
277275
"path": f"group-{_id}",
278276
}
279277
group = gl.groups.create(data)
278+
group_id = group.id
280279

281280
yield group
282281

283-
try:
284-
group.delete()
285-
except gitlab.exceptions.GitlabDeleteError as e:
286-
print(f"Group already deleted: {e}")
282+
helpers.safe_delete(manager=gl.groups, object_id=group_id, description="Group")
287283

288284

289285
@pytest.fixture(scope="module")
@@ -296,10 +292,9 @@ def project(gl):
296292

297293
yield project
298294

299-
try:
300-
project.delete()
301-
except gitlab.exceptions.GitlabDeleteError as e:
302-
print(f"Project already deleted: {e}")
295+
helpers.safe_delete(
296+
manager=gl.projects, object_id=project.id, description="Project"
297+
)
303298

304299

305300
@pytest.fixture(scope="function")
@@ -365,12 +360,16 @@ def _merge_request(*, source_branch: str):
365360
yield _merge_request
366361

367362
for mr_iid, source_branch in to_delete:
368-
project.mergerequests.delete(mr_iid)
369-
try:
370-
project.branches.delete(source_branch)
371-
except gitlab.exceptions.GitlabDeleteError:
372-
# Ignore if branch was already deleted
373-
pass
363+
helpers.safe_delete(
364+
manager=project.mergerequests,
365+
object_id=mr_iid,
366+
description="Project mergerequest",
367+
)
368+
helpers.safe_delete(
369+
manager=project.branches,
370+
object_id=source_branch,
371+
description="Project branch",
372+
)
374373

375374

376375
@pytest.fixture(scope="module")
@@ -431,14 +430,14 @@ def user(gl):
431430
password = "fakepassword"
432431

433432
user = gl.users.create(email=email, username=username, name=name, password=password)
433+
user_id = user.id
434434

435435
yield user
436436

437-
try:
438-
# Use `hard_delete=True` or a 'Ghost User' may be created.
439-
user.delete(hard_delete=True)
440-
except gitlab.exceptions.GitlabDeleteError as e:
441-
print(f"User already deleted: {e}")
437+
# Use `hard_delete=True` or a 'Ghost User' may be created.
438+
helpers.safe_delete(
439+
manager=gl.users, object_id=user_id, description="User", hard_delete=True
440+
)
442441

443442

444443
@pytest.fixture(scope="module")

tests/functional/helpers.py

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import logging
2+
import time
3+
4+
import pytest
5+
6+
import gitlab.base
7+
8+
SLEEP_INTERVAL = 0.5
9+
TIMEOUT = 60 # seconds before timeout will occur
10+
11+
12+
def delete_object(
13+
*, object: gitlab.base.RESTObject, index: int, hard_delete: bool = False
14+
):
15+
if index:
16+
logging.info(f"Attempt {index+1} to delete {object!r}.")
17+
try:
18+
if hard_delete:
19+
object.delete(hard_delete=True)
20+
else:
21+
object.delete()
22+
except gitlab.exceptions.GitlabDeleteError:
23+
logging.info(f"{object!r} already deleted.")
24+
pass
25+
26+
27+
def safe_delete(
28+
*,
29+
manager: gitlab.base.RESTManager,
30+
object_id: int,
31+
description: str,
32+
hard_delete: bool = False,
33+
) -> None:
34+
"""Ensure the object specified can not be retrieved. If object still exists after
35+
timeout period, fail the test"""
36+
max_iterations = int(TIMEOUT / SLEEP_INTERVAL)
37+
for index in range(max_iterations):
38+
try:
39+
object = manager.get(object_id)
40+
except gitlab.exceptions.GitlabGetError:
41+
return
42+
delete_object(object=object, index=index, hard_delete=hard_delete)
43+
time.sleep(SLEEP_INTERVAL)
44+
pytest.fail(f"{description} {object!r} was not deleted")

0 commit comments

Comments
 (0)