commits_spec.rb 23.8 KB
Newer Older
1 2 3
require 'spec_helper'
require 'mime/types'

4
describe API::Commits do
5 6
  let(:user) { create(:user) }
  let(:user2) { create(:user) }
7
  let!(:project) { create(:project, :repository, creator: user, namespace: user.namespace) }
8
  let!(:guest) { create(:project_member, :guest, user: user2, project: project) }
9
  let!(:note) { create(:note_on_commit, author: user, project: project, commit_id: project.repository.commit.id, note: 'a comment on a commit') }
10
  let!(:another_note) { create(:note_on_commit, author: user, project: project, commit_id: project.repository.commit.id, note: 'another comment on a commit') }
11

12 13 14
  before do
    project.team << [user, :reporter]
  end
15

M
Marc Siegfriedt 已提交
16
  describe "List repository commits" do
17
    context "authorized user" do
18 19 20
      before do
        project.team << [user2, :reporter]
      end
21

22
      it "returns project commits" do
23
        commit = project.repository.commit
24

25 26
        get api("/projects/#{project.id}/repository/commits", user)

27
        expect(response).to have_http_status(200)
28
        expect(json_response).to be_an Array
29 30 31
        expect(json_response.first['id']).to eq(commit.id)
        expect(json_response.first['committer_name']).to eq(commit.committer_name)
        expect(json_response.first['committer_email']).to eq(commit.committer_email)
32
      end
33 34 35 36 37 38 39 40 41 42

      it 'include correct pagination headers' do
        commit_count = project.repository.count_commits(ref: 'master').to_s

        get api("/projects/#{project.id}/repository/commits", user)

        expect(response).to include_pagination_headers
        expect(response.headers['X-Total']).to eq(commit_count)
        expect(response.headers['X-Page']).to eql('1')
      end
43 44 45
    end

    context "unauthorized user" do
46
      it "does not return project commits" do
47
        get api("/projects/#{project.id}/repository/commits")
Z
Z.J. van de Weg 已提交
48
        expect(response).to have_http_status(401)
49 50
      end
    end
51 52

    context "since optional parameter" do
53
      it "returns project commits since provided parameter" do
54
        commits = project.repository.commits("master")
55
        after = commits.second.created_at
56

57
        get api("/projects/#{project.id}/repository/commits?since=#{after.utc.iso8601}", user)
58 59 60 61 62

        expect(json_response.size).to eq 2
        expect(json_response.first["id"]).to eq(commits.first.id)
        expect(json_response.second["id"]).to eq(commits.second.id)
      end
63 64 65 66 67 68 69 70 71 72 73 74

      it 'include correct pagination headers' do
        commits = project.repository.commits("master")
        after = commits.second.created_at
        commit_count = project.repository.count_commits(ref: 'master', after: after).to_s

        get api("/projects/#{project.id}/repository/commits?since=#{after.utc.iso8601}", user)

        expect(response).to include_pagination_headers
        expect(response.headers['X-Total']).to eq(commit_count)
        expect(response.headers['X-Page']).to eql('1')
      end
75 76 77
    end

    context "until optional parameter" do
78
      it "returns project commits until provided parameter" do
79 80 81 82 83
        commits = project.repository.commits("master")
        before = commits.second.created_at

        get api("/projects/#{project.id}/repository/commits?until=#{before.utc.iso8601}", user)

84 85 86 87 88 89
        if commits.size >= 20
          expect(json_response.size).to eq(20)
        else
          expect(json_response.size).to eq(commits.size - 1)
        end

90 91 92
        expect(json_response.first["id"]).to eq(commits.second.id)
        expect(json_response.second["id"]).to eq(commits.third.id)
      end
93 94 95 96 97 98 99 100 101 102 103 104

      it 'include correct pagination headers' do
        commits = project.repository.commits("master")
        before = commits.second.created_at
        commit_count = project.repository.count_commits(ref: 'master', before: before).to_s

        get api("/projects/#{project.id}/repository/commits?until=#{before.utc.iso8601}", user)

        expect(response).to include_pagination_headers
        expect(response.headers['X-Total']).to eq(commit_count)
        expect(response.headers['X-Page']).to eql('1')
      end
105 106 107
    end

    context "invalid xmlschema date parameters" do
