mirror of
https://github.com/discourse/discourse.git
synced 2024-12-13 07:23:44 +08:00
e1ae32103d
This is extracted from #22390. This patch aims to ease the transition to the new message creation service. (in progress in #22390) Indeed, the new service patch is breaking some specs from `discourse-ai` and `discourse-templates` because these plugins are using either `Chat::MessageCreator` or the `chat_message` fabricator. This patch addresses theses issues by normalizing how we create a chat message in specs. To do so, the preferred way is to use `Fabricate(:chat_message)` with a new `:use_service` option allowing to call the service under the hood. While this patch will obviously call `Chat::MessageCreator`, the new service patch will now be able to simply change the call to `Chat::CreateMessage` without breaking any specs from other plugins. Another thing this patch does is to not create chat messages using the service for specs that aren’t system ones, thus speeding the execution time a bit in the process.
84 lines
2.5 KiB
Ruby
84 lines
2.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "faker"
|
|
|
|
module ChatSystemHelpers
|
|
def chat_system_bootstrap(user = Fabricate(:admin), channels_for_membership = [])
|
|
# ensures we have one valid registered admin/user
|
|
user.activate
|
|
|
|
SiteSetting.chat_enabled = true
|
|
SiteSetting.chat_allowed_groups = Group::AUTO_GROUPS[:trust_level_1]
|
|
|
|
channels_for_membership.each do |channel|
|
|
membership = channel.add(user)
|
|
if channel.chat_messages.any?
|
|
membership.update!(last_read_message_id: channel.chat_messages.last.id)
|
|
end
|
|
end
|
|
|
|
Group.refresh_automatic_groups!
|
|
end
|
|
|
|
def chat_system_user_bootstrap(user:, channel:)
|
|
user.activate
|
|
user.user_option.update!(chat_enabled: true)
|
|
Group.refresh_automatic_group!("trust_level_#{user.trust_level}".to_sym)
|
|
channel.add(user)
|
|
end
|
|
|
|
def chat_thread_chain_bootstrap(channel:, users:, messages_count: 4, thread_attrs: {})
|
|
last_user = nil
|
|
last_message = nil
|
|
|
|
users.each { |user| chat_system_user_bootstrap(user: user, channel: channel) }
|
|
messages_count.times do |i|
|
|
in_reply_to = i.zero? ? nil : last_message.id
|
|
thread_id = i.zero? ? nil : last_message.thread_id
|
|
last_user = ((users - [last_user]).presence || users).sample
|
|
creator =
|
|
Chat::MessageCreator.new(
|
|
chat_channel: channel,
|
|
in_reply_to_id: in_reply_to,
|
|
thread_id: thread_id,
|
|
user: last_user,
|
|
content: Faker::Lorem.paragraph,
|
|
)
|
|
creator.create
|
|
|
|
raise creator.error if creator.error
|
|
last_message = creator.chat_message
|
|
end
|
|
|
|
last_message.thread.set_replies_count_cache(messages_count - 1, update_db: true)
|
|
last_message.thread.update!(thread_attrs) if thread_attrs.any?
|
|
last_message.thread
|
|
end
|
|
|
|
def thread_excerpt(message)
|
|
CGI.escapeHTML(
|
|
message.censored_excerpt(max_length: ::Chat::Thread::EXCERPT_LENGTH).gsub("…", "…"),
|
|
)
|
|
end
|
|
end
|
|
|
|
module ChatSpecHelpers
|
|
def service_failed!(result)
|
|
raise RSpec::Expectations::ExpectationNotMetError.new(
|
|
"Service failed, see below for step details:\n\n" + result.inspect_steps.inspect,
|
|
)
|
|
end
|
|
end
|
|
|
|
RSpec.configure do |config|
|
|
config.include ChatSystemHelpers, type: :system
|
|
config.include ChatSpecHelpers
|
|
config.include Chat::WithServiceHelper
|
|
config.include Chat::ServiceMatchers
|
|
|
|
config.expect_with :rspec do |c|
|
|
# Or a very large value, if you do want to truncate at some point
|
|
c.max_formatted_output_length = nil
|
|
end
|
|
end
|