diff options
Diffstat (limited to 'spec/lib/gitlab/alert_management/payload/base_spec.rb')
-rw-r--r-- | spec/lib/gitlab/alert_management/payload/base_spec.rb | 103 |
1 files changed, 98 insertions, 5 deletions
diff --git a/spec/lib/gitlab/alert_management/payload/base_spec.rb b/spec/lib/gitlab/alert_management/payload/base_spec.rb index e0f63bad05d..0c26e94e596 100644 --- a/spec/lib/gitlab/alert_management/payload/base_spec.rb +++ b/spec/lib/gitlab/alert_management/payload/base_spec.rb @@ -120,14 +120,107 @@ RSpec.describe Gitlab::AlertManagement::Payload::Base do end describe '#alert_params' do - before do - allow(parsed_payload).to receive(:title).and_return('title') - allow(parsed_payload).to receive(:description).and_return('description') + subject { parsed_payload.alert_params } + + context 'with every key' do + let_it_be(:raw_payload) { { 'key' => 'value' } } + let_it_be(:stubs) do + { + description: 'description', + ends_at: Time.current, + environment: create(:environment, project: project), + gitlab_fingerprint: 'gitlab_fingerprint', + hosts: 'hosts', + monitoring_tool: 'monitoring_tool', + gitlab_alert: create(:prometheus_alert, project: project), + service: 'service', + severity: 'critical', + starts_at: Time.current, + title: 'title' + } + end + + let(:expected_result) do + { + description: stubs[:description], + ended_at: stubs[:ends_at], + environment: stubs[:environment], + fingerprint: stubs[:gitlab_fingerprint], + hosts: [stubs[:hosts]], + monitoring_tool: stubs[:monitoring_tool], + payload: raw_payload, + project_id: project.id, + prometheus_alert: stubs[:gitlab_alert], + service: stubs[:service], + severity: stubs[:severity], + started_at: stubs[:starts_at], + title: stubs[:title] + } + end + + before do + allow(parsed_payload).to receive_messages(stubs) + end + + it { is_expected.to eq(expected_result) } + + it 'can generate a valid new alert' do + expect(::AlertManagement::Alert.new(subject.except(:ended_at))).to be_valid + end end - subject { parsed_payload.alert_params } + context 'with too-long strings' do + let_it_be(:stubs) do + { + description: 'a' * (::AlertManagement::Alert::DESCRIPTION_MAX_LENGTH + 1), + hosts: 'b' * (::AlertManagement::Alert::HOSTS_MAX_LENGTH + 1), + monitoring_tool: 'c' * (::AlertManagement::Alert::TOOL_MAX_LENGTH + 1), + service: 'd' * (::AlertManagement::Alert::SERVICE_MAX_LENGTH + 1), + title: 'e' * (::AlertManagement::Alert::TITLE_MAX_LENGTH + 1) + } + end - it { is_expected.to eq({ description: 'description', project_id: project.id, title: 'title' }) } + before do + allow(parsed_payload).to receive_messages(stubs) + end + + it do + is_expected.to eq({ + description: stubs[:description].truncate(AlertManagement::Alert::DESCRIPTION_MAX_LENGTH), + hosts: ['b' * ::AlertManagement::Alert::HOSTS_MAX_LENGTH], + monitoring_tool: stubs[:monitoring_tool].truncate(::AlertManagement::Alert::TOOL_MAX_LENGTH), + service: stubs[:service].truncate(::AlertManagement::Alert::SERVICE_MAX_LENGTH), + project_id: project.id, + title: stubs[:title].truncate(::AlertManagement::Alert::TITLE_MAX_LENGTH) + }) + end + end + + context 'with too-long hosts array' do + let(:hosts) { %w(abc def ghij) } + let(:shortened_hosts) { %w(abc def ghi) } + + before do + stub_const('::AlertManagement::Alert::HOSTS_MAX_LENGTH', 9) + allow(parsed_payload).to receive(:hosts).and_return(hosts) + end + + it { is_expected.to eq(hosts: shortened_hosts, project_id: project.id) } + + context 'with host cut off between elements' do + let(:hosts) { %w(abcde fghij) } + let(:shortened_hosts) { %w(abcde fghi) } + + it { is_expected.to eq({ hosts: shortened_hosts, project_id: project.id }) } + end + + context 'with nested hosts' do + let(:hosts) { ['abc', ['de', 'f'], 'g', 'hij'] } # rubocop:disable Style/WordArray + let(:shortened_hosts) { %w(abc de f g hi) } + + it { is_expected.to eq({ hosts: shortened_hosts, project_id: project.id }) } + end + end end describe '#gitlab_fingerprint' do |