discourse/spec/lib/post_action_destroyer_spec.rb
Sérgio Saquetim 5840fb5c62
UX: Update topics stats automatically (#17135)
Updates automatically data on the stats section of the topic.

It will update automatically the following information: likes, replies and last reply (timestamp and user)
2022-06-27 18:21:05 -03:00

84 lines
2.5 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
describe PostActionDestroyer do
fab!(:admin) { Fabricate(:admin) }
fab!(:user) { Fabricate(:user) }
fab!(:post) { Fabricate(:post) }
describe '#perform' do
context 'like' do
context 'post action exists' do
before do
PostActionCreator.new(user, post, PostActionType.types[:like]).perform
end
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 do
PostActionDestroyer.destroy(user, post, :like)
end
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
end
context 'post action doesnt exist' do
describe 'perform' 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
end
context 'any other notifiable type' do
before do
PostActionCreator.new(user, post, PostActionType.types[:spam]).perform
end
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 do
PostActionDestroyer.destroy(user, post, :spam)
end
expect(messages.last.data[:type]).to eq(:acted)
end
end
end
end