merge_requests_spec.rb 25.4 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
Z
Zeger-Jan van de Weg 已提交
5 6 7
  let(:base_time)   { Time.now }
  let(:user)        { create(:user) }
  let(:admin)       { create(:user, :admin) }
8
  let(:non_member)  { create(:user) }
Z
Zeger-Jan van de Weg 已提交
9
  let!(:project)    { create(:project, creator_id: user.id, namespace: user.namespace) }
S
Stan Hu 已提交
10
  let!(:merge_request) { create(:merge_request, :simple, author: user, assignee: user, source_project: project, target_project: project, title: "Test", created_at: base_time) }
G
Gabriel Mazetto 已提交
11
  let!(:merge_request_closed) { create(:merge_request, state: "closed", author: user, assignee: user, source_project: project, target_project: project, title: "Closed test", created_at: base_time + 1.second) }
S
Stan Hu 已提交
12
  let!(:merge_request_merged) { create(:merge_request, state: "merged", author: user, assignee: user, source_project: project, target_project: project, title: "Merged test", created_at: base_time + 2.seconds) }
Z
Zeger-Jan van de Weg 已提交
13 14 15
  let!(:note)       { create(:note_on_merge_request, author: user, project: project, noteable: merge_request, note: "a comment on a MR") }
  let!(:note2)      { create(:note_on_merge_request, author: user, project: project, noteable: merge_request, note: "another comment on a MR") }
  let(:milestone)   { create(:milestone, title: '1.0.0', project: project) }
16 17

  before do
I
Izaak Alpert 已提交
18
    project.team << [user, :reporters]
19
  end
V
Valeriy Sizov 已提交
20 21 22 23

  describe "GET /projects/:id/merge_requests" do
    context "when unauthenticated" do
      it "should return authentication error" do
H
Hiroyuki Sato 已提交
24
        get api("/projects/#{project.id}/merge_requests")
25
        expect(response.status).to eq(401)
V
Valeriy Sizov 已提交
26 27 28 29
      end
    end

    context "when authenticated" do
30
      it "should return an array of all merge_requests" do
H
Hiroyuki Sato 已提交
31
        get api("/projects/#{project.id}/merge_requests", user)
32 33 34 35
        expect(response.status).to eq(200)
        expect(json_response).to be_an Array
        expect(json_response.length).to eq(3)
        expect(json_response.last['title']).to eq(merge_request.title)
V
Valeriy Sizov 已提交
36
      end
37

38 39
      it "should return an array of all merge_requests" do
        get api("/projects/#{project.id}/merge_requests?state", user)
40 41 42 43
        expect(response.status).to eq(200)
        expect(json_response).to be_an Array
        expect(json_response.length).to eq(3)
        expect(json_response.last['title']).to eq(merge_request.title)
44
      end
45

46 47
      it "should return an array of open merge_requests" do
        get api("/projects/#{project.id}/merge_requests?state=opened", user)
48 49 50 51
        expect(response.status).to eq(200)
        expect(json_response).to be_an Array
        expect(json_response.length).to eq(1)
        expect(json_response.last['title']).to eq(merge_request.title)
52
      end
53

54 55
      it "should return an array of closed merge_requests" do
        get api("/projects/#{project.id}/merge_requests?state=closed", user)
56 57
        expect(response.status).to eq(200)
        expect(json_response).to be_an Array
58 59
        expect(json_response.length).to eq(1)
        expect(json_response.first['title']).to eq(merge_request_closed.title)
60
      end
61

62 63
      it "should return an array of merged merge_requests" do
        get api("/projects/#{project.id}/merge_requests?state=merged", user)
64 65 66 67
        expect(response.status).to eq(200)
        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)
68
      end
69 70 71 72 73 74 75 76 77

      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 "should return an array of merge_requests in ascending order" do
          get api("/projects/#{project.id}/merge_requests?sort=asc", user)
78 79 80
          expect(response.status).to eq(200)
          expect(json_response).to be_an Array
          expect(json_response.length).to eq(3)
S
Stan Hu 已提交
81 82
          response_dates = json_response.map{ |merge_request| merge_request['created_at'] }
          expect(response_dates).to eq(response_dates.sort)
