Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions lib/gitlab/client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class Client < API
include Jobs
include Keys
include Labels
include MergeRequestApprovals
include MergeRequests
include Milestones
include Namespaces
Expand Down
110 changes: 110 additions & 0 deletions lib/gitlab/client/merge_request_approvals.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
class Gitlab::Client
# Defines methods related to MR Approvals.
# @see https://docs.gitlab.com/ee/api/merge_request_approvals.html
module MergeRequestApprovals
# Gets MR Approval Configuration for a project
#
# @example
# Gitlab.project_merge_request_approvals(1)
#
# @param [Integer] project The ID of a project.
# @return [Gitlab::ObjectifiedHash] MR approval configuration information about the project
def project_merge_request_approvals(project)
get("/projects/#{url_encode project}/approvals")
end

# Change MR Approval Configuration for a project
#
# @example
# Gitlab.edit_project_merge_request_approvals(1, {approvals_before_merge: 3})
# Gitlab.edit_project_merge_request_approvals(1, {approvals_before_merge: 3, reset_approvals_on_push: true})
# Gitlab.edit_project_merge_request_approvals(1, {approvals_before_merge: 3, disable_overriding_approvers_per_merge_request: false})
#
# @param [Integer] project(required) The ID of a project.
# @option options [Integer] :approvals_before_merge(optional) How many approvals are required before an MR can be merged
# @option options [Boolean] :reset_approvals_on_push(optional) Reset approvals on a new push
# @option options [Boolean] :disable_overriding_approvers_per_merge_request(optional) Allow/Disallow overriding approvers per MR
# @return [Gitlab::ObjectifiedHash] MR approval configuration information about the project
def edit_project_merge_request_approvals(project, options = {})
post("/projects/#{url_encode project}/approvals", body: options)
end

# Change allowed approvers and approver groups for a project
#
# @example
# Gitlab.edit_project_approvers(1, {approver_ids: [5], approver_groups: [1]})
#
# @param [Integer] project(required) The ID of a project.
# @option options [Array] :approver_ids(optional) An array of User IDs that can approve MRs
# @option options [Array] :approver_group_ids(optional) An array of Group IDs whose members can approve MRs
# @return [Gitlab::ObjectifiedHash] MR approval configuration information about the project
def edit_project_approvers(project, options = {})
put("/projects/#{url_encode project}/approvals", body: options)
end

# Get Configuration for approvals on a specific Merge Request.
#
# @example
# Gitlab.merge_request_approvals(1, 5)
#
# @param [Integer] project(required) The ID of a project.
# @param [Integer] merge_request(required) The IID of a merge_request.
# @return [Gitlab::ObjectifiedHash] MR approval configuration information about the merge request
def merge_request_approvals(project, merge_request)
get("/projects/#{url_encode project}/merge_requests/#{merge_request}/approvals")
end

# Change configuration for approvals on a specific merge request.
#
# @example
# Gitlab.edit_merge_request_approvals(1, 5, approvals_required: 2)
#
# @param [Integer] project(required) The ID of a project.
# @param [Integer] merge_request(required) The IID of a merge_request.
# @option options [Integer] :approvals_required(required) Approvals required before MR can be merged
# @return [Gitlab::ObjectifiedHash] Updated MR approval configuration information about the merge request
def edit_merge_request_approvals(project, merge_request, options = {})
post("/projects/#{url_encode project}/merge_requests/#{merge_request}/approvals", body: options)
end

# Change allowed approvers and approver groups for a merge request
#
# @example
# Gitlab.edit_merge_request_approvers(1, 5, {approver_ids: [5], approver_groups: [1]})
#
# @param [Integer] project(required) The ID of a project.
# @param [Integer] merge_request(required) The IID of a merge_request.
# @option options [Array] :approver_ids(optional) An array of User IDs that can approve MRs
# @option options [Array] :approver_group_ids(optional) An array of Group IDs whose members can approve MRs
# @return [Gitlab::ObjectifiedHash] MR approval configuration information about the project
def edit_merge_request_approvers(project, merge_request, options = {})
put("/projects/#{url_encode project}/merge_requests/#{merge_request}/approvals", body: options)
end

