summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNejc Habjan <hab.nejc@gmail.com>2021-05-26 00:24:46 +0200
committerGitHub <noreply@github.com>2021-05-26 00:24:46 +0200
commit9beff0d484b5fe86e2cd31f20cf00a309e09cf75 (patch)
tree597774dbef6ef63f9078720c6e96bde49d3adfa0
parent184b94bbe8da5595b06d187e30041e3331b6db8b (diff)
parent8be2838a9ee3e2440d066e2c4b77cb9b55fc3da2 (diff)
downloadgitlab-9beff0d484b5fe86e2cd31f20cf00a309e09cf75.tar.gz
Merge pull request #1465 from JohnVillalovos/jlvillal/fix_1452_query_parameters
Switch mr.merge() to use post_data (was using query_data)
-rw-r--r--gitlab/v4/objects/merge_requests.py2
-rw-r--r--tools/functional/api/test_merge_requests.py68
-rw-r--r--tools/functional/conftest.py71
3 files changed, 140 insertions, 1 deletions
diff --git a/gitlab/v4/objects/merge_requests.py b/gitlab/v4/objects/merge_requests.py
index 9ff72f9..3a878e2 100644
--- a/gitlab/v4/objects/merge_requests.py
+++ b/gitlab/v4/objects/merge_requests.py
@@ -342,7 +342,7 @@ class ProjectMergeRequest(
if merge_when_pipeline_succeeds:
data["merge_when_pipeline_succeeds"] = True
- server_data = self.manager.gitlab.http_put(path, query_data=data, **kwargs)
+ server_data = self.manager.gitlab.http_put(path, post_data=data, **kwargs)
self._update_attrs(server_data)
diff --git a/tools/functional/api/test_merge_requests.py b/tools/functional/api/test_merge_requests.py
index c5de5eb..e768234 100644
--- a/tools/functional/api/test_merge_requests.py
+++ b/tools/functional/api/test_merge_requests.py
@@ -1,6 +1,9 @@
+import time
+
import pytest
import gitlab
+import gitlab.v4.objects
def test_merge_requests(project):
@@ -95,3 +98,68 @@ def test_merge_request_merge(project):
with pytest.raises(gitlab.GitlabMRClosedError):
# Two merge attempts should raise GitlabMRClosedError
mr.merge()
+
+
+def test_merge_request_should_remove_source_branch(
+ project, merge_request, wait_for_sidekiq
+) -> None:
+ """Test to ensure
+ https://github.com/python-gitlab/python-gitlab/issues/1120 is fixed.
+ Bug reported that they could not use 'should_remove_source_branch' in
+ mr.merge() call"""
+
+ source_branch = "remove_source_branch"
+ mr = merge_request(source_branch=source_branch)
+
+ mr.merge(should_remove_source_branch=True)
+
+ result = wait_for_sidekiq(timeout=60)
+ assert result is True, "sidekiq process should have terminated but did not"
+
+ # Wait until it is merged
+ mr_iid = mr.iid
+ for _ in range(60):
+ mr = project.mergerequests.get(mr_iid)
+ if mr.merged_at is not None:
+ break
+ time.sleep(0.5)
+ assert mr.merged_at is not None
+ time.sleep(0.5)
+
+ # Ensure we can NOT get the MR branch
+ with pytest.raises(gitlab.exceptions.GitlabGetError):
+ project.branches.get(source_branch)
+
+
+def test_merge_request_large_commit_message(
+ project, merge_request, wait_for_sidekiq
+) -> None:
+ """Test to ensure https://github.com/python-gitlab/python-gitlab/issues/1452
+ is fixed.
+ Bug reported that very long 'merge_commit_message' in mr.merge() would
+ cause an error: 414 Request too large
+ """
+
+ source_branch = "large_commit_message"
+ mr = merge_request(source_branch=source_branch)
+
+ merge_commit_message = "large_message\r\n" * 1_000
+ assert len(merge_commit_message) > 10_000
+
+ mr.merge(merge_commit_message=merge_commit_message)
+
+ result = wait_for_sidekiq(timeout=60)
+ assert result is True, "sidekiq process should have terminated but did not"
+
+ # Wait until it is merged
+ mr_iid = mr.iid
+ for _ in range(60):
+ mr = project.mergerequests.get(mr_iid)
+ if mr.merged_at is not None:
+ break
+ time.sleep(0.5)
+ assert mr.merged_at is not None
+ time.sleep(0.5)
+
+ # Ensure we can get the MR branch
+ project.branches.get(source_branch)
diff --git a/tools/functional/conftest.py b/tools/functional/conftest.py
index 89b3dda..634713d 100644
--- a/tools/functional/conftest.py
+++ b/tools/functional/conftest.py
@@ -201,6 +201,77 @@ def project(gl):
print(f"Project already deleted: {e}")
+@pytest.fixture(scope="function")
+def merge_request(project, wait_for_sidekiq):
+ """Fixture used to create a merge_request.
+
+ It will create a branch, add a commit to the branch, and then create a
+ merge request against project.default_branch. The MR will be returned.
+
+ When finished any created merge requests and branches will be deleted.
+
+ NOTE: No attempt is made to restore project.default_branch to its previous
+ state. So if the merge request is merged then its content will be in the
+ project.default_branch branch.
+ """
+
+ to_delete = []
+
+ def _merge_request(*, source_branch: str):
+ # Wait for processes to be done before we start...
+ # NOTE(jlvillal): Sometimes the CI would give a "500 Internal Server
+ # Error". Hoping that waiting until all other processes are done will
+ # help with that.
+ result = wait_for_sidekiq(timeout=60)
+ assert result is True, "sidekiq process should have terminated but did not"
+
+ project.refresh() # Gets us the current default branch
+ project.branches.create(
+ {"branch": source_branch, "ref": project.default_branch}
+ )
+ # NOTE(jlvillal): Must create a commit in the new branch before we can
+ # create an MR that will work.
+ project.files.create(
+ {
+ "file_path": f"README.{source_branch}",
+ "branch": source_branch,
+ "content": "Initial content",
+ "commit_message": "New commit in new branch",
+ }
+ )
+ mr = project.mergerequests.create(
+ {
+ "source_branch": source_branch,
+ "target_branch": project.default_branch,
+ "title": "Should remove source branch",
+ "remove_source_branch": True,
+ }
+ )
+ result = wait_for_sidekiq(timeout=60)
+ assert result is True, "sidekiq process should have terminated but did not"
+
+ mr_iid = mr.iid
+ for _ in range(60):
+ mr = project.mergerequests.get(mr_iid)
+ if mr.merge_status != "checking":
+ break
+ time.sleep(0.5)
+ assert mr.merge_status != "checking"
+
+ to_delete.append((mr.iid, source_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
+
+
@pytest.fixture(scope="module")
def project_file(project):
"""File fixture for tests requiring a project with files and branches."""