merge_requests_spec.rb 12.9 KB
Newer Older
V
Valeriy Sizov 已提交
1 2
require "spec_helper"

J
Jeroen van Baarsen 已提交
3
describe API::API, api: true  do
V
Valeriy Sizov 已提交
4
  include ApiHelpers
I
Izaak Alpert 已提交
5
  let(:user) { create(:user) }
D
Dmitriy Zaporozhets 已提交
6
  let!(:project) {create(:project, creator_id: user.id, namespace: user.namespace) }
D
Dmitriy Zaporozhets 已提交
7
  let!(:merge_request) { create(:merge_request, :simple, author: user, assignee: user, source_project: project, target_project: project, title: "Test") }
8 9
  let!(:merge_request_closed) { create(:merge_request, state: "closed", author: user, assignee: user, source_project: project, target_project: project, title: "Closed test") }
  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") }
I
Izaak Alpert 已提交
11 12 13
  before {
    project.team << [user, :reporters]
  }
V
Valeriy Sizov 已提交
14 15 16 17

  describe "GET /projects/:id/merge_requests" do
    context "when unauthenticated" do
      it "should return authentication error" do
H
Hiroyuki Sato 已提交
18
        get api("/projects/#{project.id}/merge_requests")
V
Valeriy Sizov 已提交
19 20 21 22 23
        response.status.should == 401
      end
    end

    context "when authenticated" do
24
      it "should return an array of all merge_requests" do
H
Hiroyuki Sato 已提交
25
        get api("/projects/#{project.id}/merge_requests", user)
V
Valeriy Sizov 已提交
26 27
        response.status.should == 200
        json_response.should be_an Array
28
        json_response.length.should == 3
V
Valeriy Sizov 已提交
29 30
        json_response.first['title'].should == merge_request.title
      end
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
      it "should return an array of all merge_requests" do
        get api("/projects/#{project.id}/merge_requests?state", user)
        response.status.should == 200
        json_response.should be_an Array
        json_response.length.should == 3
        json_response.first['title'].should == merge_request.title
      end
      it "should return an array of open merge_requests" do
        get api("/projects/#{project.id}/merge_requests?state=opened", user)
        response.status.should == 200
        json_response.should be_an Array
        json_response.length.should == 1
        json_response.first['title'].should == merge_request.title
      end
      it "should return an array of closed merge_requests" do
        get api("/projects/#{project.id}/merge_requests?state=closed", user)
        response.status.should == 200
        json_response.should be_an Array
        json_response.length.should == 2
        json_response.first['title'].should == merge_request_closed.title
        json_response.second['title'].should == merge_request_merged.title
      end
      it "should return an array of merged merge_requests" do
        get api("/projects/#{project.id}/merge_requests?state=merged", user)
        response.status.should == 200
        json_response.should be_an Array
        json_response.length.should == 1
        json_response.first['title'].should == merge_request_merged.title
      end
V
Valeriy Sizov 已提交
60 61 62 63 64
    end
  end

  describe "GET /projects/:id/merge_request/:merge_request_id" do
    it "should return merge_request" do
H
Hiroyuki Sato 已提交
65
      get api("/projects/#{project.id}/merge_request/#{merge_request.id}", user)
V
Valeriy Sizov 已提交
66 67
      response.status.should == 200
      json_response['title'].should == merge_request.title
68
      json_response['iid'].should == merge_request.iid
V
Valeriy Sizov 已提交
69
    end
70 71

    it "should return a 404 error if merge_request_id not found" do
H
Hiroyuki Sato 已提交
72
      get api("/projects/#{project.id}/merge_request/999", user)
73 74
      response.status.should == 404
    end
V
Valeriy Sizov 已提交
75 76 77
  end

  describe "POST /projects/:id/merge_requests" do
I
Izaak Alpert 已提交
78 79
    context 'between branches projects' do
      it "should return merge_request" do
H
Hiroyuki Sato 已提交
80
        post api("/projects/#{project.id}/merge_requests", user),
81 82 83 84 85
             title: 'Test merge_request',
             source_branch: 'stable',
             target_branch: 'master',
             author: user,
             labels: 'label, label2'
I
Izaak Alpert 已提交
86 87
        response.status.should == 201
        json_response['title'].should == 'Test merge_request'
88
        json_response['labels'].should == ['label', 'label2']
I
Izaak Alpert 已提交
89
      end
90

I
Izaak Alpert 已提交
91
      it "should return 422 when source_branch equals target_branch" do
H
Hiroyuki Sato 已提交
92
        post api("/projects/#{project.id}/merge_requests", user),
93
        title: "Test merge_request", source_branch: "master", target_branch: "master", author: user
I
Izaak Alpert 已提交
94 95
        response.status.should == 422
      end
96

I
Izaak Alpert 已提交
97
      it "should return 400 when source_branch is missing" do
H
Hiroyuki Sato 已提交
98
        post api("/projects/#{project.id}/merge_requests", user),
