merge_requests_spec.rb 22.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
V
Valeriy Sizov 已提交
116
    it "should return merge_request" do
117
      get api("/projects/#{project.id}/merge_requests/#{merge_request.id}", user)
118 119 120
      expect(response.status).to eq(200)
      expect(json_response['title']).to eq(merge_request.title)
      expect(json_response['iid']).to eq(merge_request.iid)
121
      expect(json_response['work_in_progress']).to eq(false)
122
      expect(json_response['merge_status']).to eq('can_be_merged')
V
Valeriy Sizov 已提交
123
    end
124

125 126 127
    it 'should return merge_request by iid' do
      url = "/projects/#{project.id}/merge_requests?iid=#{merge_request.iid}"
      get api(url, user)
128 129 130
      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
131 132
    end

133
    it "should return a 404 error if merge_request_id not found" do
134
      get api("/projects/#{project.id}/merge_requests/999", user)
135
      expect(response.status).to eq(404)
136
    end
137 138 139 140 141 142 143 144 145 146

    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 已提交
147 148
  end

149
  describe 'GET /projects/:id/merge_requests/:merge_request_id/commits' do
150
    context 'valid merge request' do
151
      before { get api("/projects/#{project.id}/merge_requests/#{merge_request.id}/commits", user) }
152 153 154 155 156 157 158 159 160
      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
161
      get api("/projects/#{project.id}/merge_requests/999/commits", user)
162 163 164 165
      expect(response.status).to eq(404)
    end
  end

166
  describe 'GET /projects/:id/merge_requests/:merge_request_id/changes' do
167
    it 'should return the change information of the merge_request' do
168
      get api("/projects/#{project.id}/merge_requests/#{merge_request.id}/changes", user)
169 170 171 172 173
      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
174
      get api("/projects/#{project.id}/merge_requests/999/changes", user)
175 176 177 178
      expect(response.status).to eq(404)
    end
  end

V
Valeriy Sizov 已提交
179
  describe "POST /projects/:id/merge_requests" do
I
Izaak Alpert 已提交
180 181
    context 'between branches projects' do
      it "should return merge_request" do
H
Hiroyuki Sato 已提交
182
        post api("/projects/#{project.id}/merge_requests", user),
183
             title: 'Test merge_request',
184
             source_branch: 'feature_conflict',
185 186
             target_branch: 'master',
             author: user,
187 188
             labels: 'label, label2',
             milestone_id: milestone.id
189 190 191
        expect(response.status).to eq(201)
        expect(json_response['title']).to eq('Test merge_request')
        expect(json_response['labels']).to eq(['label', 'label2'])
192
        expect(json_response['milestone']['id']).to eq(milestone.id)
I
Izaak Alpert 已提交
193
      end
194

I
Izaak Alpert 已提交
195
      it "should return 422 when source_branch equals target_branch" do
H
Hiroyuki Sato 已提交
196
        post api("/projects/#{project.id}/merge_requests", user),
197
        title: "Test merge_request", source_branch: "master", target_branch: "master", author: user
198
        expect(response.status).to eq(422)
I
Izaak Alpert 已提交
199
      end
200

I
Izaak Alpert 已提交
201
      it "should return 400 when source_branch is missing" do
H
Hiroyuki Sato 已提交
202
        post api("/projects/#{project.id}/merge_requests", user),
203
        title: "Test merge_request", target_branch: "master", author: user
204
        expect(response.status).to eq(400)
I
Izaak Alpert 已提交
205
      end
206

I
Izaak Alpert 已提交
207
      it "should return 400 when target_branch is missing" do
H
Hiroyuki Sato 已提交
208
        post api("/projects/#{project.id}/merge_requests", user),
209
        title: "Test merge_request", source_branch: "markdown", author: user
210
        expect(response.status).to eq(400)
I
Izaak Alpert 已提交
211 212 213
      end

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

R
Robert Schilling 已提交
219
      it 'should return 400 on invalid label names' do
220 221
        post api("/projects/#{project.id}/merge_requests", user),
             title: 'Test merge_request',
222
             source_branch: 'markdown',
223 224 225
             target_branch: 'master',
             author: user,
             labels: 'label, ?'
