diff options
Diffstat (limited to 'spec/services/ci/create_pipeline_service_spec.rb')
-rw-r--r-- | spec/services/ci/create_pipeline_service_spec.rb | 307 |
1 files changed, 176 insertions, 131 deletions
diff --git a/spec/services/ci/create_pipeline_service_spec.rb b/spec/services/ci/create_pipeline_service_spec.rb index 56bfeda3bff..2fdb0ed3c0d 100644 --- a/spec/services/ci/create_pipeline_service_spec.rb +++ b/spec/services/ci/create_pipeline_service_spec.rb @@ -19,7 +19,6 @@ RSpec.describe Ci::CreatePipelineService do def execute_service( source: :push, after: project.commit.id, - message: 'Message', ref: ref_name, trigger_request: nil, variables_attributes: nil, @@ -32,7 +31,6 @@ RSpec.describe Ci::CreatePipelineService do params = { ref: ref, before: '00000000', after: after, - commits: [{ message: message }], variables_attributes: variables_attributes, push_options: push_options, source_sha: source_sha, @@ -49,12 +47,16 @@ RSpec.describe Ci::CreatePipelineService do # rubocop:enable Metrics/ParameterLists context 'valid params' do - let(:pipeline) { execute_service } + let(:pipeline) { execute_service.payload } let(:pipeline_on_previous_commit) do execute_service( after: previous_commit_sha_from_ref('master') - ) + ).payload + end + + it 'responds with success' do + expect(execute_service).to be_success end it 'creates a pipeline' do @@ -128,7 +130,7 @@ RSpec.describe Ci::CreatePipelineService do merge_request_1 merge_request_2 - head_pipeline = execute_service(ref: 'feature', after: nil) + head_pipeline = execute_service(ref: 'feature', after: nil).payload expect(merge_request_1.reload.head_pipeline).to eq(head_pipeline) expect(merge_request_2.reload.head_pipeline).to eq(head_pipeline) @@ -157,7 +159,7 @@ RSpec.describe Ci::CreatePipelineService do target_branch: "branch_1", source_project: project) - head_pipeline = execute_service + head_pipeline = execute_service.payload expect(merge_request.reload.head_pipeline).not_to eq(head_pipeline) end @@ -178,7 +180,7 @@ RSpec.describe Ci::CreatePipelineService do source_project: project, target_project: target_project) - head_pipeline = execute_service(ref: 'feature', after: nil) + head_pipeline = execute_service(ref: 'feature', after: nil).payload expect(merge_request.reload.head_pipeline).to eq(head_pipeline) end @@ -209,7 +211,7 @@ RSpec.describe Ci::CreatePipelineService do target_branch: 'feature', source_project: project) - head_pipeline = execute_service + head_pipeline = execute_service.payload expect(head_pipeline).to be_persisted expect(head_pipeline.yaml_errors).to be_present @@ -230,7 +232,7 @@ RSpec.describe Ci::CreatePipelineService do target_branch: 'feature', source_project: project) - head_pipeline = execute_service + head_pipeline = execute_service.payload expect(head_pipeline).to be_skipped expect(head_pipeline).to be_persisted @@ -260,7 +262,7 @@ RSpec.describe Ci::CreatePipelineService do it 'cancels running outdated pipelines', :sidekiq_inline do pipeline_on_previous_commit.reload.run - head_pipeline = execute_service + head_pipeline = execute_service.payload expect(pipeline_on_previous_commit.reload).to have_attributes(status: 'canceled', auto_canceled_by_id: head_pipeline.id) end @@ -276,7 +278,8 @@ RSpec.describe Ci::CreatePipelineService do new_pipeline = execute_service( ref: 'refs/heads/feature', after: previous_commit_sha_from_ref('feature') - ) + ).payload + pipeline expect(new_pipeline.reload).to have_attributes(status: 'created', auto_canceled_by_id: nil) @@ -290,7 +293,7 @@ RSpec.describe Ci::CreatePipelineService do end it 'is cancelable' do - pipeline = execute_service + pipeline = execute_service.payload expect(pipeline.builds.find_by(name: 'rspec').interruptible).to be_nil end @@ -303,7 +306,7 @@ RSpec.describe Ci::CreatePipelineService do end it 'is cancelable' do - pipeline = execute_service + pipeline = execute_service.payload expect(pipeline.builds.find_by(name: 'rspec').interruptible).to be_truthy end @@ -316,7 +319,7 @@ RSpec.describe Ci::CreatePipelineService do end it 'is not cancelable' do - pipeline = execute_service + pipeline = execute_service.payload expect(pipeline.builds.find_by(name: 'rspec').interruptible).to be_falsy end @@ -476,21 +479,25 @@ RSpec.describe Ci::CreatePipelineService do context "skip tag if there is no build for it" do it "creates commit if there is appropriate job" do - expect(execute_service).to be_persisted + expect(execute_service.payload).to be_persisted end it "creates commit if there is no appropriate job but deploy job has right ref setting" do config = YAML.dump({ deploy: { script: "ls", only: ["master"] } }) stub_ci_pipeline_yaml_file(config) - expect(execute_service).to be_persisted + expect(execute_service.payload).to be_persisted end end - it 'skips creating pipeline for refs without .gitlab-ci.yml' do + it 'skips creating pipeline for refs without .gitlab-ci.yml', :aggregate_failures do stub_ci_pipeline_yaml_file(nil) - expect(execute_service).not_to be_persisted + response = execute_service + + expect(response).to be_error + expect(response.message).to eq('Missing CI config file') + expect(response.payload).not_to be_persisted expect(Ci::Pipeline.count).to eq(0) expect(Namespaces::OnboardingPipelineCreatedWorker).not_to receive(:perform_async) end @@ -499,7 +506,7 @@ RSpec.describe Ci::CreatePipelineService do it 'creates failed pipeline' do stub_ci_pipeline_yaml_file(ci_yaml) - pipeline = execute_service(message: message) + pipeline = execute_service.payload expect(pipeline).to be_persisted expect(pipeline.builds.any?).to be false @@ -516,7 +523,7 @@ RSpec.describe Ci::CreatePipelineService do end it 'pull it from the repository' do - pipeline = execute_service + pipeline = execute_service.payload expect(pipeline).to be_repository_source expect(pipeline.builds.map(&:name)).to eq ['rspec'] end @@ -530,7 +537,7 @@ RSpec.describe Ci::CreatePipelineService do end it 'pull it from Auto-DevOps' do - pipeline = execute_service + pipeline = execute_service.payload expect(pipeline).to be_auto_devops_source expect(pipeline.builds.map(&:name)).to match_array(%w[brakeman-sast build code_quality eslint-sast secret_detection semgrep-sast test]) end @@ -541,11 +548,12 @@ RSpec.describe Ci::CreatePipelineService do stub_ci_pipeline_yaml_file(nil) end - it 'attaches errors to the pipeline' do - pipeline = execute_service + it 'responds with error message', :aggregate_failures do + response = execute_service - expect(pipeline.errors.full_messages).to eq ['Missing CI config file'] - expect(pipeline).not_to be_persisted + expect(response).to be_error + expect(response.message).to eq('Missing CI config file') + expect(response.payload).not_to be_persisted end end @@ -556,7 +564,7 @@ RSpec.describe Ci::CreatePipelineService do end it 'saves error in pipeline' do - pipeline = execute_service + pipeline = execute_service.payload expect(pipeline.yaml_errors).to include('Undefined error') end @@ -648,7 +656,7 @@ RSpec.describe Ci::CreatePipelineService do end it 'saves error in pipeline' do - pipeline = execute_service + pipeline = execute_service.payload expect(pipeline.yaml_errors).to include('Undefined error') end @@ -661,26 +669,18 @@ RSpec.describe Ci::CreatePipelineService do end context 'when commit contains a [ci skip] directive' do - let(:message) { "some message[ci skip]" } - - ci_messages = [ - "some message[ci skip]", - "some message[skip ci]", - "some message[CI SKIP]", - "some message[SKIP CI]", - "some message[ci_skip]", - "some message[skip_ci]", - "some message[ci-skip]", - "some message[skip-ci]" - ] + shared_examples 'creating a pipeline' do + it 'does not skip pipeline creation' do + pipeline = execute_service.payload - before do - allow_any_instance_of(Ci::Pipeline).to receive(:git_commit_message) { message } + expect(pipeline).to be_persisted + expect(pipeline.builds.first.name).to eq("rspec") + end end - ci_messages.each do |ci_message| - it "skips builds creation if the commit message is #{ci_message}" do - pipeline = execute_service(message: ci_message) + shared_examples 'skipping a pipeline' do + it 'skips pipeline creation' do + pipeline = execute_service.payload expect(pipeline).to be_persisted expect(pipeline.builds.any?).to be false @@ -688,14 +688,26 @@ RSpec.describe Ci::CreatePipelineService do end end - shared_examples 'creating a pipeline' do - it 'does not skip pipeline creation' do - allow_any_instance_of(Ci::Pipeline).to receive(:git_commit_message) { commit_message } + before do + allow_any_instance_of(Ci::Pipeline).to receive(:git_commit_message) { commit_message } + end + + skip_commit_messages = [ + "some message[ci skip]", + "some message[skip ci]", + "some message[CI SKIP]", + "some message[SKIP CI]", + "some message[ci_skip]", + "some message[skip_ci]", + "some message[ci-skip]", + "some message[skip-ci]" + ] - pipeline = execute_service(message: commit_message) + skip_commit_messages.each do |skip_commit_message| + context "when the commit message is #{skip_commit_message}" do + let(:commit_message) { skip_commit_message } - expect(pipeline).to be_persisted - expect(pipeline.builds.first.name).to eq("rspec") + it_behaves_like 'skipping a pipeline' end end @@ -712,9 +724,14 @@ RSpec.describe Ci::CreatePipelineService do end context 'when there is [ci skip] tag in commit message and yaml is invalid' do + let(:commit_message) { 'some message [ci skip]' } let(:ci_yaml) { 'invalid: file: fiile' } - it_behaves_like 'a failed pipeline' + before do + stub_ci_pipeline_yaml_file(ci_yaml) + end + + it_behaves_like 'skipping a pipeline' end end @@ -724,7 +741,7 @@ RSpec.describe Ci::CreatePipelineService do end it 'creates a pipline in the skipped state' do - pipeline = execute_service(push_options: push_options) + pipeline = execute_service(push_options: push_options).payload # TODO: DRY these up with "skips builds creation if the commit message" expect(pipeline).to be_persisted @@ -739,10 +756,12 @@ RSpec.describe Ci::CreatePipelineService do stub_ci_pipeline_yaml_file(config) end - it 'does not create a new pipeline' do + it 'does not create a new pipeline', :aggregate_failures do result = execute_service - expect(result).not_to be_persisted + expect(result).to be_error + expect(result.message).to eq('No stages / jobs for this pipeline.') + expect(result.payload).not_to be_persisted expect(Ci::Build.all).to be_empty expect(Ci::Pipeline.count).to eq(0) end @@ -757,10 +776,11 @@ RSpec.describe Ci::CreatePipelineService do .and_call_original end - it 'rewinds iid' do + it 'rewinds iid', :aggregate_failures do result = execute_service - expect(result).not_to be_persisted + expect(result).to be_error + expect(result.payload).not_to be_persisted expect(internal_id.last_value).to eq(0) end end @@ -773,7 +793,7 @@ RSpec.describe Ci::CreatePipelineService do end it 'does not create a new pipeline', :sidekiq_inline do - result = execute_service + result = execute_service.payload expect(result).to be_persisted expect(result.manual_actions).not_to be_empty @@ -793,7 +813,7 @@ RSpec.describe Ci::CreatePipelineService do end it 'creates the environment with tags' do - result = execute_service + result = execute_service.payload expect(result).to be_persisted expect(Environment.find_by(name: "review/master")).to be_present @@ -815,7 +835,7 @@ RSpec.describe Ci::CreatePipelineService do end it 'creates the environment with auto stop in' do - result = execute_service + result = execute_service.payload expect(result).to be_persisted expect(result.builds.first.options[:environment][:auto_stop_in]).to eq('1 day') @@ -835,7 +855,7 @@ RSpec.describe Ci::CreatePipelineService do end it 'skipps persisted variables in environment name' do - result = execute_service + result = execute_service.payload expect(result).to be_persisted expect(Environment.find_by(name: "review/id1/id2")).to be_present @@ -860,7 +880,7 @@ RSpec.describe Ci::CreatePipelineService do end it 'stores the requested namespace' do - result = execute_service + result = execute_service.payload build = result.builds.first expect(result).to be_persisted @@ -876,7 +896,7 @@ RSpec.describe Ci::CreatePipelineService do it 'does not create an environment' do expect do - result = execute_service + result = execute_service.payload expect(result).to be_persisted end.not_to change { Environment.count } @@ -896,7 +916,7 @@ RSpec.describe Ci::CreatePipelineService do end it 'creates a pipeline with the environment' do - result = execute_service + result = execute_service.payload expect(result).to be_persisted expect(Environment.find_by(name: 'production')).to be_present @@ -906,7 +926,7 @@ RSpec.describe Ci::CreatePipelineService do end context 'when builds with auto-retries are configured' do - let(:pipeline) { execute_service } + let(:pipeline) { execute_service.payload } let(:rspec_job) { pipeline.builds.find_by(name: 'rspec') } before do @@ -946,7 +966,7 @@ RSpec.describe Ci::CreatePipelineService do let(:resource_group_key) { 'iOS' } it 'persists the association correctly' do - result = execute_service + result = execute_service.payload deploy_job = result.builds.find_by_name!(:test) resource_group = project.resource_groups.find_by_key!(resource_group_key) @@ -962,7 +982,7 @@ RSpec.describe Ci::CreatePipelineService do let(:resource_group_key) { '$CI_COMMIT_REF_NAME-$CI_JOB_NAME' } it 'interpolates the variables into the key correctly' do - result = execute_service + result = execute_service.payload expect(result).to be_persisted expect(project.resource_groups.exists?(key: 'master-test')).to eq(true) @@ -979,7 +999,7 @@ RSpec.describe Ci::CreatePipelineService do end it 'correctly creates builds with custom timeout value configured' do - pipeline = execute_service + pipeline = execute_service.payload expect(pipeline).to be_persisted expect(pipeline.builds.find_by(name: 'rspec').options[:job_timeout]).to eq 123 @@ -994,7 +1014,7 @@ RSpec.describe Ci::CreatePipelineService do end it 'is valid config' do - pipeline = execute_service + pipeline = execute_service.payload build = pipeline.builds.first expect(pipeline).to be_kind_of(Ci::Pipeline) expect(pipeline).to be_valid @@ -1059,14 +1079,14 @@ RSpec.describe Ci::CreatePipelineService do project.add_developer(user) end - it 'does not create a pipeline' do - expect(execute_service).not_to be_persisted + it 'does not create a pipeline', :aggregate_failures do + expect(execute_service.payload).not_to be_persisted expect(Ci::Pipeline.count).to eq(0) end end context 'when user is maintainer' do - let(:pipeline) { execute_service } + let(:pipeline) { execute_service.payload } before do project.add_maintainer(user) @@ -1083,9 +1103,11 @@ RSpec.describe Ci::CreatePipelineService do let(:user) {} let(:trigger_request) { create(:ci_trigger_request) } - it 'does not create a pipeline' do - expect(execute_service(trigger_request: trigger_request)) - .not_to be_persisted + it 'does not create a pipeline', :aggregate_failures do + response = execute_service(trigger_request: trigger_request) + + expect(response).to be_error + expect(response.payload).not_to be_persisted expect(Ci::Pipeline.count).to eq(0) end end @@ -1099,9 +1121,11 @@ RSpec.describe Ci::CreatePipelineService do project.add_developer(user) end - it 'does not create a pipeline' do - expect(execute_service(trigger_request: trigger_request)) - .not_to be_persisted + it 'does not create a pipeline', :aggregate_failures do + response = execute_service(trigger_request: trigger_request) + + expect(response).to be_error + expect(response.payload).not_to be_persisted expect(Ci::Pipeline.count).to eq(0) end end @@ -1116,7 +1140,7 @@ RSpec.describe Ci::CreatePipelineService do end it 'creates a pipeline' do - expect(execute_service(trigger_request: trigger_request)) + expect(execute_service(trigger_request: trigger_request).payload) .to be_persisted expect(Ci::Pipeline.count).to eq(1) end @@ -1150,7 +1174,7 @@ RSpec.describe Ci::CreatePipelineService do end it 'creates a tagged pipeline' do - pipeline = execute_service(ref: 'v1.0.0') + pipeline = execute_service(ref: 'v1.0.0').payload expect(pipeline.tag?).to be true end @@ -1161,7 +1185,7 @@ RSpec.describe Ci::CreatePipelineService do let(:ref_name) { 'refs/heads/nonexistant-branch' } - let(:pipeline) { execute_service } + let(:pipeline) { execute_service.payload } it 'does not create the pipeline' do expect(pipeline).not_to be_created_successfully @@ -1185,7 +1209,7 @@ RSpec.describe Ci::CreatePipelineService do # v1.1.0 is on the test repo as branch and tag let(:ref_name) { 'refs/heads/v1.1.0' } - let(:pipeline) { execute_service } + let(:pipeline) { execute_service.payload } it 'creates the pipeline for the branch' do expect(pipeline).to be_created_successfully @@ -1200,7 +1224,7 @@ RSpec.describe Ci::CreatePipelineService do # v1.1.0 is on the test repo as branch and tag let(:ref_name) { 'refs/tags/v1.1.0' } - let(:pipeline) { execute_service } + let(:pipeline) { execute_service.payload } it 'creates the pipeline for the tag' do expect(pipeline).to be_created_successfully @@ -1215,7 +1239,7 @@ RSpec.describe Ci::CreatePipelineService do # v1.1.0 is on the test repo as branch and tag let(:ref_name) { 'v1.1.0' } - let(:pipeline) { execute_service } + let(:pipeline) { execute_service.payload } it 'does not create the pipeline' do expect(pipeline).not_to be_created_successfully @@ -1229,16 +1253,16 @@ RSpec.describe Ci::CreatePipelineService do { key: 'second', secret_value: 'second_world' }] end - subject { execute_service(variables_attributes: variables_attributes) } + subject(:pipeline) { execute_service(variables_attributes: variables_attributes).payload } it 'creates a pipeline with specified variables' do - expect(subject.variables.map { |var| var.slice(:key, :secret_value) }) + expect(pipeline.variables.map { |var| var.slice(:key, :secret_value) }) .to eq variables_attributes.map(&:with_indifferent_access) end end context 'when pipeline has a job with environment' do - let(:pipeline) { execute_service } + let(:pipeline) { execute_service.payload } before do stub_ci_pipeline_yaml_file(YAML.dump(config)) @@ -1286,7 +1310,7 @@ RSpec.describe Ci::CreatePipelineService do end describe 'Pipeline for external pull requests' do - let(:pipeline) do + let(:response) do execute_service(source: source, external_pull_request: pull_request, ref: ref_name, @@ -1294,6 +1318,8 @@ RSpec.describe Ci::CreatePipelineService do target_sha: target_sha) end + let(:pipeline) { response.payload } + before do stub_ci_pipeline_yaml_file(YAML.dump(config)) end @@ -1342,9 +1368,11 @@ RSpec.describe Ci::CreatePipelineService do context 'when ref is tag' do let(:ref_name) { 'refs/tags/v1.1.0' } - it 'does not create an extrnal pull request pipeline' do + it 'does not create an extrnal pull request pipeline', :aggregate_failures do + expect(response).to be_error + expect(response.message).to eq('Tag is not included in the list and Failed to build the pipeline!') expect(pipeline).not_to be_persisted - expect(pipeline.errors[:tag]).to eq(["is not included in the list"]) + expect(pipeline.errors[:tag]).to eq(['is not included in the list']) end end @@ -1363,9 +1391,11 @@ RSpec.describe Ci::CreatePipelineService do } end - it 'does not create a detached merge request pipeline' do + it 'does not create a detached merge request pipeline', :aggregate_failures do + expect(response).to be_error + expect(response.message).to eq('No stages / jobs for this pipeline.') expect(pipeline).not_to be_persisted - expect(pipeline.errors[:base]).to eq(["No stages / jobs for this pipeline."]) + expect(pipeline.errors[:base]).to eq(['No stages / jobs for this pipeline.']) end end end @@ -1373,7 +1403,9 @@ RSpec.describe Ci::CreatePipelineService do context 'when external pull request is not specified' do let(:pull_request) { nil } - it 'does not create an external pull request pipeline' do + it 'does not create an external pull request pipeline', :aggregate_failures do + expect(response).to be_error + expect(response.message).to eq("External pull request can't be blank and Failed to build the pipeline!") expect(pipeline).not_to be_persisted expect(pipeline.errors[:external_pull_request]).to eq(["can't be blank"]) end @@ -1420,11 +1452,11 @@ RSpec.describe Ci::CreatePipelineService do context 'when external pull request is not specified' do let(:pull_request) { nil } - it 'does not create an external pull request pipeline' do + it 'does not create an external pull request pipeline', :aggregate_failures do + expect(response).to be_error + expect(response.message).to eq("External pull request can't be blank and Failed to build the pipeline!") expect(pipeline).not_to be_persisted - - expect(pipeline.errors[:base]) - .to eq(['Failed to build the pipeline!']) + expect(pipeline.errors[:base]).to eq(['Failed to build the pipeline!']) end end end @@ -1432,7 +1464,7 @@ RSpec.describe Ci::CreatePipelineService do end describe 'Pipelines for merge requests' do - let(:pipeline) do + let(:response) do execute_service(source: source, merge_request: merge_request, ref: ref_name, @@ -1440,6 +1472,8 @@ RSpec.describe Ci::CreatePipelineService do target_sha: target_sha) end + let(:pipeline) { response.payload } + before do stub_ci_pipeline_yaml_file(YAML.dump(config)) end @@ -1522,9 +1556,11 @@ RSpec.describe Ci::CreatePipelineService do context 'when ref is tag' do let(:ref_name) { 'refs/tags/v1.1.0' } - it 'does not create a merge request pipeline' do + it 'does not create a merge request pipeline', :aggregate_failures do + expect(response).to be_error + expect(response.message).to eq('Tag is not included in the list and Failed to build the pipeline!') expect(pipeline).not_to be_persisted - expect(pipeline.errors[:tag]).to eq(["is not included in the list"]) + expect(pipeline.errors[:tag]).to eq(['is not included in the list']) end end @@ -1564,9 +1600,10 @@ RSpec.describe Ci::CreatePipelineService do } end - it 'does not create a detached merge request pipeline' do + it 'does not create a detached merge request pipeline', :aggregate_failures do + expect(response).to be_error + expect(response.message).to eq('No stages / jobs for this pipeline.') expect(pipeline).not_to be_persisted - expect(pipeline.errors[:base]).to eq(["No stages / jobs for this pipeline."]) end end end @@ -1599,11 +1636,10 @@ RSpec.describe Ci::CreatePipelineService do target_branch: 'master') end - it 'does not create a detached merge request pipeline' do + it 'does not create a detached merge request pipeline', :aggregate_failures do + expect(response).to be_error + expect(response.message).to eq('No stages / jobs for this pipeline.') expect(pipeline).not_to be_persisted - - expect(pipeline.errors[:base]) - .to eq(['No stages / jobs for this pipeline.']) end end end @@ -1628,11 +1664,10 @@ RSpec.describe Ci::CreatePipelineService do target_branch: 'master') end - it 'does not create a detached merge request pipeline' do + it 'does not create a detached merge request pipeline', :aggregate_failures do + expect(response).to be_error + expect(response.message).to eq('No stages / jobs for this pipeline.') expect(pipeline).not_to be_persisted - - expect(pipeline.errors[:base]) - .to eq(['No stages / jobs for this pipeline.']) end end end @@ -1659,11 +1694,10 @@ RSpec.describe Ci::CreatePipelineService do target_branch: 'master') end - it 'does not create a detached merge request pipeline' do + it 'does not create a detached merge request pipeline', :aggregate_failures do + expect(response).to be_error + expect(response.message).to eq('No stages / jobs for this pipeline.') expect(pipeline).not_to be_persisted - - expect(pipeline.errors[:base]) - .to eq(['No stages / jobs for this pipeline.']) end end end @@ -1688,11 +1722,10 @@ RSpec.describe Ci::CreatePipelineService do target_branch: 'master') end - it 'does not create a detached merge request pipeline' do + it 'does not create a detached merge request pipeline', :aggregate_failures do + expect(response).to be_error + expect(response.message).to eq('No stages / jobs for this pipeline.') expect(pipeline).not_to be_persisted - - expect(pipeline.errors[:base]) - .to eq(['No stages / jobs for this pipeline.']) end end end @@ -1733,7 +1766,8 @@ RSpec.describe Ci::CreatePipelineService do end context 'when needs is used' do - let(:pipeline) { execute_service } + let(:response) { execute_service } + let(:pipeline) { response.payload } let(:config) do { @@ -1779,7 +1813,7 @@ RSpec.describe Ci::CreatePipelineService do let(:ref_name) { 'refs/heads/feature' } shared_examples 'has errors' do - it 'contains the expected errors' do + it 'contains the expected errors', :aggregate_failures do expect(pipeline.builds).to be_empty error_message = "'test_a' job needs 'build_a' job, but 'build_a' is not in any previous stage" @@ -1790,9 +1824,12 @@ RSpec.describe Ci::CreatePipelineService do end context 'when save_on_errors is enabled' do - let(:pipeline) { execute_service(save_on_errors: true) } + let(:response) { execute_service(save_on_errors: true) } + let(:pipeline) { response.payload } - it 'does create a pipeline as test_a depends on build_a' do + it 'does create a pipeline as test_a depends on build_a', :aggregate_failures do + expect(response).to be_error + expect(response.message).to eq("'test_a' job needs 'build_a' job, but 'build_a' is not in any previous stage") expect(pipeline).to be_persisted end @@ -1800,9 +1837,11 @@ RSpec.describe Ci::CreatePipelineService do end context 'when save_on_errors is disabled' do - let(:pipeline) { execute_service(save_on_errors: false) } + let(:response) { execute_service(save_on_errors: false) } + let(:pipeline) { response.payload } - it 'does not create a pipeline as test_a depends on build_a' do + it 'does not create a pipeline as test_a depends on build_a', :aggregate_failures do + expect(response).to be_error expect(pipeline).not_to be_persisted end @@ -1822,7 +1861,8 @@ RSpec.describe Ci::CreatePipelineService do context 'when rules are used' do let(:ref_name) { 'refs/heads/master' } - let(:pipeline) { execute_service } + let(:response) { execute_service } + let(:pipeline) { response.payload } let(:build_names) { pipeline.builds.pluck(:name) } let(:regular_job) { find_job('regular-job') } let(:rules_job) { find_job('rules-job') } @@ -2379,8 +2419,9 @@ RSpec.describe Ci::CreatePipelineService do end context 'when inside freeze period' do - it 'does not create the pipeline' do + it 'does not create the pipeline', :aggregate_failures do Timecop.freeze(2020, 4, 10, 23, 1) do + expect(response).to be_error expect(pipeline).not_to be_persisted end end @@ -2410,7 +2451,8 @@ RSpec.describe Ci::CreatePipelineService do context 'with no matches' do let(:ref_name) { 'refs/heads/feature' } - it 'does not create a pipeline' do + it 'does not create a pipeline', :aggregate_failures do + expect(response).to be_error expect(pipeline).not_to be_persisted end end @@ -2418,7 +2460,7 @@ RSpec.describe Ci::CreatePipelineService do context 'with workflow rules with pipeline variables' do let(:pipeline) do - execute_service(variables_attributes: variables_attributes) + execute_service(variables_attributes: variables_attributes).payload end let(:config) do @@ -2446,7 +2488,8 @@ RSpec.describe Ci::CreatePipelineService do context 'with no matches' do let(:variables_attributes) { {} } - it 'does not create a pipeline' do + it 'does not create a pipeline', :aggregate_failures do + expect(response).to be_error expect(pipeline).not_to be_persisted end end @@ -2456,7 +2499,7 @@ RSpec.describe Ci::CreatePipelineService do let(:pipeline) do execute_service do |pipeline| pipeline.variables.build(variables) - end + end.payload end let(:config) do @@ -2514,7 +2557,8 @@ RSpec.describe Ci::CreatePipelineService do context 'with no matches' do let(:variables) { {} } - it 'does not create a pipeline' do + it 'does not create a pipeline', :aggregate_failures do + expect(response).to be_error expect(pipeline).not_to be_persisted end @@ -2542,7 +2586,8 @@ RSpec.describe Ci::CreatePipelineService do EOY end - it 'does not create a pipeline' do + it 'does not create a pipeline', :aggregate_failures do + expect(response).to be_error expect(pipeline).not_to be_persisted end end |