99
        title: "Test merge_request", target_branch: "master", author: user
I
Izaak Alpert 已提交
100 101
        response.status.should == 400
      end
102

I
Izaak Alpert 已提交
103
      it "should return 400 when target_branch is missing" do
H
Hiroyuki Sato 已提交
104
        post api("/projects/#{project.id}/merge_requests", user),
105
        title: "Test merge_request", source_branch: "stable", author: user
I
Izaak Alpert 已提交
106 107 108 109
        response.status.should == 400
      end

      it "should return 400 when title is missing" do
H
Hiroyuki Sato 已提交
110
        post api("/projects/#{project.id}/merge_requests", user),
111
        target_branch: 'master', source_branch: 'stable'
I
Izaak Alpert 已提交
112 113
        response.status.should == 400
      end
114 115 116 117 118 119 120 121 122 123 124

      it 'should return 405 on invalid label names' do
        post api("/projects/#{project.id}/merge_requests", user),
             title: 'Test merge_request',
             source_branch: 'stable',
             target_branch: 'master',
             author: user,
             labels: 'label, ?'
        response.status.should == 405
        json_response['message'].should == 'Label names invalid'
      end
125
    end
126

I
Izaak Alpert 已提交
127
    context 'forked projects' do
D
Dmitriy Zaporozhets 已提交
128 129 130
      let!(:user2) { create(:user) }
      let!(:fork_project) { create(:project, forked_from_project: project,  namespace: user2.namespace, creator_id: user2.id) }
      let!(:unrelated_project) { create(:project,  namespace: create(:user).namespace, creator_id: user2.id) }
I
Izaak Alpert 已提交
131 132 133 134 135 136

      before :each do |each|
        fork_project.team << [user2, :reporters]
      end

      it "should return merge_request" do
H
Hiroyuki Sato 已提交
137
        post api("/projects/#{fork_project.id}/merge_requests", user2),
138
        title: 'Test merge_request', source_branch: "stable", target_branch: "master", author: user2, target_project_id: project.id, description: 'Test description for Test merge_request'
I
Izaak Alpert 已提交
139 140
        response.status.should == 201
        json_response['title'].should == 'Test merge_request'
141
        json_response['description'].should == 'Test description for Test merge_request'
I
Izaak Alpert 已提交
142 143 144
      end

      it "should not return 422 when source_branch equals target_branch" do
H
Hiroyuki Sato 已提交
145
        project.id.should_not == fork_project.id
I
Izaak Alpert 已提交
146 147
        fork_project.forked?.should be_true
        fork_project.forked_from_project.should == project
H
Hiroyuki Sato 已提交
148
        post api("/projects/#{fork_project.id}/merge_requests", user2),
149
        title: 'Test merge_request', source_branch: "master", target_branch: "master", author: user2, target_project_id: project.id
I
Izaak Alpert 已提交
150 151 152 153 154
        response.status.should == 201
        json_response['title'].should == 'Test merge_request'
      end

      it "should return 400 when source_branch is missing" do
H
Hiroyuki Sato 已提交
155
        post api("/projects/#{fork_project.id}/merge_requests", user2),
156
        title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id
I
Izaak Alpert 已提交
157 158 159 160
        response.status.should == 400
      end

      it "should return 400 when target_branch is missing" do
H
Hiroyuki Sato 已提交
161
        post api("/projects/#{fork_project.id}/merge_requests", user2),
162
        title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id
I
Izaak Alpert 已提交
163 164 165 166
        response.status.should == 400
      end

      it "should return 400 when title is missing" do
H
Hiroyuki Sato 已提交
167
        post api("/projects/#{fork_project.id}/merge_requests", user2),
168
        target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: project.id
I
Izaak Alpert 已提交
169 170 171
        response.status.should == 400
      end

D
Dmitriy Zaporozhets 已提交
172
      it "should return 404 when target_branch is specified and not a forked project" do
H
Hiroyuki Sato 已提交
173
        post api("/projects/#{project.id}/merge_requests", user),
174
        title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user, target_project_id: fork_project.id
D
Dmitriy Zaporozhets 已提交
175
        response.status.should == 404
I
Izaak Alpert 已提交
176
      end
I
Izaak Alpert 已提交
177

D
Dmitriy Zaporozhets 已提交
178
      it "should return 404 when target_branch is specified and for a different fork" do
H
Hiroyuki Sato 已提交
179
        post api("/projects/#{fork_project.id}/merge_requests", user2),
180
        title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: unrelated_project.id
D
Dmitriy Zaporozhets 已提交
181
        response.status.should == 404
I
Izaak Alpert 已提交
182 183 184
      end

      it "should return 201 when target_branch is specified and for the same project" do
H
Hiroyuki Sato 已提交
185
        post api("/projects/#{fork_project.id}/merge_requests", user2),
186
        title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: fork_project.id
I
Izaak Alpert 已提交
187 188
        response.status.should == 201
      end
