require "rails_helper"

RSpec.describe Admin::Api::TrackingLinksController do

  before(:each) do
    @current_user = given_login!
  end

  describe "GET #index" do
    it "returns all tracking links" do
      tracking_link = FactoryBot.create :tracking_link

      get :index

      expect(response).to be_successful
      expect(response).to render_template("index.json.jbuilder")
      expect(assigns(:tracking_links)).to eq([tracking_link])
    end
  end

  describe "GET #show" do
    it "returns the specified tracking link" do
      tracking_link = FactoryBot.create :tracking_link

      get :show, params: {
        id: tracking_link.id
      }

      expect(response).to be_successful
      expect(response).to render_template("show.json.jbuilder")
      expect(assigns(:tracking_link)).to eq(tracking_link)
    end
  end

  describe "PUT #update" do

    it "published links can be hidden" do
      tracking_link = FactoryBot.create(:tracking_link, :published)

      put :update, {
        params: {
          id: tracking_link.id,
          tracking_link: {
            status: "hidden",
          },
        format: :json
        },
      }

      expect(response).to be_successful
      expect(assigns[:tracking_link].status).to eq("hidden")
      expect(assigns[:tracking_link].hider_id).to eq(@current_user.id)
    end

  end

  describe "POST #create" do

    it "valid data" do
      tracking_link_params = {
        destination_url: "https://example.com",
        slug: SecureRandom.hex,
        forward_all_query_params: true,
        forward_query_params_whitelist: ["something"],
        description: "I help with attribution",
        metadata: {
          "foo" => "bar",
        },
        additional_query_params: {
          "foo" => "bar",
        },
        status: "published",
      }

      post :create,
           params: {
             tracking_link: tracking_link_params,
           },
           format: :json

      expect(response.status).to eq(201)
      expect(assigns(:tracking_link)).to be_persisted
      expect(response).to render_template("show.json.jbuilder")
      expect(assigns(:tracking_link).creator_id).to eq(@current_user.id)
      expect(assigns(:tracking_link).publisher_id).to eq(@current_user.id)
      expect(assigns(:tracking_link).published_at).not_to be_nil
      expect(assigns(:tracking_link).attributes).to include(tracking_link_params.stringify_keys)

    end

    it "missing destination url" do
      tracking_link_params = {
        slug: SecureRandom.hex,
      }

      post :create,
           params: {
             tracking_link: tracking_link_params,
           },
           format: :json

      expect(response.status).to eq(422)
    end

    it "duplicate slug" do
      existing_tracking_link = FactoryBot.create(:tracking_link, :published)
      tracking_link_params = {
        slug: existing_tracking_link.slug,
        destination_url: "https://example.com",
        status: "published",
      }

      post :create,
           params: {
             tracking_link: tracking_link_params,
           },
            format: :json

      expect(response.status).to eq(422)
    end
  end
end
