diff options
Diffstat (limited to 'spec/services/merge_requests/mergeability/run_checks_service_spec.rb')
-rw-r--r-- | spec/services/merge_requests/mergeability/run_checks_service_spec.rb | 153 |
1 files changed, 75 insertions, 78 deletions
diff --git a/spec/services/merge_requests/mergeability/run_checks_service_spec.rb b/spec/services/merge_requests/mergeability/run_checks_service_spec.rb index bfff582994b..546d583a2fb 100644 --- a/spec/services/merge_requests/mergeability/run_checks_service_spec.rb +++ b/spec/services/merge_requests/mergeability/run_checks_service_spec.rb @@ -3,16 +3,32 @@ require 'spec_helper' RSpec.describe MergeRequests::Mergeability::RunChecksService, :clean_gitlab_redis_cache, feature_category: :code_review_workflow do + let(:checks) { MergeRequest.all_mergeability_checks } + let(:execute_all) { false } + subject(:run_checks) { described_class.new(merge_request: merge_request, params: {}) } describe '#execute' do - subject(:execute) { run_checks.execute } + subject(:execute) { run_checks.execute(checks, execute_all: execute_all) } let_it_be(:merge_request) { create(:merge_request) } let(:params) { {} } let(:success_result) { Gitlab::MergeRequests::Mergeability::CheckResult.success } + shared_examples 'checks are all executed' do + context 'when all checks are set to be executed' do + let(:execute_all) { true } + + specify do + result = execute + + expect(result.success?).to eq(success?) + expect(result.payload[:results].count).to eq(expected_count) + end + end + end + context 'when every check is skipped', :eager_load do before do MergeRequests::Mergeability::CheckBaseService.subclasses.each do |subclass| @@ -25,17 +41,28 @@ RSpec.describe MergeRequests::Mergeability::RunChecksService, :clean_gitlab_redi it 'is still a success' do expect(execute.success?).to eq(true) end + + it_behaves_like 'checks are all executed' do + let(:success?) { true } + let(:expected_count) { 0 } + end end context 'when a check is skipped' do - it 'does not execute the check' do - merge_request.mergeability_checks.each do |check| + before do + checks.each do |check| allow_next_instance_of(check) do |service| allow(service).to receive(:skip?).and_return(false) allow(service).to receive(:execute).and_return(success_result) end end + allow_next_instance_of(MergeRequests::Mergeability::CheckCiStatusService) do |service| + allow(service).to receive(:skip?).and_return(true) + end + end + + it 'does not execute the check' do expect_next_instance_of(MergeRequests::Mergeability::CheckCiStatusService) do |service| expect(service).to receive(:skip?).and_return(true) expect(service).not_to receive(:execute) @@ -43,6 +70,34 @@ RSpec.describe MergeRequests::Mergeability::RunChecksService, :clean_gitlab_redi expect(execute.success?).to eq(true) end + + it_behaves_like 'checks are all executed' do + let(:success?) { true } + let(:expected_count) { checks.count - 1 } + end + + context 'when one check fails' do + let(:failed_result) { Gitlab::MergeRequests::Mergeability::CheckResult.failed(payload: { reason: 'failed' }) } + + before do + allow_next_instance_of(MergeRequests::Mergeability::CheckOpenStatusService) do |service| + allow(service).to receive(:skip?).and_return(false) + allow(service).to receive(:execute).and_return(failed_result) + end + end + + it 'returns the failure reason' do + result = execute + + expect(result.success?).to eq(false) + expect(execute.payload[:failure_reason]).to eq(:failed) + end + + it_behaves_like 'checks are all executed' do + let(:success?) { false } + let(:expected_count) { checks.count - 1 } + end + end end context 'when a check is not skipped' do @@ -50,7 +105,7 @@ RSpec.describe MergeRequests::Mergeability::RunChecksService, :clean_gitlab_redi let(:merge_check) { instance_double(MergeRequests::Mergeability::CheckCiStatusService) } before do - merge_request.mergeability_checks.each do |check| + checks.each do |check| allow_next_instance_of(check) do |service| allow(service).to receive(:skip?).and_return(true) end @@ -64,11 +119,13 @@ RSpec.describe MergeRequests::Mergeability::RunChecksService, :clean_gitlab_redi context 'when the check is cacheable' do context 'when the check is cached' do - it 'returns the cached result' do + before do expect_next_instance_of(Gitlab::MergeRequests::Mergeability::ResultsStore) do |service| expect(service).to receive(:read).with(merge_check: merge_check).and_return(success_result) end + end + it 'returns the cached result' do expect_next_instance_of(MergeRequests::Mergeability::Logger, merge_request: merge_request) do |logger| expect(logger).to receive(:instrument).with(mergeability_name: 'check_ci_status_service').and_call_original expect(logger).to receive(:commit) @@ -76,15 +133,22 @@ RSpec.describe MergeRequests::Mergeability::RunChecksService, :clean_gitlab_redi expect(execute.success?).to eq(true) end + + it_behaves_like 'checks are all executed' do + let(:success?) { true } + let(:expected_count) { 1 } + end end context 'when the check is not cached' do - it 'writes and returns the result' do + before do expect_next_instance_of(Gitlab::MergeRequests::Mergeability::ResultsStore) do |service| expect(service).to receive(:read).with(merge_check: merge_check).and_return(nil) expect(service).to receive(:write).with(merge_check: merge_check, result_hash: success_result.to_hash).and_return(true) end + end + it 'writes and returns the result' do expect_next_instance_of(MergeRequests::Mergeability::Logger, merge_request: merge_request) do |logger| expect(logger).to receive(:instrument).with(mergeability_name: 'check_ci_status_service').and_call_original expect(logger).to receive(:commit) @@ -92,6 +156,11 @@ RSpec.describe MergeRequests::Mergeability::RunChecksService, :clean_gitlab_redi expect(execute.success?).to eq(true) end + + it_behaves_like 'checks are all executed' do + let(:success?) { true } + let(:expected_count) { 1 } + end end end @@ -106,76 +175,4 @@ RSpec.describe MergeRequests::Mergeability::RunChecksService, :clean_gitlab_redi end end end - - describe '#success?' do - subject(:success) { run_checks.success? } - - let_it_be(:merge_request) { create(:merge_request) } - - context 'when the execute method has been executed' do - before do - run_checks.execute - end - - context 'when all the checks succeed' do - it 'returns true' do - expect(success).to eq(true) - end - end - - context 'when one check fails' do - before do - allow(merge_request).to receive(:open?).and_return(false) - run_checks.execute - end - - it 'returns false' do - expect(success).to eq(false) - end - end - end - - context 'when execute has not been exectued' do - it 'raises an error' do - expect { subject } - .to raise_error(/Execute needs to be called before/) - end - end - end - - describe '#failure_reason' do - subject(:failure_reason) { run_checks.failure_reason } - - let_it_be(:merge_request) { create(:merge_request) } - - context 'when the execute method has been executed' do - context 'when all the checks succeed' do - before do - run_checks.execute - end - - it 'returns nil' do - expect(failure_reason).to eq(nil) - end - end - - context 'when one check fails' do - before do - allow(merge_request).to receive(:open?).and_return(false) - run_checks.execute - end - - it 'returns the open reason' do - expect(failure_reason).to eq(:not_open) - end - end - end - - context 'when execute has not been exectued' do - it 'raises an error' do - expect { subject } - .to raise_error(/Execute needs to be called before/) - end - end - end end |