2
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2026-03-03 23:54:20 +08:00
discourse/spec/requests/reviewable_claimed_topics_controller_spec.rb
Krzysztof Kotlarek f42f5b4708
FIX: Only log unclaimed history when topic was claimed (#36949)
Previously, `log_history(:unclaimed, ...)` was being called whenever
topics were unassigned or destroyed, even when the topic was never
claimed in the first place. This resulted in history entries for
unclaimed actions on topics that had no ReviewableClaimedTopic records.

This fix uses the return value of `delete_all` to check if any rows were
actually deleted before logging the unclaimed history.
2026-01-06 14:52:55 +08:00

254 lines
8.2 KiB
Ruby

# frozen_string_literal: true
RSpec.describe ReviewableClaimedTopicsController do
fab!(:moderator)
fab!(:topic)
fab!(:automatic_topic, :topic)
fab!(:reviewable) { Fabricate(:reviewable_flagged_post, topic: topic) }
fab!(:automatic_reviewable) { Fabricate(:reviewable_flagged_post, topic: automatic_topic) }
describe "#create" do
let(:params) { { reviewable_claimed_topic: { topic_id: topic.id } } }
it "requires user to be logged in" do
post "/reviewable_claimed_topics.json", params: params
expect(response.status).to eq(403)
end
context "when logged in" do
before do
SiteSetting.reviewable_claiming = "optional"
sign_in(moderator)
end
it "works" do
messages =
MessageBus.track_publish("/reviewable_claimed") do
post "/reviewable_claimed_topics.json", params: params
expect(response.status).to eq(200)
end
expect(
ReviewableClaimedTopic.where(user_id: moderator.id, topic_id: topic.id).exists?,
).to eq(true)
expect(
topic
.reviewables
.first
.history
.where(reviewable_history_type: ReviewableHistory.types[:claimed])
.size,
).to eq(1)
expect(messages.size).to eq(1)
message = messages[0]
expect(message.data[:topic_id]).to eq(topic.id)
expect(message.data[:user][:id]).to eq(moderator.id)
expect(message.data[:claimed]).to be true
expect(message.group_ids).to contain_exactly(Group::AUTO_GROUPS[:staff])
end
it "publishes reviewable claimed changes to the category moderators of the topic's category" do
SiteSetting.enable_category_group_moderation = true
SiteSetting.reviewable_claiming = "optional"
group = Fabricate(:group)
Fabricate(:category_moderation_group, category: topic.category, group:)
messages =
MessageBus.track_publish("/reviewable_claimed") do
post "/reviewable_claimed_topics.json", params: params
expect(response.status).to eq(200)
end
expect(messages.size).to eq(1)
message = messages[0]
expect(message.data[:topic_id]).to eq(topic.id)
expect(message.data[:user][:id]).to eq(moderator.id)
expect(message.group_ids).to contain_exactly(Group::AUTO_GROUPS[:staff], group.id)
end
it "works with deleted topics" do
first_post = topic.first_post || Fabricate(:post, topic: topic)
PostDestroyer.new(Discourse.system_user, first_post, context: "Automated testing").destroy
post "/reviewable_claimed_topics.json", params: params
expect(response.status).to eq(200)
expect(
ReviewableClaimedTopic.where(user_id: moderator.id, topic_id: topic.id).exists?,
).to eq(true)
end
it "raises an error if user cannot claim the topic" do
SiteSetting.reviewable_claiming = "disabled"
post "/reviewable_claimed_topics.json", params: params
expect(response.status).to eq(403)
end
it "allows claiming when automatic param is present" do
SiteSetting.reviewable_claiming = "disabled"
params[:reviewable_claimed_topic][:topic_id] = automatic_topic.id
params[:reviewable_claimed_topic][:automatic] = "true"
post "/reviewable_claimed_topics.json", params: params
expect(response.status).to eq(200)
expect(
ReviewableClaimedTopic.where(user_id: moderator.id, topic_id: automatic_topic.id).exists?,
).to eq(true)
end
it "raises an error if topic is already claimed" do
post "/reviewable_claimed_topics.json", params: params
expect(
ReviewableClaimedTopic.where(user_id: moderator.id, topic_id: topic.id).exists?,
).to eq(true)
post "/reviewable_claimed_topics.json", params: params
expect(response.status).to eq(409)
end
it "queues a sidekiq job to refresh reviewable counts for users who can see the reviewable" do
SiteSetting.navigation_menu = "sidebar"
SiteSetting.enable_category_group_moderation = true
not_notified = Fabricate(:user)
group = Fabricate(:group)
Fabricate(:category_moderation_group, category: topic.category, group:)
notified = Fabricate(:user)
group.add(notified)
expect_enqueued_with(
job: :refresh_users_reviewable_counts,
args: {
group_ids: [Group::AUTO_GROUPS[:staff], group.id],
},
) do
post "/reviewable_claimed_topics.json", params: params
expect(response.status).to eq(200)
end
end
end
end
describe "#destroy" do
fab!(:claimed) { Fabricate(:reviewable_claimed_topic, topic: topic) }
fab!(:automatic_claimed) do
Fabricate(:reviewable_claimed_topic, topic: automatic_topic, automatic: true)
end
before { sign_in(moderator) }
it "works" do
SiteSetting.reviewable_claiming = "optional"
messages =
MessageBus.track_publish("/reviewable_claimed") do
delete "/reviewable_claimed_topics/#{claimed.topic_id}.json"
expect(response.status).to eq(200)
end
expect(ReviewableClaimedTopic.where(topic_id: claimed.topic_id).exists?).to eq(false)
expect(
topic
.reviewables
.first
.history
.where(reviewable_history_type: ReviewableHistory.types[:unclaimed])
.size,
).to eq(1)
expect(messages.size).to eq(1)
message = messages[0]
expect(message.data[:topic_id]).to eq(topic.id)
expect(message.data[:user][:id]).to eq(moderator.id)
expect(message.data[:claimed]).to be false
expect(message.group_ids).to contain_exactly(Group::AUTO_GROUPS[:staff])
end
it "works with deleted topics" do
SiteSetting.reviewable_claiming = "optional"
first_post = topic.first_post || Fabricate(:post, topic: topic)
PostDestroyer.new(Discourse.system_user, first_post, context: "Automated testing").destroy
delete "/reviewable_claimed_topics/#{claimed.topic_id}.json"
expect(response.status).to eq(200)
expect(ReviewableClaimedTopic.where(user_id: moderator.id, topic_id: topic.id).exists?).to eq(
false,
)
end
it "raises an error if topic is missing" do
delete "/reviewable_claimed_topics/111111111.json"
expect(response.status).to eq(404)
end
it "raises an error if user cannot claim the topic" do
delete "/reviewable_claimed_topics/#{claimed.topic_id}.json"
expect(response.status).to eq(403)
end
it "allows unclaiming when automatic param is present" do
SiteSetting.reviewable_claiming = "disabled"
delete "/reviewable_claimed_topics/#{automatic_claimed.topic_id}.json?automatic=true"
expect(response.status).to eq(200)
expect(
ReviewableClaimedTopic.where(user_id: moderator.id, topic_id: automatic_topic.id).exists?,
).to eq(false)
end
it "queues a sidekiq job to refresh reviewable counts for users who can see the reviewable" do
SiteSetting.reviewable_claiming = "optional"
SiteSetting.navigation_menu = "sidebar"
SiteSetting.enable_category_group_moderation = true
not_notified = Fabricate(:user)
group = Fabricate(:group)
Fabricate(:category_moderation_group, category: topic.category, group:)
notified = Fabricate(:user)
group.add(notified)
expect_enqueued_with(
job: :refresh_users_reviewable_counts,
args: {
group_ids: [Group::AUTO_GROUPS[:staff], group.id],
},
) do
delete "/reviewable_claimed_topics/#{claimed.topic_id}.json"
expect(response.status).to eq(200)
end
end
it "does not log unclaimed history when topic was not claimed" do
SiteSetting.reviewable_claiming = "optional"
claimed.destroy!
delete "/reviewable_claimed_topics/#{topic.id}.json"
expect(response.status).to eq(200)
expect(
topic
.reviewables
.first
.history
.where(reviewable_history_type: ReviewableHistory.types[:unclaimed])
.size,
).to eq(0)
end
end
end