Add merge requests list endpoint for groups
This commit is contained in:
parent
9a455e9547
commit
8ed12efecd
5 changed files with 452 additions and 230 deletions
5
changelogs/unreleased/issue_45082.yml
Normal file
5
changelogs/unreleased/issue_45082.yml
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Add merge requests list endpoint for groups
|
||||
merge_request:
|
||||
author:
|
||||
type: other
|
|
@ -240,6 +240,112 @@ Parameters:
|
|||
]
|
||||
```
|
||||
|
||||
## List group merge requests
|
||||
|
||||
Get all merge requests for this group and its subgroups.
|
||||
The `state` parameter can be used to get only merge requests with a given state (`opened`, `closed`, or `merged`) or all of them (`all`).
|
||||
The pagination parameters `page` and `per_page` can be used to restrict the list of merge requests.
|
||||
|
||||
```
|
||||
GET /groups/:id/merge_requests
|
||||
GET /groups/:id/merge_requests?state=opened
|
||||
GET /groups/:id/merge_requests?state=all
|
||||
GET /groups/:id/merge_requests?milestone=release
|
||||
GET /groups/:id/merge_requests?labels=bug,reproduced
|
||||
GET /groups/:id/merge_requests?my_reaction_emoji=star
|
||||
```
|
||||
|
||||
`group_id` represents the ID of the group which contains the project where the MR resides.
|
||||
|
||||
Parameters:
|
||||
|
||||
| Attribute | Type | Required | Description |
|
||||
| ------------------- | -------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| `id` | integer | yes | The ID of a group |
|
||||
| `state` | string | no | Return all merge requests or just those that are `opened`, `closed`, or `merged` |
|
||||
| `order_by` | string | no | Return merge requests ordered by `created_at` or `updated_at` fields. Default is `created_at` |
|
||||
| `sort` | string | no | Return merge requests sorted in `asc` or `desc` order. Default is `desc` |
|
||||
| `milestone` | string | no | Return merge requests for a specific milestone |
|
||||
| `view` | string | no | If `simple`, returns the `iid`, URL, title, description, and basic state of merge request |
|
||||
| `labels` | string | no | Return merge requests matching a comma separated list of labels |
|
||||
| `created_after` | datetime | no | Return merge requests created on or after the given time |
|
||||
| `created_before` | datetime | no | Return merge requests created on or before the given time |
|
||||
| `updated_after` | datetime | no | Return merge requests updated on or after the given time |
|
||||
| `updated_before` | datetime | no | Return merge requests updated on or before the given time |
|
||||
| `scope` | string | no | Return merge requests for the given scope: `created_by_me`, `assigned_to_me` or `all`.<br> |
|
||||
| `author_id` | integer | no | Returns merge requests created by the given user `id` _([Introduced][ce-13060] in GitLab 9.5)_ |
|
||||
| `assignee_id` | integer | no | Returns merge requests assigned to the given user `id` _([Introduced][ce-13060] in GitLab 9.5)_ |
|
||||
| `my_reaction_emoji` | string | no | Return merge requests reacted by the authenticated user by the given `emoji` _([Introduced][ce-14016] in GitLab 10.0)_ |
|
||||
| `source_branch` | string | no | Return merge requests with the given source branch |
|
||||
| `target_branch` | string | no | Return merge requests with the given target branch |
|
||||
| `search` | string | no | Search merge requests against their `title` and `description` |
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"id": 1,
|
||||
"iid": 1,
|
||||
"target_branch": "master",
|
||||
"source_branch": "test1",
|
||||
"project_id": 3,
|
||||
"title": "test1",
|
||||
"state": "opened",
|
||||
"created_at": "2017-04-29T08:46:00Z",
|
||||
"updated_at": "2017-04-29T08:46:00Z",
|
||||
"upvotes": 0,
|
||||
"downvotes": 0,
|
||||
"author": {
|
||||
"id": 1,
|
||||
"username": "admin",
|
||||
"email": "admin@example.com",
|
||||
"name": "Administrator",
|
||||
"state": "active",
|
||||
"created_at": "2012-04-29T08:46:00Z"
|
||||
},
|
||||
"assignee": {
|
||||
"id": 1,
|
||||
"username": "admin",
|
||||
"email": "admin@example.com",
|
||||
"name": "Administrator",
|
||||
"state": "active",
|
||||
"created_at": "2012-04-29T08:46:00Z"
|
||||
},
|
||||
"source_project_id": 2,
|
||||
"target_project_id": 3,
|
||||
"labels": [ ],
|
||||
"description": "fixed login page css paddings",
|
||||
"work_in_progress": false,
|
||||
"milestone": {
|
||||
"id": 5,
|
||||
"iid": 1,
|
||||
"project_id": 3,
|
||||
"title": "v2.0",
|
||||
"description": "Assumenda aut placeat expedita exercitationem labore sunt enim earum.",
|
||||
"state": "closed",
|
||||
"created_at": "2015-02-02T19:49:26.013Z",
|
||||
"updated_at": "2015-02-02T19:49:26.013Z",
|
||||
"due_date": null
|
||||
},
|
||||
"merge_when_pipeline_succeeds": true,
|
||||
"merge_status": "can_be_merged",
|
||||
"sha": "8888888888888888888888888888888888888888",
|
||||
"merge_commit_sha": null,
|
||||
"user_notes_count": 1,
|
||||
"changes_count": "1",
|
||||
"should_remove_source_branch": true,
|
||||
"force_remove_source_branch": false,
|
||||
"web_url": "http://example.com/example/example/merge_requests/1",
|
||||
"discussion_locked": false,
|
||||
"time_stats": {
|
||||
"time_estimate": 0,
|
||||
"total_time_spent": 0,
|
||||
"human_time_estimate": null,
|
||||
"human_total_time_spent": null
|
||||
}
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
## Get single MR
|
||||
|
||||
Shows information about a single merge request.
|
||||
|
|
|
@ -59,6 +59,18 @@ module API
|
|||
end
|
||||
end
|
||||
|
||||
def serializer_options_for(merge_requests)
|
||||
options = { with: Entities::MergeRequestBasic, current_user: current_user }
|
||||
|
||||
if params[:view] == 'simple'
|
||||
options[:with] = Entities::MergeRequestSimple
|
||||
else
|
||||
options[:issuable_metadata] = issuable_meta_data(merge_requests, 'MergeRequest')
|
||||
end
|
||||
|
||||
options
|
||||
end
|
||||
|
||||
params :merge_requests_params do
|
||||
optional :state, type: String, values: %w[opened closed merged all], default: 'all',
|
||||
desc: 'Return opened, closed, merged, or all merge requests'
|
||||
|
@ -98,16 +110,26 @@ module API
|
|||
authenticate! unless params[:scope] == 'all'
|
||||
merge_requests = find_merge_requests
|
||||
|
||||
options = { with: Entities::MergeRequestBasic,
|
||||
current_user: current_user }
|
||||
|
||||
if params[:view] == 'simple'
|
||||
options[:with] = Entities::MergeRequestSimple
|
||||
else
|
||||
options[:issuable_metadata] = issuable_meta_data(merge_requests, 'MergeRequest')
|
||||
present merge_requests, serializer_options_for(merge_requests)
|
||||
end
|
||||
end
|
||||
|
||||
present merge_requests, options
|
||||
params do
|
||||
requires :id, type: String, desc: 'The ID of a group'
|
||||
end
|
||||
resource :groups, requirements: API::PROJECT_ENDPOINT_REQUIREMENTS do
|
||||
desc 'Get a list of group merge requests' do
|
||||
success Entities::MergeRequestBasic
|
||||
end
|
||||
params do
|
||||
use :merge_requests_params
|
||||
end
|
||||
get ":id/merge_requests" do
|
||||
group = find_group!(params[:id])
|
||||
|
||||
merge_requests = find_merge_requests(group_id: group.id, include_subgroups: true)
|
||||
|
||||
present merge_requests, serializer_options_for(merge_requests)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -159,15 +181,8 @@ module API
|
|||
|
||||
merge_requests = find_merge_requests(project_id: user_project.id)
|
||||
|
||||
options = { with: Entities::MergeRequestBasic,
|
||||
current_user: current_user,
|
||||
project: user_project }
|
||||
|
||||
if params[:view] == 'simple'
|
||||
options[:with] = Entities::MergeRequestSimple
|
||||
else
|
||||
options[:issuable_metadata] = issuable_meta_data(merge_requests, 'MergeRequest')
|
||||
end
|
||||
options = serializer_options_for(merge_requests)
|
||||
options[:project] = user_project
|
||||
|
||||
present merge_requests, options
|
||||
end
|
||||
|
|
|
@ -72,12 +72,6 @@ describe API::MergeRequests do
|
|||
|
||||
expect(response).to have_gitlab_http_status(401)
|
||||
end
|
||||
|
||||
it "returns authentication error when scope is created_by_me" do
|
||||
get api("/merge_requests"), scope: 'created_by_me'
|
||||
|
||||
expect(response).to have_gitlab_http_status(401)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when authenticated' do
|
||||
|
@ -229,224 +223,46 @@ describe API::MergeRequests do
|
|||
end
|
||||
|
||||
describe "GET /projects/:id/merge_requests" do
|
||||
context "when unauthenticated" do
|
||||
it 'returns merge requests for public projects' do
|
||||
get api("/projects/#{project.id}/merge_requests")
|
||||
let(:endpoint_path) { "/projects/#{project.id}/merge_requests" }
|
||||
|
||||
expect_paginated_array_response
|
||||
end
|
||||
it_behaves_like 'merge requests list'
|
||||
|
||||
it "returns 404 for non public projects" do
|
||||
project = create(:project, :private)
|
||||
|
||||
get api("/projects/#{project.id}/merge_requests")
|
||||
|
||||
expect(response).to have_gitlab_http_status(404)
|
||||
end
|
||||
end
|
||||
|
||||
context "when authenticated" do
|
||||
it 'avoids N+1 queries' do
|
||||
control = ActiveRecord::QueryRecorder.new do
|
||||
get api("/projects/#{project.id}/merge_requests", user)
|
||||
end
|
||||
|
||||
create(:merge_request, state: 'closed', milestone: milestone1, author: user, assignee: user, source_project: project, target_project: project, title: "Test", created_at: base_time)
|
||||
|
||||
create(:merge_request, milestone: milestone1, author: user, assignee: user, source_project: project, target_project: project, title: "Test", created_at: base_time)
|
||||
|
||||
expect do
|
||||
get api("/projects/#{project.id}/merge_requests", user)
|
||||
end.not_to exceed_query_limit(control)
|
||||
end
|
||||
|
||||
it "returns an array of all merge_requests" do
|
||||
get api("/projects/#{project.id}/merge_requests", user)
|
||||
|
||||
expect_response_ordered_exactly(merge_request_merged, merge_request_closed, merge_request)
|
||||
expect(json_response.last['title']).to eq(merge_request.title)
|
||||
expect(json_response.last).to have_key('web_url')
|
||||
expect(json_response.last['sha']).to eq(merge_request.diff_head_sha)
|
||||
expect(json_response.last['merge_commit_sha']).to be_nil
|
||||
expect(json_response.last['merge_commit_sha']).to eq(merge_request.merge_commit_sha)
|
||||
expect(json_response.last['downvotes']).to eq(1)
|
||||
expect(json_response.last['upvotes']).to eq(1)
|
||||
expect(json_response.last['labels']).to eq([label2.title, label.title])
|
||||
expect(json_response.first['title']).to eq(merge_request_merged.title)
|
||||
expect(json_response.first['sha']).to eq(merge_request_merged.diff_head_sha)
|
||||
expect(json_response.first['merge_commit_sha']).not_to be_nil
|
||||
expect(json_response.first['merge_commit_sha']).to eq(merge_request_merged.merge_commit_sha)
|
||||
expect(json_response.first['squash']).to eq(merge_request_merged.squash)
|
||||
end
|
||||
|
||||
it "returns an array of all merge_requests using simple mode" do
|
||||
get api("/projects/#{project.id}/merge_requests?view=simple", user)
|
||||
|
||||
expect_response_ordered_exactly(merge_request_merged, merge_request_closed, merge_request)
|
||||
expect(json_response.last.keys).to match_array(%w(id iid title web_url created_at description project_id state updated_at))
|
||||
expect(json_response.last['iid']).to eq(merge_request.iid)
|
||||
expect(json_response.last['title']).to eq(merge_request.title)
|
||||
expect(json_response.last).to have_key('web_url')
|
||||
expect(json_response.first['iid']).to eq(merge_request_merged.iid)
|
||||
expect(json_response.first['title']).to eq(merge_request_merged.title)
|
||||
expect(json_response.first).to have_key('web_url')
|
||||
end
|
||||
|
||||
it "returns an array of all merge_requests" do
|
||||
get api("/projects/#{project.id}/merge_requests?state", user)
|
||||
|
||||
expect_response_ordered_exactly(merge_request_merged, merge_request_closed, merge_request)
|
||||
expect(json_response.last['title']).to eq(merge_request.title)
|
||||
end
|
||||
|
||||
it "returns an array of open merge_requests" do
|
||||
get api("/projects/#{project.id}/merge_requests?state=opened", user)
|
||||
|
||||
expect_response_ordered_exactly(merge_request)
|
||||
expect(json_response.last['title']).to eq(merge_request.title)
|
||||
end
|
||||
|
||||
it "returns an array of closed merge_requests" do
|
||||
get api("/projects/#{project.id}/merge_requests?state=closed", user)
|
||||
|
||||
expect_response_ordered_exactly(merge_request_closed)
|
||||
expect(json_response.first['title']).to eq(merge_request_closed.title)
|
||||
end
|
||||
|
||||
it "returns an array of merged merge_requests" do
|
||||
get api("/projects/#{project.id}/merge_requests?state=merged", user)
|
||||
|
||||
expect_response_ordered_exactly(merge_request_merged)
|
||||
expect(json_response.first['title']).to eq(merge_request_merged.title)
|
||||
end
|
||||
|
||||
it 'returns merge_request by "iids" array' do
|
||||
get api("/projects/#{project.id}/merge_requests", user), iids: [merge_request.iid, merge_request_closed.iid]
|
||||
|
||||
expect_response_ordered_exactly(merge_request_closed, merge_request)
|
||||
expect(json_response.first['title']).to eq merge_request_closed.title
|
||||
end
|
||||
|
||||
it 'matches V4 response schema' do
|
||||
get api("/projects/#{project.id}/merge_requests", user)
|
||||
get api(endpoint_path, user), iids: [merge_request.iid, merge_request_closed.iid]
|
||||
|
||||
expect(response).to have_gitlab_http_status(200)
|
||||
expect(response).to match_response_schema('public_api/v4/merge_requests')
|
||||
end
|
||||
|
||||
it 'returns an empty array if no issue matches milestone' do
|
||||
get api("/projects/#{project.id}/merge_requests", user), milestone: '1.0.0'
|
||||
|
||||
expect_paginated_array_response
|
||||
expect(json_response.length).to eq(0)
|
||||
end
|
||||
|
||||
it 'returns an empty array if milestone does not exist' do
|
||||
get api("/projects/#{project.id}/merge_requests", user), milestone: 'foo'
|
||||
|
||||
expect_paginated_array_response
|
||||
expect(json_response.length).to eq(0)
|
||||
end
|
||||
|
||||
it 'returns an array of merge requests in given milestone' do
|
||||
get api("/projects/#{project.id}/merge_requests", user), milestone: '0.9'
|
||||
|
||||
expect(json_response).to be_an Array
|
||||
expect(json_response.length).to eq(2)
|
||||
expect(json_response.first['title']).to eq merge_request_closed.title
|
||||
expect(json_response.first['id']).to eq merge_request_closed.id
|
||||
end
|
||||
|
||||
it 'returns an array of merge requests matching state in milestone' do
|
||||
get api("/projects/#{project.id}/merge_requests", user), milestone: '0.9', state: 'closed'
|
||||
|
||||
expect_response_ordered_exactly(merge_request_closed)
|
||||
end
|
||||
|
||||
it 'returns an array of labeled merge requests' do
|
||||
get api("/projects/#{project.id}/merge_requests?labels=#{label.title}", user)
|
||||
|
||||
expect_paginated_array_response
|
||||
expect(json_response.length).to eq(1)
|
||||
expect(json_response.first['labels']).to eq([label2.title, label.title])
|
||||
end
|
||||
|
||||
it 'returns an array of labeled merge requests where all labels match' do
|
||||
get api("/projects/#{project.id}/merge_requests?labels=#{label.title},foo,bar", user)
|
||||
|
||||
expect_paginated_array_response
|
||||
expect(json_response.length).to eq(0)
|
||||
end
|
||||
|
||||
it 'returns an empty array if no merge request matches labels' do
|
||||
get api("/projects/#{project.id}/merge_requests?labels=foo,bar", user)
|
||||
|
||||
expect_paginated_array_response
|
||||
expect(json_response.length).to eq(0)
|
||||
end
|
||||
|
||||
it 'returns an array of labeled merge requests that are merged for a milestone' do
|
||||
bug_label = create(:label, title: 'bug', color: '#FFAABB', project: project)
|
||||
|
||||
mr1 = create(:merge_request, state: "merged", source_project: project, target_project: project, milestone: milestone)
|
||||
mr2 = create(:merge_request, state: "merged", source_project: project, target_project: project, milestone: milestone1)
|
||||
mr3 = create(:merge_request, state: "closed", source_project: project, target_project: project, milestone: milestone1)
|
||||
_mr = create(:merge_request, state: "merged", source_project: project, target_project: project, milestone: milestone1)
|
||||
|
||||
create(:label_link, label: bug_label, target: mr1)
|
||||
create(:label_link, label: bug_label, target: mr2)
|
||||
create(:label_link, label: bug_label, target: mr3)
|
||||
|
||||
get api("/projects/#{project.id}/merge_requests?labels=#{bug_label.title}&milestone=#{milestone1.title}&state=merged", user)
|
||||
|
||||
expect_response_ordered_exactly(mr2)
|
||||
end
|
||||
|
||||
context "with ordering" do
|
||||
let(:merge_requests) { [merge_request_merged, merge_request_closed, merge_request] }
|
||||
describe "GET /groups/:id/merge_requests" do
|
||||
let!(:group) { create(:group, :public) }
|
||||
let!(:project) { create(:project, :public, :repository, creator: user, namespace: group, only_allow_merge_if_pipeline_succeeds: false) }
|
||||
let(:endpoint_path) { "/groups/#{group.id}/merge_requests" }
|
||||
|
||||
before do
|
||||
@mr_later = mr_with_later_created_and_updated_at_time
|
||||
@mr_earlier = mr_with_earlier_created_and_updated_at_time
|
||||
group.add_reporter(user)
|
||||
end
|
||||
|
||||
it "returns an array of merge_requests in ascending order" do
|
||||
get api("/projects/#{project.id}/merge_requests?sort=asc", user)
|
||||
it_behaves_like 'merge requests list'
|
||||
|
||||
expect_response_ordered_exactly(*merge_requests.sort_by { |mr| mr['created_at'] })
|
||||
end
|
||||
context 'when have subgroups', :nested_groups do
|
||||
let!(:group) { create(:group, :public) }
|
||||
let!(:subgroup) { create(:group, parent: group) }
|
||||
let!(:project) { create(:project, :public, :repository, creator: user, namespace: subgroup, only_allow_merge_if_pipeline_succeeds: false) }
|
||||
|
||||
it "returns an array of merge_requests in descending order" do
|
||||
get api("/projects/#{project.id}/merge_requests?sort=desc", user)
|
||||
|
||||
expect_response_ordered_exactly(*merge_requests.sort_by { |mr| mr['created_at'] }.reverse)
|
||||
end
|
||||
|
||||
it "returns an array of merge_requests ordered by updated_at" do
|
||||
get api("/projects/#{project.id}/merge_requests?order_by=updated_at", user)
|
||||
|
||||
expect_response_ordered_exactly(*merge_requests.sort_by { |mr| mr['updated_at'] }.reverse)
|
||||
end
|
||||
|
||||
it "returns an array of merge_requests ordered by created_at" do
|
||||
get api("/projects/#{project.id}/merge_requests?order_by=created_at&sort=asc", user)
|
||||
|
||||
expect_response_ordered_exactly(*merge_requests.sort_by { |mr| mr['created_at'] })
|
||||
end
|
||||
end
|
||||
|
||||
context 'source_branch param' do
|
||||
it 'returns merge requests with the given source branch' do
|
||||
get api('/merge_requests', user), source_branch: merge_request_closed.source_branch, state: 'all'
|
||||
|
||||
expect_response_contain_exactly(merge_request_closed, merge_request_merged)
|
||||
end
|
||||
end
|
||||
|
||||
context 'target_branch param' do
|
||||
it 'returns merge requests with the given target branch' do
|
||||
get api('/merge_requests', user), target_branch: merge_request_closed.target_branch, state: 'all'
|
||||
|
||||
expect_response_contain_exactly(merge_request_closed, merge_request_merged)
|
||||
end
|
||||
end
|
||||
it_behaves_like 'merge requests list'
|
||||
end
|
||||
end
|
||||
|
||||
|
|
280
spec/support/shared_examples/requests/api/merge_requests_list.rb
Normal file
280
spec/support/shared_examples/requests/api/merge_requests_list.rb
Normal file
|
@ -0,0 +1,280 @@
|
|||
shared_examples 'merge requests list' do
|
||||
context 'when unauthenticated' do
|
||||
it 'returns merge requests for public projects' do
|
||||
get api(endpoint_path)
|
||||
|
||||
expect(response).to have_gitlab_http_status(200)
|
||||
expect(json_response).to be_an Array
|
||||
end
|
||||
end
|
||||
|
||||
context 'when authenticated' do
|
||||
it 'avoids N+1 queries' do
|
||||
control = ActiveRecord::QueryRecorder.new do
|
||||
get api(endpoint_path, user)
|
||||
end
|
||||
|
||||
create(:merge_request, state: 'closed', milestone: milestone1, author: user, assignee: user, source_project: project, target_project: project, title: 'Test', created_at: base_time)
|
||||
|
||||
create(:merge_request, milestone: milestone1, author: user, assignee: user, source_project: project, target_project: project, title: 'Test', created_at: base_time)
|
||||
|
||||
expect do
|
||||
get api(endpoint_path, user)
|
||||
end.not_to exceed_query_limit(control)
|
||||
end
|
||||
|
||||
it 'returns an array of all merge_requests' do
|
||||
get api(endpoint_path, user)
|
||||
|
||||
expect(response).to have_gitlab_http_status(200)
|
||||
expect(response).to include_pagination_headers
|
||||
expect(json_response).to be_an Array
|
||||
expect(json_response.length).to eq(3)
|
||||
expect(json_response.last['title']).to eq(merge_request.title)
|
||||
expect(json_response.last).to have_key('web_url')
|
||||
expect(json_response.last['sha']).to eq(merge_request.diff_head_sha)
|
||||
expect(json_response.last['merge_commit_sha']).to be_nil
|
||||
expect(json_response.last['merge_commit_sha']).to eq(merge_request.merge_commit_sha)
|
||||
expect(json_response.last['downvotes']).to eq(1)
|
||||
expect(json_response.last['upvotes']).to eq(1)
|
||||
expect(json_response.last['labels']).to eq([label2.title, label.title])
|
||||
expect(json_response.first['title']).to eq(merge_request_merged.title)
|
||||
expect(json_response.first['sha']).to eq(merge_request_merged.diff_head_sha)
|
||||
expect(json_response.first['merge_commit_sha']).not_to be_nil
|
||||
expect(json_response.first['merge_commit_sha']).to eq(merge_request_merged.merge_commit_sha)
|
||||
end
|
||||
|
||||
it 'returns an array of all merge_requests using simple mode' do
|
||||
path = endpoint_path + '?view=simple'
|
||||
|
||||
get api(path, user)
|
||||
|
||||
expect(response).to have_gitlab_http_status(200)
|
||||
expect(response).to include_pagination_headers
|
||||
expect(json_response.last.keys).to match_array(%w(id iid title web_url created_at description project_id state updated_at))
|
||||
expect(json_response).to be_an Array
|
||||
expect(json_response.length).to eq(3)
|
||||
expect(json_response.last['iid']).to eq(merge_request.iid)
|
||||
expect(json_response.last['title']).to eq(merge_request.title)
|
||||
expect(json_response.last).to have_key('web_url')
|
||||
expect(json_response.first['iid']).to eq(merge_request_merged.iid)
|
||||
expect(json_response.first['title']).to eq(merge_request_merged.title)
|
||||
expect(json_response.first).to have_key('web_url')
|
||||
end
|
||||
|
||||
it 'returns an array of all merge_requests' do
|
||||
path = endpoint_path + '?state'
|
||||
|
||||
get api(path, user)
|
||||
|
||||
expect(response).to have_gitlab_http_status(200)
|
||||
expect(response).to include_pagination_headers
|
||||
expect(json_response).to be_an Array
|
||||
expect(json_response.length).to eq(3)
|
||||
expect(json_response.last['title']).to eq(merge_request.title)
|
||||
end
|
||||
|
||||
it 'returns an array of open merge_requests' do
|
||||
path = endpoint_path + '?state=opened'
|
||||
|
||||
get api(path, user)
|
||||
|
||||
expect(response).to have_gitlab_http_status(200)
|
||||
expect(response).to include_pagination_headers
|
||||
expect(json_response).to be_an Array
|
||||
expect(json_response.length).to eq(1)
|
||||
expect(json_response.last['title']).to eq(merge_request.title)
|
||||
end
|
||||
|
||||
it 'returns an array of closed merge_requests' do
|
||||
path = endpoint_path + '?state=closed'
|
||||
|
||||
get api(path, user)
|
||||
|
||||
expect(response).to have_gitlab_http_status(200)
|
||||
expect(response).to include_pagination_headers
|
||||
expect(json_response).to be_an Array
|
||||
expect(json_response.length).to eq(1)
|
||||
expect(json_response.first['title']).to eq(merge_request_closed.title)
|
||||
end
|
||||
|
||||
it 'returns an array of merged merge_requests' do
|
||||
path = endpoint_path + '?state=merged'
|
||||
|
||||
get api(path, user)
|
||||
|
||||
expect(response).to have_gitlab_http_status(200)
|
||||
expect(response).to include_pagination_headers
|
||||
expect(json_response).to be_an Array
|
||||
expect(json_response.length).to eq(1)
|
||||
expect(json_response.first['title']).to eq(merge_request_merged.title)
|
||||
end
|
||||
|
||||
it 'matches V4 response schema' do
|
||||
get api(endpoint_path, user)
|
||||
|
||||
expect(response).to have_gitlab_http_status(200)
|
||||
expect(response).to match_response_schema('public_api/v4/merge_requests')
|
||||
end
|
||||
|
||||
it 'returns an empty array if no issue matches milestone' do
|
||||
get api(endpoint_path, user), milestone: '1.0.0'
|
||||
|
||||
expect(response).to have_gitlab_http_status(200)
|
||||
expect(json_response).to be_an Array
|
||||
expect(json_response.length).to eq(0)
|
||||
end
|
||||
|
||||
it 'returns an empty array if milestone does not exist' do
|
||||
get api(endpoint_path, user), milestone: 'foo'
|
||||
|
||||
expect(response).to have_gitlab_http_status(200)
|
||||
expect(json_response).to be_an Array
|
||||
expect(json_response.length).to eq(0)
|
||||
end
|
||||
|
||||
it 'returns an array of merge requests in given milestone' do
|
||||
get api(endpoint_path, user), milestone: '0.9'
|
||||
|
||||
expect(json_response.first['title']).to eq merge_request_closed.title
|
||||
expect(json_response.first['id']).to eq merge_request_closed.id
|
||||
end
|
||||
|
||||
it 'returns an array of merge requests matching state in milestone' do
|
||||
get api(endpoint_path, user), milestone: '0.9', state: 'closed'
|
||||
|
||||
expect(response).to have_gitlab_http_status(200)
|
||||
expect(json_response).to be_an Array
|
||||
expect(json_response.length).to eq(1)
|
||||
expect(json_response.first['id']).to eq(merge_request_closed.id)
|
||||
end
|
||||
|
||||
it 'returns an array of labeled merge requests' do
|
||||
path = endpoint_path + "?labels=#{label.title}"
|
||||
|
||||
get api(path, user)
|
||||
|
||||
expect(response).to have_gitlab_http_status(200)
|
||||
expect(json_response).to be_an Array
|
||||
expect(json_response.length).to eq(1)
|
||||
expect(json_response.first['labels']).to eq([label2.title, label.title])
|
||||
end
|
||||
|
||||
it 'returns an array of labeled merge requests where all labels match' do
|
||||
path = endpoint_path + "?labels=#{label.title},foo,bar"
|
||||
|
||||
get api(path, user)
|
||||
|
||||
expect(response).to have_gitlab_http_status(200)
|
||||
expect(json_response).to be_an Array
|
||||
expect(json_response.length).to eq(0)
|
||||
end
|
||||
|
||||
it 'returns an empty array if no merge request matches labels' do
|
||||
path = endpoint_path + '?labels=foo,bar'
|
||||
|
||||
get api(path, user)
|
||||
|
||||
expect(response).to have_gitlab_http_status(200)
|
||||
expect(json_response).to be_an Array
|
||||
expect(json_response.length).to eq(0)
|
||||
end
|
||||
|
||||
it 'returns an array of labeled merge requests that are merged for a milestone' do
|
||||
bug_label = create(:label, title: 'bug', color: '#FFAABB', project: project)
|
||||
|
||||
mr1 = create(:merge_request, state: 'merged', source_project: project, target_project: project, milestone: milestone)
|
||||
mr2 = create(:merge_request, state: 'merged', source_project: project, target_project: project, milestone: milestone1)
|
||||
mr3 = create(:merge_request, state: 'closed', source_project: project, target_project: project, milestone: milestone1)
|
||||
_mr = create(:merge_request, state: 'merged', source_project: project, target_project: project, milestone: milestone1)
|
||||
|
||||
create(:label_link, label: bug_label, target: mr1)
|
||||
create(:label_link, label: bug_label, target: mr2)
|
||||
create(:label_link, label: bug_label, target: mr3)
|
||||
|
||||
path = endpoint_path + "?labels=#{bug_label.title}&milestone=#{milestone1.title}&state=merged"
|
||||
|
||||
get api(path, user)
|
||||
|
||||
expect(response).to have_gitlab_http_status(200)
|
||||
expect(json_response).to be_an Array
|
||||
expect(json_response.length).to eq(1)
|
||||
expect(json_response.first['id']).to eq(mr2.id)
|
||||
end
|
||||
|
||||
context 'with ordering' do
|
||||
before do
|
||||
@mr_later = mr_with_later_created_and_updated_at_time
|
||||
@mr_earlier = mr_with_earlier_created_and_updated_at_time
|
||||
end
|
||||
|
||||
it 'returns an array of merge_requests in ascending order' do
|
||||
path = endpoint_path + '?sort=asc'
|
||||
|
||||
get api(path, user)
|
||||
|
||||
expect(response).to have_gitlab_http_status(200)
|
||||
expect(response).to include_pagination_headers
|
||||
expect(json_response).to be_an Array
|
||||
expect(json_response.length).to eq(3)
|
||||
response_dates = json_response.map { |merge_request| merge_request['created_at'] }
|
||||
expect(response_dates).to eq(response_dates.sort)
|
||||
end
|
||||
|
||||
it 'returns an array of merge_requests in descending order' do
|
||||
path = endpoint_path + '?sort=desc'
|
||||
|
||||
get api(path, user)
|
||||
|
||||
expect(response).to have_gitlab_http_status(200)
|
||||
expect(response).to include_pagination_headers
|
||||
expect(json_response).to be_an Array
|
||||
expect(json_response.length).to eq(3)
|
||||
response_dates = json_response.map { |merge_request| merge_request['created_at'] }
|
||||
expect(response_dates).to eq(response_dates.sort.reverse)
|
||||
end
|
||||
|
||||
it 'returns an array of merge_requests ordered by updated_at' do
|
||||
path = endpoint_path + '?order_by=updated_at'
|
||||
|
||||
get api(path, user)
|
||||
|
||||
expect(response).to have_gitlab_http_status(200)
|
||||
expect(response).to include_pagination_headers
|
||||
expect(json_response).to be_an Array
|
||||
expect(json_response.length).to eq(3)
|
||||
response_dates = json_response.map { |merge_request| merge_request['updated_at'] }
|
||||
expect(response_dates).to eq(response_dates.sort.reverse)
|
||||
end
|
||||
|
||||
it 'returns an array of merge_requests ordered by created_at' do
|
||||
path = endpoint_path + '?order_by=created_at&sort=asc'
|
||||
|
||||
get api(path, user)
|
||||
|
||||
expect(response).to have_gitlab_http_status(200)
|
||||
expect(response).to include_pagination_headers
|
||||
expect(json_response).to be_an Array
|
||||
expect(json_response.length).to eq(3)
|
||||
response_dates = json_response.map { |merge_request| merge_request['created_at'] }
|
||||
expect(response_dates).to eq(response_dates.sort)
|
||||
end
|
||||
end
|
||||
|
||||
context 'source_branch param' do
|
||||
it 'returns merge requests with the given source branch' do
|
||||
get api(endpoint_path, user), source_branch: merge_request_closed.source_branch, state: 'all'
|
||||
|
||||
expect_response_contain_exactly(merge_request_closed, merge_request_merged)
|
||||
end
|
||||
end
|
||||
|
||||
context 'target_branch param' do
|
||||
it 'returns merge requests with the given target branch' do
|
||||
get api(endpoint_path, user), target_branch: merge_request_closed.target_branch, state: 'all'
|
||||
|
||||
expect_response_contain_exactly(merge_request_closed, merge_request_merged)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue