summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn L. Villalovos <john@sodarock.com>2022-07-21 18:01:19 -0700
committerJohn L. Villalovos <john@sodarock.com>2022-07-21 18:01:19 -0700
commit1f73b6b20f08a0fe4ce4cf9195702a03656a54e1 (patch)
tree1f354334a3b2ace47cc73e4bbee45c9d74167f33
parent201298d7b5795b7d7338793da8033dc6c71d6572 (diff)
downloadgitlab-1f73b6b20f08a0fe4ce4cf9195702a03656a54e1.tar.gz
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.
-rw-r--r--tests/functional/conftest.py40
-rw-r--r--tests/functional/helpers.py39
2 files changed, 50 insertions, 29 deletions
diff --git a/tests/functional/conftest.py b/tests/functional/conftest.py
index 22457ba..8ecbcdf 100644
--- a/tests/functional/conftest.py
+++ b/tests/functional/conftest.py
@@ -9,9 +9,7 @@ import pytest
import gitlab
import gitlab.base
-
-SLEEP_INTERVAL = 0.5
-TIMEOUT = 60 # seconds before timeout will occur
+from tests.functional import helpers
@pytest.fixture(scope="session")
@@ -49,8 +47,6 @@ def reset_gitlab(gl):
logging.info(f"Marking for deletion user: {user.username!r}")
user.delete(hard_delete=True)
- max_iterations = int(TIMEOUT / SLEEP_INTERVAL)
-
# Ensure everything has been reset
start_time = time.perf_counter()
@@ -60,7 +56,7 @@ def reset_gitlab(gl):
"""Wait for the list() length to be no greater than expected maximum or fail
test if timeout is exceeded"""
logging.info(f"Checking {description!r} has no more than {max_length} items")
- for count in range(max_iterations):
+ for count in range(helpers.MAX_ITERATIONS):
items = rest_manager.list()
if len(items) <= max_length:
break
@@ -68,7 +64,7 @@ def reset_gitlab(gl):
f"Iteration: {count} Waiting for {description!r} items to be deleted: "
f"{[x.name for x in items]}"
)
- time.sleep(SLEEP_INTERVAL)
+ time.sleep(helpers.SLEEP_INTERVAL)
elapsed_time = time.perf_counter() - start_time
error_message = (
@@ -280,10 +276,7 @@ def group(gl):
yield group
- try:
- group.delete()
- except gitlab.exceptions.GitlabDeleteError as e:
- print(f"Group already deleted: {e}")
+ helpers.safe_delete(group)
@pytest.fixture(scope="module")
@@ -296,10 +289,7 @@ def project(gl):
yield project
- try:
- project.delete()
- except gitlab.exceptions.GitlabDeleteError as e:
- print(f"Project already deleted: {e}")
+ helpers.safe_delete(project)
@pytest.fixture(scope="function")
@@ -327,7 +317,7 @@ def merge_request(project, wait_for_sidekiq):
assert result is True, "sidekiq process should have terminated but did not"
project.refresh() # Gets us the current default branch
- project.branches.create(
+ mr_branch = project.branches.create(
{"branch": source_branch, "ref": project.default_branch}
)
# NOTE(jlvillal): Must create a commit in the new branch before we can
@@ -359,18 +349,13 @@ def merge_request(project, wait_for_sidekiq):
time.sleep(0.5)
assert mr.merge_status != "checking"
- to_delete.append((mr.iid, source_branch))
+ to_delete.extend([mr, mr_branch])
return mr
yield _merge_request
- for mr_iid, source_branch in to_delete:
- project.mergerequests.delete(mr_iid)
- try:
- project.branches.delete(source_branch)
- except gitlab.exceptions.GitlabDeleteError:
- # Ignore if branch was already deleted
- pass
+ for object in to_delete:
+ helpers.safe_delete(object)
@pytest.fixture(scope="module")
@@ -434,11 +419,8 @@ def user(gl):
yield user
- try:
- # Use `hard_delete=True` or a 'Ghost User' may be created.
- user.delete(hard_delete=True)
- except gitlab.exceptions.GitlabDeleteError as e:
- print(f"User already deleted: {e}")
+ # Use `hard_delete=True` or a 'Ghost User' may be created.
+ helpers.safe_delete(user, hard_delete=True)
@pytest.fixture(scope="module")
diff --git a/tests/functional/helpers.py b/tests/functional/helpers.py
new file mode 100644
index 0000000..972ca2f
--- /dev/null
+++ b/tests/functional/helpers.py
@@ -0,0 +1,39 @@
+import logging
+import time
+
+import pytest
+
+import gitlab.base
+
+SLEEP_INTERVAL = 0.5
+TIMEOUT = 60 # seconds before timeout will occur
+MAX_ITERATIONS = int(TIMEOUT / SLEEP_INTERVAL)
+
+
+def safe_delete(
+ object: gitlab.base.RESTObject,
+ *,
+ hard_delete: bool = False,
+) -> None:
+ """Ensure the object specified can not be retrieved. If object still exists after
+ timeout period, fail the test"""
+ manager = object.manager
+ for index in range(MAX_ITERATIONS):
+ try:
+ object = manager.get(object.get_id())
+ except gitlab.exceptions.GitlabGetError:
+ return
+
+ if index:
+ logging.info(f"Attempt {index+1} to delete {object!r}.")
+ try:
+ if hard_delete:
+ object.delete(hard_delete=True)
+ else:
+ object.delete()
+ except gitlab.exceptions.GitlabDeleteError:
+ logging.info(f"{object!r} already deleted.")
+ pass
+
+ time.sleep(SLEEP_INTERVAL)
+ pytest.fail(f"{object!r} was not deleted")