108
      it "returns an invalid parameter error message" do
109 110
        get api("/projects/#{project.id}/repository/commits?since=invalid-date", user)

Z
Z.J. van de Weg 已提交
111
        expect(response).to have_http_status(400)
112
        expect(json_response['error']).to eq('since is invalid')
113 114
      end
    end
L
Luis HGO 已提交
115 116 117 118

    context "path optional parameter" do
      it "returns project commits matching provided path parameter" do
        path = 'files/ruby/popen.rb'
119
        commit_count = project.repository.count_commits(ref: 'master', path: path).to_s
L
Luis HGO 已提交
120 121 122 123 124

        get api("/projects/#{project.id}/repository/commits?path=#{path}", user)

        expect(json_response.size).to eq(3)
        expect(json_response.first["id"]).to eq("570e7b2abdd848b95f2f578043fc23bd6f6fd24d")
125 126
        expect(response).to include_pagination_headers
        expect(response.headers['X-Total']).to eq(commit_count)
L
Luis HGO 已提交
127
      end
128

129 130 131 132 133 134 135 136 137 138 139
      it 'include correct pagination headers' do
        path = 'files/ruby/popen.rb'
        commit_count = project.repository.count_commits(ref: 'master', path: path).to_s

        get api("/projects/#{project.id}/repository/commits?path=#{path}", user)

        expect(response).to include_pagination_headers
        expect(response.headers['X-Total']).to eq(commit_count)
        expect(response.headers['X-Page']).to eql('1')
      end
    end
140

141 142
    context 'with pagination params' do
      let(:page) { 1 }
143 144 145 146 147 148
      let(:per_page) { 5 }
      let(:ref_name) { 'master' }
      let!(:request) do
        get api("/projects/#{project.id}/repository/commits?page=#{page}&per_page=#{per_page}&ref_name=#{ref_name}", user)
      end

149 150
      it 'returns correct headers' do
        commit_count = project.repository.count_commits(ref: ref_name).to_s
151

152
        expect(response).to include_pagination_headers
153
        expect(response.headers['X-Total']).to eq(commit_count)
154 155 156
        expect(response.headers['X-Page']).to eq('1')
        expect(response.headers['Link']).to match(/page=1&per_page=5/)
        expect(response.headers['Link']).to match(/page=2&per_page=5/)
157 158 159 160 161 162 163 164
      end

      context 'viewing the first page' do
        it 'returns the first 5 commits' do
          commit = project.repository.commit

          expect(json_response.size).to eq(per_page)
          expect(json_response.first['id']).to eq(commit.id)
165
          expect(response.headers['X-Page']).to eq('1')
166 167 168
        end
      end

169 170
      context 'viewing the third page' do
        let(:page) { 3 }
171

172 173
        it 'returns the third 5 commits' do
          commit = project.repository.commits('HEAD', offset: (page - 1) * per_page).first
174 175 176

          expect(json_response.size).to eq(per_page)
          expect(json_response.first['id']).to eq(commit.id)
177
          expect(response.headers['X-Page']).to eq('3')
178 179 180
        end
      end
    end
181 182
  end

183
  describe "POST /projects/:id/repository/commits" do
M
Marc Siegfriedt 已提交
184 185 186 187 188 189 190 191 192 193 194 195 196 197
    let!(:url) { "/projects/#{project.id}/repository/commits" }

    it 'returns a 403 unauthorized for user without permissions' do
      post api(url, user2)

      expect(response).to have_http_status(403)
    end

    it 'returns a 400 bad request if no params are given' do
      post api(url, user)

      expect(response).to have_http_status(400)
    end

198
    describe 'create' do
M
Marc Siegfriedt 已提交
199 200 201
      let(:message) { 'Created file' }
      let!(:invalid_c_params) do
        {
202
          branch: 'master',
M
Marc Siegfriedt 已提交
203 204 205 206 207 208 209 210 211 212 213 214
          commit_message: message,
          actions: [
            {
              action: 'create',
              file_path: 'files/ruby/popen.rb',
              content: 'puts 8'
            }
          ]
        }
      end
      let!(:valid_c_params) do
        {
215
          branch: 'master',
M
Marc Siegfriedt 已提交
216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
          commit_message: message,
          actions: [
            {
              action: 'create',
              file_path: 'foo/bar/baz.txt',
              content: 'puts 8'
            }
          ]
        }
      end

      it 'a new file in project repo' do
        post api(url, user), valid_c_params

        expect(response).to have_http_status(201)
        expect(json_response['title']).to eq(message)
