Skip to content

Commit d1b3e2a

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 3d801b1 commit d1b3e2a

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)