Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/services/auto_merge/base_service_spec.rb')
-rw-r--r--spec/services/auto_merge/base_service_spec.rb99
1 files changed, 93 insertions, 6 deletions
diff --git a/spec/services/auto_merge/base_service_spec.rb b/spec/services/auto_merge/base_service_spec.rb
index 0a6bcb1badc..e08e1d670bf 100644
--- a/spec/services/auto_merge/base_service_spec.rb
+++ b/spec/services/auto_merge/base_service_spec.rb
@@ -82,9 +82,9 @@ describe AutoMerge::BaseService do
end
end
- context 'when failed to save' do
+ context 'when failed to save merge request' do
before do
- allow(merge_request).to receive(:save) { false }
+ allow(merge_request).to receive(:save!) { raise ActiveRecord::RecordInvalid.new }
end
it 'does not yield block' do
@@ -94,6 +94,39 @@ describe AutoMerge::BaseService do
it 'returns failed' do
is_expected.to eq(:failed)
end
+
+ it 'tracks the exception' do
+ expect(Gitlab::ErrorTracking)
+ .to receive(:track_exception).with(kind_of(ActiveRecord::RecordInvalid),
+ merge_request_id: merge_request.id)
+
+ subject
+ end
+ end
+
+ context 'when exception happens in yield block' do
+ def execute_with_error_in_yield
+ service.execute(merge_request) { raise 'Something went wrong' }
+ end
+
+ it 'returns failed status' do
+ expect(execute_with_error_in_yield).to eq(:failed)
+ end
+
+ it 'rollback the transaction' do
+ execute_with_error_in_yield
+
+ merge_request.reload
+ expect(merge_request).not_to be_auto_merge_enabled
+ end
+
+ it 'tracks the exception' do
+ expect(Gitlab::ErrorTracking)
+ .to receive(:track_exception).with(kind_of(RuntimeError),
+ merge_request_id: merge_request.id)
+
+ execute_with_error_in_yield
+ end
end
end
@@ -162,7 +195,7 @@ describe AutoMerge::BaseService do
context 'when failed to save' do
before do
- allow(merge_request).to receive(:save) { false }
+ allow(merge_request).to receive(:save!) { raise ActiveRecord::RecordInvalid.new }
end
it 'does not yield block' do
@@ -178,9 +211,9 @@ describe AutoMerge::BaseService do
it_behaves_like 'Canceled or Dropped'
- context 'when failed to save' do
+ context 'when failed to save merge request' do
before do
- allow(merge_request).to receive(:save) { false }
+ allow(merge_request).to receive(:save!) { raise ActiveRecord::RecordInvalid.new }
end
it 'returns error status' do
@@ -188,6 +221,33 @@ describe AutoMerge::BaseService do
expect(subject[:message]).to eq("Can't cancel the automatic merge")
end
end
+
+ context 'when exception happens in yield block' do
+ def cancel_with_error_in_yield
+ service.cancel(merge_request) { raise 'Something went wrong' }
+ end
+
+ it 'returns error' do
+ result = cancel_with_error_in_yield
+ expect(result[:status]).to eq(:error)
+ expect(result[:message]).to eq("Can't cancel the automatic merge")
+ end
+
+ it 'rollback the transaction' do
+ cancel_with_error_in_yield
+
+ merge_request.reload
+ expect(merge_request).to be_auto_merge_enabled
+ end
+
+ it 'tracks the exception' do
+ expect(Gitlab::ErrorTracking)
+ .to receive(:track_exception).with(kind_of(RuntimeError),
+ merge_request_id: merge_request.id)
+
+ cancel_with_error_in_yield
+ end
+ end
end
describe '#abort' do
@@ -200,7 +260,7 @@ describe AutoMerge::BaseService do
context 'when failed to save' do
before do
- allow(merge_request).to receive(:save) { false }
+ allow(merge_request).to receive(:save!) { raise ActiveRecord::RecordInvalid.new }
end
it 'returns error status' do
@@ -208,5 +268,32 @@ describe AutoMerge::BaseService do
expect(subject[:message]).to eq("Can't abort the automatic merge")
end
end
+
+ context 'when exception happens in yield block' do
+ def abort_with_error_in_yield
+ service.abort(merge_request, reason) { raise 'Something went wrong' }
+ end
+
+ it 'returns error' do
+ result = abort_with_error_in_yield
+ expect(result[:status]).to eq(:error)
+ expect(result[:message]).to eq("Can't abort the automatic merge")
+ end
+
+ it 'rollback the transaction' do
+ abort_with_error_in_yield
+
+ merge_request.reload
+ expect(merge_request).to be_auto_merge_enabled
+ end
+
+ it 'tracks the exception' do
+ expect(Gitlab::ErrorTracking)
+ .to receive(:track_exception).with(kind_of(RuntimeError),
+ merge_request_id: merge_request.id)
+
+ abort_with_error_in_yield
+ end
+ end
end
end