232 233
        expect(json_response['committer_name']).to eq(user.name)
        expect(json_response['committer_email']).to eq(user.email)
M
Marc Siegfriedt 已提交
234 235 236 237 238 239 240
      end

      it 'returns a 400 bad request if file exists' do
        post api(url, user), invalid_c_params

        expect(response).to have_http_status(400)
      end
241

242 243
      context 'with project path containing a dot in URL' do
        let(:url) { "/projects/#{CGI.escape(project.full_path)}/repository/commits" }
244 245 246 247 248 249 250

        it 'a new file in project repo' do
          post api(url, user), valid_c_params

          expect(response).to have_http_status(201)
        end
      end
M
Marc Siegfriedt 已提交
251 252
    end

253
    describe 'delete' do
M
Marc Siegfriedt 已提交
254 255 256
      let(:message) { 'Deleted file' }
      let!(:invalid_d_params) do
        {
257
          branch: 'markdown',
M
Marc Siegfriedt 已提交
258 259 260 261 262 263 264 265 266 267 268
          commit_message: message,
          actions: [
            {
              action: 'delete',
              file_path: 'doc/api/projects.md'
            }
          ]
        }
      end
      let!(:valid_d_params) do
        {
269
          branch: 'markdown',
M
Marc Siegfriedt 已提交
270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293
          commit_message: message,
          actions: [
            {
              action: 'delete',
              file_path: 'doc/api/users.md'
            }
          ]
        }
      end

      it 'an existing file in project repo' do
        post api(url, user), valid_d_params

        expect(response).to have_http_status(201)
        expect(json_response['title']).to eq(message)
      end

      it 'returns a 400 bad request if file does not exist' do
        post api(url, user), invalid_d_params

        expect(response).to have_http_status(400)
      end
    end

294
    describe 'move' do
M
Marc Siegfriedt 已提交
295 296 297
      let(:message) { 'Moved file' }
      let!(:invalid_m_params) do
        {
298
          branch: 'feature',
M
Marc Siegfriedt 已提交
299 300 301 302 303 304 305 306 307 308 309 310 311
          commit_message: message,
          actions: [
            {
              action: 'move',
              file_path: 'CHANGELOG',
              previous_path: 'VERSION',
              content: '6.7.0.pre'
            }
          ]
        }
      end
      let!(:valid_m_params) do
        {
312
          branch: 'feature',
M
Marc Siegfriedt 已提交
313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338
          commit_message: message,
          actions: [
            {
              action: 'move',
              file_path: 'VERSION.txt',
              previous_path: 'VERSION',
              content: '6.7.0.pre'
            }
          ]
        }
      end

      it 'an existing file in project repo' do
        post api(url, user), valid_m_params

        expect(response).to have_http_status(201)
        expect(json_response['title']).to eq(message)
      end

      it 'returns a 400 bad request if file does not exist' do
        post api(url, user), invalid_m_params

        expect(response).to have_http_status(400)
      end
    end

339
    describe 'update' do
M
Marc Siegfriedt 已提交
340 341 342
      let(:message) { 'Updated file' }
      let!(:invalid_u_params) do
        {
343
          branch: 'master',
M
Marc Siegfriedt 已提交
344 345 346 347 348 349 350 351 352 353 354 355
          commit_message: message,
          actions: [
            {
              action: 'update',
              file_path: 'foo/bar.baz',
              content: 'puts 8'
            }
          ]
        }
      end
      let!(:valid_u_params) do
        {
356
          branch: 'master',
M
Marc Siegfriedt 已提交
357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381
          commit_message: message,
          actions: [
            {
              action: 'update',
              file_path: 'files/ruby/popen.rb',
              content: 'puts 8'
            }
          ]
        }
      end

      it 'an existing file in project repo' do
        post api(url, user), valid_u_params

        expect(response).to have_http_status(201)
        expect(json_response['title']).to eq(message)
      end

      it 'returns a 400 bad request if file does not exist' do
        post api(url, user), invalid_u_params

        expect(response).to have_http_status(400)
      end
    end

