mirror of
https://github.com/discourse/discourse.git
synced 2025-02-07 03:48:23 +00:00
ddf4ecba04
What is the problem? We were calling out to methods that calls `has_css?` or `has_selector?` which returns a boolean. Since we are not using the return value, it means the methods can be deemed unnecessary. However, we do want those checks and this commit adds the necessarily assertions to make use of the return values.
197 lines
7.0 KiB
Ruby
197 lines
7.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
RSpec.describe "Quoting chat message transcripts", type: :system, js: true do
|
|
fab!(:current_user) { Fabricate(:user) }
|
|
fab!(:admin) { Fabricate(:admin) }
|
|
fab!(:chat_channel_1) { Fabricate(:chat_channel) }
|
|
|
|
let(:cdp) { PageObjects::CDP.new }
|
|
let(:chat_page) { PageObjects::Pages::Chat.new }
|
|
let(:chat_channel_page) { PageObjects::Pages::ChatChannel.new }
|
|
let(:topic_page) { PageObjects::Pages::Topic.new }
|
|
|
|
before do
|
|
chat_system_bootstrap(admin, [chat_channel_1])
|
|
chat_channel_1.add(current_user)
|
|
sign_in(current_user)
|
|
end
|
|
|
|
def select_message_desktop(message)
|
|
if page.has_css?(".chat-message-container.selecting-messages", wait: 0)
|
|
chat_channel_page.message_by_id(message.id).find(".chat-message-selector").click
|
|
else
|
|
chat_channel_page.message_by_id(message.id).hover
|
|
expect(page).to have_css(".chat-message-actions .more-buttons")
|
|
find(".chat-message-actions .more-buttons").click
|
|
find(".select-kit-row[data-value=\"select\"]").click
|
|
end
|
|
end
|
|
|
|
def click_selection_button(button)
|
|
selector =
|
|
case button
|
|
when "quote"
|
|
"chat-quote-btn"
|
|
when "copy"
|
|
"chat-copy-btn"
|
|
when "cancel"
|
|
"chat-cancel-selection-btn"
|
|
when "move"
|
|
"chat-move-to-channel-btn"
|
|
end
|
|
find_button(selector, disabled: false, wait: 5).click
|
|
end
|
|
|
|
def copy_messages_to_clipboard(messages)
|
|
messages = Array.wrap(messages)
|
|
messages.each { |message| select_message_desktop(message) }
|
|
expect(chat_channel_page).to have_selection_management
|
|
click_selection_button("copy")
|
|
expect(page).to have_selector(".chat-copy-success")
|
|
clip_text = cdp.read_clipboard
|
|
expect(clip_text.chomp).to eq(generate_transcript(messages, current_user))
|
|
clip_text
|
|
end
|
|
|
|
def generate_transcript(messages, acting_user)
|
|
messages = Array.wrap(messages)
|
|
Chat::TranscriptService
|
|
.new(messages.first.chat_channel, acting_user, messages_or_ids: messages.map(&:id))
|
|
.generate_markdown
|
|
.chomp
|
|
end
|
|
|
|
describe "copying quote transcripts with the clipboard" do
|
|
before { cdp.allow_clipboard }
|
|
|
|
context "when quoting a single message into a topic" do
|
|
fab!(:post_1) { Fabricate(:post) }
|
|
fab!(:message_1) { Fabricate(:chat_message, chat_channel: chat_channel_1) }
|
|
|
|
it "quotes the message" do
|
|
chat_page.visit_channel(chat_channel_1)
|
|
|
|
clip_text = copy_messages_to_clipboard(message_1)
|
|
topic_page.visit_topic_and_open_composer(post_1.topic)
|
|
topic_page.fill_in_composer("This is a new post!\n\n" + clip_text)
|
|
|
|
within(".d-editor-preview") { expect(page).to have_css(".chat-transcript") }
|
|
|
|
topic_page.send_reply
|
|
selector = topic_page.post_by_number_selector(2)
|
|
|
|
expect(page).to have_css(selector)
|
|
within(selector) { expect(page).to have_css(".chat-transcript") }
|
|
end
|
|
end
|
|
|
|
context "when quoting multiple messages into a topic" do
|
|
fab!(:post_1) { Fabricate(:post) }
|
|
fab!(:message_1) { Fabricate(:chat_message, chat_channel: chat_channel_1) }
|
|
fab!(:message_2) { Fabricate(:chat_message, chat_channel: chat_channel_1) }
|
|
|
|
it "quotes the messages" do
|
|
chat_page.visit_channel(chat_channel_1)
|
|
|
|
clip_text = copy_messages_to_clipboard([message_1, message_2])
|
|
topic_page.visit_topic_and_open_composer(post_1.topic)
|
|
topic_page.fill_in_composer("This is a new post!\n\n" + clip_text)
|
|
|
|
within(".d-editor-preview") { expect(page).to have_css(".chat-transcript", count: 2) }
|
|
expect(page).to have_content("Originally sent in #{chat_channel_1.name}")
|
|
|
|
topic_page.send_reply
|
|
|
|
selector = topic_page.post_by_number_selector(2)
|
|
expect(page).to have_css(selector)
|
|
within(selector) { expect(page).to have_css(".chat-transcript", count: 2) }
|
|
end
|
|
end
|
|
|
|
context "when quoting a message containing a onebox" do
|
|
fab!(:post_1) { Fabricate(:post) }
|
|
fab!(:message_1) { Fabricate(:chat_message, chat_channel: chat_channel_1) }
|
|
|
|
before do
|
|
Oneboxer.stubs(:preview).returns(
|
|
"<aside class=\"onebox\"><article class=\"onebox-body\"><h3><a href=\"http://www.example.com/article.html\" tabindex=\"-1\">An interesting article</a></h3></article></aside>",
|
|
)
|
|
message_1.update!(message: "http://www.example.com/has-title.html")
|
|
message_1.rebake!
|
|
end
|
|
|
|
it "works" do
|
|
chat_page.visit_channel(chat_channel_1)
|
|
|
|
clip_text = copy_messages_to_clipboard(message_1)
|
|
topic_page.visit_topic_and_open_composer(post_1.topic)
|
|
topic_page.fill_in_composer(clip_text)
|
|
|
|
within(".chat-transcript-messages") do
|
|
expect(page).to have_content("An interesting article")
|
|
end
|
|
end
|
|
end
|
|
|
|
context "when quoting a message in another message" do
|
|
fab!(:message_1) { Fabricate(:chat_message, chat_channel: chat_channel_1) }
|
|
|
|
it "quotes the message" do
|
|
chat_page.visit_channel(chat_channel_1)
|
|
|
|
clip_text = copy_messages_to_clipboard(message_1)
|
|
click_selection_button("cancel")
|
|
chat_channel_page.send_message(clip_text, check_message_presence: false)
|
|
|
|
expect(page).to have_selector(".chat-message", count: 2)
|
|
expect(page).to have_css(".chat-transcript")
|
|
end
|
|
end
|
|
end
|
|
|
|
context "when quoting into a topic directly" do
|
|
fab!(:message_1) { Fabricate(:chat_message, chat_channel: chat_channel_1) }
|
|
let(:topic_title) { "Some topic title for testing" }
|
|
|
|
it "opens the topic composer with correct state" do
|
|
chat_page.visit_channel(chat_channel_1)
|
|
|
|
select_message_desktop(message_1)
|
|
click_selection_button("quote")
|
|
|
|
expect(topic_page).to have_expanded_composer
|
|
expect(topic_page).to have_composer_content(generate_transcript(message_1, current_user))
|
|
expect(page).to have_css(
|
|
".category-input .select-kit-header[data-value='#{chat_channel_1.chatable.id}']",
|
|
)
|
|
expect(page).not_to have_current_path(chat_channel_1.chatable.url)
|
|
|
|
topic_page.fill_in_composer_title(topic_title)
|
|
topic_page.send_reply
|
|
|
|
selector = topic_page.post_by_number_selector(1)
|
|
expect(page).to have_css(selector)
|
|
within(selector) { expect(page).to have_css(".chat-transcript") }
|
|
|
|
topic = Topic.find_by(user: current_user, title: topic_title)
|
|
expect(page).to have_current_path(topic.url)
|
|
end
|
|
|
|
context "when on mobile" do
|
|
it "first navigates to the channel's category before opening the topic composer with the quote prefilled",
|
|
mobile: true do
|
|
chat_page.visit_channel(chat_channel_1)
|
|
chat_channel_page.select_message(message_1)
|
|
click_selection_button("quote")
|
|
|
|
expect(topic_page).to have_expanded_composer
|
|
expect(topic_page).to have_composer_content(generate_transcript(message_1, current_user))
|
|
expect(page).to have_current_path(chat_channel_1.chatable.url)
|
|
expect(page).to have_css(
|
|
".category-input .select-kit-header[data-value='#{chat_channel_1.chatable.id}']",
|
|
)
|
|
end
|
|
end
|
|
end
|
|
end
|