| ... | ... | @@ -8,6 +8,7 @@ describe API::Commits do |
|
|
|
|
|
|
|
let(:user) { create(:user) }
|
|
|
|
let(:guest) { create(:user).tap { |u| project.add_guest(u) } }
|
|
|
|
let(:developer) { create(:user).tap { |u| project.add_developer(u) } }
|
|
|
|
let(:project) { create(:project, :repository, creator: user, path: 'my.project') }
|
|
|
|
let(:branch_with_dot) { project.repository.find_branch('ends-with.json') }
|
|
|
|
let(:branch_with_slash) { project.repository.find_branch('improve/awesome') }
|
| ... | ... | @@ -964,6 +965,56 @@ describe API::Commits do |
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
shared_examples_for 'ref with pipeline' do
|
|
|
|
let!(:pipeline) do
|
|
|
|
project
|
|
|
|
.ci_pipelines
|
|
|
|
.create!(source: :push, ref: 'master', sha: commit.sha, protected: false)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'includes status as "created" and a last_pipeline object' do
|
|
|
|
get api(route, current_user)
|
|
|
|
|
|
|
|
expect(response).to have_gitlab_http_status(200)
|
|
|
|
expect(response).to match_response_schema('public_api/v4/commit/detail')
|
|
|
|
expect(json_response['status']).to eq('created')
|
|
|
|
expect(json_response['last_pipeline']['id']).to eq(pipeline.id)
|
|
|
|
expect(json_response['last_pipeline']['ref']).to eq(pipeline.ref)
|
|
|
|
expect(json_response['last_pipeline']['sha']).to eq(pipeline.sha)
|
|
|
|
expect(json_response['last_pipeline']['status']).to eq(pipeline.status)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when pipeline succeeds' do
|
|
|
|
before do
|
|
|
|
pipeline.update!(status: 'success')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'includes a "success" status' do
|
|
|
|
get api(route, current_user)
|
|
|
|
|
|
|
|
expect(response).to have_gitlab_http_status(200)
|
|
|
|
expect(response).to match_response_schema('public_api/v4/commit/detail')
|
|
|
|
expect(json_response['status']).to eq('success')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
shared_examples_for 'ref with unaccessible pipeline' do
|
|
|
|
let!(:pipeline) do
|
|
|
|
project
|
|
|
|
.ci_pipelines
|
|
|
|
.create!(source: :push, ref: 'master', sha: commit.sha, protected: false)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'does not include last_pipeline' do
|
|
|
|
get api(route, current_user)
|
|
|
|
|
|
|
|
expect(response).to match_response_schema('public_api/v4/commit/detail')
|
|
|
|
expect(response).to have_gitlab_http_status(200)
|
|
|
|
expect(json_response['last_pipeline']).to be_nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when stat param' do
|
|
|
|
let(:route) { "/projects/#{project_id}/repository/commits/#{commit_id}" }
|
|
|
|
|
| ... | ... | @@ -993,6 +1044,15 @@ describe API::Commits do |
|
|
|
let(:project) { create(:project, :public, :repository) }
|
|
|
|
|
|
|
|
it_behaves_like 'ref commit'
|
|
|
|
it_behaves_like 'ref with pipeline'
|
|
|
|
|
|
|
|
context 'with private builds' do
|
|
|
|
before do
|
|
|
|
project.project_feature.update!(builds_access_level: ProjectFeature::PRIVATE)
|
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'ref with unaccessible pipeline'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when unauthenticated', 'and project is private' do
|
| ... | ... | @@ -1006,6 +1066,17 @@ describe API::Commits do |
|
|
|
let(:current_user) { user }
|
|
|
|
|
|
|
|
it_behaves_like 'ref commit'
|
|
|
|
it_behaves_like 'ref with pipeline'
|
|
|
|
|
|
|
|
context 'when builds are disabled' do
|
|
|
|
before do
|
|
|
|
project
|
|
|
|
.project_feature
|
|
|
|
.update!(builds_access_level: ProjectFeature::DISABLED)
|
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'ref with unaccessible pipeline'
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when branch contains a dot' do
|
|
|
|
let(:commit) { project.repository.commit(branch_with_dot.name) }
|
| ... | ... | @@ -1041,35 +1112,53 @@ describe API::Commits do |
|
|
|
it_behaves_like 'ref commit'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the ref has a pipeline' do
|
|
|
|
let!(:pipeline) { project.ci_pipelines.create(source: :push, ref: 'master', sha: commit.sha, protected: false) }
|
|
|
|
context 'when authenticated', 'as a developer' do
|
|
|
|
let(:current_user) { developer }
|
|
|
|
|
|
|
|
it 'includes a "created" status' do
|
|
|
|
get api(route, current_user)
|
|
|
|
it_behaves_like 'ref commit'
|
|
|
|
it_behaves_like 'ref with pipeline'
|
|
|
|
|
|
|
|
expect(response).to have_gitlab_http_status(200)
|
|
|
|
expect(response).to match_response_schema('public_api/v4/commit/detail')
|
|
|
|
expect(json_response['status']).to eq('created')
|
|
|
|
expect(json_response['last_pipeline']['id']).to eq(pipeline.id)
|
|
|
|
expect(json_response['last_pipeline']['ref']).to eq(pipeline.ref)
|
|
|
|
expect(json_response['last_pipeline']['sha']).to eq(pipeline.sha)
|
|
|
|
expect(json_response['last_pipeline']['status']).to eq(pipeline.status)
|
|
|
|
context 'with private builds' do
|
|
|
|
before do
|
|
|
|
project.project_feature.update!(builds_access_level: ProjectFeature::PRIVATE)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when pipeline succeeds' do
|
|
|
|
before do
|
|
|
|
pipeline.update(status: 'success')
|
|
|
|
it_behaves_like 'ref with pipeline'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'includes a "success" status' do
|
|
|
|
get api(route, current_user)
|
|
|
|
context 'when authenticated', 'as a guest' do
|
|
|
|
let(:current_user) { guest }
|
|
|
|
|
|
|
|
expect(response).to have_gitlab_http_status(200)
|
|
|
|
expect(response).to match_response_schema('public_api/v4/commit/detail')
|
|
|
|
expect(json_response['status']).to eq('success')
|
|
|
|
it_behaves_like '403 response' do
|
|
|
|
let(:request) { get api(route, guest) }
|
|
|
|
let(:message) { '403 Forbidden' }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when authenticated', 'as a non member' do
|
|
|
|
let(:current_user) { create(:user) }
|
|
|
|
|
|
|
|
it_behaves_like '403 response' do
|
|
|
|
let(:request) { get api(route, guest) }
|
|
|
|
let(:message) { '403 Forbidden' }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when authenticated', 'as non_member and project is public' do
|
|
|
|
let(:current_user) { create(:user) }
|
|
|
|
let(:project) { create(:project, :public, :repository) }
|
|
|
|
|
|
|
|
it_behaves_like 'ref with pipeline'
|
|
|
|
|
|
|
|
context 'with private builds' do
|
|
|
|
before do
|
|
|
|
project.project_feature.update!(builds_access_level: ProjectFeature::PRIVATE)
|
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'ref with unaccessible pipeline'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
| ... | ... | |
| ... | ... | |