# frozen_string_literal: true

require 'spec_helper'

RSpec.describe PagerDuty::WebhookPayloadParser do
  describe '.call' do
    let(:fixture_file) do
      File.read(File.join(File.dirname(__FILE__), '../../fixtures/pager_duty/webhook_incident_trigger.json'))
    end

    let(:triggered_event) do
      {
        'event' => 'incident.triggered',
        'incident' => {
          'url' => 'https://gitlab-1.pagerduty.com/incidents/Q1XZUF87W1HB5A',
          'incident_number' => 2,
          'title' => '[FILTERED]',
          'status' => 'triggered',
          'created_at' => '2022-11-30T08:46:19Z',
          'urgency' => 'high',
          'incident_key' => '[FILTERED]',
          'assignees' =>
          [
            {
              'summary' => 'Rajendra Kadam',
              'url' => 'https://gitlab-1.pagerduty.com/users/PIN0B5C'
            }
          ],
          'impacted_service' =>
          {
            'summary' => 'Test service',
            'url' => 'https://gitlab-1.pagerduty.com/services/PK6IKMT'
          }
        }
      }
    end

    subject(:parse) { described_class.call(payload) }

    context 'when payload is a correct PagerDuty payload' do
      let(:payload) { Gitlab::Json.parse(fixture_file) }

      it 'returns parsed payload' do
        is_expected.to eq(triggered_event)
      end

      context 'when assignments summary and html_url are blank' do
        before do
          payload['event']['data']['assignees'] = [{ 'summary' => '', 'html_url' => '' }]
        end

        it 'returns parsed payload with blank assignees' do
          assignees = parse['incident'].slice('assignees')

          expect(assignees).to eq({ 'assignees' => [] })
        end
      end

      context 'when impacted_services summary and html_url are blank' do
        before do
          payload['event']['data']['service'] = { 'summary' => '', 'html_url' => '' }
        end

        it 'returns parsed payload with blank impacted service' do
          assignees = parse['incident'].slice('impacted_service')

          expect(assignees).to eq({ 'impacted_service' => {} })
        end
      end
    end

    context 'when payload schema is invalid' do
      let(:payload) { { 'event' => 'incident.triggered' } }

      it 'returns payload with blank incident' do
        is_expected.to eq({})
      end
    end

    context 'when event is unknown' do
      let(:payload) do
        valid_payload = Gitlab::Json.parse(fixture_file)
        valid_payload['event'] = 'incident.unknown'
      end

      it 'returns empty payload' do
        is_expected.to be_empty
      end
    end
  end
end