2019-10-12 21:52:04 +05:30
# frozen_string_literal: true
2017-08-17 22:00:37 +05:30
require 'spec_helper'
2020-06-23 00:09:42 +05:30
RSpec . describe 'Pipelines' , :js do
2019-07-07 11:18:12 +05:30
include ProjectForksHelper
2017-09-10 17:25:29 +05:30
let ( :project ) { create ( :project ) }
2017-08-17 22:00:37 +05:30
context 'when user is logged in' do
let ( :user ) { create ( :user ) }
before do
2017-09-10 17:25:29 +05:30
sign_in ( user )
2018-03-17 18:26:18 +05:30
project . add_developer ( user )
2018-11-20 20:47:30 +05:30
project . update! ( auto_devops_attributes : { enabled : false } )
2017-08-17 22:00:37 +05:30
end
describe 'GET /:project/pipelines' do
2017-09-10 17:25:29 +05:30
let ( :project ) { create ( :project , :repository ) }
2017-08-17 22:00:37 +05:30
let! ( :pipeline ) do
create (
:ci_empty_pipeline ,
project : project ,
ref : 'master' ,
status : 'running' ,
2017-09-10 17:25:29 +05:30
sha : project . commit . id
2017-08-17 22:00:37 +05:30
)
end
context 'scope' do
before do
create ( :ci_empty_pipeline , status : 'pending' , project : project , sha : project . commit . id , ref : 'master' )
create ( :ci_empty_pipeline , status : 'running' , project : project , sha : project . commit . id , ref : 'master' )
create ( :ci_empty_pipeline , status : 'created' , project : project , sha : project . commit . id , ref : 'master' )
create ( :ci_empty_pipeline , status : 'success' , project : project , sha : project . commit . id , ref : 'master' )
end
[ :all , :running , :pending , :finished , :branches ] . each do | scope |
context " when displaying #{ scope } " do
before do
visit_project_pipelines ( scope : scope )
end
it 'contains pipeline commit short SHA' do
expect ( page ) . to have_content ( pipeline . short_sha )
end
it 'contains branch name' do
expect ( page ) . to have_content ( pipeline . ref )
end
end
end
end
context 'header tabs' do
before do
2017-09-10 17:25:29 +05:30
visit project_pipelines_path ( project )
wait_for_requests
2017-08-17 22:00:37 +05:30
end
it 'shows a tab for All pipelines and count' do
2018-03-17 18:26:18 +05:30
expect ( page . find ( '.js-pipelines-tab-all' ) . text ) . to include ( 'All' )
2017-08-17 22:00:37 +05:30
expect ( page . find ( '.js-pipelines-tab-all .badge' ) . text ) . to include ( '1' )
end
it 'shows a tab for Finished pipelines and count' do
2018-03-17 18:26:18 +05:30
expect ( page . find ( '.js-pipelines-tab-finished' ) . text ) . to include ( 'Finished' )
2017-08-17 22:00:37 +05:30
end
it 'shows a tab for Branches' do
2018-03-17 18:26:18 +05:30
expect ( page . find ( '.js-pipelines-tab-branches' ) . text ) . to include ( 'Branches' )
2017-08-17 22:00:37 +05:30
end
it 'shows a tab for Tags' do
2018-03-17 18:26:18 +05:30
expect ( page . find ( '.js-pipelines-tab-tags' ) . text ) . to include ( 'Tags' )
end
it 'updates content when tab is clicked' do
2020-07-28 23:09:34 +05:30
page . find ( '.js-pipelines-tab-finished' ) . click
2018-03-17 18:26:18 +05:30
wait_for_requests
2020-07-28 23:09:34 +05:30
expect ( page ) . to have_content ( 'There are currently no finished pipelines.' )
2018-03-27 19:54:05 +05:30
end
end
context 'navigation links' do
before do
visit project_pipelines_path ( project )
wait_for_requests
end
it 'renders run pipeline link' do
expect ( page ) . to have_link ( 'Run Pipeline' )
end
it 'renders ci lint link' do
expect ( page ) . to have_link ( 'CI Lint' )
2017-08-17 22:00:37 +05:30
end
end
context 'when pipeline is cancelable' do
let! ( :build ) do
create ( :ci_build , pipeline : pipeline ,
2019-02-15 15:39:39 +05:30
stage : 'test' )
2017-08-17 22:00:37 +05:30
end
before do
build . run
visit_project_pipelines
end
it 'indicates that pipeline can be canceled' do
expect ( page ) . to have_selector ( '.js-pipelines-cancel-button' )
expect ( page ) . to have_selector ( '.ci-running' )
end
context 'when canceling' do
before do
find ( '.js-pipelines-cancel-button' ) . click
2018-11-08 19:23:39 +05:30
find ( '.js-modal-primary-action' ) . click
2017-09-10 17:25:29 +05:30
wait_for_requests
2017-08-17 22:00:37 +05:30
end
2019-12-26 22:10:19 +05:30
it 'indicated that pipelines was canceled' , :sidekiq_might_not_need_inline do
2017-08-17 22:00:37 +05:30
expect ( page ) . not_to have_selector ( '.js-pipelines-cancel-button' )
expect ( page ) . to have_selector ( '.ci-canceled' )
end
end
end
2019-12-26 22:10:19 +05:30
context 'when pipeline is retryable' , :sidekiq_might_not_need_inline do
2017-08-17 22:00:37 +05:30
let! ( :build ) do
create ( :ci_build , pipeline : pipeline ,
2019-02-15 15:39:39 +05:30
stage : 'test' )
2017-08-17 22:00:37 +05:30
end
before do
build . drop
visit_project_pipelines
end
it 'indicates that pipeline can be retried' do
expect ( page ) . to have_selector ( '.js-pipelines-retry-button' )
expect ( page ) . to have_selector ( '.ci-failed' )
end
context 'when retrying' do
before do
find ( '.js-pipelines-retry-button' ) . click
2017-09-10 17:25:29 +05:30
wait_for_requests
2017-08-17 22:00:37 +05:30
end
it 'shows running pipeline that is not retryable' do
expect ( page ) . not_to have_selector ( '.js-pipelines-retry-button' )
expect ( page ) . to have_selector ( '.ci-running' )
end
end
end
2019-07-07 11:18:12 +05:30
context 'when pipeline is detached merge request pipeline' do
let ( :merge_request ) do
create ( :merge_request ,
:with_detached_merge_request_pipeline ,
source_project : source_project ,
target_project : target_project )
end
let! ( :pipeline ) { merge_request . all_pipelines . first }
let ( :source_project ) { project }
let ( :target_project ) { project }
before do
visit project_pipelines_path ( source_project )
end
2019-12-26 22:10:19 +05:30
shared_examples_for 'detached merge request pipeline' do
it 'shows pipeline information without pipeline ref' , :sidekiq_might_not_need_inline do
2019-07-07 11:18:12 +05:30
within '.pipeline-tags' do
expect ( page ) . to have_content ( 'detached' )
end
within '.branch-commit' do
expect ( page ) . to have_link ( merge_request . iid ,
href : project_merge_request_path ( project , merge_request ) )
end
within '.branch-commit' do
expect ( page ) . not_to have_link ( pipeline . ref )
end
end
end
2019-12-26 22:10:19 +05:30
it_behaves_like 'detached merge request pipeline'
2019-07-07 11:18:12 +05:30
context 'when source project is a forked project' do
let ( :source_project ) { fork_project ( project , user , repository : true ) }
2019-12-26 22:10:19 +05:30
it_behaves_like 'detached merge request pipeline'
2019-07-07 11:18:12 +05:30
end
end
context 'when pipeline is merge request pipeline' do
let ( :merge_request ) do
create ( :merge_request ,
:with_merge_request_pipeline ,
source_project : source_project ,
target_project : target_project ,
merge_sha : target_project . commit . sha )
end
let! ( :pipeline ) { merge_request . all_pipelines . first }
let ( :source_project ) { project }
let ( :target_project ) { project }
before do
visit project_pipelines_path ( source_project )
end
shared_examples_for 'Correct merge request pipeline information' do
2019-12-26 22:10:19 +05:30
it 'does not show detached tag for the pipeline, and shows the link of the merge request, and does not show the ref of the pipeline' , :sidekiq_might_not_need_inline do
2019-07-07 11:18:12 +05:30
within '.pipeline-tags' do
expect ( page ) . not_to have_content ( 'detached' )
end
within '.branch-commit' do
expect ( page ) . to have_link ( merge_request . iid ,
href : project_merge_request_path ( project , merge_request ) )
end
within '.branch-commit' do
expect ( page ) . not_to have_link ( pipeline . ref )
end
end
end
it_behaves_like 'Correct merge request pipeline information'
context 'when source project is a forked project' do
let ( :source_project ) { fork_project ( project , user , repository : true ) }
it_behaves_like 'Correct merge request pipeline information'
end
end
2017-08-17 22:00:37 +05:30
context 'when pipeline has configuration errors' do
let ( :pipeline ) do
create ( :ci_pipeline , :invalid , project : project )
end
2017-09-10 17:25:29 +05:30
before do
visit_project_pipelines
end
2017-08-17 22:00:37 +05:30
it 'contains badge that indicates errors' do
expect ( page ) . to have_content 'yaml invalid'
end
it 'contains badge with tooltip which contains error' do
expect ( pipeline ) . to have_yaml_errors
expect ( page ) . to have_selector (
2020-03-13 15:44:24 +05:30
%Q{ span[title=" #{ pipeline . yaml_errors } "] } )
2017-08-17 22:00:37 +05:30
end
2018-03-17 18:26:18 +05:30
it 'contains badge that indicates failure reason' do
expect ( page ) . to have_content 'error'
end
it 'contains badge with tooltip which contains failure reason' do
expect ( pipeline . failure_reason? ) . to eq true
expect ( page ) . to have_selector (
2020-03-13 15:44:24 +05:30
%Q{ span[title=" #{ pipeline . present . failure_reason } "] } )
2018-03-17 18:26:18 +05:30
end
2017-08-17 22:00:37 +05:30
end
context 'with manual actions' do
let! ( :manual ) do
create ( :ci_build , :manual ,
pipeline : pipeline ,
name : 'manual build' ,
2019-02-15 15:39:39 +05:30
stage : 'test' )
2017-08-17 22:00:37 +05:30
end
2017-09-10 17:25:29 +05:30
before do
visit_project_pipelines
end
2017-08-17 22:00:37 +05:30
it 'has a dropdown with play button' do
2017-09-10 17:25:29 +05:30
expect ( page ) . to have_selector ( '.dropdown-new.btn.btn-default .icon-play' )
2017-08-17 22:00:37 +05:30
end
it 'has link to the manual action' do
find ( '.js-pipeline-dropdown-manual-actions' ) . click
expect ( page ) . to have_button ( 'manual build' )
end
context 'when manual action was played' do
before do
find ( '.js-pipeline-dropdown-manual-actions' ) . click
click_button ( 'manual build' )
end
it 'enqueues manual action job' do
expect ( page ) . to have_selector ( '.js-pipeline-dropdown-manual-actions:disabled' )
end
end
end
2018-12-05 23:21:45 +05:30
context 'when there is a delayed job' do
let! ( :delayed_job ) do
create ( :ci_build , :scheduled ,
pipeline : pipeline ,
2020-11-24 15:15:51 +05:30
name : 'delayed job 1' ,
2019-02-15 15:39:39 +05:30
stage : 'test' )
2018-12-05 23:21:45 +05:30
end
before do
visit_project_pipelines
end
it 'has a dropdown for actionable jobs' do
expect ( page ) . to have_selector ( '.dropdown-new.btn.btn-default .icon-play' )
end
it " has link to the delayed job's action " do
find ( '.js-pipeline-dropdown-manual-actions' ) . click
time_diff = [ 0 , delayed_job . scheduled_at - Time . now ] . max
2020-11-24 15:15:51 +05:30
expect ( page ) . to have_button ( 'delayed job 1' )
2018-12-05 23:21:45 +05:30
expect ( page ) . to have_content ( Time . at ( time_diff ) . utc . strftime ( " %H:%M:%S " ) )
end
context 'when delayed job is expired already' do
let! ( :delayed_job ) do
create ( :ci_build , :expired_scheduled ,
pipeline : pipeline ,
2020-11-24 15:15:51 +05:30
name : 'delayed job 1' ,
2019-02-15 15:39:39 +05:30
stage : 'test' )
2018-12-05 23:21:45 +05:30
end
it " shows 00:00:00 as the remaining time " do
find ( '.js-pipeline-dropdown-manual-actions' ) . click
expect ( page ) . to have_content ( " 00:00:00 " )
end
end
context 'when user played a delayed job immediately' do
before do
find ( '.js-pipeline-dropdown-manual-actions' ) . click
2020-11-24 15:15:51 +05:30
page . accept_confirm { click_button ( 'delayed job 1' ) }
2018-12-05 23:21:45 +05:30
wait_for_requests
end
it 'enqueues the delayed job' , :js do
expect ( delayed_job . reload ) . to be_pending
end
end
end
2017-08-17 22:00:37 +05:30
context 'for generic statuses' do
2019-07-07 11:18:12 +05:30
context 'when preparing' do
let! ( :pipeline ) do
create ( :ci_empty_pipeline ,
status : 'preparing' , project : project )
end
let! ( :status ) do
create ( :generic_commit_status ,
:preparing , pipeline : pipeline )
end
before do
visit_project_pipelines
end
it 'is cancelable' do
expect ( page ) . to have_selector ( '.js-pipelines-cancel-button' )
end
it 'shows the pipeline as preparing' do
expect ( page ) . to have_selector ( '.ci-preparing' )
end
end
2017-08-17 22:00:37 +05:30
context 'when running' do
let! ( :running ) do
create ( :generic_commit_status ,
status : 'running' ,
pipeline : pipeline ,
stage : 'test' )
end
2017-09-10 17:25:29 +05:30
before do
visit_project_pipelines
end
2017-08-17 22:00:37 +05:30
it 'is cancelable' do
expect ( page ) . to have_selector ( '.js-pipelines-cancel-button' )
end
it 'has pipeline running' do
expect ( page ) . to have_selector ( '.ci-running' )
end
context 'when canceling' do
2017-09-10 17:25:29 +05:30
before do
2018-03-17 18:26:18 +05:30
find ( '.js-pipelines-cancel-button' ) . click
2018-11-08 19:23:39 +05:30
find ( '.js-modal-primary-action' ) . click
2017-09-10 17:25:29 +05:30
end
2017-08-17 22:00:37 +05:30
2019-12-26 22:10:19 +05:30
it 'indicates that pipeline was canceled' , :sidekiq_might_not_need_inline do
2017-08-17 22:00:37 +05:30
expect ( page ) . not_to have_selector ( '.js-pipelines-cancel-button' )
expect ( page ) . to have_selector ( '.ci-canceled' )
end
end
end
context 'when failed' do
let! ( :status ) do
create ( :generic_commit_status , :pending ,
pipeline : pipeline ,
stage : 'test' )
end
before do
status . drop
visit_project_pipelines
end
it 'is not retryable' do
expect ( page ) . not_to have_selector ( '.js-pipelines-retry-button' )
end
2019-12-26 22:10:19 +05:30
it 'has failed pipeline' , :sidekiq_might_not_need_inline do
2017-08-17 22:00:37 +05:30
expect ( page ) . to have_selector ( '.ci-failed' )
end
end
end
context 'downloadable pipelines' do
context 'with artifacts' do
let! ( :with_artifacts ) do
2020-06-23 00:09:42 +05:30
build = create ( :ci_build , :success ,
2017-08-17 22:00:37 +05:30
pipeline : pipeline ,
name : 'rspec tests' ,
stage : 'test' )
2020-06-23 00:09:42 +05:30
create ( :ci_job_artifact , :codequality , job : build )
2017-08-17 22:00:37 +05:30
end
2017-09-10 17:25:29 +05:30
before do
visit_project_pipelines
end
2017-08-17 22:00:37 +05:30
2019-09-04 21:01:54 +05:30
it 'has artifacts' do
2017-08-17 22:00:37 +05:30
expect ( page ) . to have_selector ( '.build-artifacts' )
end
it 'has artifacts download dropdown' do
find ( '.js-pipeline-dropdown-download' ) . click
2020-06-23 00:09:42 +05:30
expect ( page ) . to have_link ( with_artifacts . file_type )
2017-08-17 22:00:37 +05:30
end
it 'has download attribute on download links' do
find ( '.js-pipeline-dropdown-download' ) . click
expect ( page ) . to have_selector ( 'a' , text : 'Download' )
page . all ( '.build-artifacts a' , text : 'Download' ) . each do | link |
expect ( link [ :download ] ) . to eq ''
end
end
end
context 'with artifacts expired' do
let! ( :with_artifacts_expired ) do
2018-03-17 18:26:18 +05:30
create ( :ci_build , :expired , :success ,
2017-08-17 22:00:37 +05:30
pipeline : pipeline ,
name : 'rspec' ,
stage : 'test' )
end
2017-09-10 17:25:29 +05:30
before do
visit_project_pipelines
end
2017-08-17 22:00:37 +05:30
it { expect ( page ) . not_to have_selector ( '.build-artifacts' ) }
end
context 'without artifacts' do
let! ( :without_artifacts ) do
create ( :ci_build , :success ,
pipeline : pipeline ,
name : 'rspec' ,
stage : 'test' )
end
2017-09-10 17:25:29 +05:30
before do
visit_project_pipelines
end
2017-08-17 22:00:37 +05:30
it { expect ( page ) . not_to have_selector ( '.build-artifacts' ) }
end
2018-03-27 19:54:05 +05:30
context 'with trace artifact' do
before do
create ( :ci_build , :success , :trace_artifact , pipeline : pipeline )
visit_project_pipelines
end
it 'does not show trace artifact as artifacts' do
expect ( page ) . not_to have_selector ( '.build-artifacts' )
end
end
2017-08-17 22:00:37 +05:30
end
context 'mini pipeline graph' do
let! ( :build ) do
create ( :ci_build , :pending , pipeline : pipeline ,
stage : 'build' ,
name : 'build' )
end
2017-09-10 17:25:29 +05:30
before do
visit_project_pipelines
end
2017-08-17 22:00:37 +05:30
2019-07-07 11:18:12 +05:30
it 'renders a mini pipeline graph' do
2020-07-28 23:09:34 +05:30
expect ( page ) . to have_selector ( '[data-testid="widget-mini-pipeline-graph"]' )
2017-08-17 22:00:37 +05:30
expect ( page ) . to have_selector ( '.js-builds-dropdown-button' )
end
context 'when clicking a stage badge' do
2019-07-07 11:18:12 +05:30
it 'opens a dropdown' do
2018-03-17 18:26:18 +05:30
find ( '.js-builds-dropdown-button' ) . click
2017-08-17 22:00:37 +05:30
expect ( page ) . to have_link build . name
end
2019-07-07 11:18:12 +05:30
it 'is possible to cancel pending build' do
2018-03-17 18:26:18 +05:30
find ( '.js-builds-dropdown-button' ) . click
2018-10-15 14:42:47 +05:30
find ( '.js-ci-action' ) . click
wait_for_requests
2017-08-17 22:00:37 +05:30
expect ( build . reload ) . to be_canceled
end
end
2018-05-09 12:01:36 +05:30
context 'for a failed pipeline' do
let! ( :build ) do
create ( :ci_build , :failed , pipeline : pipeline ,
stage : 'build' ,
name : 'build' )
end
2019-07-07 11:18:12 +05:30
it 'displays the failure reason' do
2018-05-09 12:01:36 +05:30
find ( '.js-builds-dropdown-button' ) . click
within ( '.js-builds-dropdown-list' ) do
build_element = page . find ( '.mini-pipeline-graph-dropdown-item' )
2020-03-13 15:44:24 +05:30
expect ( build_element [ 'title' ] ) . to eq ( 'build - failed - (unknown failure)' )
2018-05-09 12:01:36 +05:30
end
end
end
2017-08-17 22:00:37 +05:30
end
context 'with pagination' do
before do
allow ( Ci :: Pipeline ) . to receive ( :default_per_page ) . and_return ( 1 )
2019-03-02 22:35:43 +05:30
create ( :ci_empty_pipeline , project : project )
2017-08-17 22:00:37 +05:30
end
2019-07-07 11:18:12 +05:30
it 'renders pagination' do
2017-09-10 17:25:29 +05:30
visit project_pipelines_path ( project )
wait_for_requests
2017-08-17 22:00:37 +05:30
expect ( page ) . to have_selector ( '.gl-pagination' )
end
2019-07-07 11:18:12 +05:30
it 'renders second page of pipelines' do
2017-09-10 17:25:29 +05:30
visit project_pipelines_path ( project , page : '2' )
wait_for_requests
2017-08-17 22:00:37 +05:30
2020-01-01 13:55:28 +05:30
expect ( page ) . to have_selector ( '.gl-pagination .page-link' , count : 4 )
2017-08-17 22:00:37 +05:30
end
2018-03-17 18:26:18 +05:30
2019-07-07 11:18:12 +05:30
it 'shows updated content' do
2018-03-17 18:26:18 +05:30
visit project_pipelines_path ( project )
wait_for_requests
2020-01-01 13:55:28 +05:30
page . find ( '.page-link.next-page-item' ) . click
2018-03-17 18:26:18 +05:30
2020-01-01 13:55:28 +05:30
expect ( page ) . to have_selector ( '.gl-pagination .page-link' , count : 4 )
2018-03-17 18:26:18 +05:30
end
2017-08-17 22:00:37 +05:30
end
end
describe 'GET /:project/pipelines/show' do
2017-09-10 17:25:29 +05:30
let ( :project ) { create ( :project , :repository ) }
2017-08-17 22:00:37 +05:30
let ( :pipeline ) do
create ( :ci_empty_pipeline ,
project : project ,
sha : project . commit . id ,
user : user )
end
before do
create_build ( 'build' , 0 , 'build' , :success )
create_build ( 'test' , 1 , 'rspec 0:2' , :pending )
create_build ( 'test' , 1 , 'rspec 1:2' , :running )
create_build ( 'test' , 1 , 'spinach 0:2' , :created )
create_build ( 'test' , 1 , 'spinach 1:2' , :created )
create_build ( 'test' , 1 , 'audit' , :created )
create_build ( 'deploy' , 2 , 'production' , :created )
create ( :generic_commit_status , pipeline : pipeline , stage : 'external' , name : 'jenkins' , stage_idx : 3 )
2017-09-10 17:25:29 +05:30
visit project_pipeline_path ( project , pipeline )
wait_for_requests
2017-08-17 22:00:37 +05:30
end
it 'shows a graph with grouped stages' do
expect ( page ) . to have_css ( '.js-pipeline-graph' )
# header
expect ( page ) . to have_text ( " # #{ pipeline . id } " )
expect ( page ) . to have_selector ( %Q( img[alt$=" #{ pipeline . user . name } 's avatar"] ) )
expect ( page ) . to have_link ( pipeline . user . name , href : user_path ( pipeline . user ) )
# stages
expect ( page ) . to have_text ( 'Build' )
expect ( page ) . to have_text ( 'Test' )
expect ( page ) . to have_text ( 'Deploy' )
expect ( page ) . to have_text ( 'External' )
# builds
expect ( page ) . to have_text ( 'rspec' )
expect ( page ) . to have_text ( 'spinach' )
expect ( page ) . to have_text ( 'rspec' )
expect ( page ) . to have_text ( 'production' )
expect ( page ) . to have_text ( 'jenkins' )
end
def create_build ( stage , stage_idx , name , status )
create ( :ci_build , pipeline : pipeline , stage : stage , stage_idx : stage_idx , name : name , status : status )
end
end
describe 'POST /:project/pipelines' do
2017-09-10 17:25:29 +05:30
let ( :project ) { create ( :project , :repository ) }
2017-08-17 22:00:37 +05:30
before do
2020-10-24 23:57:45 +05:30
stub_feature_flags ( new_pipeline_form : false )
2017-09-10 17:25:29 +05:30
visit new_project_pipeline_path ( project )
2017-08-17 22:00:37 +05:30
end
2018-03-17 18:26:18 +05:30
context 'for valid commit' , :js do
2017-08-17 22:00:37 +05:30
before do
click_button project . default_branch
page . within '.dropdown-menu' do
click_link 'master'
end
end
context 'with gitlab-ci.yml' do
2017-09-10 17:25:29 +05:30
before do
stub_ci_pipeline_to_return_yaml_file
end
2017-08-17 22:00:37 +05:30
it 'creates a new pipeline' do
2019-07-07 11:18:12 +05:30
expect { click_on 'Run Pipeline' }
2017-08-17 22:00:37 +05:30
. to change { Ci :: Pipeline . count } . by ( 1 )
2017-09-10 17:25:29 +05:30
expect ( Ci :: Pipeline . last ) . to be_web
2017-08-17 22:00:37 +05:30
end
2018-10-15 14:42:47 +05:30
context 'when variables are specified' do
it 'creates a new pipeline with variables' do
page . within '.ci-variable-row-body' do
fill_in " Input variable key " , with : " key_name "
fill_in " Input variable value " , with : " value "
end
2019-07-07 11:18:12 +05:30
expect { click_on 'Run Pipeline' }
2018-10-15 14:42:47 +05:30
. to change { Ci :: Pipeline . count } . by ( 1 )
expect ( Ci :: Pipeline . last . variables . map { | var | var . slice ( :key , :secret_value ) } )
. to eq [ { key : " key_name " , secret_value : " value " } . with_indifferent_access ]
end
end
2017-08-17 22:00:37 +05:30
end
context 'without gitlab-ci.yml' do
2017-09-10 17:25:29 +05:30
before do
2019-07-07 11:18:12 +05:30
click_on 'Run Pipeline'
2017-09-10 17:25:29 +05:30
end
2017-08-17 22:00:37 +05:30
2020-01-01 13:55:28 +05:30
it { expect ( page ) . to have_content ( 'Missing CI config file' ) }
2018-03-17 18:26:18 +05:30
it 'creates a pipeline after first request failed and a valid gitlab-ci.yml file is available when trying again' do
click_button project . default_branch
stub_ci_pipeline_to_return_yaml_file
page . within '.dropdown-menu' do
click_link 'master'
end
2019-07-07 11:18:12 +05:30
expect { click_on 'Run Pipeline' }
2018-03-17 18:26:18 +05:30
. to change { Ci :: Pipeline . count } . by ( 1 )
end
2017-08-17 22:00:37 +05:30
end
end
end
2019-07-07 11:18:12 +05:30
describe 'Run Pipelines' do
2017-09-10 17:25:29 +05:30
let ( :project ) { create ( :project , :repository ) }
2017-08-17 22:00:37 +05:30
before do
2020-10-24 23:57:45 +05:30
stub_feature_flags ( new_pipeline_form : false )
2017-09-10 17:25:29 +05:30
visit new_project_pipeline_path ( project )
2017-08-17 22:00:37 +05:30
end
describe 'new pipeline page' do
it 'has field to add a new pipeline' do
expect ( page ) . to have_selector ( '.js-branch-select' )
expect ( find ( '.js-branch-select' ) ) . to have_content project . default_branch
2019-07-07 11:18:12 +05:30
expect ( page ) . to have_content ( 'Run for' )
2017-08-17 22:00:37 +05:30
end
end
describe 'find pipelines' do
2018-03-17 18:26:18 +05:30
it 'shows filtered pipelines' , :js do
2017-08-17 22:00:37 +05:30
click_button project . default_branch
page . within '.dropdown-menu' do
find ( '.dropdown-input-field' ) . native . send_keys ( 'fix' )
page . within '.dropdown-content' do
expect ( page ) . to have_content ( 'fix' )
end
end
end
end
end
2018-03-17 18:26:18 +05:30
describe 'Reset runner caches' do
let ( :project ) { create ( :project , :repository ) }
before do
create ( :ci_empty_pipeline , status : 'success' , project : project , sha : project . commit . id , ref : 'master' )
2018-11-18 11:00:15 +05:30
project . add_maintainer ( user )
2018-03-17 18:26:18 +05:30
visit project_pipelines_path ( project )
end
it 'has a clear caches button' do
2018-05-09 12:01:36 +05:30
expect ( page ) . to have_button 'Clear Runner Caches'
2018-03-17 18:26:18 +05:30
end
describe 'user clicks the button' do
context 'when project already has jobs_cache_index' do
before do
2018-11-18 11:00:15 +05:30
project . update ( jobs_cache_index : 1 )
2018-03-17 18:26:18 +05:30
end
it 'increments jobs_cache_index' do
2018-05-09 12:01:36 +05:30
click_button 'Clear Runner Caches'
wait_for_requests
2018-03-17 18:26:18 +05:30
expect ( page . find ( '.flash-notice' ) ) . to have_content 'Project cache successfully reset.'
end
end
context 'when project does not have jobs_cache_index' do
it 'sets jobs_cache_index to 1' do
2018-05-09 12:01:36 +05:30
click_button 'Clear Runner Caches'
wait_for_requests
2018-03-17 18:26:18 +05:30
expect ( page . find ( '.flash-notice' ) ) . to have_content 'Project cache successfully reset.'
end
end
end
end
2018-03-27 19:54:05 +05:30
describe 'Empty State' do
let ( :project ) { create ( :project , :repository ) }
before do
visit project_pipelines_path ( project )
end
it 'renders empty state' do
expect ( page ) . to have_content 'Build with confidence'
end
end
2017-08-17 22:00:37 +05:30
end
context 'when user is not logged in' do
before do
2018-11-20 20:47:30 +05:30
project . update! ( auto_devops_attributes : { enabled : false } )
2017-09-10 17:25:29 +05:30
visit project_pipelines_path ( project )
2017-08-17 22:00:37 +05:30
end
context 'when project is public' do
2017-09-10 17:25:29 +05:30
let ( :project ) { create ( :project , :public , :repository ) }
2017-08-17 22:00:37 +05:30
2018-03-27 19:54:05 +05:30
context 'without pipelines' do
it { expect ( page ) . to have_content 'This project is not currently set up to run pipelines.' }
end
2017-08-17 22:00:37 +05:30
end
context 'when project is private' do
2017-09-10 17:25:29 +05:30
let ( :project ) { create ( :project , :private , :repository ) }
2017-08-17 22:00:37 +05:30
2019-10-31 01:37:42 +05:30
it 'redirects the user to sign_in and displays the flash alert' do
expect ( page ) . to have_content 'You need to sign in'
expect ( page . current_path ) . to eq ( " /users/sign_in " )
end
2017-08-17 22:00:37 +05:30
end
end
def visit_project_pipelines ( ** query )
2017-09-10 17:25:29 +05:30
visit project_pipelines_path ( project , query )
wait_for_requests
2017-08-17 22:00:37 +05:30
end
end