Commit 53b52b11d5cbaa32f98c267eb53b4b7c928a92c4

Authored by Dmitriy Zaporozhets
2 parents 481bbd75 66209fbc

Merge pull request #6699 from criteo/api_get_open_merge_requests

Add optional parameter to list merge requests
doc/api/merge_requests.md
1 ## List merge requests 1 ## List merge requests
2 2
3 -Get all merge requests for this project. This function takes pagination parameters  
4 -`page` and `per_page` to restrict the list of merge requests. 3 +Get all merge requests for this project.
  4 +The `state` parameter can be used to get only merge requests with a
  5 +given state (`opened`, `closed`, or `merged`) or all of them (`all`).
  6 +The pagination parameters `page` and `per_page` can be used to restrict the
  7 +list of merge requests.
5 8
6 ``` 9 ```
7 GET /projects/:id/merge_requests 10 GET /projects/:id/merge_requests
  11 +GET /projects/:id/merge_requests?state=opened
  12 +GET /projects/:id/merge_requests?state=all
8 ``` 13 ```
9 14
10 Parameters: 15 Parameters:
11 16
12 + `id` (required) - The ID of a project 17 + `id` (required) - The ID of a project
  18 ++ `state` (optional) - Return `all` requests or just those that are `merged`, `opened` or `closed`
13 19
14 ```json 20 ```json
15 [ 21 [
lib/api/merge_requests.rb
@@ -19,14 +19,24 @@ module API @@ -19,14 +19,24 @@ module API
19 # 19 #
20 # Parameters: 20 # Parameters:
21 # id (required) - The ID of a project 21 # id (required) - The ID of a project
  22 + # state (optional) - Return requests "merged", "opened" or "closed"
22 # 23 #
23 # Example: 24 # Example:
24 # GET /projects/:id/merge_requests 25 # GET /projects/:id/merge_requests
  26 + # GET /projects/:id/merge_requests?state=opened
  27 + # GET /projects/:id/merge_requests?state=closed
25 # 28 #
26 get ":id/merge_requests" do 29 get ":id/merge_requests" do
27 authorize! :read_merge_request, user_project 30 authorize! :read_merge_request, user_project
28 31
29 - present paginate(user_project.merge_requests), with: Entities::MergeRequest 32 + mrs = case params["state"]
  33 + when "opened" then user_project.merge_requests.opened
  34 + when "closed" then user_project.merge_requests.closed
  35 + when "merged" then user_project.merge_requests.merged
  36 + else user_project.merge_requests
  37 + end
  38 +
  39 + present paginate(mrs), with: Entities::MergeRequest
30 end 40 end
31 41
32 # Show MR 42 # Show MR
spec/requests/api/merge_requests_spec.rb
@@ -7,6 +7,8 @@ describe API::API, api: true do @@ -7,6 +7,8 @@ describe API::API, api: true do
7 let(:user) { create(:user) } 7 let(:user) { create(:user) }
8 let!(:project) {create(:project, creator_id: user.id, namespace: user.namespace) } 8 let!(:project) {create(:project, creator_id: user.id, namespace: user.namespace) }
9 let!(:merge_request) { create(:merge_request, :simple, author: user, assignee: user, source_project: project, target_project: project, title: "Test") } 9 let!(:merge_request) { create(:merge_request, :simple, author: user, assignee: user, source_project: project, target_project: project, title: "Test") }
  10 + let!(:merge_request_closed) { create(:merge_request, state: "closed", author: user, assignee: user, source_project: project, target_project: project, title: "Closed test") }
  11 + let!(:merge_request_merged) { create(:merge_request, state: "merged", author: user, assignee: user, source_project: project, target_project: project, title: "Merged test") }
10 let!(:note) { create(:note_on_merge_request, author: user, project: project, noteable: merge_request, note: "a comment on a MR") } 12 let!(:note) { create(:note_on_merge_request, author: user, project: project, noteable: merge_request, note: "a comment on a MR") }
11 before { 13 before {
12 project.team << [user, :reporters] 14 project.team << [user, :reporters]
@@ -21,12 +23,42 @@ describe API::API, api: true do @@ -21,12 +23,42 @@ describe API::API, api: true do
21 end 23 end
22 24
23 context "when authenticated" do 25 context "when authenticated" do
24 - it "should return an array of merge_requests" do 26 + it "should return an array of all merge_requests" do
25 get api("/projects/#{project.id}/merge_requests", user) 27 get api("/projects/#{project.id}/merge_requests", user)
26 response.status.should == 200 28 response.status.should == 200
27 json_response.should be_an Array 29 json_response.should be_an Array
  30 + json_response.length.should == 3
28 json_response.first['title'].should == merge_request.title 31 json_response.first['title'].should == merge_request.title
29 end 32 end
  33 + it "should return an array of all merge_requests" do
  34 + get api("/projects/#{project.id}/merge_requests?state", user)
  35 + response.status.should == 200
  36 + json_response.should be_an Array
  37 + json_response.length.should == 3
  38 + json_response.first['title'].should == merge_request.title
  39 + end
  40 + it "should return an array of open merge_requests" do
  41 + get api("/projects/#{project.id}/merge_requests?state=opened", user)
  42 + response.status.should == 200
  43 + json_response.should be_an Array
  44 + json_response.length.should == 1
  45 + json_response.first['title'].should == merge_request.title
  46 + end
  47 + it "should return an array of closed merge_requests" do
  48 + get api("/projects/#{project.id}/merge_requests?state=closed", user)
  49 + response.status.should == 200
  50 + json_response.should be_an Array
  51 + json_response.length.should == 2
  52 + json_response.first['title'].should == merge_request_closed.title
  53 + json_response.second['title'].should == merge_request_merged.title
  54 + end
  55 + it "should return an array of merged merge_requests" do
  56 + get api("/projects/#{project.id}/merge_requests?state=merged", user)
  57 + response.status.should == 200
  58 + json_response.should be_an Array
  59 + json_response.length.should == 1
  60 + json_response.first['title'].should == merge_request_merged.title
  61 + end
30 end 62 end
31 end 63 end
32 64