# Approve a merge request
#
# @example
# Gitlab.approve_merge_request(1, 5)
# Gitlab.approve_merge_request(1, 5, sha: 'fe678da')
#
# @param [Integer] project(required) The ID of a project.
# @param [Integer] merge_request(required) The IID of a merge request.
# @option options [String] :sha(optional) The HEAD of the MR
# @return [Gitlab::ObjectifiedHash] MR approval configuration information about the project
def approve_merge_request(project, merge_request, options = {})
post("/projects/#{url_encode project}/merge_requests/#{merge_request}/approve", body: options)
end

# Unapprove a merge request
#
# @example
# Gitlab.unapprove_merge_request(1, 5)
#
# @param [Integer] project(required) The ID of a project.
# @param [Integer] merge_request(required) The IID of a merge request.
# @return [void] This API call returns an empty response body.
def unapprove_merge_request(project, merge_request)
post("/projects/#{url_encode project}/merge_requests/#{merge_request}/unapprove")
end
end
end
46 changes: 46 additions & 0 deletions spec/fixtures/merge_request_approvals.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
{
"id": 5,
"iid": 5,
"project_id": 1,
"title": "Approvals API",
"description": "Test",
"state": "opened",
"created_at": "2016-06-08T00:19:52.638Z",
"updated_at": "2016-06-08T21:20:42.470Z",
"merge_status": "can_be_merged",
"approvals_required": 2,
"approvals_missing": 2,
"approved_by": [],
"approvers": [
{
"user": {
"name": "Administrator",
"username": "root",
"id": 1,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon",
"web_url": "http://localhost:3000/u/root"
}
}
],
"approver_groups": [
{
"group": {
"id": 5,
"name": "group1",
"path": "group1",
"description": "",
"visibility": "public",
"lfs_enabled": false,
"avatar_url": null,
"web_url": "http://localhost/groups/group1",
"request_access_enabled": false,
"full_name": "group1",
"full_path": "group1",
"parent_id": null,
"ldap_cn": null,
"ldap_access": null
}
}
]
}
35 changes: 35 additions & 0 deletions spec/fixtures/project_merge_request_approvals.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"approvers": [
{
"user": {
"id": 5,
"name": "John Doe6",
"username": "user5",
"state":"active","avatar_url":"https://www.gravatar.com/avatar/4aea8cf834ed91844a2da4ff7ae6b491?s=80\u0026d=identicon","web_url":"http://localhost/user5"
}
}
],
"approver_groups": [
{
"group": {
"id": 1,
"name": "group1",
"path": "group1",
"description": "",
"visibility": "public",
"lfs_enabled": false,
"avatar_url": null,
"web_url": "http://localhost/groups/group1",
"request_access_enabled": false,
"full_name": "group1",
"full_path": "group1",
"parent_id": null,
"ldap_cn": null,
"ldap_access": null
}
}
],
"approvals_before_merge": 3,
"reset_approvals_on_push": false,
"disable_overriding_approvers_per_merge_request": true
}
141 changes: 141 additions & 0 deletions spec/gitlab/client/merge_request_approvals_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
require 'spec_helper'

describe Gitlab::Client do
describe '.project_merge_request_approvals' do
before do
stub_get("/projects/1/approvals", 'project_merge_request_approvals')
@project_mr_approvals = Gitlab.project_merge_request_approvals(1)
end

it "gets the correct resource" do
expect(a_get("/projects/1/approvals")).to have_been_made
end

it "returns the correct objectified hash" do
expect(@project_mr_approvals).to be_a Gitlab::ObjectifiedHash
end
end

describe '.edit_project_merge_request_approvals' do
before do
body = { approvals_before_merge: '3', reset_approvals_on_push: 'false', disable_overriding_approvers_per_merge_request: 'true' }
stub_post("/projects/1/approvals", 'project_merge_request_approvals').with(body: body)
@project_mr_approvals = Gitlab.edit_project_merge_request_approvals(1, approvals_before_merge: 3, reset_approvals_on_push: false, disable_overriding_approvers_per_merge_request: true)
end

it 'gets the correct resource' do
body = { approvals_before_merge: '3', reset_approvals_on_push: 'false', disable_overriding_approvers_per_merge_request: 'true' }
expect(a_post("/projects/1/approvals").
with(body: body)).to have_been_made
end

