# frozen_string_literal: true

require "rails_helper"

describe Moderation::ReportsController, type: :controller do
  let(:user) { FactoryBot.create :user, roles: ["moderator"] }

  describe "#index" do
    shared_examples_for "sets the expected ivars" do
      let(:expected_assigns) { {} }

      it "sets the expected ivars" do
        subject

        expected_assigns.each do |name, value|
          expect(assigns[name]).to eq(value)
        end
      end
    end

    context "template rendering" do
      let(:other_user) { FactoryBot.create :user }
      let(:report) { Report.create(user:, target_id: other_user.id, type: "Reports::User") }

      subject { get :index }

      before do
        report
        sign_in user
      end

      it "renders the moderation/reports/index template" do
        subject
        expect(response).to render_template("moderation/reports/index")
      end

      include_examples "sets the expected ivars" do
        let(:expected_assigns) do
          {
            reports:         [report],
            reports_last_id: report.id,
          }
        end
      end
    end

    context "filtering for target users" do
      let(:other_user) { FactoryBot.create :user }
      let(:question) { FactoryBot.create :question }
      let(:report) { Report.create(user:, target_id: other_user.id, target_user_id: other_user.id, type: "Reports::User") }
      let(:report2) { Report.create(user:, target_id: question.id, target_user_id: nil, type: "Reports::Question") }

      subject { get :index, params: { target_user: other_user.screen_name } }

      before do
        report
        report2
        sign_in user
      end

      include_examples "sets the expected ivars" do
        let(:expected_assigns) do
          {
            reports:         [report],
            reports_last_id: report.id,
          }
        end
      end
    end

    context "filtering for users" do
      let(:report_user) { FactoryBot.create :user }
      let(:other_user) { FactoryBot.create :user }
      let(:question) { FactoryBot.create :question }
      let(:report) { Report.create(user:, target_id: other_user.id, target_user_id: other_user.id, type: "Reports::User") }
      let(:report2) { Report.create(user: report_user, target_id: question.id, target_user_id: nil, type: "Reports::Question") }

      subject { get :index, params: { user: report_user.screen_name } }

      before do
        report
        report2
        sign_in user
      end

      include_examples "sets the expected ivars" do
        let(:expected_assigns) do
          {
            reports:         [report2],
            reports_last_id: report2.id,
          }
        end
      end
    end

    context "filtering for type" do
      let(:report_user) { FactoryBot.create :user }
      let(:other_user) { FactoryBot.create :user }
      let(:question) { FactoryBot.create :question }
      let(:report) { Report.create(user:, target_id: other_user.id, target_user_id: other_user.id, type: "Reports::User") }
      let(:report2) { Report.create(user: report_user, target_id: question.id, target_user_id: nil, type: "Reports::Question") }

      subject { get :index, params: { type: "question" } }

      before do
        report
        report2
        sign_in user
      end

      include_examples "sets the expected ivars" do
        let(:expected_assigns) do
          {
            reports:         [report2],
            reports_last_id: report2.id,
          }
        end
      end
    end
  end
end