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

  before { project.team << [user, :reporter] }

M
Marc Siegfriedt 已提交
14
  describe "List repository commits" do
15 16 17
    context "authorized user" do
      before { project.team << [user2, :reporter] }

18
      it "returns project commits" do
19
        commit = project.repository.commit
20

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

23
        expect(response).to have_http_status(200)
24
        expect(json_response).to be_an Array
25 26 27
        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)
28
      end
29 30 31 32 33 34 35 36 37 38

      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
39 40 41
    end

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

    context "since optional parameter" do
49
      it "returns project commits since provided parameter" do
50
        commits = project.repository.commits("master")
51
        after = commits.second.created_at
52

53
        get api("/projects/#{project.id}/repository/commits?since=#{after.utc.iso8601}", user)
54 55 56 57 58

        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
59 60 61 62 63 64 65 66 67 68 69 70

      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
71 72 73
    end

    context "until optional parameter" do
74
      it "returns project commits until provided parameter" do
75 76 77 78 79
        commits = project.repository.commits("master")
        before = commits.second.created_at

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

80 81 82 83 84 85
        if commits.size >= 20
          expect(json_response.size).to eq(20)
        else
          expect(json_response.size).to eq(commits.size - 1)
        end

86 87 88
        expect(json_response.first["id"]).to eq(commits.second.id)
        expect(json_response.second["id"]).to eq(commits.third.id)
      end
89 90 91 92 93 94 95 96 97 98 99 100

      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
101 102 103
    end

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

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

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

        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")
121 122
        expect(response).to include_pagination_headers
        expect(response.headers['X-Total']).to eq(commit_count)
L
Luis HGO 已提交
123
      end
124

125 126 127 128 129 130 131 132 133 134 135
      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
136

137 138
    context 'with pagination params' do
      let(:page) { 1 }
139 140 141 142 143 144
      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

145 146
      it 'returns correct headers' do
        commit_count = project.repository.count_commits(ref: ref_name).to_s
147

148
        expect(response).to include_pagination_headers
149
        expect(response.headers['X-Total']).to eq(commit_count)
150 151 152
        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/)
153 154 155 156 157 158 159 160
      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)
161
          expect(response.headers['X-Page']).to eq('1')
162 163 164
        end
      end

165 166
      context 'viewing the third page' do
        let(:page) { 3 }
167

168 169
        it 'returns the third 5 commits' do
          commit = project.repository.commits('HEAD', offset: (page - 1) * per_page).first
170 171 172

          expect(json_response.size).to eq(per_page)
          expect(json_response.first['id']).to eq(commit.id)
173
          expect(response.headers['X-Page']).to eq('3')
174 175 176
        end
      end
    end
177 178
  end

179
  describe "POST /projects/:id/repository/commits" do
M
Marc Siegfriedt 已提交
180 181 182 183 184 185 186 187 188 189 190 191 192 193
    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

194
    describe 'create' do
M
Marc Siegfriedt 已提交
195 196 197
      let(:message) { 'Created file' }
      let!(:invalid_c_params) do
        {
198
          branch: 'master',
M
Marc Siegfriedt 已提交
199 200 201 202 203 204 205 206 207 208 209 210
          commit_message: message,
          actions: [
            {
              action: 'create',
              file_path: 'files/ruby/popen.rb',
              content: 'puts 8'
            }
          ]
        }
      end
      let!(:valid_c_params) do
        {
211
          branch: 'master',
M
Marc Siegfriedt 已提交
212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
          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)
228 229
        expect(json_response['committer_name']).to eq(user.name)
        expect(json_response['committer_email']).to eq(user.email)
M
Marc Siegfriedt 已提交
230 231 232 233 234 235 236
      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
237

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

        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 已提交
247 248
    end

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

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

335
    describe 'update' do
