|
| 1 | +""" |
| 2 | +Gitlab API: https://docs.gitlab.com/ee/api/merge_request_approvals.html |
| 3 | +""" |
| 4 | + |
| 5 | +importpytest |
| 6 | +importresponses |
| 7 | +importcopy |
| 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 | +defresp_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 | +withresponses.RequestsMock(assert_all_requests_are_fired=False)asrsps: |
| 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 | +yieldrsps |
| 231 | + |
| 232 | + |
| 233 | +deftest_list_merge_request_approval_rules(project,resp_snippet): |
| 234 | +approval_rules=project.mergerequests.get(1).approval_rules.list() |
| 235 | +assertlen(approval_rules)==1 |
| 236 | +assertapproval_rules[0].name==approval_rule_name |
| 237 | +assertapproval_rules[0].id==approval_rule_id |
| 238 | + |
| 239 | + |
| 240 | +deftest_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 | +assertresponse.approvals_required==updated_approval_rule_approvals_required |
| 250 | +assertlen(response.eligible_approvers)==len(updated_approval_rule_user_ids) |
| 251 | +assertresponse.eligible_approvers[0]["id"]==updated_approval_rule_user_ids[0] |
| 252 | +assertresponse.name==approval_rule_name |
| 253 | + |
| 254 | + |
| 255 | +deftest_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 | +assertresponse.approvals_required==new_approval_rule_approvals_required |
| 264 | +assertlen(response.eligible_approvers)==len(new_approval_rule_user_ids) |
| 265 | +assertresponse.eligible_approvers[0]["id"]==new_approval_rule_user_ids[0] |
| 266 | +assertresponse.name==new_approval_rule_name |
| 267 | + |
| 268 | + |
| 269 | +deftest_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 | +assertresponse.approvals_required==new_approval_rule_approvals_required |
| 280 | +assertlen(response.eligible_approvers)==len(new_approval_rule_user_ids) |
| 281 | +assertresponse.eligible_approvers[0]["id"]==new_approval_rule_user_ids[0] |
| 282 | +assertresponse.name==new_approval_rule_name |
| 283 | + |
| 284 | + |
| 285 | +deftest_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 | +assertar_1.approvals_required==updated_approval_rule_approvals_required |
| 293 | +assertlen(ar_1.eligible_approvers)==len(updated_approval_rule_user_ids) |
| 294 | +assertar_1.eligible_approvers[0]["id"]==updated_approval_rule_user_ids[0] |