summaryrefslogtreecommitdiff
path: root/spec/services/incident_management/pager_duty/process_webhook_service_spec.rb
blob: 11ce8388427f8c6f72af917fe94ec7a86a2e40be (plain)
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe IncidentManagement::PagerDuty::ProcessWebhookService do
  let_it_be(:project, reload: true) { create(:project) }

  describe '#execute' do
    shared_examples 'does not process incidents' do
      it 'does not process incidents' do
        expect(::IncidentManagement::PagerDuty::ProcessIncidentWorker).not_to receive(:perform_async)

        execute
      end
    end

    let(:webhook_payload) { Gitlab::Json.parse(fixture_file('pager_duty/webhook_incident_trigger.json')) }
    let(:token) { nil }

    subject(:execute) { described_class.new(project, nil, webhook_payload).execute(token) }

    context 'when pagerduty_webhook feature is enabled' do
      before do
        stub_feature_flags(pagerduty_webhook: project)
      end

      context 'when PagerDuty webhook setting is active' do
        let_it_be(:incident_management_setting) { create(:project_incident_management_setting, project: project, pagerduty_active: true) }

        context 'when token is valid' do
          let(:token) { incident_management_setting.pagerduty_token }

          context 'when webhook payload has acceptable size' do
            it 'responds with Accepted' do
              result = execute

              expect(result).to be_success
              expect(result.http_status).to eq(:accepted)
            end

            it 'processes issues' do
              incident_payload = ::PagerDuty::WebhookPayloadParser.call(webhook_payload).first['incident']

              expect(::IncidentManagement::PagerDuty::ProcessIncidentWorker)
                .to receive(:perform_async)
                .with(project.id, incident_payload)
                .once

              execute
            end
          end

          context 'when webhook payload is too big' do
            let(:deep_size) { instance_double(Gitlab::Utils::DeepSize, valid?: false) }

            before do
              allow(Gitlab::Utils::DeepSize)
                .to receive(:new)
                .with(webhook_payload, max_size: described_class::PAGER_DUTY_PAYLOAD_SIZE_LIMIT)
                .and_return(deep_size)
            end

            it 'responds with Bad Request' do
              result = execute

              expect(result).to be_error
              expect(result.http_status).to eq(:bad_request)
            end

            it_behaves_like 'does not process incidents'
          end

          context 'when webhook payload is blank' do
            let(:webhook_payload) { nil }

            it 'responds with Accepted' do
              result = execute

              expect(result).to be_success
              expect(result.http_status).to eq(:accepted)
            end

            it_behaves_like 'does not process incidents'
          end
        end

        context 'when token is invalid' do
          let(:token) { 'invalid-token' }

          it 'responds with Unauthorized' do
            result = execute

            expect(result).to be_error
            expect(result.http_status).to eq(:unauthorized)
          end

          it_behaves_like 'does not process incidents'
        end
      end

      context 'when both tokens are nil' do
        let_it_be(:incident_management_setting) { create(:project_incident_management_setting, project: project, pagerduty_active: false) }
        let(:token) { nil }

        before do
          incident_management_setting.update_column(:pagerduty_active, true)
        end

        it 'responds with Unauthorized' do
          result = execute

          expect(result).to be_error
          expect(result.http_status).to eq(:unauthorized)
        end

        it_behaves_like 'does not process incidents'
      end

      context 'when PagerDuty webhook setting is not active' do
        let_it_be(:incident_management_setting) { create(:project_incident_management_setting, project: project, pagerduty_active: false) }

        it 'responds with Forbidden' do
          result = execute

          expect(result).to be_error
          expect(result.http_status).to eq(:forbidden)
        end

        it_behaves_like 'does not process incidents'
      end
    end

    context 'when pagerduty_webhook feature is disabled' do
      before do
        stub_feature_flags(pagerduty_webhook: false)
      end

      it 'responds with Forbidden' do
        result = execute

        expect(result).to be_error
        expect(result.http_status).to eq(:forbidden)
      end

      it_behaves_like 'does not process incidents'
    end
  end
end