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 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 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 15 Parameters:
11 16  
12 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 20 ```json
15 21 [
... ...
lib/api/merge_requests.rb
... ... @@ -19,14 +19,24 @@ module API
19 19 #
20 20 # Parameters:
21 21 # id (required) - The ID of a project
  22 + # state (optional) - Return requests "merged", "opened" or "closed"
22 23 #
23 24 # Example:
24 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 29 get ":id/merge_requests" do
27 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 40 end
31 41  
32 42 # Show MR
... ...
spec/requests/api/merge_requests_spec.rb
... ... @@ -7,6 +7,8 @@ describe API::API do
7 7 let(:user) { create(:user) }
8 8 let!(:project) {create(:project, creator_id: user.id, namespace: user.namespace) }
9 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 12 let!(:note) { create(:note_on_merge_request, author: user, project: project, noteable: merge_request, note: "a comment on a MR") }
11 13 before {
12 14 project.team << [user, :reporters]
... ... @@ -21,12 +23,42 @@ describe API::API do
21 23 end
22 24  
23 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 27 get api("/projects/#{project.id}/merge_requests", user)
26 28 response.status.should == 200
27 29 json_response.should be_an Array
  30 + json_response.length.should == 3
28 31 json_response.first['title'].should == merge_request.title
29 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 62 end
31 63 end
32 64  
... ...