2020-11-24 15:15:51 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
require 'spec_helper'
|
|
|
|
|
|
|
|
RSpec.describe Gitlab::AlertManagement::Payload::Generic do
|
|
|
|
let_it_be(:project) { build_stubbed(:project) }
|
2021-04-29 21:17:54 +05:30
|
|
|
|
2020-11-24 15:15:51 +05:30
|
|
|
let(:raw_payload) { {} }
|
|
|
|
|
|
|
|
let(:parsed_payload) { described_class.new(project: project, payload: raw_payload) }
|
|
|
|
|
|
|
|
it_behaves_like 'subclass has expected api'
|
|
|
|
|
|
|
|
describe '#title' do
|
|
|
|
subject { parsed_payload.title }
|
|
|
|
|
2021-04-17 20:07:23 +05:30
|
|
|
it_behaves_like 'parsable alert payload field with fallback', 'New: Alert', 'title'
|
2020-11-24 15:15:51 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
describe '#severity' do
|
|
|
|
subject { parsed_payload.severity }
|
|
|
|
|
2021-03-11 19:13:27 +05:30
|
|
|
context 'when set' do
|
|
|
|
using RSpec::Parameterized::TableSyntax
|
|
|
|
|
|
|
|
let(:raw_payload) { { 'severity' => payload_severity } }
|
|
|
|
|
|
|
|
where(:payload_severity, :expected_severity) do
|
|
|
|
'critical' | :critical
|
|
|
|
'high' | :high
|
|
|
|
'medium' | :medium
|
|
|
|
'low' | :low
|
|
|
|
'info' | :info
|
|
|
|
|
|
|
|
'CRITICAL' | :critical
|
|
|
|
'cRiTiCaL' | :critical
|
|
|
|
|
|
|
|
'unmapped' | nil
|
|
|
|
1 | nil
|
|
|
|
nil | nil
|
|
|
|
end
|
|
|
|
|
|
|
|
with_them do
|
|
|
|
it { is_expected.to eq(expected_severity) }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'without key' do
|
|
|
|
it { is_expected.to be_nil }
|
|
|
|
end
|
2020-11-24 15:15:51 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
describe '#monitoring_tool' do
|
|
|
|
subject { parsed_payload.monitoring_tool }
|
|
|
|
|
|
|
|
it_behaves_like 'parsable alert payload field', 'monitoring_tool'
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#service' do
|
|
|
|
subject { parsed_payload.service }
|
|
|
|
|
|
|
|
it_behaves_like 'parsable alert payload field', 'service'
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#hosts' do
|
|
|
|
subject { parsed_payload.hosts }
|
|
|
|
|
|
|
|
it_behaves_like 'parsable alert payload field', 'hosts'
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#starts_at' do
|
|
|
|
let(:current_time) { Time.current.change(usec: 0).utc }
|
|
|
|
|
|
|
|
subject { parsed_payload.starts_at }
|
|
|
|
|
|
|
|
around do |example|
|
2021-01-03 14:25:43 +05:30
|
|
|
travel_to(current_time) { example.run }
|
2020-11-24 15:15:51 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
context 'without start_time' do
|
|
|
|
it { is_expected.to eq(current_time) }
|
|
|
|
end
|
|
|
|
|
|
|
|
context "with start_time" do
|
|
|
|
let(:value) { 10.minutes.ago.change(usec: 0).utc }
|
|
|
|
|
|
|
|
before do
|
|
|
|
raw_payload['start_time'] = value.to_s
|
|
|
|
end
|
|
|
|
|
|
|
|
it { is_expected.to eq(value) }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#runbook' do
|
|
|
|
subject { parsed_payload.runbook }
|
|
|
|
|
|
|
|
it_behaves_like 'parsable alert payload field', 'runbook'
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#gitlab_fingerprint' do
|
|
|
|
let(:plain_fingerprint) { 'fingerprint' }
|
|
|
|
let(:raw_payload) { { 'fingerprint' => plain_fingerprint } }
|
|
|
|
|
|
|
|
subject { parsed_payload.gitlab_fingerprint }
|
|
|
|
|
|
|
|
it 'returns a fingerprint' do
|
|
|
|
is_expected.to eq(Digest::SHA1.hexdigest(plain_fingerprint))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#environment_name' do
|
|
|
|
subject { parsed_payload.environment_name }
|
|
|
|
|
|
|
|
it_behaves_like 'parsable alert payload field', 'gitlab_environment_name'
|
|
|
|
end
|
2021-01-03 14:25:43 +05:30
|
|
|
|
|
|
|
describe '#description' do
|
|
|
|
subject { parsed_payload.description }
|
|
|
|
|
|
|
|
it_behaves_like 'parsable alert payload field', 'description'
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#ends_at' do
|
|
|
|
let(:current_time) { Time.current.change(usec: 0).utc }
|
|
|
|
|
|
|
|
subject { parsed_payload.ends_at }
|
|
|
|
|
|
|
|
around do |example|
|
|
|
|
travel_to(current_time) { example.run }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'without end_time' do
|
|
|
|
it { is_expected.to be_nil }
|
|
|
|
end
|
|
|
|
|
|
|
|
context "with end_time" do
|
|
|
|
let(:value) { 10.minutes.ago.change(usec: 0).utc }
|
|
|
|
|
|
|
|
before do
|
|
|
|
raw_payload['end_time'] = value.to_s
|
|
|
|
end
|
|
|
|
|
|
|
|
it { is_expected.to eq(value) }
|
|
|
|
end
|
|
|
|
end
|
2022-10-11 01:57:18 +05:30
|
|
|
|
|
|
|
describe '#resolved?' do
|
|
|
|
subject { parsed_payload.resolved? }
|
|
|
|
|
|
|
|
context 'without end time' do
|
|
|
|
it { is_expected.to eq(false) }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with end time' do
|
|
|
|
let(:raw_payload) { { 'end_time' => Time.current.to_s } }
|
|
|
|
|
|
|
|
it { is_expected.to eq(true) }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#source' do
|
|
|
|
subject { parsed_payload.source }
|
|
|
|
|
|
|
|
it { is_expected.to eq('Generic Alert Endpoint') }
|
|
|
|
|
|
|
|
context 'with alerting integration provided' do
|
|
|
|
before do
|
|
|
|
parsed_payload.integration = instance_double('::AlertManagement::HttpIntegration', name: 'INTEGRATION')
|
|
|
|
end
|
|
|
|
|
|
|
|
it { is_expected.to eq('INTEGRATION') }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with monitoring tool defined in the raw payload' do
|
|
|
|
before do
|
|
|
|
allow(parsed_payload).to receive(:monitoring_tool).and_return('TOOL')
|
|
|
|
end
|
|
|
|
|
|
|
|
it { is_expected.to eq('TOOL') }
|
|
|
|
end
|
|
|
|
end
|
2020-11-24 15:15:51 +05:30
|
|
|
end
|