it "returns the correct updated configuration" do
expect(@project_mr_approvals).to be_a Gitlab::ObjectifiedHash
expect(@project_mr_approvals.approvals_before_merge).to eq 3
expect(@project_mr_approvals.reset_approvals_on_push).to eq false
expect(@project_mr_approvals.disable_overriding_approvers_per_merge_request).to eq true
end
end

describe '.edit_project_approvers' do
before do
body = {"approver_ids": ['5'], "approver_group_ids": ['1']}
stub_put("/projects/1/approvals", 'project_merge_request_approvals').with(body: body)
@project_mr_approvals = Gitlab.edit_project_approvers(1, approver_ids: [5], approver_group_ids: [1])
end

it 'gets the correct resource' do
body = {"approver_ids": ['5'], "approver_group_ids": ['1']}
expect(a_put("/projects/1/approvals").
with(body: body)).to have_been_made
end

it 'returns the correct updated configuration' do
expect(@project_mr_approvals).to be_a Gitlab::ObjectifiedHash
expect(@project_mr_approvals.approvers.map{|approver| approver['user']['id']}).to eq [5]
expect(@project_mr_approvals.approver_groups.map{|approver_group| approver_group['group']['id']}).to eq [1]
end
end

describe '.merge_request_approvals' do
before do
stub_get("/projects/1/merge_requests/5/approvals", 'merge_request_approvals')
@merge_request_approvals = Gitlab.merge_request_approvals(1, 5)
end

it 'gets the correct resource' do
expect(a_get("/projects/1/merge_requests/5/approvals")).to have_been_made
end

it 'returns the correct objectified hash' do
expect(@merge_request_approvals).to be_a Gitlab::ObjectifiedHash
expect(@merge_request_approvals.project_id).to eq 1
expect(@merge_request_approvals.iid).to eq 5
end
end

describe '.edit_merge_request_approvals' do
before do
body = { approvals_required: '2' }
stub_post("/projects/1/merge_requests/5/approvals", 'merge_request_approvals').with(body: body)
@merge_request_approvals = Gitlab.edit_merge_request_approvals(1, 5, approvals_required: 2)
end

it 'gets the correct resource' do
body = { approvals_required: '2' }
expect(a_post("/projects/1/merge_requests/5/approvals").with(body: body)).to have_been_made
end

it 'returns the correct objectified hash' do
expect(@merge_request_approvals).to be_a Gitlab::ObjectifiedHash
expect(@merge_request_approvals.approvals_required).to eq 2
end
end

describe '.edit_merge_request_approvers' do
before do
body = {"approver_ids": ['1'], "approver_group_ids": ['5']}
stub_put("/projects/1/merge_requests/5/approvals", 'merge_request_approvals').with(body: body)
@merge_request_approvals = Gitlab.edit_merge_request_approvers(1, 5, approver_ids: [1], approver_group_ids: [5])
end

it 'gets the correct resource' do
body = {"approver_ids": ['1'], "approver_group_ids": ['5']}
expect(a_put("/projects/1/merge_requests/5/approvals").
with(body: body)).to have_been_made
end

it 'returns the correct updated configuration' do
expect(@merge_request_approvals).to be_a Gitlab::ObjectifiedHash
expect(@merge_request_approvals.approvers.map{|approver| approver['user']['id']}).to eq [1]
expect(@merge_request_approvals.approver_groups.map{|approver_group| approver_group['group']['id']}).to eq [5]
end
end

describe '.approve_merge_request' do
before do
stub_post("/projects/1/merge_requests/5/approve", 'merge_request_approvals')
@merge_request_approvals = Gitlab.approve_merge_request(1, 5)
end

it 'gets the correct resource' do
expect(a_post("/projects/1/merge_requests/5/approve")).to have_been_made
end

it 'returns the correct updated configuration' do
expect(@merge_request_approvals).to be_a Gitlab::ObjectifiedHash
expect(@merge_request_approvals.merge_status).to eq 'can_be_merged'
end
end

describe '.unapprove_merge_request' do
before do
stub_post("/projects/1/merge_requests/5/unapprove", 'merge_request_approvals')
@merge_request_approvals = Gitlab.unapprove_merge_request(1, 5)
end

it 'gets the correct resource' do
expect(a_post("/projects/1/merge_requests/5/unapprove")).to have_been_made
end
end
end