diff options
author | Shinya Maeda <shinya@gitlab.com> | 2018-10-10 16:01:04 +0900 |
---|---|---|
committer | Shinya Maeda <shinya@gitlab.com> | 2018-10-18 14:48:29 +0900 |
commit | f262b8f320c2f6760cc978ef946c7c2b5b440a58 (patch) | |
tree | 839dfdb202ad474c502d8faeae93d6dad32c470e | |
parent | e409834f1b1f182f8b387bab4c4ca9f7b350f68a (diff) | |
download | gitlab-ce-f262b8f320c2f6760cc978ef946c7c2b5b440a58.tar.gz |
Improve specs for Ci::ProcessBuildService
-rw-r--r-- | spec/services/ci/process_build_service_spec.rb | 251 |
1 files changed, 90 insertions, 161 deletions
diff --git a/spec/services/ci/process_build_service_spec.rb b/spec/services/ci/process_build_service_spec.rb index 9f47439dc4a..3c730c07457 100644 --- a/spec/services/ci/process_build_service_spec.rb +++ b/spec/services/ci/process_build_service_spec.rb @@ -2,141 +2,40 @@ require 'spec_helper' describe Ci::ProcessBuildService, '#execute' do + VALID_STATUSES_WHEN_ON_SUCCESS = %w[success skipped].freeze + VALID_STATUSES_WHEN_ON_FAILURE = %w[failed].freeze + VALID_STATUSES_WHEN_ALWAYS = %w[success failed skipped].freeze + VALID_STATUSES_WHEN_MANUAL = %w[success skipped].freeze + VALID_STATUSES_WHEN_DELAYED = %w[success skipped].freeze + SKIPPABLE_STATUES = %w[created pending].freeze + let(:user) { create(:user) } let(:project) { create(:project) } - subject { described_class.new(project, user).execute(build, current_status) } + subject { described_class.new(project, user).execute(build, status_for_prior_stages) } before do project.add_maintainer(user) end - shared_examples_for 'Enqueuing properly' do |valid_statuses_for_when| - valid_statuses_for_when.each do |status_for_prior_stages| - context "when status for prior stages is #{status_for_prior_stages}" do - let(:current_status) { status_for_prior_stages } - - %w[created skipped manual scheduled].each do |status| - context "when build status is #{status}" do - let(:build) { create(:ci_build, status.to_sym, when: when_option, user: user, project: project) } - - it 'enqueues the build' do - expect { subject }.to change { build.status }.to('pending') - end - end - end - - %w[pending running success failed canceled].each do |status| - context "when build status is #{status}" do - let(:build) { create(:ci_build, status.to_sym, when: when_option, user: user, project: project) } - - it 'does not change the build status' do - expect { subject }.not_to change { build.status } - end - end - end - end - end - - (HasStatus::AVAILABLE_STATUSES - valid_statuses_for_when).each do |status_for_prior_stages| - let(:current_status) { status_for_prior_stages } - - context "when status for prior stages is #{status_for_prior_stages}" do - %w[created pending].each do |status| - context "when build status is #{status}" do - let(:build) { create(:ci_build, status.to_sym, when: when_option, user: user, project: project) } - - it 'skips the build' do - expect { subject }.to change { build.status }.to('skipped') - end - end - end - - (HasStatus::AVAILABLE_STATUSES - %w[created pending]).each do |status| - context "when build status is #{status}" do - let(:build) { create(:ci_build, status.to_sym, when: when_option, user: user, project: project) } - - it 'does not change build status' do - expect { subject }.not_to change { build.status } - end - end - end - end - end - end - - shared_examples_for 'Actionizing properly' do |valid_statuses_for_when| - valid_statuses_for_when.each do |status_for_prior_stages| - context "when status for prior stages is #{status_for_prior_stages}" do - let(:current_status) { status_for_prior_stages } - - %w[created].each do |status| - context "when build status is #{status}" do - let(:build) { create(:ci_build, status.to_sym, :actionable, user: user, project: project) } - - it 'enqueues the build' do - expect { subject }.to change { build.status }.to('manual') - end - end - end - - %w[manual skipped pending running success failed canceled scheduled].each do |status| - context "when build status is #{status}" do - let(:build) { create(:ci_build, status.to_sym, :actionable, user: user, project: project) } - - it 'does not change the build status' do - expect { subject }.not_to change { build.status } - end - end - end - end - end - - (HasStatus::AVAILABLE_STATUSES - valid_statuses_for_when).each do |status_for_prior_stages| - let(:current_status) { status_for_prior_stages } - - context "when status for prior stages is #{status_for_prior_stages}" do - %w[created pending].each do |status| - context "when build status is #{status}" do - let(:build) { create(:ci_build, status.to_sym, :actionable, user: user, project: project) } - - it 'skips the build' do - expect { subject }.to change { build.status }.to('skipped') - end - end - end - - (HasStatus::AVAILABLE_STATUSES - %w[created pending]).each do |status| - context "when build status is #{status}" do - let(:build) { create(:ci_build, status.to_sym, :actionable, user: user, project: project) } - - it 'does not change build status' do - expect { subject }.not_to change { build.status } - end - end - end - end - end - end - - shared_examples_for 'Scheduling properly' do |valid_statuses_for_when| - valid_statuses_for_when.each do |status_for_prior_stages| - context "when status for prior stages is #{status_for_prior_stages}" do - let(:current_status) { status_for_prior_stages } + shared_examples_for 'Change the build status' do |when_option: nil, current_statuses: nil, from_statuses:, to_status:, factory_options: nil| + current_statuses.each do |current_status| + context "when status for prior stages is #{current_status}" do + let(:status_for_prior_stages) { current_status } - %w[created].each do |status| + from_statuses.each do |status| context "when build status is #{status}" do - let(:build) { create(:ci_build, status.to_sym, :schedulable, user: user, project: project) } + let(:build) { create(:ci_build, status.to_sym, *factory_options, when: when_option, user: user, project: project) } - it 'enqueues the build' do - expect { subject }.to change { build.status }.to('scheduled') + it 'changes the build status' do + expect { subject }.to change { build.status }.to(to_status) end end end - %w[manual skipped pending running success failed canceled scheduled].each do |status| + (HasStatus::AVAILABLE_STATUSES - from_statuses).each do |status| context "when build status is #{status}" do - let(:build) { create(:ci_build, status.to_sym, :schedulable, user: user, project: project) } + let(:build) { create(:ci_build, status.to_sym, *factory_options, when: when_option, user: user, project: project) } it 'does not change the build status' do expect { subject }.not_to change { build.status } @@ -145,61 +44,67 @@ describe Ci::ProcessBuildService, '#execute' do end end end - - (HasStatus::AVAILABLE_STATUSES - valid_statuses_for_when).each do |status_for_prior_stages| - let(:current_status) { status_for_prior_stages } - - context "when status for prior stages is #{status_for_prior_stages}" do - %w[created pending].each do |status| - context "when build status is #{status}" do - let(:build) { create(:ci_build, status.to_sym, :schedulable, user: user, project: project) } - - it 'skips the build' do - expect { subject }.to change { build.status }.to('skipped') - end - end - end - - (HasStatus::AVAILABLE_STATUSES - %w[created pending]).each do |status| - context "when build status is #{status}" do - let(:build) { create(:ci_build, status.to_sym, :schedulable, user: user, project: project) } - - it 'does not change build status' do - expect { subject }.not_to change { build.status } - end - end - end - end - end end context 'when build has on_success option' do - let(:when_option) { :on_success } - - it_behaves_like 'Enqueuing properly', %w[success skipped] + it_behaves_like 'Change the build status', + when_option: :on_success, + current_statuses: VALID_STATUSES_WHEN_ON_SUCCESS, + from_statuses: %w[created skipped manual scheduled], + to_status: 'pending' + + it_behaves_like 'Change the build status', + when_option: :on_success, + current_statuses: (HasStatus::AVAILABLE_STATUSES - VALID_STATUSES_WHEN_ON_SUCCESS), + from_statuses: SKIPPABLE_STATUES, + to_status: 'skipped' end context 'when build has on_failure option' do - let(:when_option) { :on_failure } - - it_behaves_like 'Enqueuing properly', %w[failed] + it_behaves_like 'Change the build status', + when_option: :on_failure, + current_statuses: VALID_STATUSES_WHEN_ON_FAILURE, + from_statuses: %w[created skipped manual scheduled], + to_status: 'pending' + + it_behaves_like 'Change the build status', + when_option: :on_failure, + current_statuses: (HasStatus::AVAILABLE_STATUSES - VALID_STATUSES_WHEN_ON_FAILURE), + from_statuses: SKIPPABLE_STATUES, + to_status: 'skipped' end context 'when build has always option' do - let(:when_option) { :always } - - it_behaves_like 'Enqueuing properly', %w[success failed skipped] + it_behaves_like 'Change the build status', + when_option: :always, + current_statuses: VALID_STATUSES_WHEN_ALWAYS, + from_statuses: %w[created skipped manual scheduled], + to_status: 'pending' + + it_behaves_like 'Change the build status', + when_option: :always, + current_statuses: (HasStatus::AVAILABLE_STATUSES - VALID_STATUSES_WHEN_ALWAYS), + from_statuses: SKIPPABLE_STATUES, + to_status: 'skipped' end context 'when build has manual option' do - let(:when_option) { :manual } - - it_behaves_like 'Actionizing properly', %w[success skipped] + it_behaves_like 'Change the build status', + when_option: :manual, + current_statuses: VALID_STATUSES_WHEN_MANUAL, + from_statuses: %w[created], + to_status: 'manual', + factory_options: %i[actionable] + + it_behaves_like 'Change the build status', + when_option: :manual, + current_statuses: (HasStatus::AVAILABLE_STATUSES - VALID_STATUSES_WHEN_ON_SUCCESS), + from_statuses: SKIPPABLE_STATUES, + to_status: 'skipped', + factory_options: %i[actionable] end context 'when build has delayed option' do - let(:when_option) { :delayed } - before do allow(Ci::BuildScheduleWorker).to receive(:perform_at) { } end @@ -209,7 +114,19 @@ describe Ci::ProcessBuildService, '#execute' do stub_feature_flags(ci_enable_scheduled_build: true) end - it_behaves_like 'Scheduling properly', %w[success skipped] + it_behaves_like 'Change the build status', + when_option: :delayed, + current_statuses: VALID_STATUSES_WHEN_DELAYED, + from_statuses: %w[created], + to_status: 'scheduled', + factory_options: %i[schedulable] + + it_behaves_like 'Change the build status', + when_option: :delayed, + current_statuses: (HasStatus::AVAILABLE_STATUSES - VALID_STATUSES_WHEN_ON_SUCCESS), + from_statuses: SKIPPABLE_STATUES, + to_status: 'skipped', + factory_options: %i[schedulable] end context 'when ci_enable_scheduled_build is enabled' do @@ -217,7 +134,19 @@ describe Ci::ProcessBuildService, '#execute' do stub_feature_flags(ci_enable_scheduled_build: false) end - it_behaves_like 'Actionizing properly', %w[success skipped] + it_behaves_like 'Change the build status', + when_option: :delayed, + current_statuses: VALID_STATUSES_WHEN_DELAYED, + from_statuses: %w[created], + to_status: 'manual', + factory_options: %i[schedulable] + + it_behaves_like 'Change the build status', + when_option: :delayed, + current_statuses: (HasStatus::AVAILABLE_STATUSES - VALID_STATUSES_WHEN_ON_SUCCESS), + from_statuses: SKIPPABLE_STATUES, + to_status: 'skipped', + factory_options: %i[schedulable] end end end |