5f271a9fa2
* master: (313 commits) Allow slashes in slash command arguments Add API endpoint to get all milestone merge requests remove trailing comma Restore pagination to admin abuse reports replace deprecated NoErrorsPlugin with NoEmitOnErrorsPlugin only compress assets in production Reduce number of pipelines created to test pagination add CHANGELOG.md entry for !8761 prevent diff unfolding link from appearing for deleted files fix build failures only show diff unfolding link if there are more lines to show fix typo in node section Only yield valid references in ReferenceFilter.references_in Cache js selectors; fix css move "Install node modules" step before "Migrate DB" within update process Renders pagination again for pipelines table update migration docs for 8.17 to include minimum node version Add CHANGELOG file Fix positioning of top scroll button Remove comments in migration ...
249 lines
8.2 KiB
Ruby
249 lines
8.2 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe API::CommitStatuses, api: true do
|
|
include ApiHelpers
|
|
|
|
let!(:project) { create(:project, :repository) }
|
|
let(:commit) { project.repository.commit }
|
|
let(:guest) { create_user(:guest) }
|
|
let(:reporter) { create_user(:reporter) }
|
|
let(:developer) { create_user(:developer) }
|
|
let(:sha) { commit.id }
|
|
|
|
let(:commit_status) do
|
|
create(:commit_status, status: :pending, pipeline: pipeline)
|
|
end
|
|
|
|
describe "GET /projects/:id/repository/commits/:sha/statuses" do
|
|
let(:get_url) { "/projects/#{project.id}/repository/commits/#{sha}/statuses" }
|
|
|
|
context 'ci commit exists' do
|
|
let!(:master) { project.pipelines.create(sha: commit.id, ref: 'master') }
|
|
let!(:develop) { project.pipelines.create(sha: commit.id, ref: 'develop') }
|
|
|
|
it_behaves_like 'a paginated resources' do
|
|
let(:request) { get api(get_url, reporter) }
|
|
end
|
|
|
|
context "reporter user" do
|
|
let(:statuses_id) { json_response.map { |status| status['id'] } }
|
|
|
|
def create_status(commit, opts = {})
|
|
create(:commit_status, { pipeline: commit, ref: commit.ref }.merge(opts))
|
|
end
|
|
|
|
let!(:status1) { create_status(master, status: 'running') }
|
|
let!(:status2) { create_status(master, name: 'coverage', status: 'pending') }
|
|
let!(:status3) { create_status(develop, status: 'running', allow_failure: true) }
|
|
let!(:status4) { create_status(master, name: 'coverage', status: 'success') }
|
|
let!(:status5) { create_status(develop, name: 'coverage', status: 'success') }
|
|
let!(:status6) { create_status(master, status: 'success') }
|
|
|
|
context 'latest commit statuses' do
|
|
before { get api(get_url, reporter) }
|
|
|
|
it 'returns latest commit statuses' do
|
|
expect(response).to have_http_status(200)
|
|
|
|
expect(json_response).to be_an Array
|
|
expect(statuses_id).to contain_exactly(status3.id, status4.id, status5.id, status6.id)
|
|
json_response.sort_by!{ |status| status['id'] }
|
|
expect(json_response.map{ |status| status['allow_failure'] }).to eq([true, false, false, false])
|
|
end
|
|
end
|
|
|
|
context 'all commit statuses' do
|
|
before { get api(get_url, reporter), all: 1 }
|
|
|
|
it 'returns all commit statuses' do
|
|
expect(response).to have_http_status(200)
|
|
|
|
expect(json_response).to be_an Array
|
|
expect(statuses_id).to contain_exactly(status1.id, status2.id,
|
|
status3.id, status4.id,
|
|
status5.id, status6.id)
|
|
end
|
|
end
|
|
|
|
context 'latest commit statuses for specific ref' do
|
|
before { get api(get_url, reporter), ref: 'develop' }
|
|
|
|
it 'returns latest commit statuses for specific ref' do
|
|
expect(response).to have_http_status(200)
|
|
|
|
expect(json_response).to be_an Array
|
|
expect(statuses_id).to contain_exactly(status3.id, status5.id)
|
|
end
|
|
end
|
|
|
|
context 'latest commit statues for specific name' do
|
|
before { get api(get_url, reporter), name: 'coverage' }
|
|
|
|
it 'return latest commit statuses for specific name' do
|
|
expect(response).to have_http_status(200)
|
|
|
|
expect(json_response).to be_an Array
|
|
expect(statuses_id).to contain_exactly(status4.id, status5.id)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'ci commit does not exist' do
|
|
before { get api(get_url, reporter) }
|
|
|
|
it 'returns empty array' do
|
|
expect(response.status).to eq 200
|
|
expect(json_response).to be_an Array
|
|
expect(json_response).to be_empty
|
|
end
|
|
end
|
|
|
|
context "guest user" do
|
|
before { get api(get_url, guest) }
|
|
|
|
it "does not return project commits" do
|
|
expect(response).to have_http_status(403)
|
|
end
|
|
end
|
|
|
|
context "unauthorized user" do
|
|
before { get api(get_url) }
|
|
|
|
it "does not return project commits" do
|
|
expect(response).to have_http_status(401)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe 'POST /projects/:id/statuses/:sha' do
|
|
let(:post_url) { "/projects/#{project.id}/statuses/#{sha}" }
|
|
|
|
context 'developer user' do
|
|
%w[pending running success failed canceled].each do |status|
|
|
context "for #{status}" do
|
|
context 'uses only required parameters' do
|
|
it 'creates commit status' do
|
|
post api(post_url, developer), state: status
|
|
|
|
expect(response).to have_http_status(201)
|
|
expect(json_response['sha']).to eq(commit.id)
|
|
expect(json_response['status']).to eq(status)
|
|
expect(json_response['name']).to eq('default')
|
|
expect(json_response['ref']).not_to be_empty
|
|
expect(json_response['target_url']).to be_nil
|
|
expect(json_response['description']).to be_nil
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'transitions status from pending' do
|
|
before do
|
|
post api(post_url, developer), state: 'pending'
|
|
end
|
|
|
|
%w[running success failed canceled].each do |status|
|
|
it "to #{status}" do
|
|
expect { post api(post_url, developer), state: status }.not_to change { CommitStatus.count }
|
|
|
|
expect(response).to have_http_status(201)
|
|
expect(json_response['status']).to eq(status)
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'with all optional parameters' do
|
|
before do
|
|
optional_params = { state: 'success',
|
|
context: 'coverage',
|
|
ref: 'develop',
|
|
description: 'test',
|
|
coverage: 80.0,
|
|
target_url: 'http://gitlab.com/status' }
|
|
|
|
post api(post_url, developer), optional_params
|
|
end
|
|
|
|
it 'creates commit status' do
|
|
expect(response).to have_http_status(201)
|
|
expect(json_response['sha']).to eq(commit.id)
|
|
expect(json_response['status']).to eq('success')
|
|
expect(json_response['name']).to eq('coverage')
|
|
expect(json_response['ref']).to eq('develop')
|
|
expect(json_response['coverage']).to eq(80.0)
|
|
expect(json_response['description']).to eq('test')
|
|
expect(json_response['target_url']).to eq('http://gitlab.com/status')
|
|
end
|
|
end
|
|
|
|
context 'when status is invalid' do
|
|
before { post api(post_url, developer), state: 'invalid' }
|
|
|
|
it 'does not create commit status' do
|
|
expect(response).to have_http_status(400)
|
|
end
|
|
end
|
|
|
|
context 'when request without a state made' do
|
|
before { post api(post_url, developer) }
|
|
|
|
it 'does not create commit status' do
|
|
expect(response).to have_http_status(400)
|
|
end
|
|
end
|
|
|
|
context 'when commit SHA is invalid' do
|
|
let(:sha) { 'invalid_sha' }
|
|
before { post api(post_url, developer), state: 'running' }
|
|
|
|
it 'returns not found error' do
|
|
expect(response).to have_http_status(404)
|
|
end
|
|
end
|
|
|
|
context 'when target URL is an invalid address' do
|
|
before do
|
|
post api(post_url, developer), state: 'pending',
|
|
target_url: 'invalid url'
|
|
end
|
|
|
|
it 'responds with bad request status and validation errors' do
|
|
expect(response).to have_http_status(400)
|
|
expect(json_response['message']['target_url'])
|
|
.to include 'must be a valid URL'
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'reporter user' do
|
|
before { post api(post_url, reporter), state: 'running' }
|
|
|
|
it 'does not create commit status' do
|
|
expect(response).to have_http_status(403)
|
|
end
|
|
end
|
|
|
|
context 'guest user' do
|
|
before { post api(post_url, guest), state: 'running' }
|
|
|
|
it 'does not create commit status' do
|
|
expect(response).to have_http_status(403)
|
|
end
|
|
end
|
|
|
|
context 'unauthorized user' do
|
|
before { post api(post_url) }
|
|
|
|
it 'does not create commit status' do
|
|
expect(response).to have_http_status(401)
|
|
end
|
|
end
|
|
end
|
|
|
|
def create_user(access_level_trait)
|
|
user = create(:user)
|
|
create(:project_member, access_level_trait, user: user, project: project)
|
|
user
|
|
end
|
|
end
|