# frozen_string_literal: true

RSpec.describe SlugsController do
  fab!(:current_user) { Fabricate(:user, trust_level: TrustLevel[4]) }

  describe "#generate" do
    let(:name) { "Arts & Media" }

    context "when user not logged in" do
      it "returns a 403 error" do
        post "/slugs.json", params: { name: name }
        expect(response.status).to eq(403)
      end
    end

    context "when user is logged in" do
      before { sign_in(current_user) }

      it "generates a slug from the name" do
        post "/slugs.json", params: { name: name }
        expect(response.status).to eq(200)
        expect(response.parsed_body["slug"]).to eq(Slug.for(name, ""))
      end

      it "requires name" do
        post "/slugs.json"
        expect(response.status).to eq(400)
      end

      describe "rate limiting" do
        before { RateLimiter.enable }

        use_redis_snapshotting

        it "rate limits" do
          stub_const(SlugsController, "MAX_SLUG_GENERATIONS_PER_MINUTE", 1) do
            post "/slugs.json?name=#{name}"
            post "/slugs.json?name=#{name}"
          end

          expect(response.status).to eq(429)
        end
      end

      context "when user is not TL4 or higher" do
        before { current_user.change_trust_level!(1) }

        it "returns a 403 error" do
          post "/slugs.json?name=#{name}"
          expect(response.status).to eq(403)
        end
      end

      context "when user is admin" do
        fab!(:current_user) { Fabricate(:admin) }

        it "generates a slug from the name" do
          post "/slugs.json", params: { name: name }
          expect(response.status).to eq(200)
          expect(response.parsed_body["slug"]).to eq(Slug.for(name, ""))
        end
      end
    end
  end
end