# frozen_string_literal: true

require 'spec_helper'

describe AbuseReportsController do
  let(:reporter) { create(:user) }
  let(:user)     { create(:user) }
  let(:attrs) do
    attributes_for(:abuse_report) do |hash|
      hash[:user_id] = user.id
    end
  end

  before do
    sign_in(reporter)
  end

  describe 'GET new' do
    context 'when the user has already been deleted' do
      it 'redirects the reporter to root_path' do
        user_id = user.id
        user.destroy

        get :new, params: { user_id: user_id }

        expect(response).to redirect_to root_path
        expect(flash[:alert]).to eq('Cannot create the abuse report. The user has been deleted.')
      end
    end

    context 'when the user has already been blocked' do
      it 'redirects the reporter to the user\'s profile' do
        user.block

        get :new, params: { user_id: user.id }

        expect(response).to redirect_to user
        expect(flash[:alert]).to eq('Cannot create the abuse report. This user has been blocked.')
      end
    end
  end

  describe 'POST create' do
    context 'with valid attributes' do
      it 'saves the abuse report' do
        expect do
          post :create, params: { abuse_report: attrs }
        end.to change { AbuseReport.count }.by(1)
      end

      it 'calls notify' do
        expect_any_instance_of(AbuseReport).to receive(:notify)

        post :create, params: { abuse_report: attrs }
      end

      it 'redirects back to the reported user' do
        post :create, params: { abuse_report: attrs }

        expect(response).to redirect_to user
      end
    end

    context 'with invalid attributes' do
      it 'renders new' do
        attrs.delete(:user_id)
        post :create, params: { abuse_report: attrs }

        expect(response).to render_template(:new)
      end
    end
  end
end