83
        end
D
Dmitriy Zaporozhets 已提交
84

85 86
        it "should return an array of merge_requests in descending order" do
          get api("/projects/#{project.id}/merge_requests?sort=desc", user)
87 88 89
          expect(response.status).to eq(200)
          expect(json_response).to be_an Array
          expect(json_response.length).to eq(3)
S
Stan Hu 已提交
90 91
          response_dates = json_response.map{ |merge_request| merge_request['created_at'] }
          expect(response_dates).to eq(response_dates.sort.reverse)
92
        end
D
Dmitriy Zaporozhets 已提交
93

94 95
        it "should return an array of merge_requests ordered by updated_at" do
          get api("/projects/#{project.id}/merge_requests?order_by=updated_at", user)
96 97 98
          expect(response.status).to eq(200)
          expect(json_response).to be_an Array
          expect(json_response.length).to eq(3)
S
Stan Hu 已提交
99 100
          response_dates = json_response.map{ |merge_request| merge_request['updated_at'] }
          expect(response_dates).to eq(response_dates.sort.reverse)
101
        end
D
Dmitriy Zaporozhets 已提交
102

103
        it "should return an array of merge_requests ordered by created_at" do
S
Stan Hu 已提交
104
          get api("/projects/#{project.id}/merge_requests?order_by=created_at&sort=asc", user)
105 106 107
          expect(response.status).to eq(200)
          expect(json_response).to be_an Array
          expect(json_response.length).to eq(3)
S
Stan Hu 已提交
108 109
          response_dates = json_response.map{ |merge_request| merge_request['created_at'] }
          expect(response_dates).to eq(response_dates.sort)
110
        end
111
      end
V
Valeriy Sizov 已提交
112 113 114
    end
  end

115
  describe "GET /projects/:id/merge_requests/:merge_request_id" do
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
    it 'exposes known attributes' do
      get api("/projects/#{project.id}/merge_requests/#{merge_request.id}", user)

      expect(response.status).to eq(200)
      expect(json_response['id']).to eq(merge_request.id)
      expect(json_response['iid']).to eq(merge_request.iid)
      expect(json_response['project_id']).to eq(merge_request.project.id)
      expect(json_response['title']).to eq(merge_request.title)
      expect(json_response['description']).to eq(merge_request.description)
      expect(json_response['state']).to eq(merge_request.state)
      expect(json_response['created_at']).to be_present
      expect(json_response['updated_at']).to be_present
      expect(json_response['labels']).to eq(merge_request.label_names)
      expect(json_response['milestone']).to be_nil
      expect(json_response['assignee']).to be_a Hash
      expect(json_response['author']).to be_a Hash
      expect(json_response['target_branch']).to eq(merge_request.target_branch)
      expect(json_response['source_branch']).to eq(merge_request.source_branch)
      expect(json_response['upvotes']).to eq(0)
      expect(json_response['downvotes']).to eq(0)
      expect(json_response['source_project_id']).to eq(merge_request.source_project.id)
      expect(json_response['target_project_id']).to eq(merge_request.target_project.id)
      expect(json_response['work_in_progress']).to be_falsy
      expect(json_response['merge_when_build_succeeds']).to be_falsy
      expect(json_response['merge_status']).to eq('can_be_merged')
      expect(json_response['user_notes_count']).to be(2)
    end

V
Valeriy Sizov 已提交
144
    it "should return merge_request" do
145
      get api("/projects/#{project.id}/merge_requests/#{merge_request.id}", user)
146 147 148
      expect(response.status).to eq(200)
      expect(json_response['title']).to eq(merge_request.title)
      expect(json_response['iid']).to eq(merge_request.iid)
149
      expect(json_response['work_in_progress']).to eq(false)
150
      expect(json_response['merge_status']).to eq('can_be_merged')
V
Valeriy Sizov 已提交
151
    end
152

153 154 155
    it 'should return merge_request by iid' do
      url = "/projects/#{project.id}/merge_requests?iid=#{merge_request.iid}"
      get api(url, user)
156 157 158
      expect(response.status).to eq 200
      expect(json_response.first['title']).to eq merge_request.title
      expect(json_response.first['id']).to eq merge_request.id
