# frozen_string_literal: true

RSpec.describe Admin::EmbeddableHostsController do
  fab!(:admin) { Fabricate(:admin) }
  fab!(:moderator) { Fabricate(:moderator) }
  fab!(:user) { Fabricate(:user) }
  fab!(:embeddable_host) { Fabricate(:embeddable_host) }

  describe "#create" do
    context "when logged in as an admin" do
      before { sign_in(admin) }

      it "logs embeddable host create" do
        post "/admin/embeddable_hosts.json", params: { embeddable_host: { host: "test.com" } }

        expect(response.status).to eq(200)
        expect(
          UserHistory.where(
            acting_user_id: admin.id,
            action: UserHistory.actions[:embeddable_host_create],
          ).exists?,
        ).to eq(true)
      end
    end

    shared_examples "embeddable host creation not allowed" do
      it "prevents embeddable host creation with a 404 response" do
        post "/admin/embeddable_hosts.json", params: { embeddable_host: { host: "test.com" } }

        expect(response.status).to eq(404)
        expect(response.parsed_body["errors"]).to include(I18n.t("not_found"))
      end
    end

    context "when logged in as a moderator" do
      before { sign_in(moderator) }

      include_examples "embeddable host creation not allowed"
    end

    context "when logged in as a non-staff user" do
      before { sign_in(user) }

      include_examples "embeddable host creation not allowed"
    end
  end

  describe "#update" do
    context "when logged in as an admin" do
      before { sign_in(admin) }

      it "logs embeddable host update" do
        category = Fabricate(:category)

        put "/admin/embeddable_hosts/#{embeddable_host.id}.json",
            params: {
              embeddable_host: {
                host: "test.com",
                category_id: category.id,
              },
            }

        expect(response.status).to eq(200)

        history_exists =
          UserHistory.where(
            acting_user_id: admin.id,
            action: UserHistory.actions[:embeddable_host_update],
            new_value: "category_id: #{category.id}, host: test.com",
          ).exists?

        expect(history_exists).to eq(true)
      end
    end

    shared_examples "embeddable host update not allowed" do
      it "prevents updates with a 404 response" do
        category = Fabricate(:category)

        put "/admin/embeddable_hosts/#{embeddable_host.id}.json",
            params: {
              embeddable_host: {
                host: "test.com",
                category_id: category.id,
              },
            }

        expect(response.status).to eq(404)
        expect(response.parsed_body["errors"]).to include(I18n.t("not_found"))
      end
    end

    context "when logged in as a moderator" do
      before { sign_in(moderator) }

      include_examples "embeddable host update not allowed"
    end

    context "when logged in as a non-staff user" do
      before { sign_in(user) }

      include_examples "embeddable host update not allowed"
    end
  end

  describe "#destroy" do
    context "when logged in as an admin" do
      before { sign_in(admin) }

      it "logs embeddable host destroy" do
        delete "/admin/embeddable_hosts/#{embeddable_host.id}.json", params: {}

        expect(response.status).to eq(200)
        expect(
          UserHistory.where(
            acting_user_id: admin.id,
            action: UserHistory.actions[:embeddable_host_destroy],
          ).exists?,
        ).to eq(true)
      end
    end

    shared_examples "embeddable host deletion not allowed" do
      it "prevents deletion with a 404 response" do
        delete "/admin/embeddable_hosts/#{embeddable_host.id}.json", params: {}

        expect(response.status).to eq(404)
        expect(response.parsed_body["errors"]).to include(I18n.t("not_found"))
      end
    end

    context "when logged in as a moderator" do
      before { sign_in(moderator) }

      include_examples "embeddable host deletion not allowed"
    end

    context "when logged in as a non-staff user" do
      before { sign_in(user) }

      include_examples "embeddable host deletion not allowed"
    end
  end
end