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/support/shared_examples/services/alert_management/alert_processing/alert_firing_shared_examples.rb')
-rw-r--r--spec/support/shared_examples/services/alert_management/alert_processing/alert_firing_shared_examples.rb47
1 files changed, 44 insertions, 3 deletions
diff --git a/spec/support/shared_examples/services/alert_management/alert_processing/alert_firing_shared_examples.rb b/spec/support/shared_examples/services/alert_management/alert_processing/alert_firing_shared_examples.rb
index ca86cb082a7..6cae7d8e00f 100644
--- a/spec/support/shared_examples/services/alert_management/alert_processing/alert_firing_shared_examples.rb
+++ b/spec/support/shared_examples/services/alert_management/alert_processing/alert_firing_shared_examples.rb
@@ -23,7 +23,7 @@ RSpec.shared_examples 'creates an alert management alert or errors' do
end
context 'and fails to save' do
- let(:errors) { double(messages: { hosts: ['hosts array is over 255 chars'] })}
+ let(:errors) { double(messages: { hosts: ['hosts array is over 255 chars'] }, '[]': [] )}
before do
allow(service).to receive(:alert).and_call_original
@@ -35,9 +35,10 @@ RSpec.shared_examples 'creates an alert management alert or errors' do
it 'writes a warning to the log' do
expect(Gitlab::AppLogger).to receive(:warn).with(
- message: "Unable to create AlertManagement::Alert from #{source}",
+ message: "Unable to create AlertManagement::Alert",
project_id: project.id,
- alert_errors: { hosts: ['hosts array is over 255 chars'] }
+ alert_errors: { hosts: ['hosts array is over 255 chars'] },
+ alert_source: source
)
subject
@@ -45,6 +46,46 @@ RSpec.shared_examples 'creates an alert management alert or errors' do
end
end
+RSpec.shared_examples 'handles race condition in alert creation' do
+ let(:other_alert) { create(:alert_management_alert, project: project) }
+
+ context 'when another alert is saved at the same time' do
+ before do
+ allow_next_instance_of(::AlertManagement::Alert) do |alert|
+ allow(alert).to receive(:save) do
+ other_alert.update!(fingerprint: alert.fingerprint)
+
+ raise ActiveRecord::RecordNotUnique
+ end
+ end
+ end
+
+ it 'finds the other alert and increments the counter' do
+ subject
+
+ expect(other_alert.reload.events).to eq(2)
+ end
+ end
+
+ context 'when another alert is saved before the validation runes' do
+ before do
+ allow_next_instance_of(::AlertManagement::Alert) do |alert|
+ allow(alert).to receive(:save).and_wrap_original do |method, *args|
+ other_alert.update!(fingerprint: alert.fingerprint)
+
+ method.call(*args)
+ end
+ end
+ end
+
+ it 'finds the other alert and increments the counter' do
+ subject
+
+ expect(other_alert.reload.events).to eq(2)
+ end
+ end
+end
+
# This shared_example requires the following variables:
# - last_alert_attributes, last created alert
# - project, project that alert created