159 160
    end

161
    it "should return a 404 error if merge_request_id not found" do
162
      get api("/projects/#{project.id}/merge_requests/999", user)
163
      expect(response.status).to eq(404)
164
    end
165 166 167 168 169 170 171 172 173 174

    context 'Work in Progress' do
      let!(:merge_request_wip) { create(:merge_request, author: user, assignee: user, source_project: project, target_project: project, title: "WIP: Test", created_at: base_time + 1.second) }

      it "should return merge_request" do
        get api("/projects/#{project.id}/merge_requests/#{merge_request_wip.id}", user)
        expect(response.status).to eq(200)
        expect(json_response['work_in_progress']).to eq(true)
      end
    end
V
Valeriy Sizov 已提交
175 176
  end

177
  describe 'GET /projects/:id/merge_requests/:merge_request_id/commits' do
178
    context 'valid merge request' do
179
      before { get api("/projects/#{project.id}/merge_requests/#{merge_request.id}/commits", user) }
180 181 182 183 184 185 186 187 188
      let(:commit) { merge_request.commits.first }

      it { expect(response.status).to eq 200 }
      it { expect(json_response.size).to eq(merge_request.commits.size) }
      it { expect(json_response.first['id']).to eq(commit.id) }
      it { expect(json_response.first['title']).to eq(commit.title) }
    end

    it 'returns a 404 when merge_request_id not found' do
189
      get api("/projects/#{project.id}/merge_requests/999/commits", user)
190 191 192 193
      expect(response.status).to eq(404)
    end
  end

194
  describe 'GET /projects/:id/merge_requests/:merge_request_id/changes' do
195
    it 'should return the change information of the merge_request' do
196
      get api("/projects/#{project.id}/merge_requests/#{merge_request.id}/changes", user)
197 198 199 200 201
      expect(response.status).to eq 200
      expect(json_response['changes'].size).to eq(merge_request.diffs.size)
    end

    it 'returns a 404 when merge_request_id not found' do
202
      get api("/projects/#{project.id}/merge_requests/999/changes", user)
203 204 205 206
      expect(response.status).to eq(404)
    end
  end

V
Valeriy Sizov 已提交
207
  describe "POST /projects/:id/merge_requests" do
I
Izaak Alpert 已提交
208 209
    context 'between branches projects' do
      it "should return merge_request" do
H
Hiroyuki Sato 已提交
210
        post api("/projects/#{project.id}/merge_requests", user),
211
             title: 'Test merge_request',
212
             source_branch: 'feature_conflict',
213 214
             target_branch: 'master',
             author: user,
215 216
             labels: 'label, label2',
             milestone_id: milestone.id
217 218 219
        expect(response.status).to eq(201)
        expect(json_response['title']).to eq('Test merge_request')
        expect(json_response['labels']).to eq(['label', 'label2'])
220
        expect(json_response['milestone']['id']).to eq(milestone.id)
I
Izaak Alpert 已提交
221
      end
222

I
Izaak Alpert 已提交
223
      it "should return 422 when source_branch equals target_branch" do
H
Hiroyuki Sato 已提交
224
        post api("/projects/#{project.id}/merge_requests", user),
225
        title: "Test merge_request", source_branch: "master", target_branch: "master", author: user
226
        expect(response.status).to eq(422)
I
Izaak Alpert 已提交
227
      end
228

I
Izaak Alpert 已提交
229
      it "should return 400 when source_branch is missing" do
H
Hiroyuki Sato 已提交
230
        post api("/projects/#{project.id}/merge_requests", user),
231
        title: "Test merge_request", target_branch: "master", author: user
232
        expect(response.status).to eq(400)
I
Izaak Alpert 已提交
233
      end
234

I
Izaak Alpert 已提交
235
      it "should return 400 when target_branch is missing" do
H
Hiroyuki Sato 已提交
236
        post api("/projects/#{project.id}/merge_requests", user),
237
        title: "Test merge_request", source_branch: "markdown", author: user
238
        expect(response.status).to eq(400)
I
Izaak Alpert 已提交
239 240 241
      end

      it "should return 400 when title is missing" do