382
    describe 'multiple operations' do
M
Marc Siegfriedt 已提交
383 384 385
      let(:message) { 'Multiple actions' }
      let!(:invalid_mo_params) do
        {
386
          branch: 'master',
M
Marc Siegfriedt 已提交
387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413
          commit_message: message,
          actions: [
            {
              action: 'create',
              file_path: 'files/ruby/popen.rb',
              content: 'puts 8'
            },
            {
              action: 'delete',
              file_path: 'doc/api/projects.md'
            },
            {
              action: 'move',
              file_path: 'CHANGELOG',
              previous_path: 'VERSION',
              content: '6.7.0.pre'
            },
            {
              action: 'update',
              file_path: 'foo/bar.baz',
              content: 'puts 8'
            }
          ]
        }
      end
      let!(:valid_mo_params) do
        {
414
          branch: 'master',
M
Marc Siegfriedt 已提交
415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456
          commit_message: message,
          actions: [
            {
              action: 'create',
              file_path: 'foo/bar/baz.txt',
              content: 'puts 8'
            },
            {
              action: 'delete',
              file_path: 'Gemfile.zip'
            },
            {
              action: 'move',
              file_path: 'VERSION.txt',
              previous_path: 'VERSION',
              content: '6.7.0.pre'
            },
            {
              action: 'update',
              file_path: 'files/ruby/popen.rb',
              content: 'puts 8'
            }
          ]
        }
      end

      it 'are commited as one in project repo' do
        post api(url, user), valid_mo_params

        expect(response).to have_http_status(201)
        expect(json_response['title']).to eq(message)
      end

      it 'return a 400 bad request if there are any issues' do
        post api(url, user), invalid_mo_params

        expect(response).to have_http_status(400)
      end
    end
  end

  describe "Get a single commit" do
457
    context "authorized user" do
458
      it "returns a commit by sha" do
459
        get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}", user)
D
dixpac 已提交
460

Z
Z.J. van de Weg 已提交
461
        expect(response).to have_http_status(200)
462 463 464 465 466 467 468 469 470 471 472 473 474 475 476
        commit = project.repository.commit
        expect(json_response['id']).to eq(commit.id)
        expect(json_response['short_id']).to eq(commit.short_id)
        expect(json_response['title']).to eq(commit.title)
        expect(json_response['message']).to eq(commit.safe_message)
        expect(json_response['author_name']).to eq(commit.author_name)
        expect(json_response['author_email']).to eq(commit.author_email)
        expect(json_response['authored_date']).to eq(commit.authored_date.iso8601(3))
        expect(json_response['committer_name']).to eq(commit.committer_name)
        expect(json_response['committer_email']).to eq(commit.committer_email)
        expect(json_response['committed_date']).to eq(commit.committed_date.iso8601(3))
        expect(json_response['parent_ids']).to eq(commit.parent_ids)
        expect(json_response['stats']['additions']).to eq(commit.stats.additions)
        expect(json_response['stats']['deletions']).to eq(commit.stats.deletions)
        expect(json_response['stats']['total']).to eq(commit.stats.total)
477 478
      end

479
      it "returns a 404 error if not found" do
480
        get api("/projects/#{project.id}/repository/commits/invalid_sha", user)
Z
Z.J. van de Weg 已提交
481
        expect(response).to have_http_status(404)
482
      end
K
Kamil Trzcinski 已提交
483

484
      it "returns nil for commit without CI" do
K
Kamil Trzcinski 已提交
485
        get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}", user)
486

Z
Z.J. van de Weg 已提交
487
        expect(response).to have_http_status(200)
K
Kamil Trzcinski 已提交
488
        expect(json_response['status']).to be_nil
K
Kamil Trzcinski 已提交
489 490
      end

491
      it "returns status for CI" do
492
        pipeline = project.pipelines.create(source: :push, ref: 'master', sha: project.repository.commit.sha)
493 494
        pipeline.update(status: 'success')

K
Kamil Trzcinski 已提交
495
        get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}", user)
496

Z
Z.J. van de Weg 已提交
497
        expect(response).to have_http_status(200)
