diff options
Diffstat (limited to 'spec/models/alert_management/alert_spec.rb')
-rw-r--r-- | spec/models/alert_management/alert_spec.rb | 171 |
1 files changed, 155 insertions, 16 deletions
diff --git a/spec/models/alert_management/alert_spec.rb b/spec/models/alert_management/alert_spec.rb index eb9dcca842d..b57062b5fc1 100644 --- a/spec/models/alert_management/alert_spec.rb +++ b/spec/models/alert_management/alert_spec.rb @@ -133,7 +133,7 @@ RSpec.describe AlertManagement::Alert do let(:new_alert) { build(:alert_management_alert, new_status, fingerprint: fingerprint, project: project) } before do - existing_alert.public_send(described_class::STATUS_EVENTS[existing_status]) + existing_alert.change_status_to(existing_status) end if params[:valid] @@ -170,6 +170,12 @@ RSpec.describe AlertManagement::Alert do it { is_expected.to be_valid } end + + context 'nested array' do + let(:hosts) { ['111.111.111.111', ['111.111.111.111']] } + + it { is_expected.not_to be_valid } + end end end @@ -189,14 +195,14 @@ RSpec.describe AlertManagement::Alert do end describe '.for_status' do - let(:status) { AlertManagement::Alert::STATUSES[:resolved] } + let(:status) { :resolved } subject { AlertManagement::Alert.for_status(status) } it { is_expected.to match_array(resolved_alert) } context 'with multiple statuses' do - let(:status) { AlertManagement::Alert::STATUSES.values_at(:resolved, :ignored) } + let(:status) { [:resolved, :ignored] } it { is_expected.to match_array([resolved_alert, ignored_alert]) } end @@ -230,6 +236,35 @@ RSpec.describe AlertManagement::Alert do it { is_expected.to match_array(env_alert) } end + describe '.for_assignee_username' do + let_it_be(:alert) { triggered_alert } + let_it_be(:assignee) { create(:user) } + + subject { AlertManagement::Alert.for_assignee_username(assignee_username) } + + before_all do + alert.update!(assignees: [assignee]) + end + + context 'when matching assignee_username' do + let(:assignee_username) { assignee.username } + + it { is_expected.to contain_exactly(alert) } + end + + context 'when unknown assignee_username' do + let(:assignee_username) { 'unknown username' } + + it { is_expected.to be_empty } + end + + context 'with empty assignee_username' do + let(:assignee_username) { ' ' } + + it { is_expected.to be_empty } + end + end + describe '.order_severity_with_open_prometheus_alert' do subject { described_class.where(project: alert_project).order_severity_with_open_prometheus_alert } @@ -241,19 +276,6 @@ RSpec.describe AlertManagement::Alert do it { is_expected.to eq([triggered_critical_alert, triggered_high_alert]) } end - describe '.counts_by_status' do - subject { described_class.counts_by_status } - - it do - is_expected.to eq( - triggered_alert.status => 1, - acknowledged_alert.status => 1, - resolved_alert.status => 1, - ignored_alert.status => 1 - ) - end - end - describe '.counts_by_project_id' do subject { described_class.counts_by_project_id } @@ -278,6 +300,55 @@ RSpec.describe AlertManagement::Alert do end end + describe '.status_value' do + using RSpec::Parameterized::TableSyntax + + where(:status, :status_value) do + :triggered | 0 + :acknowledged | 1 + :resolved | 2 + :ignored | 3 + :unknown | nil + end + + with_them do + it 'returns status value by its name' do + expect(described_class.status_value(status)).to eq(status_value) + end + end + end + + describe '.status_name' do + using RSpec::Parameterized::TableSyntax + + where(:raw_status, :status) do + 0 | :triggered + 1 | :acknowledged + 2 | :resolved + 3 | :ignored + -1 | nil + end + + with_them do + it 'returns status name by its values' do + expect(described_class.status_name(raw_status)).to eq(status) + end + end + end + + describe '.counts_by_status' do + subject { described_class.counts_by_status } + + it do + is_expected.to eq( + triggered: 1, + acknowledged: 1, + resolved: 1, + ignored: 1 + ) + end + end + describe '.last_prometheus_alert_by_project_id' do subject { described_class.last_prometheus_alert_by_project_id } @@ -363,6 +434,24 @@ RSpec.describe AlertManagement::Alert do end end + describe '.open_status?' do + using RSpec::Parameterized::TableSyntax + + where(:status, :is_open_status) do + :triggered | true + :acknowledged | true + :resolved | false + :ignored | false + nil | false + end + + with_them do + it 'returns true when the status is open status' do + expect(described_class.open_status?(status)).to eq(is_open_status) + end + end + end + describe '#to_reference' do it { expect(triggered_alert.to_reference).to eq("^alert##{triggered_alert.iid}") } end @@ -453,4 +542,54 @@ RSpec.describe AlertManagement::Alert do expect { subject }.to change { alert.events }.by(1) end end + + describe '#status_event_for' do + using RSpec::Parameterized::TableSyntax + + where(:for_status, :event) do + :triggered | :trigger + 'triggered' | :trigger + :acknowledged | :acknowledge + 'acknowledged' | :acknowledge + :resolved | :resolve + 'resolved' | :resolve + :ignored | :ignore + 'ignored' | :ignore + :unknown | nil + nil | nil + '' | nil + 1 | nil + end + + with_them do + let(:alert) { build(:alert_management_alert, project: project) } + + it 'returns event by status name' do + expect(alert.status_event_for(for_status)).to eq(event) + end + end + end + + describe '#change_status_to' do + let_it_be_with_reload(:alert) { create(:alert_management_alert, project: project) } + + context 'with valid statuses' do + it 'changes the status to triggered' do + alert.acknowledge! # change to non-triggered status + expect { alert.change_status_to(:triggered) }.to change { alert.triggered? }.to(true) + end + + %i(acknowledged resolved ignored).each do |status| + it "changes the status to #{status}" do + expect { alert.change_status_to(status) }.to change { alert.public_send(:"#{status}?") }.to(true) + end + end + end + + context 'with invalid status' do + it 'does not change the current status' do + expect { alert.change_status_to(nil) }.not_to change { alert.status } + end + end + end end |