discourse/plugins/discourse-solved/spec/requests/answer_controller_spec.rb
Jarek Radosz 71834c898f
DEV: Update rubocop-discourse to 3.13 and autofix issues (#35073)
Co-authored-by: Loïc Guitaut <loic@discourse.org>
2025-10-06 16:11:01 +02:00

86 lines
2.7 KiB
Ruby

# frozen_string_literal: true
describe DiscourseSolved::AnswerController do
fab!(:user)
fab!(:staff_user, :admin)
fab!(:category)
fab!(:topic) { Fabricate(:topic, category: category) }
fab!(:p) { Fabricate(:post, topic: topic) }
fab!(:solution_post) { Fabricate(:post, topic: topic) }
before do
SiteSetting.solved_enabled = true
SiteSetting.allow_solved_on_all_topics = true
category.custom_fields[DiscourseSolved::ENABLE_ACCEPTED_ANSWERS_CUSTOM_FIELD] = "true"
category.save_custom_fields
# Give permission to accept solutions
user.update!(trust_level: 1)
# Make user the topic creator so they can accept answers
topic.update!(user_id: user.id)
end
describe "#accept" do
context "with default rate limiting" do
it "applies rate limits to regular users" do
sign_in(user)
# Should be rate limited
RateLimiter.any_instance.expects(:performed!).raises(RateLimiter::LimitExceeded.new(60))
post "/solution/accept.json", params: { id: solution_post.id }
expect(response.status).to eq(429)
end
it "does not apply rate limits to staff" do
sign_in(staff_user)
post "/solution/accept.json", params: { id: solution_post.id }
expect(response.status).to eq(200)
end
end
context "with plugin modifier" do
it "allows plugins to bypass rate limiting" do
sign_in(user)
# Create a plugin instance and register a modifier
plugin_instance = Plugin::Instance.new
modifier_block = Proc.new { |_, _| false }
plugin_instance.register_modifier(
:solved_answers_controller_run_rate_limiter,
&modifier_block
)
post "/solution/accept.json", params: { id: solution_post.id }
expect(response.status).to eq(200)
post "/solution/accept.json", params: { id: solution_post.id }
expect(response.status).to eq(200)
# Unregister the modifier using DiscoursePluginRegistry
DiscoursePluginRegistry.unregister_modifier(
plugin_instance,
:solved_answers_controller_run_rate_limiter,
&modifier_block
)
end
end
end
describe "#unaccept" do
before do
# Setup an accepted solution
sign_in(user)
post "/solution/accept.json", params: { id: solution_post.id }
expect(response.status).to eq(200)
sign_out
end
it "applies rate limits to regular users" do
sign_in(user)
# Should be rate limited
RateLimiter.any_instance.expects(:performed!).raises(RateLimiter::LimitExceeded.new(60))
post "/solution/unaccept.json", params: { id: solution_post.id }
expect(response.status).to eq(429)
end
end
end