498
        expect(json_response['status']).to eq(pipeline.status)
K
Kamil Trzcinski 已提交
499
      end
500 501

      it "returns status for CI when pipeline is created" do
502
        project.pipelines.create(source: :push, ref: 'master', sha: project.repository.commit.sha)
503 504 505 506

        get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}", user)

        expect(response).to have_http_status(200)
507
        expect(json_response['status']).to eq("created")
508
      end
509 510 511
    end

    context "unauthorized user" do
512
      it "does not return the selected commit" do
513
        get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}")
Z
Z.J. van de Weg 已提交
514
        expect(response).to have_http_status(401)
515 516 517 518
      end
    end
  end

M
Marc Siegfriedt 已提交
519
  describe "Get the diff of a commit" do
520
    context "authorized user" do
521 522 523
      before do
        project.team << [user2, :reporter]
      end
524

525
      it "returns the diff of the selected commit" do
526
        get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/diff", user)
Z
Z.J. van de Weg 已提交
527
        expect(response).to have_http_status(200)
528

529 530 531
        expect(json_response).to be_an Array
        expect(json_response.length).to be >= 1
        expect(json_response.first.keys).to include "diff"
532 533
      end

534
      it "returns a 404 error if invalid commit" do
535
        get api("/projects/#{project.id}/repository/commits/invalid_sha/diff", user)
Z
Z.J. van de Weg 已提交
536
        expect(response).to have_http_status(404)
537 538 539 540
      end
    end

    context "unauthorized user" do
541
      it "does not return the diff of the selected commit" do
542
        get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/diff")
Z
Z.J. van de Weg 已提交
543
        expect(response).to have_http_status(401)
544 545 546
      end
    end
  end
547

M
Marc Siegfriedt 已提交
548
  describe 'Get the comments of a commit' do
549
    context 'authorized user' do
550
      it 'returns merge_request comments' do
551
        get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/comments", user)
Z
Z.J. van de Weg 已提交
552
        expect(response).to have_http_status(200)
553
        expect(response).to include_pagination_headers
554
        expect(json_response).to be_an Array
555
        expect(json_response.length).to eq(2)
556 557
        expect(json_response.first['note']).to eq('a comment on a commit')
        expect(json_response.first['author']['id']).to eq(user.id)
558 559
      end

560
      it 'returns a 404 error if merge_request_id not found' do
561
        get api("/projects/#{project.id}/repository/commits/1234ab/comments", user)
Z
Z.J. van de Weg 已提交
562
        expect(response).to have_http_status(404)
563 564 565 566
      end
    end

    context 'unauthorized user' do
567
      it 'does not return the diff of the selected commit' do
568
        get api("/projects/#{project.id}/repository/commits/1234ab/comments")
Z
Z.J. van de Weg 已提交
569
        expect(response).to have_http_status(401)
570 571
      end
    end
572 573 574 575 576 577 578 579 580 581 582 583 584 585

    context 'when the commit is present on two projects' do
      let(:forked_project) { create(:project, :repository, creator: user2, namespace: user2.namespace) }
      let!(:forked_project_note) { create(:note_on_commit, author: user2, project: forked_project, commit_id: forked_project.repository.commit.id, note: 'a comment on a commit for fork') }

      it 'returns the comments for the target project' do
        get api("/projects/#{forked_project.id}/repository/commits/#{forked_project.repository.commit.id}/comments", user2)

        expect(response).to have_http_status(200)
        expect(json_response.length).to eq(1)
        expect(json_response.first['note']).to eq('a comment on a commit for fork')
        expect(json_response.first['author']['id']).to eq(user2.id)
      end
    end
586 587
  end

588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605
  describe 'POST :id/repository/commits/:sha/cherry_pick' do
    let(:master_pickable_commit)  { project.commit('7d3b0f7cff5f37573aea97cebfd5692ea1689924') }

    context 'authorized user' do
      it 'cherry picks a commit' do
        post api("/projects/#{project.id}/repository/commits/#{master_pickable_commit.id}/cherry_pick", user), branch: 'master'

        expect(response).to have_http_status(201)
        expect(json_response['title']).to eq(master_pickable_commit.title)
        expect(json_response['message']).to eq(master_pickable_commit.message)
        expect(json_response['author_name']).to eq(master_pickable_commit.author_name)
        expect(json_response['committer_name']).to eq(user.name)
      end

      it 'returns 400 if commit is already included in the target branch' do
        post api("/projects/#{project.id}/repository/commits/#{master_pickable_commit.id}/cherry_pick", user), branch: 'markdown'

        expect(response).to have_http_status(400)