189
    end
V
Valeriy Sizov 已提交
190 191
  end

A
Andrew8xx8 已提交
192 193
  describe "PUT /projects/:id/merge_request/:merge_request_id to close MR" do
    it "should return merge_request" do
H
Hiroyuki Sato 已提交
194
      put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user), state_event: "close"
A
Andrew8xx8 已提交
195 196 197 198 199
      response.status.should == 200
      json_response['state'].should == 'closed'
    end
  end

200 201 202 203
  describe "PUT /projects/:id/merge_request/:merge_request_id/merge" do
    it "should return merge_request in case of success" do
      MergeRequest.any_instance.stub(can_be_merged?: true, automerge!: true)
      put api("/projects/#{project.id}/merge_request/#{merge_request.id}/merge", user)
A
Andrew8xx8 已提交
204
      response.status.should == 200
205 206 207 208 209 210 211
    end

    it "should return 405 if branch can't be merged" do
      MergeRequest.any_instance.stub(can_be_merged?: false)
      put api("/projects/#{project.id}/merge_request/#{merge_request.id}/merge", user)
      response.status.should == 405
      json_response['message'].should == 'Branch cannot be merged'
A
Andrew8xx8 已提交
212
    end
D
Dmitriy Zaporozhets 已提交
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227

    it "should return 405 if merge_request is not open" do
      merge_request.close
      put api("/projects/#{project.id}/merge_request/#{merge_request.id}/merge", user)
      response.status.should == 405
      json_response['message'].should == 'Method Not Allowed'
    end

    it "should return 401 if user has no permissions to merge" do
      user2 = create(:user)
      project.team << [user2, :reporter]
      put api("/projects/#{project.id}/merge_request/#{merge_request.id}/merge", user2)
      response.status.should == 401
      json_response['message'].should == '401 Unauthorized'
    end
A
Andrew8xx8 已提交
228 229
  end

V
Valeriy Sizov 已提交
230 231
  describe "PUT /projects/:id/merge_request/:merge_request_id" do
    it "should return merge_request" do
H
Hiroyuki Sato 已提交
232
      put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user), title: "New title"
V
Valeriy Sizov 已提交
233
      response.status.should == 200
234
      json_response['title'].should == 'New title'
V
Valeriy Sizov 已提交
235
    end
236

237 238 239 240 241 242
    it "should return merge_request" do
      put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user), description: "New description"
      response.status.should == 200
      json_response['description'].should == 'New description'
    end

243
    it "should return 422 when source_branch and target_branch are renamed the same" do
H
Hiroyuki Sato 已提交
244
      put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user),
245
      source_branch: "master", target_branch: "master"
246 247 248 249
      response.status.should == 422
    end

    it "should return merge_request with renamed target_branch" do
H
Hiroyuki Sato 已提交
250
      put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user), target_branch: "wiki"
251
      response.status.should == 200
I
Izaak Alpert 已提交
252
      json_response['target_branch'].should == 'wiki'
253
    end
254 255 256 257 258 259 260 261 262

    it 'should return 405 on invalid label names' do
      put api("/projects/#{project.id}/merge_request/#{merge_request.id}",
              user),
          title: 'new issue',
          labels: 'label, ?'
      response.status.should == 405
      json_response['message'].should == 'Label names invalid'
    end
V
Valeriy Sizov 已提交
263 264 265 266
  end

  describe "POST /projects/:id/merge_request/:merge_request_id/comments" do
    it "should return comment" do
H
Hiroyuki Sato 已提交
267
      post api("/projects/#{project.id}/merge_request/#{merge_request.id}/comments", user), note: "My comment"
V
Valeriy Sizov 已提交
268
      response.status.should == 201
269
      json_response['note'].should == 'My comment'
V
Valeriy Sizov 已提交
270
    end
271 272

    it "should return 400 if note is missing" do
H
Hiroyuki Sato 已提交
273
      post api("/projects/#{project.id}/merge_request/#{merge_request.id}/comments", user)
274 275
      response.status.should == 400
    end
276 277

    it "should return 404 if note is attached to non existent merge request" do
H
Hiroyuki Sato 已提交
278
      post api("/projects/#{project.id}/merge_request/111/comments", user), note: "My comment"
279 280
      response.status.should == 404
    end
V
Valeriy Sizov 已提交
281
  end
282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297

  describe "GET :id/merge_request/:merge_request_id/comments" do
    it "should return merge_request comments" do
      get api("/projects/#{project.id}/merge_request/#{merge_request.id}/comments", user)
      response.status.should == 200
      json_response.should be_an Array
      json_response.length.should == 1
      json_response.first['note'].should == "a comment on a MR"
      json_response.first['author']['id'].should == user.id
    end

    it "should return a 404 error if merge_request_id not found" do
      get api("/projects/#{project.id}/merge_request/999/comments", user)
      response.status.should == 404
    end
  end
V
Valeriy Sizov 已提交
298
end