Commit 66209fbc7668b5b64b34c2997185223891211829

Authored by Stuart Pook
1 parent 650d0bc6

Add optional parameter to list merge requests

Add an optional parameter to list merge requests to restrict the
returned merge requests to those that are "opened", "merged" or
"closed". By default all merge requests are returned. Note that
"all" can be given to explicitly request all 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 do @@ -7,6 +7,8 @@ describe API::API 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 do @@ -21,12 +23,42 @@ describe API::API 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