M
Marc Siegfriedt 已提交
336 337 338
      let(:message) { 'Updated file' }
      let!(:invalid_u_params) do
        {
339
          branch: 'master',
M
Marc Siegfriedt 已提交
340 341 342 343 344 345 346 347 348 349 350 351
          commit_message: message,
          actions: [
            {
              action: 'update',
              file_path: 'foo/bar.baz',
              content: 'puts 8'
            }
          ]
        }
      end
      let!(:valid_u_params) do
        {
352
          branch: 'master',
M
Marc Siegfriedt 已提交
353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377
          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

378
    describe 'multiple operations' do
M
Marc Siegfriedt 已提交
379 380 381
      let(:message) { 'Multiple actions' }
      let!(:invalid_mo_params) do
        {
382
          branch: 'master',
M
Marc Siegfriedt 已提交
383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409
          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
        {
410
          branch: 'master',
M
Marc Siegfriedt 已提交
411 412 413 414 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
          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
453
    context "authorized user" do
454
      it "returns a commit by sha" do
455
        get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}", user)
D
dixpac 已提交
456

Z
Z.J. van de Weg 已提交
457
        expect(response).to have_http_status(200)
458 459 460 461 462 463 464 465 466 467 468 469 470 471 472
        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)
473 474
      end

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

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

Z
Z.J. van de Weg 已提交
483
        expect(response).to have_http_status(200)
K
Kamil Trzcinski 已提交
484
        expect(json_response['status']).to be_nil
K
Kamil Trzcinski 已提交
485 486
      end

487
      it "returns status for CI" do
488
        pipeline = project.pipelines.create(source: :push, ref: 'master', sha: project.repository.commit.sha)
489 490
        pipeline.update(status: 'success')

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

Z
Z.J. van de Weg 已提交
493
        expect(response).to have_http_status(200)
494
        expect(json_response['status']).to eq(pipeline.status)
K
Kamil Trzcinski 已提交
495
      end
496 497

      it "returns status for CI when pipeline is created" do
498
        project.pipelines.create(source: :push, ref: 'master', sha: project.repository.commit.sha)
499 500 501 502

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

        expect(response).to have_http_status(200)
503
        expect(json_response['status']).to eq("created")
504
      end
505 506 507
    end

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

M
Marc Siegfriedt 已提交
515
  describe "Get the diff of a commit" do
516 517 518
    context "authorized user" do
      before { project.team << [user2, :reporter] }

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

523 524 525
        expect(json_response).to be_an Array
        expect(json_response.length).to be >= 1
        expect(json_response.first.keys).to include "diff"
526 527
      end

528
      it "returns a 404 error if invalid commit" do
529
        get api("/projects/#{project.id}/repository/commits/invalid_sha/diff", user)
Z
Z.J. van de Weg 已提交
530
        expect(response).to have_http_status(404)
531 532 533 534
      end
    end

    context "unauthorized user" do
535
      it "does not return the diff of the selected commit" do
536
        get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/diff")
Z
Z.J. van de Weg 已提交
537
        expect(response).to have_http_status(401)
538 539 540
      end
    end
  end
541

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

554
      it 'returns a 404 error if merge_request_id not found' do
555
        get api("/projects/#{project.id}/repository/commits/1234ab/comments", user)
Z
Z.J. van de Weg 已提交
556
        expect(response).to have_http_status(404)
557 558 559 560
      end
    end

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

    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
580 581
  end

582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599
  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 已提交
600
        expect(json_response['message']).to include('Sorry, we cannot cherry-pick this commit automatically.')
601 602 603 604 605 606
      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 已提交
607
        post api("/projects/#{project.id}/repository/commits/#{master_pickable_commit.id}/cherry_pick", user2), branch: protected_branch.name
608 609 610 611 612 613 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

        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 已提交
651
  describe 'Post comment to commit' do
652
    context 'authorized user' do
653
      it 'returns comment' do
654
        post api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/comments", user), note: 'My comment'
Z
Z.J. van de Weg 已提交
655
        expect(response).to have_http_status(201)
656 657 658 659
        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
660 661
      end

662
      it 'returns the inline comment' do
663 664
        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 已提交
665
        expect(response).to have_http_status(201)
666
        expect(json_response['note']).to eq('My comment')
667
        expect(json_response['path']).to eq(project.repository.commit.raw_diffs.first.new_path)
668
        expect(json_response['line']).to eq(1)
669
        expect(json_response['line_type']).to eq('new')
670 671
      end

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

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

    context 'unauthorized user' do
684
      it 'does not return the diff of the selected commit' do
685
        post api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/comments")
Z
Z.J. van de Weg 已提交
686
        expect(response).to have_http_status(401)
687 688 689
      end
    end
  end
690
end