alert_spec.rb 3.55 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
# frozen_string_literal: true

require 'spec_helper'

describe AlertManagement::Alert do
  describe 'associations' do
    it { is_expected.to belong_to(:project) }
    it { is_expected.to belong_to(:issue) }
  end

  describe 'validations' do
    it { is_expected.to validate_presence_of(:title) }
    it { is_expected.to validate_presence_of(:events) }
    it { is_expected.to validate_presence_of(:severity) }
    it { is_expected.to validate_presence_of(:status) }
    it { is_expected.to validate_presence_of(:started_at) }

    it { is_expected.to validate_length_of(:title).is_at_most(200) }
    it { is_expected.to validate_length_of(:description).is_at_most(1000) }
    it { is_expected.to validate_length_of(:service).is_at_most(100) }
    it { is_expected.to validate_length_of(:monitoring_tool).is_at_most(100) }

    describe 'fingerprint' do
      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 }
        end

        context 'different project' do
          let(:project) { create(:project) }

          it { is_expected.to be_valid }
        end
      end
    end

    describe 'hosts' do
      subject(:alert) { build(:alert_management_alert, hosts: hosts) }

      context 'over 255 total chars' do
        let(:hosts) { ['111.111.111.111'] * 18 }

        it { is_expected.not_to be_valid }
      end

      context 'under 255 chars' do
        let(:hosts) { ['111.111.111.111'] * 17 }

        it { is_expected.to be_valid }
      end
    end
  end

  describe 'enums' do
    let(:severity_values) do
      { critical: 0, high: 1, medium: 2, low: 3, info: 4, unknown: 5 }
    end

    let(:status_values) do
      { triggered: 0, acknowledged: 1, resolved: 2, ignored: 3 }
    end

    it { is_expected.to define_enum_for(:severity).with_values(severity_values) }
    it { is_expected.to define_enum_for(:status).with_values(status_values) }
  end

  describe 'fingerprint setter' do
    let(:alert) { build(:alert_management_alert) }

    subject(:set_fingerprint) { alert.fingerprint = fingerprint }

    let(:fingerprint) { 'test' }

    it 'sets to the SHA1 of the value' do
      expect { set_fingerprint }
        .to change { alert.fingerprint }
        .from(nil)
        .to(Digest::SHA1.hexdigest(fingerprint))
    end

    describe 'testing length of 40' do
      where(:input) do
        [
          'test',
          'another test',
          'a' * 1000,
          12345
        ]
      end

      with_them do
        let(:fingerprint) { input }

        it 'sets the fingerprint to 40 chars' do
          set_fingerprint
          expect(alert.fingerprint.size).to eq(40)
        end
      end
    end

    context 'blank value given' do
      let(:fingerprint) { '' }

      it 'does not set the fingerprint' do
        expect { set_fingerprint }
          .not_to change { alert.fingerprint }
          .from(nil)
      end
    end
  end
119 120 121 122 123 124 125 126 127 128

  describe '.for_iid' do
    let_it_be(:project) { create(:project) }
    let_it_be(:alert_1) { create(:alert_management_alert, project: project) }
    let_it_be(:alert_2) { create(:alert_management_alert, project: project) }

    subject { AlertManagement::Alert.for_iid(alert_1.iid) }

    it { is_expected.to match_array(alert_1) }
  end
129
end