require 'spec_helper' feature 'Pipeline Schedules', :feature do include PipelineSchedulesHelper let!(:project) { create(:project) } let!(:pipeline_schedule) { create(:ci_pipeline_schedule, :nightly, project: project ) } let!(:pipeline) { create(:ci_pipeline, pipeline_schedule: pipeline_schedule) } let(:scope) { nil } let!(:user) { create(:user) } before do project.add_master(user) gitlab_sign_in(user) visit_page end describe 'GET /projects/pipeline_schedules' do let(:visit_page) { visit_pipelines_schedules } it 'avoids N + 1 queries' do control_count = ActiveRecord::QueryRecorder.new { visit_pipelines_schedules }.count create_list(:ci_pipeline_schedule, 2, project: project) expect { visit_pipelines_schedules }.not_to exceed_query_limit(control_count) end describe 'The view' do it 'displays the required information description' do page.within('.pipeline-schedule-table-row') do expect(page).to have_content('pipeline schedule') expect(page).to have_content(pipeline_schedule.real_next_run.strftime('%b %d, %Y')) expect(page).to have_link('master') expect(page).to have_link("##{pipeline.id}") end end it 'creates a new scheduled pipeline' do click_link 'New schedule' expect(page).to have_content('Schedule a new pipeline') end it 'changes ownership of the pipeline' do click_link 'Take ownership' page.within('.pipeline-schedule-table-row') do expect(page).not_to have_content('No owner') expect(page).to have_link('John Doe') end end it 'edits the pipeline' do page.within('.pipeline-schedule-table-row') do click_link 'Edit' end expect(page).to have_content('Edit Pipeline Schedule') end it 'deletes the pipeline' do click_link 'Delete' expect(page).not_to have_content('pipeline schedule') end end context 'when ref is nil' do before do pipeline_schedule.update_attribute(:ref, nil) visit_pipelines_schedules end it 'shows a list of the pipeline schedules with empty ref column' do expect(first('.branch-name-cell').text).to eq('') end end end describe 'POST /projects/pipeline_schedules/new', js: true do let(:visit_page) { visit_new_pipeline_schedule } it 'sets defaults for timezone and target branch' do expect(page).to have_button('master') expect(page).to have_button('UTC') end it 'it creates a new scheduled pipeline' do fill_in_schedule_form save_pipeline_schedule expect(page).to have_content('my fancy description') end it 'it prevents an invalid form from being submitted' do save_pipeline_schedule expect(page).to have_content('This field is required') end it 'sets a variable' do fill_in_schedule_form fill_in_variable save_pipeline_schedule expect(Ci::PipelineSchedule.last.job_variables).to eq([{ key: 'foo', value: 'bar', public: false }]) end end describe 'PATCH /projects/pipelines_schedules/:id/edit', js: true do let(:visit_page) do edit_pipeline_schedule end it 'it displays existing properties' do description = find_field('schedule_description').value expect(description).to eq('pipeline schedule') expect(page).to have_button('master') expect(page).to have_button('UTC') end it 'edits the scheduled pipeline' do fill_in 'schedule_description', with: 'my brand new description' save_pipeline_schedule expect(page).to have_content('my brand new description') end it 'adds a new variable' do fill_in_variable save_pipeline_schedule expect(Ci::PipelineSchedule.last.job_variables).to eq([{ key: 'foo', value: 'bar', public: false }]) end context 'when ref is nil' do before do pipeline_schedule.update_attribute(:ref, nil) edit_pipeline_schedule end it 'shows the pipeline schedule with default ref' do page.within('.js-target-branch-dropdown') do expect(first('.dropdown-toggle-text').text).to eq('master') end end end context 'when variables already exist' do before do create(:ci_pipeline_schedule_variable, key: 'some_key', value: 'some_value', pipeline_schedule: pipeline_schedule) edit_pipeline_schedule end it 'edits existing variable' do expect(first('[name="schedule[variables_attributes][][key]"]').value).to eq('some_key') expect(first('[name="schedule[variables_attributes][][value]"]').value).to eq('some_value') fill_in_variable save_pipeline_schedule expect(Ci::PipelineSchedule.last.job_variables).to eq([{ key: 'foo', value: 'bar', public: false }]) end it 'removes an existing variable' do remove_variable save_pipeline_schedule expect(Ci::PipelineSchedule.last.job_variables).to eq([]) end it 'adds another variable' do fill_in_variable(1) save_pipeline_schedule expect(Ci::PipelineSchedule.last.job_variables).to eq([ { key: 'some_key', value: 'some_value', public: false }, { key: 'foo', value: 'bar', public: false } ]) end end end def visit_new_pipeline_schedule visit new_namespace_project_pipeline_schedule_path(project.namespace, project, pipeline_schedule) end def edit_pipeline_schedule visit edit_namespace_project_pipeline_schedule_path(project.namespace, project, pipeline_schedule) end def visit_pipelines_schedules visit namespace_project_pipeline_schedules_path(project.namespace, project, scope: scope) end def select_timezone find('.js-timezone-dropdown').click click_link 'American Samoa' end def select_target_branch find('.js-target-branch-dropdown').click click_link 'master' end def save_pipeline_schedule click_button 'Save pipeline schedule' end def fill_in_variable(index = 0) all('[name="schedule[variables_attributes][][key]"]')[index].set('foo') all('[name="schedule[variables_attributes][][value]"]')[index].set('bar') end def remove_variable first('.js-pipeline-variable-list .js-row-remove-button').click end def fill_in_schedule_form fill_in 'schedule_description', with: 'my fancy description' fill_in 'schedule_cron', with: '* 1 2 3 4' select_timezone select_target_branch end end