226 227
        expect(response.status).to eq(400)
        expect(json_response['message']['labels']['?']['title']).to eq(
R
Robert Schilling 已提交
228
          ['is invalid']
229
        )
230
      end
J
jubianchi 已提交
231 232 233 234 235

      context 'with existing MR' do
        before do
          post api("/projects/#{project.id}/merge_requests", user),
               title: 'Test merge_request',
236
               source_branch: 'feature_conflict',
J
jubianchi 已提交
237 238 239 240 241 242 243 244 245
               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',
246
                 source_branch: 'feature_conflict',
J
jubianchi 已提交
247 248 249
                 target_branch: 'master',
                 author: user
          end.to change { MergeRequest.count }.by(0)
250
          expect(response.status).to eq(409)
J
jubianchi 已提交
251 252
        end
      end
253
    end
254

I
Izaak Alpert 已提交
255
    context 'forked projects' do
D
Dmitriy Zaporozhets 已提交
256 257 258
      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 已提交
259 260 261 262 263 264

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

      it "should return merge_request" do
H
Hiroyuki Sato 已提交
265
        post api("/projects/#{fork_project.id}/merge_requests", user2),
266 267
          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'
268 269 270
        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 已提交
271 272 273
      end

      it "should not return 422 when source_branch equals target_branch" do
274 275 276
        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 已提交
277
        post api("/projects/#{fork_project.id}/merge_requests", user2),
278
        title: 'Test merge_request', source_branch: "master", target_branch: "master", author: user2, target_project_id: project.id
279 280
        expect(response.status).to eq(201)
        expect(json_response['title']).to eq('Test merge_request')
I
Izaak Alpert 已提交
281 282 283
      end

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

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

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

J
jubianchi 已提交
301 302 303 304 305
      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',
306
               source_branch: 'markdown',
J
jubianchi 已提交
307 308
               author: user,
               target_project_id: fork_project.id
309
          expect(response.status).to eq(422)
J
jubianchi 已提交
310
        end
I
Izaak Alpert 已提交
311

J
jubianchi 已提交
312 313 314 315
        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',
316
               source_branch: 'markdown',
J
jubianchi 已提交
317 318
               author: user2,
               target_project_id: unrelated_project.id
319
          expect(response.status).to eq(422)
J
jubianchi 已提交
320
        end
I
Izaak Alpert 已提交
321 322 323
      end

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

331 332 333
  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 已提交
334

335 336 337
      before do
        project.team << [developer, :developer]
      end
Z
Zeger-Jan van de Weg 已提交
338

339 340 341 342
      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 已提交
343
    end
344

345 346 347 348 349 350
    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
351
    end
Z
Zeger-Jan van de Weg 已提交
352 353
  end

354
  describe "PUT /projects/:id/merge_requests/:merge_request_id to close MR" do
A
Andrew8xx8 已提交
355
    it "should return merge_request" do
356
      put api("/projects/#{project.id}/merge_requests/#{merge_request.id}", user), state_event: "close"
357 358
      expect(response.status).to eq(200)
      expect(json_response['state']).to eq('closed')
A
Andrew8xx8 已提交
359 360 361
    end
  end

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

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

368
      expect(response.status).to eq(200)
369 370
    end

371
    it "should return 406 if branch can't be merged" do
372 373 374
      allow_any_instance_of(MergeRequest).
        to receive(:can_be_merged?).and_return(false)

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

377
      expect(response.status).to eq(406)
378
      expect(json_response['message']).to eq('Branch cannot be merged')
A
Andrew8xx8 已提交
379
    end
D
Dmitriy Zaporozhets 已提交
380 381 382

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

388 389
    it "should return 405 if merge_request is a work in progress" do
      merge_request.update_attribute(:title, "WIP: #{merge_request.title}")
390
      put api("/projects/#{project.id}/merge_requests/#{merge_request.id}/merge", user)
391 392 393 394
      expect(response.status).to eq(405)
      expect(json_response['message']).to eq('405 Method Not Allowed')
    end

D
Dmitriy Zaporozhets 已提交
395 396 397
    it "should return 401 if user has no permissions to merge" do
      user2 = create(:user)
      project.team << [user2, :reporter]
