summaryrefslogtreecommitdiff
path: root/spec/models/alert_management/alert_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/alert_management/alert_spec.rb')
-rw-r--r--spec/models/alert_management/alert_spec.rb119
1 files changed, 111 insertions, 8 deletions
diff --git a/spec/models/alert_management/alert_spec.rb b/spec/models/alert_management/alert_spec.rb
index 27b8bb48073..becc5475c15 100644
--- a/spec/models/alert_management/alert_spec.rb
+++ b/spec/models/alert_management/alert_spec.rb
@@ -2,10 +2,12 @@
require 'spec_helper'
-describe AlertManagement::Alert do
+RSpec.describe AlertManagement::Alert do
describe 'associations' do
it { is_expected.to belong_to(:project) }
- it { is_expected.to belong_to(:issue) }
+ it { is_expected.to belong_to(:issue).optional }
+ it { is_expected.to belong_to(:prometheus_alert).optional }
+ it { is_expected.to belong_to(:environment).optional }
it { is_expected.to have_many(:assignees).through(:alert_assignees) }
it { is_expected.to have_many(:notes) }
it { is_expected.to have_many(:ordered_notes) }
@@ -81,21 +83,50 @@ describe AlertManagement::Alert do
end
describe 'fingerprint' do
+ let_it_be(:project) { create(:project) }
let_it_be(:fingerprint) { 'fingerprint' }
- let_it_be(:existing_alert) { create(:alert_management_alert, fingerprint: fingerprint) }
let(:new_alert) { build(:alert_management_alert, fingerprint: fingerprint, project: project) }
subject { new_alert }
context 'adding an alert with the same fingerprint' do
- context 'same project' do
- let(:project) { existing_alert.project }
-
- it { is_expected.not_to be_valid }
+ context 'same project, various states' do
+ using RSpec::Parameterized::TableSyntax
+
+ # We are only validating uniqueness for non-resolved alerts
+ where(:existing_status, :new_status, :valid) do
+ :resolved | :triggered | true
+ :resolved | :acknowledged | true
+ :resolved | :ignored | true
+ :resolved | :resolved | true
+ :triggered | :triggered | false
+ :triggered | :acknowledged | false
+ :triggered | :ignored | false
+ :triggered | :resolved | true
+ :acknowledged | :triggered | false
+ :acknowledged | :acknowledged | false
+ :acknowledged | :ignored | false
+ :acknowledged | :resolved | true
+ :ignored | :triggered | false
+ :ignored | :acknowledged | false
+ :ignored | :ignored | false
+ :ignored | :resolved | true
+ end
+
+ with_them do
+ let!(:existing_alert) { create(:alert_management_alert, existing_status, fingerprint: fingerprint, project: project) }
+ let(:new_alert) { build(:alert_management_alert, new_status, fingerprint: fingerprint, project: project) }
+
+ if params[:valid]
+ it { is_expected.to be_valid }
+ else
+ it { is_expected.to be_invalid }
+ end
+ end
end
context 'different project' do
- let(:project) { create(:project) }
+ let!(:existing_alert) { create(:alert_management_alert, fingerprint: fingerprint) }
it { is_expected.to be_valid }
end
@@ -163,6 +194,15 @@ describe AlertManagement::Alert do
it { is_expected.to contain_exactly(alert_with_fingerprint) }
end
+ describe '.for_environment' do
+ let(:environment) { create(:environment, project: project) }
+ let!(:env_alert) { create(:alert_management_alert, project: project, environment: environment) }
+
+ subject { described_class.for_environment(environment) }
+
+ it { is_expected.to match_array(env_alert) }
+ end
+
describe '.counts_by_status' do
subject { described_class.counts_by_status }
@@ -174,6 +214,51 @@ describe AlertManagement::Alert do
)
end
end
+
+ describe '.counts_by_project_id' do
+ subject { described_class.counts_by_project_id }
+
+ let!(:alert_other_project) { create(:alert_management_alert) }
+
+ it do
+ is_expected.to eq(
+ project.id => 3,
+ alert_other_project.project.id => 1
+ )
+ end
+ end
+
+ describe '.open' do
+ subject { described_class.open }
+
+ let!(:acknowledged_alert) { create(:alert_management_alert, :acknowledged, project: project)}
+
+ it { is_expected.to contain_exactly(acknowledged_alert, triggered_alert) }
+ end
+
+ describe '.not_resolved' do
+ subject { described_class.not_resolved }
+
+ let!(:acknowledged_alert) { create(:alert_management_alert, :acknowledged, project: project) }
+
+ it { is_expected.to contain_exactly(acknowledged_alert, triggered_alert, ignored_alert) }
+ end
+ end
+
+ describe '.last_prometheus_alert_by_project_id' do
+ subject { described_class.last_prometheus_alert_by_project_id }
+
+ let(:project_1) { create(:project) }
+ let!(:alert_1) { create(:alert_management_alert, project: project_1) }
+ let!(:alert_2) { create(:alert_management_alert, project: project_1) }
+
+ let(:project_2) { create(:project) }
+ let!(:alert_3) { create(:alert_management_alert, project: project_2) }
+ let!(:alert_4) { create(:alert_management_alert, project: project_2) }
+
+ it 'returns the latest alert for each project' do
+ expect(subject).to contain_exactly(alert_2, alert_4)
+ end
end
describe '.search' do
@@ -337,4 +422,22 @@ describe AlertManagement::Alert do
expect { subject }.to change { alert.events }.by(1)
end
end
+
+ describe '#present' do
+ context 'when alert is generic' do
+ let(:alert) { build(:alert_management_alert) }
+
+ it 'uses generic alert presenter' do
+ expect(alert.present).to be_kind_of(AlertManagement::AlertPresenter)
+ end
+ end
+
+ context 'when alert is Prometheus specific' do
+ let(:alert) { build(:alert_management_alert, :prometheus) }
+
+ it 'uses Prometheus Alert presenter' do
+ expect(alert.present).to be_kind_of(AlertManagement::PrometheusAlertPresenter)
+ end
+ end
+ end
end