diff options
Diffstat (limited to 'spec/requests/api/pipeline_schedules_spec.rb')
-rw-r--r-- | spec/requests/api/pipeline_schedules_spec.rb | 522 |
1 files changed, 0 insertions, 522 deletions
diff --git a/spec/requests/api/pipeline_schedules_spec.rb b/spec/requests/api/pipeline_schedules_spec.rb deleted file mode 100644 index 98eaf36b14e..00000000000 --- a/spec/requests/api/pipeline_schedules_spec.rb +++ /dev/null @@ -1,522 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -describe API::PipelineSchedules do - let_it_be(:developer) { create(:user) } - let_it_be(:user) { create(:user) } - let_it_be(:project) { create(:project, :repository, public_builds: false) } - - before do - project.add_developer(developer) - end - - describe 'GET /projects/:id/pipeline_schedules' do - context 'authenticated user with valid permissions' do - let(:pipeline_schedule) { create(:ci_pipeline_schedule, project: project, owner: developer) } - - before do - pipeline_schedule.pipelines << build(:ci_pipeline, project: project) - end - - def create_pipeline_schedules(count) - create_list(:ci_pipeline_schedule, count, project: project) - .each do |pipeline_schedule| - create(:user).tap do |user| - project.add_developer(user) - pipeline_schedule.update(owner: user) - end - pipeline_schedule.pipelines << build(:ci_pipeline, project: project) - end - end - - it 'returns list of pipeline_schedules' do - get api("/projects/#{project.id}/pipeline_schedules", developer) - - expect(response).to have_gitlab_http_status(:ok) - expect(response).to include_pagination_headers - expect(response).to match_response_schema('pipeline_schedules') - end - - it 'avoids N + 1 queries' do - # We need at least two users to trigger a preload for that relation. - create_pipeline_schedules(1) - - control_count = ActiveRecord::QueryRecorder.new do - get api("/projects/#{project.id}/pipeline_schedules", developer) - end.count - - create_pipeline_schedules(5) - - expect do - get api("/projects/#{project.id}/pipeline_schedules", developer) - end.not_to exceed_query_limit(control_count) - end - - %w[active inactive].each do |target| - context "when scope is #{target}" do - before do - create(:ci_pipeline_schedule, project: project, active: active?(target)) - end - - it 'returns matched pipeline schedules' do - get api("/projects/#{project.id}/pipeline_schedules", developer), params: { scope: target } - - expect(json_response.map { |r| r['active'] }).to all(eq(active?(target))) - end - end - - def active?(str) - str == 'active' - end - end - end - - context 'authenticated user with invalid permissions' do - it 'does not return pipeline_schedules list' do - get api("/projects/#{project.id}/pipeline_schedules", user) - - expect(response).to have_gitlab_http_status(:not_found) - end - end - - context 'unauthenticated user' do - it 'does not return pipeline_schedules list' do - get api("/projects/#{project.id}/pipeline_schedules") - - expect(response).to have_gitlab_http_status(:unauthorized) - end - end - end - - describe 'GET /projects/:id/pipeline_schedules/:pipeline_schedule_id' do - let(:pipeline_schedule) { create(:ci_pipeline_schedule, project: project, owner: developer) } - - before do - pipeline_schedule.variables << build(:ci_pipeline_schedule_variable) - pipeline_schedule.pipelines << build(:ci_pipeline, project: project) - end - - context 'authenticated user with valid permissions' do - it 'returns pipeline_schedule details' do - get api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}", developer) - - expect(response).to have_gitlab_http_status(:ok) - expect(response).to match_response_schema('pipeline_schedule') - end - - it 'responds with 404 Not Found if requesting non-existing pipeline_schedule' do - get api("/projects/#{project.id}/pipeline_schedules/-5", developer) - - expect(response).to have_gitlab_http_status(:not_found) - end - end - - context 'authenticated user with invalid permissions' do - it 'does not return pipeline_schedules list' do - get api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}", user) - - expect(response).to have_gitlab_http_status(:not_found) - end - end - - context 'authenticated user with insufficient permissions' do - before do - project.add_guest(user) - end - - it 'does not return pipeline_schedules list' do - get api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}", user) - - expect(response).to have_gitlab_http_status(:not_found) - end - end - - context 'unauthenticated user' do - it 'does not return pipeline_schedules list' do - get api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}") - - expect(response).to have_gitlab_http_status(:unauthorized) - end - end - end - - describe 'POST /projects/:id/pipeline_schedules' do - let(:params) { attributes_for(:ci_pipeline_schedule) } - - context 'authenticated user with valid permissions' do - context 'with required parameters' do - it 'creates pipeline_schedule' do - expect do - post api("/projects/#{project.id}/pipeline_schedules", developer), - params: params - end.to change { project.pipeline_schedules.count }.by(1) - - expect(response).to have_gitlab_http_status(:created) - expect(response).to match_response_schema('pipeline_schedule') - expect(json_response['description']).to eq(params[:description]) - expect(json_response['ref']).to eq(params[:ref]) - expect(json_response['cron']).to eq(params[:cron]) - expect(json_response['cron_timezone']).to eq(params[:cron_timezone]) - expect(json_response['owner']['id']).to eq(developer.id) - end - end - - context 'without required parameters' do - it 'does not create pipeline_schedule' do - post api("/projects/#{project.id}/pipeline_schedules", developer) - - expect(response).to have_gitlab_http_status(:bad_request) - end - end - - context 'when cron has validation error' do - it 'does not create pipeline_schedule' do - post api("/projects/#{project.id}/pipeline_schedules", developer), - params: params.merge('cron' => 'invalid-cron') - - expect(response).to have_gitlab_http_status(:bad_request) - expect(json_response['message']).to have_key('cron') - end - end - end - - context 'authenticated user with invalid permissions' do - it 'does not create pipeline_schedule' do - post api("/projects/#{project.id}/pipeline_schedules", user), params: params - - expect(response).to have_gitlab_http_status(:not_found) - end - end - - context 'unauthenticated user' do - it 'does not create pipeline_schedule' do - post api("/projects/#{project.id}/pipeline_schedules"), params: params - - expect(response).to have_gitlab_http_status(:unauthorized) - end - end - end - - describe 'PUT /projects/:id/pipeline_schedules/:pipeline_schedule_id' do - let(:pipeline_schedule) do - create(:ci_pipeline_schedule, project: project, owner: developer) - end - - context 'authenticated user with valid permissions' do - it 'updates cron' do - put api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}", developer), - params: { cron: '1 2 3 4 *' } - - expect(response).to have_gitlab_http_status(:ok) - expect(response).to match_response_schema('pipeline_schedule') - expect(json_response['cron']).to eq('1 2 3 4 *') - end - - context 'when cron has validation error' do - it 'does not update pipeline_schedule' do - put api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}", developer), - params: { cron: 'invalid-cron' } - - expect(response).to have_gitlab_http_status(:bad_request) - expect(json_response['message']).to have_key('cron') - end - end - end - - context 'authenticated user with invalid permissions' do - it 'does not update pipeline_schedule' do - put api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}", user) - - expect(response).to have_gitlab_http_status(:not_found) - end - end - - context 'unauthenticated user' do - it 'does not update pipeline_schedule' do - put api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}") - - expect(response).to have_gitlab_http_status(:unauthorized) - end - end - end - - describe 'POST /projects/:id/pipeline_schedules/:pipeline_schedule_id/take_ownership' do - let(:pipeline_schedule) do - create(:ci_pipeline_schedule, project: project, owner: developer) - end - - context 'authenticated user with valid permissions' do - it 'updates owner' do - post api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/take_ownership", developer) - - expect(response).to have_gitlab_http_status(:created) - expect(response).to match_response_schema('pipeline_schedule') - end - end - - context 'authenticated user with invalid permissions' do - it 'does not update owner' do - post api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/take_ownership", user) - - expect(response).to have_gitlab_http_status(:not_found) - end - end - - context 'unauthenticated user' do - it 'does not update owner' do - post api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/take_ownership") - - expect(response).to have_gitlab_http_status(:unauthorized) - end - end - end - - describe 'DELETE /projects/:id/pipeline_schedules/:pipeline_schedule_id' do - let(:maintainer) { create(:user) } - - let!(:pipeline_schedule) do - create(:ci_pipeline_schedule, project: project, owner: developer) - end - - before do - project.add_maintainer(maintainer) - end - - context 'authenticated user with valid permissions' do - it 'deletes pipeline_schedule' do - expect do - delete api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}", maintainer) - end.to change { project.pipeline_schedules.count }.by(-1) - - expect(response).to have_gitlab_http_status(:no_content) - end - - it 'responds with 404 Not Found if requesting non-existing pipeline_schedule' do - delete api("/projects/#{project.id}/pipeline_schedules/-5", maintainer) - - expect(response).to have_gitlab_http_status(:not_found) - end - - it_behaves_like '412 response' do - let(:request) { api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}", maintainer) } - end - end - - context 'authenticated user with invalid permissions' do - let!(:pipeline_schedule) { create(:ci_pipeline_schedule, project: project, owner: maintainer) } - - it 'does not delete pipeline_schedule' do - delete api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}", developer) - - expect(response).to have_gitlab_http_status(:forbidden) - end - end - - context 'unauthenticated user' do - it 'does not delete pipeline_schedule' do - delete api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}") - - expect(response).to have_gitlab_http_status(:unauthorized) - end - end - end - - describe 'POST /projects/:id/pipeline_schedules/:pipeline_schedule_id/play' do - let_it_be(:pipeline_schedule) { create(:ci_pipeline_schedule, project: project) } - - let(:route) { ->(id) { "/projects/#{project.id}/pipeline_schedules/#{id}/play" } } - - context 'authenticated user with `:play_pipeline_schedule` permission' do - it 'schedules a pipeline worker' do - project.add_developer(developer) - - expect(RunPipelineScheduleWorker) - .to receive(:perform_async) - .with(pipeline_schedule.id, developer.id) - .and_call_original - post api(route[pipeline_schedule.id], developer) - - expect(response).to have_gitlab_http_status(:created) - end - - it 'renders an error if scheduling failed' do - project.add_developer(developer) - - expect(RunPipelineScheduleWorker) - .to receive(:perform_async) - .with(pipeline_schedule.id, developer.id) - .and_return(nil) - post api(route[pipeline_schedule.id], developer) - - expect(response).to have_gitlab_http_status(:internal_server_error) - end - end - - context 'authenticated user with insufficient access' do - it 'responds with not found' do - project.add_guest(user) - - post api(route[pipeline_schedule.id], user) - - expect(response).to have_gitlab_http_status(:not_found) - end - end - - context 'unauthenticated user' do - it 'responds with unauthorized' do - post api(route[pipeline_schedule.id]) - - expect(response).to have_gitlab_http_status(:unauthorized) - end - end - end - - describe 'POST /projects/:id/pipeline_schedules/:pipeline_schedule_id/variables' do - let(:params) { attributes_for(:ci_pipeline_schedule_variable) } - - let_it_be(:pipeline_schedule) do - create(:ci_pipeline_schedule, project: project, owner: developer) - end - - context 'authenticated user with valid permissions' do - context 'with required parameters' do - it 'creates pipeline_schedule_variable' do - expect do - post api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables", developer), - params: params.merge(variable_type: 'file') - end.to change { pipeline_schedule.variables.count }.by(1) - - expect(response).to have_gitlab_http_status(:created) - expect(response).to match_response_schema('pipeline_schedule_variable') - expect(json_response['key']).to eq(params[:key]) - expect(json_response['value']).to eq(params[:value]) - expect(json_response['variable_type']).to eq('file') - end - end - - context 'without required parameters' do - it 'does not create pipeline_schedule_variable' do - post api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables", developer) - - expect(response).to have_gitlab_http_status(:bad_request) - end - end - - context 'when key has validation error' do - it 'does not create pipeline_schedule_variable' do - post api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables", developer), - params: params.merge('key' => '!?!?') - - expect(response).to have_gitlab_http_status(:bad_request) - expect(json_response['message']).to have_key('key') - end - end - end - - context 'authenticated user with invalid permissions' do - it 'does not create pipeline_schedule_variable' do - post api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables", user), params: params - - expect(response).to have_gitlab_http_status(:not_found) - end - end - - context 'unauthenticated user' do - it 'does not create pipeline_schedule_variable' do - post api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables"), params: params - - expect(response).to have_gitlab_http_status(:unauthorized) - end - end - end - - describe 'PUT /projects/:id/pipeline_schedules/:pipeline_schedule_id/variables/:key' do - let_it_be(:pipeline_schedule) do - create(:ci_pipeline_schedule, project: project, owner: developer) - end - - let(:pipeline_schedule_variable) do - create(:ci_pipeline_schedule_variable, pipeline_schedule: pipeline_schedule) - end - - context 'authenticated user with valid permissions' do - it 'updates pipeline_schedule_variable' do - put api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables/#{pipeline_schedule_variable.key}", developer), - params: { value: 'updated_value', variable_type: 'file' } - - expect(response).to have_gitlab_http_status(:ok) - expect(response).to match_response_schema('pipeline_schedule_variable') - expect(json_response['value']).to eq('updated_value') - expect(json_response['variable_type']).to eq('file') - end - end - - context 'authenticated user with invalid permissions' do - it 'does not update pipeline_schedule_variable' do - put api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables/#{pipeline_schedule_variable.key}", user) - - expect(response).to have_gitlab_http_status(:not_found) - end - end - - context 'unauthenticated user' do - it 'does not update pipeline_schedule_variable' do - put api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables/#{pipeline_schedule_variable.key}") - - expect(response).to have_gitlab_http_status(:unauthorized) - end - end - end - - describe 'DELETE /projects/:id/pipeline_schedules/:pipeline_schedule_id/variables/:key' do - let(:maintainer) { create(:user) } - - let_it_be(:pipeline_schedule) do - create(:ci_pipeline_schedule, project: project, owner: developer) - end - - let!(:pipeline_schedule_variable) do - create(:ci_pipeline_schedule_variable, pipeline_schedule: pipeline_schedule) - end - - before do - project.add_maintainer(maintainer) - end - - context 'authenticated user with valid permissions' do - it 'deletes pipeline_schedule_variable' do - expect do - delete api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables/#{pipeline_schedule_variable.key}", maintainer) - end.to change { Ci::PipelineScheduleVariable.count }.by(-1) - - expect(response).to have_gitlab_http_status(:accepted) - expect(response).to match_response_schema('pipeline_schedule_variable') - end - - it 'responds with 404 Not Found if requesting non-existing pipeline_schedule_variable' do - delete api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables/____", maintainer) - - expect(response).to have_gitlab_http_status(:not_found) - end - end - - context 'authenticated user with invalid permissions' do - let!(:pipeline_schedule) { create(:ci_pipeline_schedule, project: project, owner: maintainer) } - - it 'does not delete pipeline_schedule_variable' do - delete api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables/#{pipeline_schedule_variable.key}", developer) - - expect(response).to have_gitlab_http_status(:forbidden) - end - end - - context 'unauthenticated user' do - it 'does not delete pipeline_schedule_variable' do - delete api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables/#{pipeline_schedule_variable.key}") - - expect(response).to have_gitlab_http_status(:unauthorized) - end - end - end -end |