398
      put api("/projects/#{project.id}/merge_requests/#{merge_request.id}/merge", user2)
399 400
      expect(response.status).to eq(401)
      expect(json_response['message']).to eq('401 Unauthorized')
D
Dmitriy Zaporozhets 已提交
401
    end
402 403 404 405 406

    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)

407
      put api("/projects/#{project.id}/merge_requests/#{merge_request.id}/merge", user), merge_when_build_succeeds: true
408 409 410 411 412

      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 已提交
413 414
  end

415
  describe "PUT /projects/:id/merge_requests/:merge_request_id" do
416
    it "updates title and returns merge_request" do
417
      put api("/projects/#{project.id}/merge_requests/#{merge_request.id}", user), title: "New title"
418 419
      expect(response.status).to eq(200)
      expect(json_response['title']).to eq('New title')
V
Valeriy Sizov 已提交
420
    end
421

422
    it "updates description and returns merge_request" do
423
      put api("/projects/#{project.id}/merge_requests/#{merge_request.id}", user), description: "New description"
424 425
      expect(response.status).to eq(200)
      expect(json_response['description']).to eq('New description')
426 427
    end

428 429 430 431 432 433
    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

434
    it "should return 400 when source_branch is specified" do
435
      put api("/projects/#{project.id}/merge_requests/#{merge_request.id}", user),
436
      source_branch: "master", target_branch: "master"
437
      expect(response.status).to eq(400)
438 439 440
    end

    it "should return merge_request with renamed target_branch" do
441
      put api("/projects/#{project.id}/merge_requests/#{merge_request.id}", user), target_branch: "wiki"
442 443
      expect(response.status).to eq(200)
      expect(json_response['target_branch']).to eq('wiki')
444
    end
445

R
Robert Schilling 已提交
446
    it 'should return 400 on invalid label names' do
447
      put api("/projects/#{project.id}/merge_requests/#{merge_request.id}",
448 449 450
              user),
          title: 'new issue',
          labels: 'label, ?'
451 452
      expect(response.status).to eq(400)
      expect(json_response['message']['labels']['?']['title']).to eq(['is invalid'])
453
    end
V
Valeriy Sizov 已提交
454 455
  end

456
  describe "POST /projects/:id/merge_requests/:merge_request_id/comments" do
V
Valeriy Sizov 已提交
457
    it "should return comment" do
458 459
      original_count = merge_request.notes.size

460
      post api("/projects/#{project.id}/merge_requests/#{merge_request.id}/comments", user), note: "My comment"
461 462
      expect(response.status).to eq(201)
      expect(json_response['note']).to eq('My comment')
463 464 465
      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 已提交
466
    end
467 468

    it "should return 400 if note is missing" do
469
      post api("/projects/#{project.id}/merge_requests/#{merge_request.id}/comments", user)
470
      expect(response.status).to eq(400)
471
    end
472 473

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

480
  describe "GET :id/merge_requests/:merge_request_id/comments" do
481
    it "should return merge_request comments ordered by created_at" do
482
      get api("/projects/#{project.id}/merge_requests/#{merge_request.id}/comments", user)
483 484
      expect(response.status).to eq(200)
      expect(json_response).to be_an Array
485
      expect(json_response.length).to eq(2)
486 487
      expect(json_response.first['note']).to eq("a comment on a MR")
      expect(json_response.first['author']['id']).to eq(user.id)
488
      expect(json_response.last['note']).to eq("another comment on a MR")
489 490 491
    end

    it "should return a 404 error if merge_request_id not found" do
492
      get api("/projects/#{project.id}/merge_requests/999/comments", user)
493
      expect(response.status).to eq(404)
494 495
    end
  end
496

497 498 499 500 501 502
  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
503

504
      get api("/projects/#{project.id}/merge_requests/#{mr.id}/closes_issues", user)
505 506 507 508 509 510
      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

511
    it 'returns an empty array when there are no issues to be closed' do
512 513 514 515 516 517 518
      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

519 520 521 522 523 524 525 526 527 528 529 530 531 532 533
  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 已提交
534
end