require_relative "../examples"

RSpec.describe "Ad methods" do
  include_context "use api"

  def add_ads
    api.campaign_management.call(:add_ads,
      ad_group_id: Examples.ad_group_id,
      ads: [
        {
          expanded_text_ad: {
            ad_format_preference: "All",
            domain: "https://www.example.com/",
            final_urls: [string: "http://www.contoso.com/"],
            path_1: "subdirectory1",
            path_2: "su§bdirectory2",
            text: "Ad text goes here",
            title_part_1: "Title goes here",
            title_part_2: "Title 2 goes here",
            status: "Paused",
            tracking_url_template: "{lpurl}"
          }
        }
      ])
  end

  def get_ads
    api.campaign_management.get_ads_by_ad_group_id(
      ad_group_id: Examples.ad_group_id,
      ad_types: [
        {ad_type: "Text"},
        {ad_type: "Image"},
        {ad_type: "Product"},
        {ad_type: "AppInstall"},
        {ad_type: "ExpandedText"},
        {ad_type: "DynamicSearch"}
      ]
    )
  end

  describe "#add_ads" do
    it "returns created Ad ids" do
      expect(add_ads).to include(
        ad_ids: [a_kind_of(Integer)],
        partial_errors: ""
      )
    end
  end

  describe "#get_ads_by_ad_group_id" do
    before { add_ads }

    it "returns a list of ads" do
      expect(get_ads).to include(
        {
          ad_format_preference: a_kind_of(String),
          device_preference: a_kind_of(String),
          editorial_status: a_kind_of(String),
          final_app_urls: nil,
          final_mobile_urls: nil,
          final_urls: a_kind_of(Hash),
          final_url_suffix: nil,
          forward_compatibility_map: "",
          id: a_kind_of(String),
          status: a_kind_of(String),
          tracking_url_template: a_kind_of(String),
          type: "ExpandedText",
          url_custom_parameters: nil,
          domain: a_kind_of(String),
          path1: a_kind_of(String),
          path2: a_kind_of(String),
          text: a_kind_of(String),
          text_part2: "",
          title_part1: a_kind_of(String),
          title_part2: a_kind_of(String),
          title_part3: ""
        }
      )
    end
  end

  describe "#update_ads" do
    before { add_ads }

    it "updates the Ad" do
      expect(api.campaign_management.call(:update_ads,
        ad_group_id: Examples.ad_group_id,
        ads: {
          expanded_text_ad: [{
            id: get_ads.first[:id],
            text: "Ad text goes here - #{random}"
          }]
        })).to eq(partial_errors: "")

      expect(get_ads.first).to include(text: "Ad text goes here - #{random}")
    end
  end

  describe "test_delete_ads" do
    let(:ad_id) { add_ads[:ad_ids].first }

    it "returns no errors" do
      expect(api.campaign_management.call(:delete_ads,
        ad_group_id: Examples.ad_group_id,
        ad_ids: [long: ad_id])).to eq(partial_errors: "")

      expect(get_ads.map { |h| h[:id] }).not_to include ad_id.to_s
    end
  end
end