H
Hiroyuki Sato 已提交
242
        post api("/projects/#{project.id}/merge_requests", user),
243
        target_branch: 'master', source_branch: 'markdown'
244
        expect(response.status).to eq(400)
I
Izaak Alpert 已提交
245
      end
246

R
Robert Schilling 已提交
247
      it 'should return 400 on invalid label names' do
248 249
        post api("/projects/#{project.id}/merge_requests", user),
             title: 'Test merge_request',
250
             source_branch: 'markdown',
251 252 253
             target_branch: 'master',
             author: user,
             labels: 'label, ?'
254 255
        expect(response.status).to eq(400)
        expect(json_response['message']['labels']['?']['title']).to eq(
R
Robert Schilling 已提交
256
          ['is invalid']
257
        )
258
      end
J
jubianchi 已提交
259 260 261 262 263

      context 'with existing MR' do
        before do
          post api("/projects/#{project.id}/merge_requests", user),
               title: 'Test merge_request',
264
               source_branch: 'feature_conflict',
J
jubianchi 已提交
265 266 267 268 269 270 271 272 273
               target_branch: 'master',
               author: user
          @mr = MergeRequest.all.last
        end

        it 'should return 409 when MR already exists for source/target' do
          expect do
            post api("/projects/#{project.id}/merge_requests", user),
                 title: 'New test merge_request',
274
                 source_branch: 'feature_conflict',
J
jubianchi 已提交
275 276 277
                 target_branch: 'master',
                 author: user
          end.to change { MergeRequest.count }.by(0)
278
          expect(response.status).to eq(409)
J
jubianchi 已提交
279 280
        end
      end
281
    end
282

I
Izaak Alpert 已提交
283
    context 'forked projects' do
D
Dmitriy Zaporozhets 已提交
284 285 286
      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 已提交
287 288 289 290 291 292

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

      it "should return merge_request" do
H
Hiroyuki Sato 已提交
293
        post api("/projects/#{fork_project.id}/merge_requests", user2),
294 295
          title: 'Test merge_request', source_branch: "feature_conflict", target_branch: "master",
          author: user2, target_project_id: project.id, description: 'Test description for Test merge_request'
296 297 298
        expect(response.status).to eq(201)
        expect(json_response['title']).to eq('Test merge_request')
        expect(json_response['description']).to eq('Test description for Test merge_request')
I
Izaak Alpert 已提交
299 300 301
      end

      it "should not return 422 when source_branch equals target_branch" do
302 303 304
        expect(project.id).not_to eq(fork_project.id)
        expect(fork_project.forked?).to be_truthy
        expect(fork_project.forked_from_project).to eq(project)
H
Hiroyuki Sato 已提交
305
        post api("/projects/#{fork_project.id}/merge_requests", user2),
306
        title: 'Test merge_request', source_branch: "master", target_branch: "master", author: user2, target_project_id: project.id
307 308
        expect(response.status).to eq(201)
        expect(json_response['title']).to eq('Test merge_request')
I
Izaak Alpert 已提交
309 310 311
      end

      it "should return 400 when source_branch is missing" do
H
Hiroyuki Sato 已提交
312
        post api("/projects/#{fork_project.id}/merge_requests", user2),
313
        title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id
314
        expect(response.status).to eq(400)
I
Izaak Alpert 已提交
315 316 317
      end

      it "should return 400 when target_branch is missing" do
H
Hiroyuki Sato 已提交
318
        post api("/projects/#{fork_project.id}/merge_requests", user2),
319
        title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id
320
        expect(response.status).to eq(400)
I
Izaak Alpert 已提交
321 322 323
      end

      it "should return 400 when title is missing" do
H
Hiroyuki Sato 已提交
324
        post api("/projects/#{fork_project.id}/merge_requests", user2),
325
        target_branch: 'master', source_branch: 'markdown', author: user2, target_project_id: project.id
326
        expect(response.status).to eq(400)
I
Izaak Alpert 已提交
327 328
      end

J
jubianchi 已提交
329 330 331 332 333
      context 'when target_branch is specified' do
        it 'should return 422 if not a forked project' do
          post api("/projects/#{project.id}/merge_requests", user),
               title: 'Test merge_request',
               target_branch: 'master',
