require_relative '../examples'

RSpec.describe 'CampaignCriterion methods' do
  include_context 'use api'

  def add_campaign_criterions(location_id)
    api.campaign_management.call(:add_campaign_criterions,
      campaign_criterions: [
        {
          negative_campaign_criterion: {
            campaign_id: Examples.campaign_id,
            location_criterion: {
              location_id: location_id
            }
          }
        }
      ],
      criterion_type: 'Targets'
    )
  end

  describe '#add_campaign_criterions' do
    it 'returns CampaignCriterion ids' do
      expect(add_campaign_criterions(190)).to include(
        campaign_criterion_ids: [a_kind_of(Integer)],
        nested_partial_errors: ''
      )
    end
  end

  describe '#delete_campaign_criterions' do
    it 'returns no errors' do
      response = add_campaign_criterions(191)

      expect(api.campaign_management.call(:delete_campaign_criterions,
        campaign_criterion_ids: [
          { long: response[:campaign_criterion_ids].first }
        ],
        campaign_id: Examples.campaign_id,
        criterion_type: 'Targets'
      )).to eq(
        partial_errors: ''
      )
    end
  end

  describe '#get_campaign_criterions_by_ids' do
    it 'returns CampaignCriterions' do
      response = add_campaign_criterions(193)
      criterion_id = response[:campaign_criterion_ids].first.to_s

      criterions = api.campaign_management.get_campaign_criterions_by_ids(
        campaign_criterion_ids: [{ long: criterion_id }],
        campaign_id: Examples.campaign_id,
        criterion_type: 'Age DayTime Device Gender Location LocationIntent Radius'
      )

      expect(criterions).to include(
        campaign_id: Examples.campaign_id.to_s,
        criterion: {
          type: 'LocationCriterion',
          display_name: a_kind_of(String),
          enclosed_location_ids: nil,
          location_id: '193',
          location_type: a_kind_of(String),
        },
        forward_compatibility_map: nil,
        id: criterion_id,
        status: a_kind_of(String),
        type: 'NegativeCampaignCriterion'
      )
    end
  end
end