# frozen_string_literal: true

require "rails_helper"

describe Ajax::FriendController, :ajax_controller, type: :controller do
  describe "#create" do
    let(:params) do
      {
        screen_name: screen_name
      }
    end

    subject { post(:create, params: params) }

    context "when user is signed in" do
      before(:each) { sign_in(user) }

      context "when target user exists" do
        let(:target_user) { FactoryBot.create(:user) }
        let(:screen_name) { target_user.screen_name }

        let(:expected_response) do
          {
            "success" => true,
            "status" => "okay",
            "message" => anything
          }
        end

        it "creates a follow relationship" do
          expect(user.friends.ids).not_to include(target_user.id)
          expect { subject }.to(change { user.friends.count }.by(1))
          expect(user.friends.ids).to include(target_user.id)
        end

        include_examples "returns the expected response"
      end

      context "when target user does not exist" do
        let(:screen_name) { "tripmeister_eder" }

        let(:expected_response) do
          {
            "success" => true,
            "status" => "okay",
            "message" => anything
          }
        end

        it "does not create a follow relationship" do
          expect { subject }.not_to(change { user.friends.count })
        end

        include_examples "returns the expected response"
      end
    end

    context "when user is not signed in" do
      let(:screen_name) { "tutenchamun" }
      let(:expected_response) do
        {
          "success" => false,
          "status" => "fail",
          "message" => anything
        }
      end

      include_examples "returns the expected response"
    end
  end

  describe "#destroy" do
    let(:params) do
      {
        screen_name: screen_name
      }
    end

    subject { delete(:destroy, params: params) }

    context "when user is signed in" do
      before(:each) { sign_in(user) }

      context "when target user exists" do
        let(:target_user) { FactoryBot.create(:user) }
        let(:screen_name) { target_user.screen_name }

        before(:each) { target_user }

        context "when user follows target" do
          let(:expected_response) do
            {
              "success" => true,
              "status" => "okay",
              "message" => anything
            }
          end

          before(:each) { user.follow target_user }

          it "destroys a follow relationship" do
            expect(user.friends.ids).to include(target_user.id)
            expect { subject }.to(change { user.friends.count }.by(-1))
            expect(user.friends.ids).not_to include(target_user.id)
          end

          include_examples "returns the expected response"
        end

        context "when user does not already follow target" do
          let(:expected_response) do
            {
              "success" => false,
              "status" => "fail",
              "message" => anything
            }
          end

          it "does not destroy a follow relationship" do
            expect { subject }.not_to(change { user.friends.count })
          end

          include_examples "returns the expected response"
        end
      end

      context "when target user does not exist" do
        let(:screen_name) { "tripmeister_eder" }

        let(:expected_response) do
          {
            "success" => false,
            "status" => "fail",
            "message" => anything
          }
        end

        it "does not destroy a follow relationship" do
          expect { subject }.not_to(change { user.friends.count })
        end

        include_examples "returns the expected response"
      end
    end

    context "when user is not signed in" do
      let(:screen_name) { "tutenchamun" }
      let(:expected_response) do
        {
          "success" => false,
          "status" => "fail",
          "message" => anything
        }
      end

      include_examples "returns the expected response"
    end
  end
end