require "rails_helper"

RSpec.describe Admin::Api::BannersController do

  before do
    @current_user = given_login!
  end

  describe "GET #index" do

    it do
      get :index
      should respond_with(200)
    end

  end

  describe "GET #new" do

    it do
      get :new
      should respond_with(200)
    end

  end

  describe "POST #create" do

    it "should update both banner and banner field attributes" do
      new_name = "New Banner #{SecureRandom.hex}"
      post :create,
           params: {
             banner: {
               name: new_name,
               banner_key: Banner.keys.sample,
             },
           }
      should respond_with(200)
      expect(Banner.last.name).to eq new_name
    end

    it "should respond with an error if given inappropriate attributes" do
      new_name = "New Banner #{SecureRandom.hex}"
      post :create,
           params: {
             banner: {
               name: new_name,
             },
           }
      should respond_with(422)
    end

  end

  describe "GET #show" do

    it do
      get :show, params: { id: create(:banner).id }
      should respond_with(200)
    end

  end

  describe "PUT/PATCH #update" do

    it "should update both banner and banner field attributes" do
      banner = create(:banner)
      new_name = "New Banner #{SecureRandom.hex}"
      random_text_field = banner.banner_fields.find { |field| field.banner_field_key.include?("Text") }
      great_new_text = SecureRandom.hex(85)
      put :update,
          params: {
            id: banner.id,
                    banner: {
                      name: new_name,
                    },
                    banner_fields: {
                      random_text_field.banner_field_key => great_new_text,
                    },
          }
      should respond_with(200)
      expect(banner.reload.name).to eq new_name
      expect(random_text_field.reload.value).to eq great_new_text
    end

    it "should respond with an error if given inappropriate attributes" do
      banner = create(:banner)
      new_name = "New Banner #{SecureRandom.hex}"
      random_text_field = banner.banner_fields.find { |field| field.banner_field_key.include?("Text") }
      great_new_text = SecureRandom.hex(85)
      put :update,
          params: {
            id: banner.id,
                    banner: {
                      name: new_name,
                      banner_key: nil,
                    },
                    banner_fields: {
                      random_text_field.banner_field_key => great_new_text,
                    },
          }
      should respond_with(422)
    end

  end

  describe "DELETE #destroy" do

    let(:banner) { create(:banner) }

    it do
      delete :destroy, params: { id: banner.id }
      should respond_with(200)
    end

  end

end
