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

J
Jeroen van Baarsen 已提交
4
describe API::API, api: true  do
5 6 7 8
  include ApiHelpers
  let(:user) { create(:user) }
  let(:user2) { create(:user) }
  let!(:project) { create(:project, creator_id: user.id) }
9 10
  let!(:master) { create(:project_member, :master, user: user, project: project) }
  let!(:guest) { create(:project_member, :guest, user: user2, project: project) }
11
  let!(:note) { create(:note_on_commit, author: user, project: project, commit_id: project.repository.commit.id, note: 'a comment on a commit') }
12
  let!(:another_note) { create(:note_on_commit, author: user, project: project, commit_id: project.repository.commit.id, note: 'another comment on a commit') }
13 14 15 16 17 18 19

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

  describe "GET /projects/:id/repository/commits" do
    context "authorized user" do
      before { project.team << [user2, :reporter] }

20
      it "returns project commits" do
21
        get api("/projects/#{project.id}/repository/commits", user)
Z
Z.J. van de Weg 已提交
22
        expect(response).to have_http_status(200)
23

24 25
        expect(json_response).to be_an Array
        expect(json_response.first['id']).to eq(project.repository.commit.id)
26 27 28 29
      end
    end

    context "unauthorized user" do
30
      it "does not return project commits" do
31
        get api("/projects/#{project.id}/repository/commits")
Z
Z.J. van de Weg 已提交
32
        expect(response).to have_http_status(401)
33 34
      end
    end
35 36

    context "since optional parameter" do
37
      it "returns project commits since provided parameter" do
38 39 40 41 42 43 44 45 46 47 48 49
        commits = project.repository.commits("master")
        since = commits.second.created_at

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

        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
    end

    context "until optional parameter" do
50
      it "returns project commits until provided parameter" do
51 52 53 54 55 56 57 58 59 60 61 62
        commits = project.repository.commits("master")
        before = commits.second.created_at

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

        expect(json_response.size).to eq(commits.size - 1)
        expect(json_response.first["id"]).to eq(commits.second.id)
        expect(json_response.second["id"]).to eq(commits.third.id)
      end
    end

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

Z
Z.J. van de Weg 已提交
66
        expect(response).to have_http_status(400)
67 68 69
        expect(json_response['message']).to include "\"since\" must be a timestamp in ISO 8601 format"
      end
    end
70 71 72 73
  end

  describe "GET /projects:id/repository/commits/:sha" do
    context "authorized user" do
74
      it "returns a commit by sha" do
75
        get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}", user)
D
dixpac 已提交
76

Z
Z.J. van de Weg 已提交
77
        expect(response).to have_http_status(200)
78 79
        expect(json_response['id']).to eq(project.repository.commit.id)
        expect(json_response['title']).to eq(project.repository.commit.title)
D
dixpac 已提交
80 81 82
        expect(json_response['stats']['additions']).to eq(project.repository.commit.stats.additions)
        expect(json_response['stats']['deletions']).to eq(project.repository.commit.stats.deletions)
        expect(json_response['stats']['total']).to eq(project.repository.commit.stats.total)
83 84
      end

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

90
      it "returns nil for commit without CI" do
K
Kamil Trzcinski 已提交
91
        get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}", user)
Z
Z.J. van de Weg 已提交
92
        expect(response).to have_http_status(200)
K
Kamil Trzcinski 已提交
93
        expect(json_response['status']).to be_nil
K
Kamil Trzcinski 已提交
94 95
      end

96
      it "returns status for CI" do
97
        pipeline = project.ensure_pipeline(project.repository.commit.sha, 'master')
K
Kamil Trzcinski 已提交
98
        get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}", user)
Z
Z.J. van de Weg 已提交
99
        expect(response).to have_http_status(200)
100
        expect(json_response['status']).to eq(pipeline.status)
K
Kamil Trzcinski 已提交
101
      end
102 103 104
    end

    context "unauthorized user" do
105
      it "does not return the selected commit" do
106
        get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}")
Z
Z.J. van de Weg 已提交
107
        expect(response).to have_http_status(401)
108 109 110 111 112 113 114 115
      end
    end
  end

  describe "GET /projects:id/repository/commits/:sha/diff" do
    context "authorized user" do
      before { project.team << [user2, :reporter] }

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

120 121 122
        expect(json_response).to be_an Array
        expect(json_response.length).to be >= 1
        expect(json_response.first.keys).to include "diff"
123 124
      end

125
      it "returns a 404 error if invalid commit" do
126
        get api("/projects/#{project.id}/repository/commits/invalid_sha/diff", user)
Z
Z.J. van de Weg 已提交
127
        expect(response).to have_http_status(404)
128 129 130 131
      end
    end

    context "unauthorized user" do
132
      it "does not return the diff of the selected commit" do
133
        get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/diff")
Z
Z.J. van de Weg 已提交
134
        expect(response).to have_http_status(401)
135 136 137
      end
    end
  end
138 139 140

  describe 'GET /projects:id/repository/commits/:sha/comments' do
    context 'authorized user' do
141
      it 'returns merge_request comments' do
142
        get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/comments", user)
Z
Z.J. van de Weg 已提交
143
        expect(response).to have_http_status(200)
144
        expect(json_response).to be_an Array
145
        expect(json_response.length).to eq(2)
146 147
        expect(json_response.first['note']).to eq('a comment on a commit')
        expect(json_response.first['author']['id']).to eq(user.id)
148 149
      end

150
      it 'returns a 404 error if merge_request_id not found' do
151
        get api("/projects/#{project.id}/repository/commits/1234ab/comments", user)
Z
Z.J. van de Weg 已提交
152
        expect(response).to have_http_status(404)
153 154 155 156
      end
    end

    context 'unauthorized user' do
157
      it 'does not return the diff of the selected commit' do
158
        get api("/projects/#{project.id}/repository/commits/1234ab/comments")
Z
Z.J. van de Weg 已提交
159
        expect(response).to have_http_status(401)
160 161 162 163 164 165
      end
    end
  end

  describe 'POST /projects:id/repository/commits/:sha/comments' do
    context 'authorized user' do
166
      it 'returns comment' do
167
        post api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/comments", user), note: 'My comment'
Z
Z.J. van de Weg 已提交
168
        expect(response).to have_http_status(201)
169 170 171 172
        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
173 174
      end

175
      it 'returns the inline comment' do
176
        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: 7, line_type: 'new'
Z
Z.J. van de Weg 已提交
177
        expect(response).to have_http_status(201)
178
        expect(json_response['note']).to eq('My comment')
179
        expect(json_response['path']).to eq(project.repository.commit.raw_diffs.first.new_path)
180 181
        expect(json_response['line']).to eq(7)
        expect(json_response['line_type']).to eq('new')
182 183
      end

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

189
      it 'returns 404 if note is attached to non existent commit' do
190
        post api("/projects/#{project.id}/repository/commits/1234ab/comments", user), note: 'My comment'
Z
Z.J. van de Weg 已提交
191
        expect(response).to have_http_status(404)
192 193 194 195
      end
    end

    context 'unauthorized user' do
196
      it 'does not return the diff of the selected commit' do
197
        post api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/comments")
Z
Z.J. van de Weg 已提交
198
        expect(response).to have_http_status(401)
199 200 201
      end
    end
  end
202
end