334
               source_branch: 'markdown',
J
jubianchi 已提交
335 336
               author: user,
               target_project_id: fork_project.id
337
          expect(response.status).to eq(422)
J
jubianchi 已提交
338
        end
I
Izaak Alpert 已提交
339

J
jubianchi 已提交
340 341 342 343
        it 'should return 422 if targeting a different fork' do
          post api("/projects/#{fork_project.id}/merge_requests", user2),
               title: 'Test merge_request',
               target_branch: 'master',
344
               source_branch: 'markdown',
J
jubianchi 已提交
345 346
               author: user2,
               target_project_id: unrelated_project.id
347
          expect(response.status).to eq(422)
J
jubianchi 已提交
348
        end
I
Izaak Alpert 已提交
349 350 351
      end

      it "should return 201 when target_branch is specified and for the same project" do
H
Hiroyuki Sato 已提交
352
        post api("/projects/#{fork_project.id}/merge_requests", user2),
353
        title: 'Test merge_request', target_branch: 'master', source_branch: 'markdown', author: user2, target_project_id: fork_project.id
354
        expect(response.status).to eq(201)
I
Izaak Alpert 已提交
355
      end
356
    end
V
Valeriy Sizov 已提交
357 358
  end

359 360 361
  describe "DELETE /projects/:id/merge_requests/:merge_request_id" do
    context "when the user is developer" do
      let(:developer) { create(:user) }
Z
Zeger-Jan van de Weg 已提交
362

363 364 365
      before do
        project.team << [developer, :developer]
      end
Z
Zeger-Jan van de Weg 已提交
366

367 368 369 370
      it "denies the deletion of the merge request" do
        delete api("/projects/#{project.id}/merge_requests/#{merge_request.id}", developer)
        expect(response.status).to be(403)
      end
Z
Zeger-Jan van de Weg 已提交
371
    end
372

373 374 375 376 377 378
    context "when the user is project owner" do
      it "destroys the merge request owners can destroy" do
        delete api("/projects/#{project.id}/merge_requests/#{merge_request.id}", user)

        expect(response.status).to eq(200)
      end
379
    end
Z
Zeger-Jan van de Weg 已提交
380 381
  end

382
  describe "PUT /projects/:id/merge_requests/:merge_request_id to close MR" do
A
Andrew8xx8 已提交
383
    it "should return merge_request" do
384
      put api("/projects/#{project.id}/merge_requests/#{merge_request.id}", user), state_event: "close"
385 386
      expect(response.status).to eq(200)
      expect(json_response['state']).to eq('closed')
A
Andrew8xx8 已提交
387 388 389
    end
  end

390
  describe "PUT /projects/:id/merge_requests/:merge_request_id/merge" do
Z
Zeger-Jan van de Weg 已提交
391
    let(:ci_commit) { create(:ci_commit_without_jobs) }
392

393
    it "should return merge_request in case of success" do
394
      put api("/projects/#{project.id}/merge_requests/#{merge_request.id}/merge", user)
395

396
      expect(response.status).to eq(200)
397 398
    end

399
    it "should return 406 if branch can't be merged" do
400 401 402
      allow_any_instance_of(MergeRequest).
        to receive(:can_be_merged?).and_return(false)

403
      put api("/projects/#{project.id}/merge_requests/#{merge_request.id}/merge", user)
404

405
      expect(response.status).to eq(406)
406
      expect(json_response['message']).to eq('Branch cannot be merged')
A
Andrew8xx8 已提交
407
    end
D
Dmitriy Zaporozhets 已提交
408 409 410

    it "should return 405 if merge_request is not open" do
      merge_request.close
411
      put api("/projects/#{project.id}/merge_requests/#{merge_request.id}/merge", user)
412 413
      expect(response.status).to eq(405)
      expect(json_response['message']).to eq('405 Method Not Allowed')
D
Dmitriy Zaporozhets 已提交
414 415
    end

416 417
    it "should return 405 if merge_request is a work in progress" do
      merge_request.update_attribute(:title, "WIP: #{merge_request.title}")
418
      put api("/projects/#{project.id}/merge_requests/#{merge_request.id}/merge", user)
