mirror of
https://github.com/discourse/discourse.git
synced 2025-06-20 17:11:31 +08:00

These changes have been made for playwright as it was hard to test a long press even on playwright given `click` won't trigger `touchstart` even with `isMobile:true` and `hasTouch:true`. You have to use `tap`, but you don't have the `delay` option on tap, so you can't make it a long tap. Sadly this code is apparently not working correctly on Android 15. This commit will revert the modifier to what it was before and is relying on native JS to trigger the fake long press in specs, which seems to work nicely. This commit also attempts to centralize the actions on messages in page objects to avoid code duplication.
237 lines
7.4 KiB
Ruby
237 lines
7.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
RSpec.describe "React to message", type: :system do
|
|
fab!(:current_user) { Fabricate(:user, group_ids: [Group::AUTO_GROUPS[:trust_level_1]]) }
|
|
fab!(:other_user) { Fabricate(:user, group_ids: [Group::AUTO_GROUPS[:trust_level_1]]) }
|
|
fab!(:category_channel_1) { Fabricate(:category_channel) }
|
|
fab!(:message_1) { Fabricate(:chat_message, chat_channel: category_channel_1) }
|
|
|
|
let(:chat) { PageObjects::Pages::Chat.new }
|
|
let(:channel) { PageObjects::Pages::ChatChannel.new }
|
|
|
|
before do
|
|
chat_system_bootstrap
|
|
category_channel_1.add(current_user)
|
|
category_channel_1.add(other_user)
|
|
end
|
|
|
|
context "when other user has reacted" do
|
|
fab!(:reaction_1) do
|
|
Chat::MessageReactor.new(other_user, category_channel_1).react!(
|
|
message_id: message_1.id,
|
|
react_action: :add,
|
|
emoji: "woman_detective",
|
|
)
|
|
end
|
|
|
|
shared_examples "inline reactions" do
|
|
it "shows existing reactions under the message" do
|
|
sign_in(current_user)
|
|
chat.visit_channel(category_channel_1)
|
|
expect(channel).to have_reaction(message_1, reaction_1.emoji)
|
|
end
|
|
|
|
it "increments when clicking it" do
|
|
sign_in(current_user)
|
|
chat.visit_channel(category_channel_1)
|
|
channel.click_reaction(message_1, reaction_1.emoji)
|
|
expect(channel).to have_reaction(message_1, reaction_1.emoji, 2)
|
|
end
|
|
end
|
|
|
|
context "when desktop" do
|
|
include_examples "inline reactions"
|
|
end
|
|
|
|
context "when mobile", mobile: true do
|
|
include_examples "inline reactions"
|
|
end
|
|
end
|
|
|
|
context "when current user reacts" do
|
|
fab!(:reaction_1) do
|
|
Chat::MessageReactor.new(other_user, category_channel_1).react!(
|
|
message_id: message_1.id,
|
|
react_action: :add,
|
|
emoji: "woman_detective",
|
|
)
|
|
end
|
|
|
|
context "when desktop" do
|
|
context "when using inline reaction button" do
|
|
it "adds a reaction" do
|
|
sign_in(current_user)
|
|
chat.visit_channel(category_channel_1)
|
|
channel.react_to_message(message_1)
|
|
find(".emoji-picker [data-emoji=\"grimacing\"]").click
|
|
|
|
expect(channel).to have_reaction(message_1, "grimacing")
|
|
end
|
|
|
|
context "when current user has multiple sessions" do
|
|
xit "adds reaction on each session" do
|
|
reaction = "grimacing"
|
|
|
|
sign_in(current_user)
|
|
chat.visit_channel(category_channel_1)
|
|
|
|
using_session(:tab_1) do
|
|
sign_in(current_user)
|
|
chat.visit_channel(category_channel_1)
|
|
end
|
|
|
|
using_session(:tab_1) do
|
|
channel.hover_message(message_1)
|
|
find(".react-btn").click
|
|
find(".emoji-picker [data-emoji=\"#{reaction}\"]").click
|
|
|
|
expect(channel).to have_reaction(message_1, reaction)
|
|
end
|
|
|
|
expect(channel).to have_reaction(message_1, "grimacing")
|
|
end
|
|
end
|
|
end
|
|
|
|
context "when using message actions menu" do
|
|
context "when using the emoji picker" do
|
|
it "adds a reaction" do
|
|
sign_in(current_user)
|
|
chat.visit_channel(category_channel_1)
|
|
channel.hover_message(message_1)
|
|
find(".chat-message-actions .react-btn").click
|
|
find(".emoji-picker [data-emoji=\"nerd_face\"]").click
|
|
|
|
expect(channel).to have_reaction(message_1, reaction_1.emoji)
|
|
end
|
|
|
|
it "removes denied emojis and aliases from reactions" do
|
|
SiteSetting.emoji_deny_list = "fu"
|
|
|
|
sign_in(current_user)
|
|
chat.visit_channel(category_channel_1)
|
|
channel.hover_message(message_1)
|
|
find(".chat-message-actions .react-btn").click
|
|
|
|
expect(page).to have_no_css(".emoji-picker [data-emoji=\"fu\"]")
|
|
expect(page).to have_no_css(".emoji-picker [data-emoji=\"middle_finger\"]")
|
|
end
|
|
end
|
|
|
|
context "when using favorite reactions" do
|
|
it "adds a reaction" do
|
|
sign_in(current_user)
|
|
chat.visit_channel(category_channel_1)
|
|
channel.hover_message(message_1)
|
|
find(".chat-message-actions [data-emoji-name=\"+1\"]").click
|
|
|
|
expect(channel.message_reactions_list(message_1)).to have_css(
|
|
"[data-emoji-name=\"+1\"]",
|
|
)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
context "when mobile", mobile: true do
|
|
context "when using favorite reactions" do
|
|
it "adds a reaction" do
|
|
sign_in(current_user)
|
|
chat.visit_channel(category_channel_1)
|
|
channel.emoji(message_1, "+1")
|
|
|
|
expect(channel.message_reactions_list(message_1)).to have_css("[data-emoji-name=\"+1\"]")
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
context "when current user and another have reacted" do
|
|
fab!(:other_user) { Fabricate(:user, group_ids: [Group::AUTO_GROUPS[:trust_level_1]]) }
|
|
|
|
fab!(:reaction_1) do
|
|
Chat::MessageReactor.new(current_user, category_channel_1).react!(
|
|
message_id: message_1.id,
|
|
react_action: :add,
|
|
emoji: "woman_detective",
|
|
)
|
|
end
|
|
|
|
fab!(:reaction_2) do
|
|
Chat::MessageReactor.new(other_user, category_channel_1).react!(
|
|
message_id: message_1.id,
|
|
react_action: :add,
|
|
emoji: "woman_detective",
|
|
)
|
|
end
|
|
|
|
context "when removing the reaction" do
|
|
it "removes only the reaction from the current user" do
|
|
sign_in(current_user)
|
|
chat.visit_channel(category_channel_1)
|
|
|
|
expect(channel).to have_reaction(message_1, "woman_detective", "2")
|
|
|
|
channel.click_reaction(message_1, "woman_detective")
|
|
|
|
expect(channel).to have_reaction(message_1, "woman_detective", "1")
|
|
end
|
|
end
|
|
end
|
|
|
|
context "when current user has reacted" do
|
|
fab!(:reaction_1) do
|
|
Chat::MessageReactor.new(current_user, category_channel_1).react!(
|
|
message_id: message_1.id,
|
|
react_action: :add,
|
|
emoji: "woman_detective",
|
|
)
|
|
end
|
|
|
|
shared_examples "inline reactions" do
|
|
it "shows existing reactions under the message" do
|
|
sign_in(current_user)
|
|
chat.visit_channel(category_channel_1)
|
|
expect(channel).to have_reaction(message_1, reaction_1.emoji)
|
|
end
|
|
|
|
it "removes it when clicking it" do
|
|
sign_in(current_user)
|
|
chat.visit_channel(category_channel_1)
|
|
channel.click_reaction(message_1, reaction_1.emoji)
|
|
expect(channel).to have_no_reactions(message_1)
|
|
end
|
|
end
|
|
|
|
context "when desktop" do
|
|
include_examples "inline reactions"
|
|
end
|
|
|
|
context "when mobile", mobile: true do
|
|
include_examples "inline reactions"
|
|
end
|
|
|
|
context "when receiving a duplicate reaction event" do
|
|
fab!(:user_1) { Fabricate(:user, group_ids: [Group::AUTO_GROUPS[:trust_level_1]]) }
|
|
|
|
fab!(:reaction_2) do
|
|
Chat::MessageReactor.new(user_1, category_channel_1).react!(
|
|
message_id: message_1.id,
|
|
react_action: :add,
|
|
emoji: "heart",
|
|
)
|
|
end
|
|
|
|
it "doesn’t create duplicate reactions" do
|
|
sign_in(current_user)
|
|
chat.visit_channel(category_channel_1)
|
|
|
|
Chat::Publisher.publish_reaction!(category_channel_1, message_1, "add", user_1, "heart")
|
|
channel.send_message("test") # cheap trick to ensure reaction has been processed
|
|
|
|
expect(channel).to have_reaction(message_1, reaction_2.emoji, "1")
|
|
end
|
|
end
|
|
end
|
|
end
|