Skip to content

Commit cb4e015

Browse files
isaac-philipJohnVillalovos
authored andcommitted
feat(functional): #2547 merge-train api for status and add mr
Signed-off-by: Isaac Philip <4974658+isaac-philip@users.noreply.github.com>
1 parent e10ba0c commit cb4e015

File tree

2 files changed

+41
-6
lines changed

2 files changed

+41
-6
lines changed

gitlab/v4/objects/merge_trains.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from gitlab.base import RESTManager, RESTObject
2-
from gitlab.mixins import CRUDMixin, GetMixin, ListMixin
2+
from gitlab.mixins import GetMixin, ListMixin, UpdateMethod, UpdateMixin
3+
from gitlab.types import RequiredOptional
34

45
__all__ = [
56
"ProjectMergeTrain",
@@ -13,10 +14,15 @@ class ProjectMergeTrainMergeRequest(RESTObject):
1314
pass
1415

1516

16-
class ProjectMergeTrainMergeRequestManager(CRUDMixin, RESTManager):
17+
class ProjectMergeTrainMergeRequestManager(GetMixin, UpdateMixin, RESTManager):
1718
_path = "/projects/{project_id}/merge_trains/merge_requests"
1819
_obj_cls = ProjectMergeTrainMergeRequest
1920
_from_parent_attrs = {"project_id": "project_id"}
21+
_update_method: UpdateMethod = UpdateMethod.POST
22+
23+
_update_attrs = RequiredOptional(
24+
optional=("sha", "squash", "when_pipeline_succeeds"),
25+
)
2026

2127

2228
class ProjectMergeTrain(RESTObject):

tests/unit/objects/test_merge_trains.py

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@
4646
"duration": 70,
4747
}
4848

49+
merge_train_update = mr_content.copy()
50+
merge_train_update["id"] = 123
51+
merge_train_update["pipeline"]["sha"] = "ef33a3zxc3"
52+
4953

5054
@pytest.fixture
5155
def resp_list_merge_trains():
@@ -65,26 +69,51 @@ def resp_merge_trains_merge_request_get():
6569
with responses.RequestsMock() as rsps:
6670
rsps.add(
6771
method=responses.GET,
68-
url="http://localhost/api/v4/projects/1/merge_trains/merge_requests/123",
72+
url="http://localhost/api/v4/projects/1/merge_trains/merge_requests/110",
6973
json=mr_content,
7074
content_type="application/json",
7175
status=200,
7276
)
7377
yield rsps
7478

7579

80+
@pytest.fixture
81+
def resp_merge_trains_merge_request_post():
82+
with responses.RequestsMock() as rsps:
83+
rsps.add(
84+
method=responses.POST,
85+
url="http://localhost/api/v4/projects/1/merge_trains/merge_requests/123",
86+
json=[merge_train_update],
87+
content_type="application/json",
88+
status=200,
89+
)
90+
yield rsps
91+
92+
7693
def test_list_project_merge_requests(project, resp_list_merge_trains):
7794
merge_trains = project.merge_trains.list()
7895
assert isinstance(merge_trains[0], ProjectMergeTrain)
7996
assert merge_trains[0].id == mr_content["id"]
8097

8198

82-
def test_merge_trains_status_merge_request(
99+
def test_merge_trains_status_merge_request_get_status(
83100
project, resp_merge_trains_merge_request_get
84101
):
85-
# flow will be : project -> merge_trains : -> get merge_requests -> merge_request_iod
86102
merge_train_mr: ProjectMergeTrainMergeRequest = project.merge_trains.get(
87103
1, lazy=True
88-
).merge_requests.get(123)
104+
).merge_requests.get(110)
89105
assert isinstance(merge_train_mr, ProjectMergeTrainMergeRequest)
90106
assert merge_train_mr.get_id() == 110
107+
assert merge_train_mr.pipeline.get("status") == mr_content["pipeline"]["status"]
108+
109+
110+
def test_merge_train_add_merge_request(project, resp_merge_trains_merge_request_post):
111+
merge_train: ProjectMergeTrain = project.merge_trains.get(1, lazy=True)
112+
merge_requests_update = merge_train.merge_requests.update(
113+
123, new_data={"sha": "ef33a3zxc3"}
114+
)
115+
assert isinstance(merge_train, ProjectMergeTrain)
116+
assert (
117+
merge_requests_update[0]["pipeline"]["sha"]
118+
== merge_train_update["pipeline"]["sha"]
119+
)

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy