Skip to content

Commit 9f6335f

Browse files
committed
test: add test_project_merge_request_approvals.py
1 parent 449fc26 commit 9f6335f

File tree

2 files changed

+296
-2
lines changed

2 files changed

+296
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,294 @@
1+
"""
2+
Gitlab API: https://docs.gitlab.com/ee/api/merge_request_approvals.html
3+
"""
4+
5+
import pytest
6+
import responses
7+
import copy
8+
9+
10+
approval_rule_id = 1
11+
approval_rule_name = "security"
12+
approvals_required = 3
13+
user_ids = [5, 50]
14+
group_ids = [5]
15+
16+
new_approval_rule_name = "new approval rule"
17+
new_approval_rule_user_ids = user_ids
18+
new_approval_rule_approvals_required = 2
19+
20+
updated_approval_rule_user_ids = [5]
21+
updated_approval_rule_approvals_required = 1
22+
23+
24+
@pytest.fixture
25+
def resp_snippet():
26+
merge_request_content = [
27+
{
28+
"id": 1,
29+
"iid": 1,
30+
"project_id": 1,
31+
"title": "test1",
32+
"description": "fixed login page css paddings",
33+
"state": "merged",
34+
"merged_by": {
35+
"id": 87854,
36+
"name": "Douwe Maan",
37+
"username": "DouweM",
38+
"state": "active",
39+
"avatar_url": "https://gitlab.example.com/uploads/-/system/user/avatar/87854/avatar.png",
40+
"web_url": "https://gitlab.com/DouweM",
41+
},
42+
"merged_at": "2018-09-07T11:16:17.520Z",
43+
"closed_by": None,
44+
"closed_at": None,
45+
"created_at": "2017-04-29T08:46:00Z",
46+
"updated_at": "2017-04-29T08:46:00Z",
47+
"target_branch": "master",
48+
"source_branch": "test1",
49+
"upvotes": 0,
50+
"downvotes": 0,
51+
"author": {
52+
"id": 1,
53+
"name": "Administrator",
54+
"username": "admin",
55+
"state": "active",
56+
"avatar_url": None,
57+
"web_url": "https://gitlab.example.com/admin",
58+
},
59+
"assignee": {
60+
"id": 1,
61+
"name": "Administrator",
62+
"username": "admin",
63+
"state": "active",
64+
"avatar_url": None,
65+
"web_url": "https://gitlab.example.com/admin",
66+
},
67+
"assignees": [
68+
{
69+
"name": "Miss Monserrate Beier",
70+
"username": "axel.block",
71+
"id": 12,
72+
"state": "active",
73+
"avatar_url": "http://www.gravatar.com/avatar/46f6f7dc858ada7be1853f7fb96e81da?s=80&d=identicon",
74+
"web_url": "https://gitlab.example.com/axel.block",
75+
}
76+
],
77+
"source_project_id": 2,
78+
"target_project_id": 3,
79+
"labels": ["Community contribution", "Manage"],
80+
"work_in_progress": None,
81+
"milestone": {
82+
"id": 5,
83+
"iid": 1,
84+
"project_id": 3,
85+
"title": "v2.0",
86+
"description": "Assumenda aut placeat expedita exercitationem labore sunt enim earum.",
87+
"state": "closed",
88+
"created_at": "2015-02-02T19:49:26.013Z",
89+
"updated_at": "2015-02-02T19:49:26.013Z",
90+
"due_date": "2018-09-22",
91+
"start_date": "2018-08-08",
92+
"web_url": "https://gitlab.example.com/my-group/my-project/milestones/1",
93+
},
94+
"merge_when_pipeline_succeeds": None,
95+
"merge_status": "can_be_merged",
96+
"sha": "8888888888888888888888888888888888888888",
97+
"merge_commit_sha": None,
98+
"squash_commit_sha": None,
99+
"user_notes_count": 1,
100+
"discussion_locked": None,
101+
"should_remove_source_branch": True,
102+
"force_remove_source_branch": False,
103+
"allow_collaboration": False,
104+
"allow_maintainer_to_push": False,
105+
"web_url": "http://gitlab.example.com/my-group/my-project/merge_requests/1",
106+
"references": {
107+
"short": "!1",
108+
"relative": "my-group/my-project!1",
109+
"full": "my-group/my-project!1",
110+
},
111+
"time_stats": {
112+
"time_estimate": 0,
113+
"total_time_spent": 0,
114+
"human_time_estimate": None,
115+
"human_total_time_spent": None,
116+
},
117+
"squash": False,
118+
"task_completion_status": {"count": 0, "completed_count": 0},
119+
}
120+
]
121+
mr_ars_content = [
122+
{
123+
"id": approval_rule_id,
124+
"name": approval_rule_name,
125+
"rule_type": "regular",
126+
"eligible_approvers": [
127+
{
128+
"id": user_ids[0],
129+
"name": "John Doe",
130+
"username": "jdoe",
131+
"state": "active",
132+
"avatar_url": "https://www.gravatar.com/avatar/0?s=80&d=identicon",
133+
"web_url": "http://localhost/jdoe",
134+
},
135+
{
136+
"id": user_ids[1],
137+
"name": "Group Member 1",
138+
"username": "group_member_1",
139+
"state": "active",
140+
"avatar_url": "https://www.gravatar.com/avatar/0?s=80&d=identicon",
141+
"web_url": "http://localhost/group_member_1",
142+
},
143+
],
144+
"approvals_required": approvals_required,
145+
"source_rule": None,
146+
"users": [
147+
{
148+
"id": 5,
149+
"name": "John Doe",
150+
"username": "jdoe",
151+
"state": "active",
152+
"avatar_url": "https://www.gravatar.com/avatar/0?s=80&d=identicon",
153+
"web_url": "http://localhost/jdoe",
154+
}
155+
],
156+
"groups": [
157+
{
158+
"id": 5,
159+
"name": "group1",
160+
"path": "group1",
161+
"description": "",
162+
"visibility": "public",
163+
"lfs_enabled": False,
164+
"avatar_url": None,
165+
"web_url": "http://localhost/groups/group1",
166+
"request_access_enabled": False,
167+
"full_name": "group1",
168+
"full_path": "group1",
169+
"parent_id": None,
170+
"ldap_cn": None,
171+
"ldap_access": None,
172+
}
173+
],
174+
"contains_hidden_groups": False,
175+
"overridden": False,
176+
}
177+
]
178+
179+
with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps:
180+
rsps.add(
181+
method=responses.GET,
182+
url="http://localhost/api/v4/projects/1/merge_requests",
183+
json=merge_request_content,
184+
content_type="application/json",
185+
status=200,
186+
)
187+
rsps.add(
188+
method=responses.GET,
189+
url="http://localhost/api/v4/projects/1/merge_requests/1",
190+
json=merge_request_content[0],
191+
content_type="application/json",
192+
status=200,
193+
)
194+
rsps.add(
195+
method=responses.GET,
196+
url="http://localhost/api/v4/projects/1/merge_requests/1/approval_rules",
197+
json=mr_ars_content,
198+
content_type="application/json",
199+
status=200,
200+
)
201+
202+
new_mr_ars_content = dict(mr_ars_content[0])
203+
new_mr_ars_content["name"] = new_approval_rule_name
204+
new_mr_ars_content["approvals_required"] = new_approval_rule_approvals_required
205+
206+
rsps.add(
207+
method=responses.POST,
208+
url="http://localhost/api/v4/projects/1/merge_requests/1/approval_rules",
209+
json=new_mr_ars_content,
210+
content_type="application/json",
211+
status=200,
212+
)
213+
214+
updated_mr_ars_content = copy.deepcopy(mr_ars_content[0])
215+
updated_mr_ars_content["eligible_approvers"] = [
216+
mr_ars_content[0]["eligible_approvers"][0]
217+
]
218+
219+
updated_mr_ars_content[
220+
"approvals_required"
221+
] = updated_approval_rule_approvals_required
222+
223+
rsps.add(
224+
method=responses.PUT,
225+
url="http://localhost/api/v4/projects/1/merge_requests/1/approval_rules/1",
226+
json=updated_mr_ars_content,
227+
content_type="application/json",
228+
status=200,
229+
)
230+
yield rsps
231+
232+
233+
def test_list_merge_request_approval_rules(project, resp_snippet):
234+
approval_rules = project.mergerequests.get(1).approval_rules.list()
235+
assert len(approval_rules) == 1
236+
assert approval_rules[0].name == approval_rule_name
237+
assert approval_rules[0].id == approval_rule_id
238+
239+
240+
def test_update_merge_request_approvals_set_approvers(project, resp_snippet):
241+
approvals = project.mergerequests.get(1).approvals
242+
response = approvals.set_approvers(
243+
updated_approval_rule_approvals_required,
244+
approver_ids=updated_approval_rule_user_ids,
245+
approver_group_ids=group_ids,
246+
approval_rule_name=approval_rule_name,
247+
)
248+
249+
assert response.approvals_required == updated_approval_rule_approvals_required
250+
assert len(response.eligible_approvers) == len(updated_approval_rule_user_ids)
251+
assert response.eligible_approvers[0]["id"] == updated_approval_rule_user_ids[0]
252+
assert response.name == approval_rule_name
253+
254+
255+
def test_create_merge_request_approvals_set_approvers(project, resp_snippet):
256+
approvals = project.mergerequests.get(1).approvals
257+
response = approvals.set_approvers(
258+
new_approval_rule_approvals_required,
259+
approver_ids=new_approval_rule_user_ids,
260+
approver_group_ids=group_ids,
261+
approval_rule_name=new_approval_rule_name,
262+
)
263+
assert response.approvals_required == new_approval_rule_approvals_required
264+
assert len(response.eligible_approvers) == len(new_approval_rule_user_ids)
265+
assert response.eligible_approvers[0]["id"] == new_approval_rule_user_ids[0]
266+
assert response.name == new_approval_rule_name
267+
268+
269+
def test_create_merge_request_approval_rule(project, resp_snippet):
270+
approval_rules = project.mergerequests.get(1).approval_rules
271+
data = {
272+
"name": new_approval_rule_name,
273+
"approvals_required": new_approval_rule_approvals_required,
274+
"rule_type": "regular",
275+
"user_ids": new_approval_rule_user_ids,
276+
"group_ids": group_ids,
277+
}
278+
response = approval_rules.create(data)
279+
assert response.approvals_required == new_approval_rule_approvals_required
280+
assert len(response.eligible_approvers) == len(new_approval_rule_user_ids)
281+
assert response.eligible_approvers[0]["id"] == new_approval_rule_user_ids[0]
282+
assert response.name == new_approval_rule_name
283+
284+
285+
def test_update_merge_request_approval_rule(project, resp_snippet):
286+
approval_rules = project.mergerequests.get(1).approval_rules
287+
ar_1 = approval_rules.list()[0]
288+
ar_1.user_ids = updated_approval_rule_user_ids
289+
ar_1.approvals_required = updated_approval_rule_approvals_required
290+
ar_1.save()
291+
292+
assert ar_1.approvals_required == updated_approval_rule_approvals_required
293+
assert len(ar_1.eligible_approvers) == len(updated_approval_rule_user_ids)
294+
assert ar_1.eligible_approvers[0]["id"] == updated_approval_rule_user_ids[0]

gitlab/v4/objects/__init__.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -3033,9 +3033,9 @@ def set_approvers(
30333033
ar.approvals_required = data["approvals_required"]
30343034
ar.group_ids = data["group_ids"]
30353035
ar.save()
3036-
return
3036+
return ar
30373037
""" if there was no rule matching the rule name, create a new one"""
3038-
approval_rules.create(data=data)
3038+
return approval_rules.create(data=data)
30393039

30403040

30413041
class ProjectMergeRequestApprovalRule(SaveMixin, RESTObject):

0 commit comments

Comments
 (0)