D
Douwe Maan 已提交
606
        expect(json_response['message']).to include('Sorry, we cannot cherry-pick this commit automatically.')
607 608 609 610 611 612
      end

      it 'returns 400 if you are not allowed to push to the target branch' do
        project.team << [user2, :developer]
        protected_branch = create(:protected_branch, project: project, name: 'feature')

R
Robert Schilling 已提交
613
        post api("/projects/#{project.id}/repository/commits/#{master_pickable_commit.id}/cherry_pick", user2), branch: protected_branch.name
614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656

        expect(response).to have_http_status(400)
        expect(json_response['message']).to eq('You are not allowed to push into this branch')
      end

      it 'returns 400 for missing parameters' do
        post api("/projects/#{project.id}/repository/commits/#{master_pickable_commit.id}/cherry_pick", user)

        expect(response).to have_http_status(400)
        expect(json_response['error']).to eq('branch is missing')
      end

      it 'returns 404 if commit is not found' do
        post api("/projects/#{project.id}/repository/commits/abcd0123/cherry_pick", user), branch: 'master'

        expect(response).to have_http_status(404)
        expect(json_response['message']).to eq('404 Commit Not Found')
      end

      it 'returns 404 if branch is not found' do
        post api("/projects/#{project.id}/repository/commits/#{master_pickable_commit.id}/cherry_pick", user), branch: 'foo'

        expect(response).to have_http_status(404)
        expect(json_response['message']).to eq('404 Branch Not Found')
      end

      it 'returns 400 for missing parameters' do
        post api("/projects/#{project.id}/repository/commits/#{master_pickable_commit.id}/cherry_pick", user)

        expect(response).to have_http_status(400)
        expect(json_response['error']).to eq('branch is missing')
      end
    end

    context 'unauthorized user' do
      it 'does not cherry pick the commit' do
        post api("/projects/#{project.id}/repository/commits/#{master_pickable_commit.id}/cherry_pick"), branch: 'master'

        expect(response).to have_http_status(401)
      end
    end
  end

M
Marc Siegfriedt 已提交
657
  describe 'Post comment to commit' do
658
    context 'authorized user' do
659
      it 'returns comment' do
660
        post api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/comments", user), note: 'My comment'
Z
Z.J. van de Weg 已提交
661
        expect(response).to have_http_status(201)
662 663 664 665
        expect(json_response['note']).to eq('My comment')
        expect(json_response['path']).to be_nil
        expect(json_response['line']).to be_nil
        expect(json_response['line_type']).to be_nil
666 667
      end

668
      it 'returns the inline comment' do
669 670
        post api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/comments", user), note: 'My comment', path: project.repository.commit.raw_diffs.first.new_path, line: 1, line_type: 'new'

Z
Z.J. van de Weg 已提交
671
        expect(response).to have_http_status(201)
672
        expect(json_response['note']).to eq('My comment')
673
        expect(json_response['path']).to eq(project.repository.commit.raw_diffs.first.new_path)
674
        expect(json_response['line']).to eq(1)
675
        expect(json_response['line_type']).to eq('new')
676 677
      end

678
      it 'returns 400 if note is missing' do
679
        post api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/comments", user)
Z
Z.J. van de Weg 已提交
680
        expect(response).to have_http_status(400)
681 682
      end

683
      it 'returns 404 if note is attached to non existent commit' do
684
        post api("/projects/#{project.id}/repository/commits/1234ab/comments", user), note: 'My comment'
Z
Z.J. van de Weg 已提交
685
        expect(response).to have_http_status(404)
686 687 688 689
      end
    end

    context 'unauthorized user' do
690
      it 'does not return the diff of the selected commit' do
691
        post api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/comments")
Z
Z.J. van de Weg 已提交
692
        expect(response).to have_http_status(401)
693 694 695
      end
    end
  end
696
end