419 420 421 422
      expect(response.status).to eq(405)
      expect(json_response['message']).to eq('405 Method Not Allowed')
    end

D
Dmitriy Zaporozhets 已提交
423 424 425
    it "should return 401 if user has no permissions to merge" do
      user2 = create(:user)
      project.team << [user2, :reporter]
426
      put api("/projects/#{project.id}/merge_requests/#{merge_request.id}/merge", user2)
427 428
      expect(response.status).to eq(401)
      expect(json_response['message']).to eq('401 Unauthorized')
D
Dmitriy Zaporozhets 已提交
429
    end
430 431 432 433 434

    it "enables merge when build succeeds if the ci is active" do
      allow_any_instance_of(MergeRequest).to receive(:ci_commit).and_return(ci_commit)
      allow(ci_commit).to receive(:active?).and_return(true)

435
      put api("/projects/#{project.id}/merge_requests/#{merge_request.id}/merge", user), merge_when_build_succeeds: true
436 437 438 439 440

      expect(response.status).to eq(200)
      expect(json_response['title']).to eq('Test')
      expect(json_response['merge_when_build_succeeds']).to eq(true)
    end
A
Andrew8xx8 已提交
441 442
  end

443
  describe "PUT /projects/:id/merge_requests/:merge_request_id" do
444
    it "updates title and returns merge_request" do
445
      put api("/projects/#{project.id}/merge_requests/#{merge_request.id}", user), title: "New title"
446 447
      expect(response.status).to eq(200)
      expect(json_response['title']).to eq('New title')
V
Valeriy Sizov 已提交
448
    end
449

450
    it "updates description and returns merge_request" do
451
      put api("/projects/#{project.id}/merge_requests/#{merge_request.id}", user), description: "New description"
452 453
      expect(response.status).to eq(200)
      expect(json_response['description']).to eq('New description')
454 455
    end

456 457 458 459 460 461
    it "updates milestone_id and returns merge_request" do
      put api("/projects/#{project.id}/merge_requests/#{merge_request.id}", user), milestone_id: milestone.id
      expect(response.status).to eq(200)
      expect(json_response['milestone']['id']).to eq(milestone.id)
    end

462
    it "should return 400 when source_branch is specified" do
463
      put api("/projects/#{project.id}/merge_requests/#{merge_request.id}", user),
464
      source_branch: "master", target_branch: "master"
465
      expect(response.status).to eq(400)
466 467 468
    end

    it "should return merge_request with renamed target_branch" do
469
      put api("/projects/#{project.id}/merge_requests/#{merge_request.id}", user), target_branch: "wiki"
470 471
      expect(response.status).to eq(200)
      expect(json_response['target_branch']).to eq('wiki')
472
    end
473

R
Robert Schilling 已提交
474
    it 'should return 400 on invalid label names' do
475
      put api("/projects/#{project.id}/merge_requests/#{merge_request.id}",
476 477 478
              user),
          title: 'new issue',
          labels: 'label, ?'
479 480
      expect(response.status).to eq(400)
      expect(json_response['message']['labels']['?']['title']).to eq(['is invalid'])
481
    end
V
Valeriy Sizov 已提交
482 483
  end

484
  describe "POST /projects/:id/merge_requests/:merge_request_id/comments" do
V
Valeriy Sizov 已提交
485
    it "should return comment" do
486 487
      original_count = merge_request.notes.size

488
      post api("/projects/#{project.id}/merge_requests/#{merge_request.id}/comments", user), note: "My comment"
489 490
      expect(response.status).to eq(201)
      expect(json_response['note']).to eq('My comment')
491 492 493
      expect(json_response['author']['name']).to eq(user.name)
      expect(json_response['author']['username']).to eq(user.username)
      expect(merge_request.notes.size).to eq(original_count + 1)
V
Valeriy Sizov 已提交
494
    end
495 496

    it "should return 400 if note is missing" do
497
      post api("/projects/#{project.id}/merge_requests/#{merge_request.id}/comments", user)
498
      expect(response.status).to eq(400)
499
    end
500 501

    it "should return 404 if note is attached to non existent merge request" do
