gitlab-org--gitlab-foss/spec/services/alert_management/process_prometheus_alert_se...

93 lines
2.7 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
RSpec.describe AlertManagement::ProcessPrometheusAlertService do
let_it_be(:project, reload: true) { create(:project, :repository) }
let(:service) { described_class.new(project, payload) }
describe '#execute' do
include_context 'incident management settings enabled'
subject(:execute) { service.execute }
before do
stub_licensed_features(oncall_schedules: false, generic_alert_fingerprinting: false)
end
context 'when alert payload is valid' do
let_it_be(:starts_at) { '2020-04-27T10:10:22.265949279Z' }
let_it_be(:title) { 'Alert title' }
let_it_be(:fingerprint) { [starts_at, title, 'vector(1)'].join('/') }
let_it_be(:source) { 'Prometheus' }
let(:prometheus_status) { 'firing' }
let(:payload) do
{
'status' => prometheus_status,
'labels' => {
'alertname' => 'GitalyFileServerDown',
'channel' => 'gitaly',
'pager' => 'pagerduty',
'severity' => 's1'
},
'annotations' => {
'description' => 'Alert description',
'runbook' => 'troubleshooting/gitaly-down.md',
'title' => title
},
'startsAt' => starts_at,
'endsAt' => '2020-04-27T10:20:22.265949279Z',
'generatorURL' => 'http://8d467bd4607a:9090/graph?g0.expr=vector%281%29&g0.tab=1'
}
end
it_behaves_like 'processes new firing alert'
context 'with resolving payload' do
let(:prometheus_status) { 'resolved' }
it_behaves_like 'processes recovery alert'
end
context 'environment given' do
let(:environment) { create(:environment, project: project) }
let(:alert) { project.alert_management_alerts.last }
before do
payload['labels']['gitlab_environment_name'] = environment.name
end
it 'sets the environment' do
execute
expect(alert.environment).to eq(environment)
end
end
context 'prometheus alert given' do
let(:prometheus_alert) { create(:prometheus_alert, project: project) }
let(:alert) { project.alert_management_alerts.last }
before do
payload['labels']['gitlab_alert_id'] = prometheus_alert.prometheus_metric_id
end
it 'sets the prometheus alert and environment' do
execute
expect(alert.prometheus_alert).to eq(prometheus_alert)
expect(alert.environment).to eq(prometheus_alert.environment)
end
end
end
context 'when alert payload is invalid' do
let(:payload) { {} }
it_behaves_like 'alerts service responds with an error and takes no actions', :bad_request
end
end
end