82 lines
2.5 KiB
Ruby
82 lines
2.5 KiB
Ruby
# frozen_string_literal: true
|
||
|
||
RSpec.describe PostActionDestroyer do
|
||
fab!(:admin) { Fabricate(:admin) }
|
||
fab!(:user) { Fabricate(:user) }
|
||
fab!(:post) { Fabricate(:post) }
|
||
|
||
describe '#perform' do
|
||
context 'with like' do
|
||
context 'when 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 'when post action doesn’t 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 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
|