Skip to content

Commit f41b093

Browse files
committed
feat(api): add merge request approval state
Add support for merge request approval state
1 parent 5a1678f commit f41b093

File tree

4 files changed

+52
-0
lines changed

4 files changed

+52
-0
lines changed

docs/gl_objects/mr_approvals.rst

+7
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ References
2121
+ :class:`gitlab.v4.objects.ProjectMergeRequestApprovalRule`
2222
+ :class:`gitlab.v4.objects.ProjectMergeRequestApprovalRuleManager`
2323
+ :attr:`gitlab.v4.objects.ProjectMergeRequest.approval_rules`
24+
+ :class:`gitlab.v4.objects.ProjectMergeRequestApprovalState`
25+
+ :class:`gitlab.v4.objects.ProjectMergeRequestApprovalStateManager`
26+
+ :attr:`gitlab.v4.objects.ProjectMergeRequest.approval_state`
2427

2528
* GitLab API: https://docs.gitlab.com/ee/api/merge_request_approvals.html
2629

@@ -46,6 +49,10 @@ Get project-level or MR-level MR approvals settings::
4649

4750
mr_mras = mr.approvals.get()
4851

52+
Get MR-level approval state::
53+
54+
mr_approval_state = mr.approval_state.get()
55+
4956
Change project-level or MR-level MR approvals settings::
5057

5158
p_mras.approvals_before_merge = 2

gitlab/v4/objects/merge_request_approvals.py

+12
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
"ProjectMergeRequestApprovalManager",
2020
"ProjectMergeRequestApprovalRule",
2121
"ProjectMergeRequestApprovalRuleManager",
22+
"ProjectMergeRequestApprovalState",
23+
"ProjectMergeRequestApprovalStateManager",
2224
]
2325

2426

@@ -204,3 +206,13 @@ def create(self, data, **kwargs):
204206
new_data["id"] = self._from_parent_attrs["project_id"]
205207
new_data["merge_request_iid"] = self._from_parent_attrs["mr_iid"]
206208
return CreateMixin.create(self, new_data, **kwargs)
209+
210+
211+
class ProjectMergeRequestApprovalState(RESTObject):
212+
pass
213+
214+
215+
class ProjectMergeRequestApprovalStateManager(GetWithoutIdMixin, RESTManager):
216+
_path = "/projects/%(project_id)s/merge_requests/%(mr_iid)s/approval_state"
217+
_obj_cls = ProjectMergeRequestApprovalState
218+
_from_parent_attrs = {"project_id": "project_id", "mr_iid": "iid"}

gitlab/v4/objects/merge_requests.py

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from .merge_request_approvals import ( # noqa: F401
2727
ProjectMergeRequestApprovalManager,
2828
ProjectMergeRequestApprovalRuleManager,
29+
ProjectMergeRequestApprovalStateManager,
2930
)
3031
from .notes import ProjectMergeRequestNoteManager # noqa: F401
3132
from .pipelines import ProjectMergeRequestPipelineManager # noqa: F401
@@ -140,6 +141,7 @@ class ProjectMergeRequest(
140141
_id_attr = "iid"
141142

142143
approval_rules: ProjectMergeRequestApprovalRuleManager
144+
approval_state: ProjectMergeRequestApprovalStateManager
143145
approvals: ProjectMergeRequestApprovalManager
144146
awardemojis: ProjectMergeRequestAwardEmojiManager
145147
diffs: "ProjectMergeRequestDiffManager"

tests/unit/objects/test_project_merge_request_approvals.py

+31
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,15 @@ def resp_snippet():
178178
}
179179
]
180180

181+
approval_state_rules = copy.deepcopy(mr_ars_content)
182+
approval_state_rules[0]["approved"] = False
183+
approval_state_rules[0]["approved_by"] = []
184+
185+
mr_approval_state_content = {
186+
"approval_rules_overwritten": False,
187+
"rules": approval_state_rules,
188+
}
189+
181190
with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps:
182191
rsps.add(
183192
method=responses.GET,
@@ -200,6 +209,13 @@ def resp_snippet():
200209
content_type="application/json",
201210
status=200,
202211
)
212+
rsps.add(
213+
method=responses.GET,
214+
url="http://localhost/api/v4/projects/1/merge_requests/1/approval_state",
215+
json=mr_approval_state_content,
216+
content_type="application/json",
217+
status=200,
218+
)
203219

204220
new_mr_ars_content = dict(mr_ars_content[0])
205221
new_mr_ars_content["name"] = new_approval_rule_name
@@ -315,3 +331,18 @@ def test_update_merge_request_approval_rule(project, resp_snippet):
315331
assert ar_1.approvals_required == updated_approval_rule_approvals_required
316332
assert len(ar_1.eligible_approvers) == len(updated_approval_rule_user_ids)
317333
assert ar_1.eligible_approvers[0]["id"] == updated_approval_rule_user_ids[0]
334+
335+
336+
def test_get_merge_request_approval_state(project, resp_snippet):
337+
merge_request = project.mergerequests.get(1)
338+
approval_state = merge_request.approval_state.get()
339+
assert isinstance(
340+
approval_state,
341+
gitlab.v4.objects.merge_request_approvals.ProjectMergeRequestApprovalState,
342+
)
343+
assert not approval_state.approval_rules_overwritten
344+
assert len(approval_state.rules) == 1
345+
assert approval_state.rules[0]["name"] == approval_rule_name
346+
assert approval_state.rules[0]["id"] == approval_rule_id
347+
assert not approval_state.rules[0]["approved"]
348+
assert approval_state.rules[0]["approved_by"] == []

0 commit comments

Comments
 (0)