discourse/spec/lib/post_action_destroyer_spec.rb
Ted Johansson 294febf3c4
DEV: Convert min_trust_to_flag_posts setting to groups (#24864)
We're changing the implementation of trust levels to use groups. Part of this is to have site settings that reference trust levels use groups instead. It converts the min_trust_to_flag_posts site setting to flag_post_allowed_groups.

Note: In the original setting, "posts" is plural. I have changed this to "post" singular in the new setting to match others.
2023-12-13 17:18:42 +08:00

99 lines
3.6 KiB
Ruby
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# frozen_string_literal: true
RSpec.describe PostActionDestroyer do
fab!(:admin)
fab!(:user) { Fabricate(:user, refresh_auto_groups: true) }
fab!(:post)
describe "#perform" do
context "with like" do
context "when post action exists" do
before { PostActionCreator.new(user, post, PostActionType.types[:like]).perform }
it "destroys the post action" do
expect { PostActionDestroyer.destroy(user, post, :like) }.to change {
PostAction.count
}.by(-1)
end
it "notifies subscribers" do
expect(post.reload.like_count).to eq(1)
messages = MessageBus.track_publish { PostActionDestroyer.destroy(user, post, :like) }
message = messages.find { |msg| msg.data[:type] === :unliked }.data
expect(message).to be_present
expect(message[:type]).to eq(:unliked)
expect(message[:likes_count]).to eq(0)
expect(message[:user_id]).to eq(user.id)
end
it "notifies updated topic stats to subscribers" do
topic = Fabricate(:topic)
post = Fabricate(:post, topic: topic)
PostActionCreator.new(user, post, PostActionType.types[:like]).perform
expect(post.reload.like_count).to eq(1)
messages =
MessageBus.track_publish("/topic/#{topic.id}") do
PostActionDestroyer.destroy(user, post, :like)
end
stats_message = messages.select { |msg| msg.data[:type] == :stats }.first
expect(stats_message).to be_present
expect(stats_message.data[:like_count]).to eq(0)
end
it "triggers the right flag events" do
PostActionCreator.new(user, post, PostActionType.types[:inappropriate]).perform
events =
DiscourseEvent.track_events { PostActionDestroyer.destroy(user, post, :inappropriate) }
event_names = events.map { |event| event[:event_name] }
expect(event_names).to include(:flag_destroyed)
expect(event_names).not_to include(:like_destroyed)
end
it "triggers the right like events" do
events = DiscourseEvent.track_events { PostActionDestroyer.destroy(user, post, :like) }
event_names = events.map { |event| event[:event_name] }
expect(event_names).to include(:like_destroyed)
expect(event_names).not_to include(:flag_destroyed)
end
it "sends the right event arguments" do
events = DiscourseEvent.track_events { PostActionDestroyer.destroy(user, post, :like) }
event = events.find { |e| e[:event_name] == :like_destroyed }
expect(event.present?).to eq(true)
expect(event[:params].first).to be_instance_of(PostAction)
expect(event[:params].second).to be_instance_of(PostActionDestroyer)
end
end
context "when post action doesnt exist" do
it "fails" do
result = PostActionDestroyer.destroy(user, post, :like)
expect(result.success).to eq(false)
expect(result.not_found).to eq(true)
end
end
end
context "with any other notifiable type" do
before { PostActionCreator.new(user, post, PostActionType.types[:spam]).perform }
it "destroys the post action" do
expect { PostActionDestroyer.destroy(user, post, :spam) }.to change { PostAction.count }.by(
-1,
)
end
it "notifies subscribers" do
messages = MessageBus.track_publish { PostActionDestroyer.destroy(user, post, :spam) }
expect(messages.last.data[:type]).to eq(:acted)
end
end
end
end