discourse/spec/requests/slugs_controller_spec.rb
Martin Brennan 641e94fc3c
FEATURE: Allow changing slug on create channel (#19928)
This commit allows us to set the channel slug when creating new chat
channels. As well as this, it introduces a new `SlugsController` which can
generate a slug using `Slug.for` and a name string for input. We call this
after the user finishes typing the channel name (debounced) and fill in
the autogenerated slug in the background, and update the slug input
placeholder.

This autogenerated slug is used by default, but if the user writes anything
else in the input it will be used instead.
2023-01-23 14:48:33 +10:00

62 lines
1.7 KiB
Ruby

# 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
get "/slugs/generate.json?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
get "/slugs/generate.json", params: { name: name }
expect(response.status).to eq(200)
expect(response.parsed_body["slug"]).to eq(Slug.for(name, ""))
end
it "rate limits" do
RateLimiter.enable
stub_const(SlugsController, "MAX_SLUG_GENERATIONS_PER_MINUTE", 1) do
get "/slugs/generate.json?name=#{name}"
get "/slugs/generate.json?name=#{name}"
end
expect(response.status).to eq(429)
end
it "requires name" do
get "/slugs/generate.json"
expect(response.status).to eq(400)
end
context "when user is not TL4 or higher" do
before { current_user.change_trust_level!(1) }
it "returns a 403 error" do
get "/slugs/generate.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
get "/slugs/generate.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