502
      post api("/projects/#{project.id}/merge_requests/404/comments", user),
J
jubianchi 已提交
503
           note: 'My comment'
504
      expect(response.status).to eq(404)
505
    end
V
Valeriy Sizov 已提交
506
  end
507

508
  describe "GET :id/merge_requests/:merge_request_id/comments" do
509
    it "should return merge_request comments ordered by created_at" do
510
      get api("/projects/#{project.id}/merge_requests/#{merge_request.id}/comments", user)
511 512
      expect(response.status).to eq(200)
      expect(json_response).to be_an Array
513
      expect(json_response.length).to eq(2)
514 515
      expect(json_response.first['note']).to eq("a comment on a MR")
      expect(json_response.first['author']['id']).to eq(user.id)
516
      expect(json_response.last['note']).to eq("another comment on a MR")
517 518 519
    end

    it "should return a 404 error if merge_request_id not found" do
520
      get api("/projects/#{project.id}/merge_requests/999/comments", user)
521
      expect(response.status).to eq(404)
522 523
    end
  end
524

525 526 527 528 529 530
  describe 'GET :id/merge_requests/:merge_request_id/closes_issues' do
    it 'returns the issue that will be closed on merge' do
      issue = create(:issue, project: project)
      mr = merge_request.tap do |mr|
        mr.update_attribute(:description, "Closes #{issue.to_reference(mr.project)}")
      end
531

532
      get api("/projects/#{project.id}/merge_requests/#{mr.id}/closes_issues", user)
533 534 535 536 537 538
      expect(response.status).to eq(200)
      expect(json_response).to be_an Array
      expect(json_response.length).to eq(1)
      expect(json_response.first['id']).to eq(issue.id)
    end

539
    it 'returns an empty array when there are no issues to be closed' do
540 541 542 543 544 545 546
      get api("/projects/#{project.id}/merge_requests/#{merge_request.id}/closes_issues", user)
      expect(response.status).to eq(200)
      expect(json_response).to be_an Array
      expect(json_response.length).to eq(0)
    end
  end

547
  describe 'POST :id/merge_requests/:merge_request_id/subscription' do
548
    it 'subscribes to a merge request' do
549
      post api("/projects/#{project.id}/merge_requests/#{merge_request.id}/subscription", admin)
550 551 552 553 554 555

      expect(response.status).to eq(201)
      expect(json_response['subscribed']).to eq(true)
    end

    it 'returns 304 if already subscribed' do
556
      post api("/projects/#{project.id}/merge_requests/#{merge_request.id}/subscription", user)
557 558 559

      expect(response.status).to eq(304)
    end
560 561 562 563 564 565

    it 'returns 404 if the merge request is not found' do
      post api("/projects/#{project.id}/merge_requests/123/subscription", user)

      expect(response.status).to eq(404)
    end
566 567
  end

568
  describe 'DELETE :id/merge_requests/:merge_request_id/subscription' do
569
    it 'unsubscribes from a merge request' do
570
      delete api("/projects/#{project.id}/merge_requests/#{merge_request.id}/subscription", user)
571

572
      expect(response.status).to eq(200)
573 574 575 576
      expect(json_response['subscribed']).to eq(false)
    end

    it 'returns 304 if not subscribed' do
577
      delete api("/projects/#{project.id}/merge_requests/#{merge_request.id}/subscription", admin)
578 579 580

      expect(response.status).to eq(304)
    end
581 582 583 584 585 586

    it 'returns 404 if the merge request is not found' do
      post api("/projects/#{project.id}/merge_requests/123/subscription", user)

      expect(response.status).to eq(404)
    end
587 588
  end

589 590 591 592 593 594 595 596 597 598 599 600 601 602 603
  def mr_with_later_created_and_updated_at_time
    merge_request
    merge_request.created_at += 1.hour
    merge_request.updated_at += 30.minutes
    merge_request.save
    merge_request
  end

  def mr_with_earlier_created_and_updated_at_time
    merge_request_closed
    merge_request_closed.created_at -= 1.hour
    merge_request_closed.updated_at -= 30.minutes
    merge_request_closed.save
    merge_request_closed
  end
V
Valeriy Sizov 已提交
604
end