discourse/plugins/chat/spec/lib/chat_message_reactor_spec.rb

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

141 lines
4.7 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
require "rails_helper"
describe Chat::ChatMessageReactor do
fab!(:reacting_user) { Fabricate(:user) }
fab!(:channel) { Fabricate(:category_channel) }
fab!(:reactor) { described_class.new(reacting_user, channel) }
fab!(:message_1) { Fabricate(:chat_message, chat_channel: channel, user: reacting_user) }
let(:subject) { described_class.new(reacting_user, channel) }
it "calls guardian ensure_can_join_chat_channel!" do
Guardian.any_instance.expects(:ensure_can_join_chat_channel!).once
subject.react!(message_id: message_1.id, react_action: :add, emoji: ":+1:")
end
it "raises an error if the user cannot see the channel" do
channel.update!(chatable: Fabricate(:private_category, group: Group[:staff]))
expect {
subject.react!(message_id: message_1.id, react_action: :add, emoji: ":+1:")
}.to raise_error(Discourse::InvalidAccess)
end
it "raises an error if the user cannot react" do
SpamRule::AutoSilence.new(reacting_user).silence_user
expect {
subject.react!(message_id: message_1.id, react_action: :add, emoji: ":+1:")
}.to raise_error(Discourse::InvalidAccess)
end
it "raises an error if the channel status is not open" do
channel.update!(status: ChatChannel.statuses[:archived])
expect {
subject.react!(message_id: message_1.id, react_action: :add, emoji: ":+1:")
}.to raise_error(Discourse::InvalidAccess)
channel.update!(status: ChatChannel.statuses[:open])
expect {
subject.react!(message_id: message_1.id, react_action: :add, emoji: ":+1:")
}.to change(ChatMessageReaction, :count).by(1)
end
it "raises an error if the reaction is not valid" do
expect {
reactor.react!(message_id: message_1.id, react_action: :foo, emoji: ":+1:")
}.to raise_error(Discourse::InvalidParameters)
end
it "raises an error if the emoji does not exist" do
expect {
reactor.react!(message_id: message_1.id, react_action: :add, emoji: ":woohoo:")
}.to raise_error(Discourse::InvalidParameters)
end
it "raises an error if the message is not found" do
expect {
reactor.react!(message_id: -999, react_action: :add, emoji: ":woohoo:")
}.to raise_error(Discourse::InvalidParameters)
end
context "when max reactions has been reached" do
before do
emojis = Emoji.all.slice(0, Chat::ChatMessageReactor::MAX_REACTIONS_LIMIT)
emojis.each do |emoji|
ChatMessageReaction.create!(
chat_message: message_1,
user: reacting_user,
emoji: ":#{emoji.name}:",
)
end
end
it "adding a reaction raises an error" do
expect {
reactor.react!(
message_id: message_1.id,
react_action: :add,
emoji: ":#{Emoji.all.last.name}:",
)
}.to raise_error(Discourse::InvalidAccess)
end
it "removing a reaction works" do
expect {
reactor.react!(
message_id: message_1.id,
react_action: :add,
emoji: ":#{Emoji.all.first.name}:",
)
}.to_not raise_error
end
end
it "creates a membership when not present" do
expect {
reactor.react!(message_id: message_1.id, react_action: :add, emoji: ":heart:")
}.to change(UserChatChannelMembership, :count).by(1)
end
it "doesnt create a membership when present" do
UserChatChannelMembership.create!(user: reacting_user, chat_channel: channel, following: true)
expect {
reactor.react!(message_id: message_1.id, react_action: :add, emoji: ":heart:")
}.not_to change(UserChatChannelMembership, :count)
end
it "can add a reaction" do
expect {
reactor.react!(message_id: message_1.id, react_action: :add, emoji: ":heart:")
}.to change(ChatMessageReaction, :count).by(1)
end
it "doesnt duplicate reactions" do
ChatMessageReaction.create!(chat_message: message_1, user: reacting_user, emoji: ":heart:")
expect {
reactor.react!(message_id: message_1.id, react_action: :add, emoji: ":heart:")
}.not_to change(ChatMessageReaction, :count)
end
it "can remove an existing reaction" do
ChatMessageReaction.create!(chat_message: message_1, user: reacting_user, emoji: ":heart:")
expect {
reactor.react!(message_id: message_1.id, react_action: :remove, emoji: ":heart:")
}.to change(ChatMessageReaction, :count).by(-1)
end
it "does nothing when removing if no reaction found" do
expect {
reactor.react!(message_id: message_1.id, react_action: :remove, emoji: ":heart:")
}.not_to change(ChatMessageReaction, :count)
end
it "publishes the reaction" do
ChatPublisher.expects(:publish_reaction!).once
reactor.react!(message_id: message_1.id, react_action: :add, emoji: ":heart:")
end
end