DEV: Rename direct message related models

This is a followup of the previous refactor where we created two new
models to handle all the dedicated logic that was present in the
`ChatChannel` model.

For the sake of consistency, `DMChannel` has been renamed to
`DirectMessageChannel` and the previous `DirectMessageChannel` model is
now named `DirectMessage`. This should help reasoning about direct
messages.
This commit is contained in:
Loïc Guitaut 2022-11-02 15:53:36 +01:00 committed by Loïc Guitaut
parent 7e992cb299
commit abcaa1a961
57 changed files with 378 additions and 455 deletions

View File

@ -129,7 +129,7 @@ class Chat::ChatChannelsController < Chat::ChatBaseController
if users.count > 0
ChatChannel
.includes(chatable: :users)
.joins(direct_message_channel: :direct_message_users)
.joins(direct_message: :direct_message_users)
.group(1)
.having(
"ARRAY[?] <@ ARRAY_AGG(user_id) AND ARRAY[?] && ARRAY_AGG(user_id)",

View File

@ -25,13 +25,9 @@ class Chat::DirectMessagesController < Chat::ChatBaseController
guardian.ensure_can_chat!(current_user)
users = users_from_usernames(current_user, params)
direct_message_channel = DirectMessageChannel.for_user_ids(users.map(&:id).uniq)
if direct_message_channel
chat_channel =
ChatChannel.find_by(
chatable_id: direct_message_channel.id,
chatable_type: "DirectMessageChannel",
)
direct_message = DirectMessage.for_user_ids(users.map(&:id).uniq)
if direct_message
chat_channel = ChatChannel.find_by(chatable: direct_message)
render_serialized(
chat_channel,
ChatChannelSerializer,

View File

@ -4,8 +4,8 @@ class ChatChannel < ActiveRecord::Base
include Trashable
belongs_to :chatable, polymorphic: true
belongs_to :direct_message_channel,
-> { where(chat_channels: { chatable_type: "DirectMessageChannel" }) },
belongs_to :direct_message,
-> { where(chat_channels: { chatable_type: "DirectMessage" }) },
foreign_key: "chatable_id"
has_many :chat_messages
@ -37,7 +37,7 @@ class ChatChannel < ActiveRecord::Base
end
def chatable_types
public_channel_chatable_types << "DirectMessageChannel"
public_channel_chatable_types << "DirectMessage"
end
end

View File

@ -28,7 +28,7 @@ class ChatMessage < ActiveRecord::Base
}
scope :in_dm_channel,
-> { joins(:chat_channel).where(chat_channel: { chatable_type: "DirectMessageChannel" }) }
-> { joins(:chat_channel).where(chat_channel: { chatable_type: "DirectMessage" }) }
scope :created_before, ->(date) { where("chat_messages.created_at < ?", date) }

View File

@ -14,13 +14,6 @@ module Chatable
private
def channel_class
case self
when Category
CategoryChannel
when DirectMessageChannel
DMChannel
else
raise "Unknown chatable #{self}"
end
"#{self.class}Channel".safe_constantize || raise("Unknown chatable #{self}")
end
end

View File

@ -1,22 +0,0 @@
# frozen_string_literal: true
# TODO: merge DMChannel and DirectMessageChannel models together
class DMChannel < ChatChannel
alias_attribute :direct_message_channel, :chatable
def direct_message_channel?
true
end
def allowed_user_ids
direct_message_channel.user_ids
end
def read_restricted?
true
end
def title(user)
direct_message_channel.chat_channel_title_for_user(self, user)
end
end

View File

@ -0,0 +1,56 @@
# frozen_string_literal: true
class DirectMessage < ActiveRecord::Base
self.table_name = "direct_message_channels"
include Chatable
has_many :direct_message_users, foreign_key: :direct_message_channel_id
has_many :users, through: :direct_message_users
def self.for_user_ids(user_ids)
joins(:users)
.group("direct_message_channels.id")
.having("ARRAY[?] = ARRAY_AGG(users.id ORDER BY users.id)", user_ids.sort)
&.first
end
def user_can_access?(user)
users.include?(user)
end
def chat_channel_title_for_user(chat_channel, acting_user)
users =
(direct_message_users.map(&:user) - [acting_user]).map { |user| user || DeletedChatUser.new }
# direct message to self
if users.empty?
return I18n.t("chat.channel.dm_title.single_user", user: "@#{acting_user.username}")
end
# all users deleted
return chat_channel.id if !users.first
usernames_formatted = users.sort_by(&:username).map { |u| "@#{u.username}" }
if usernames_formatted.size > 5
return(
I18n.t(
"chat.channel.dm_title.multi_user_truncated",
users: usernames_formatted[0..4].join(", "),
leftover: usernames_formatted.length - 5,
)
)
end
I18n.t("chat.channel.dm_title.multi_user", users: usernames_formatted.join(", "))
end
end
# == Schema Information
#
# Table name: direct_message_channels
#
# id :bigint not null, primary key
# created_at :datetime not null
# updated_at :datetime not null
#

View File

@ -1,54 +1,21 @@
# frozen_string_literal: true
class DirectMessageChannel < ActiveRecord::Base
include Chatable
class DirectMessageChannel < ChatChannel
alias_attribute :direct_message, :chatable
has_many :direct_message_users
has_many :users, through: :direct_message_users
def self.for_user_ids(user_ids)
joins(:users)
.group("direct_message_channels.id")
.having("ARRAY[?] = ARRAY_AGG(users.id ORDER BY users.id)", user_ids.sort)
&.first
def direct_message_channel?
true
end
def user_can_access?(user)
users.include?(user)
def allowed_user_ids
direct_message.user_ids
end
def chat_channel_title_for_user(chat_channel, acting_user)
users =
(direct_message_users.map(&:user) - [acting_user]).map { |user| user || DeletedChatUser.new }
def read_restricted?
true
end
# direct message to self
if users.empty?
return I18n.t("chat.channel.dm_title.single_user", user: "@#{acting_user.username}")
end
# all users deleted
return chat_channel.id if !users.first
usernames_formatted = users.sort_by(&:username).map { |u| "@#{u.username}" }
if usernames_formatted.size > 5
return(
I18n.t(
"chat.channel.dm_title.multi_user_truncated",
users: usernames_formatted[0..4].join(", "),
leftover: usernames_formatted.length - 5,
)
)
end
I18n.t("chat.channel.dm_title.multi_user", users: usernames_formatted.join(", "))
def title(user)
direct_message.chat_channel_title_for_user(self, user)
end
end
# == Schema Information
#
# Table name: direct_message_channels
#
# id :bigint not null, primary key
# created_at :datetime not null
# updated_at :datetime not null
#

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true
class DirectMessageUser < ActiveRecord::Base
belongs_to :direct_message_channel
belongs_to :direct_message, foreign_key: :direct_message_channel_id
belongs_to :user
end

View File

@ -44,8 +44,8 @@ class ChatChannelSerializer < ApplicationSerializer
case object.chatable_type
when "Category"
BasicCategorySerializer.new(object.chatable, root: false).as_json
when "DirectMessageChannel"
DirectMessageChannelSerializer.new(object.chatable, scope: scope, root: false).as_json
when "DirectMessage"
DirectMessageSerializer.new(object.chatable, scope: scope, root: false).as_json
when "Site"
nil
end

View File

@ -1,6 +1,6 @@
# frozen_string_literal: true
class DirectMessageChannelSerializer < ApplicationSerializer
class DirectMessageSerializer < ApplicationSerializer
has_many :users, serializer: UserWithCustomFieldsAndStatusSerializer, embed: :objects
def users

View File

@ -7,7 +7,7 @@ import { ajax } from "discourse/lib/ajax";
import { escapeExpression } from "discourse/lib/utilities";
export const CHATABLE_TYPES = {
directMessageChannel: "DirectMessageChannel",
directMessageChannel: "DirectMessage",
categoryChannel: "Category",
};
export const CHANNEL_STATUSES = {

View File

@ -0,0 +1,9 @@
# frozen_string_literal: true
class MigrateDmChannels < ActiveRecord::Migration[7.0]
def up
DB.exec(
"UPDATE chat_channels SET type='DirectMessageChannel', chatable_type='DirectMessage' WHERE chatable_type = 'DirectMessageChannel'",
)
end
end

View File

@ -53,7 +53,7 @@ module Chat::ChatChannelFetcher
.select(:id)
.joins(
"INNER JOIN direct_message_channels ON direct_message_channels.id = chat_channels.chatable_id
AND chat_channels.chatable_type = 'DirectMessageChannel'
AND chat_channels.chatable_type = 'DirectMessage'
INNER JOIN direct_message_users ON direct_message_users.direct_message_channel_id = direct_message_channels.id",
)
.where("direct_message_users.user_id = :user_id", user_id: guardian.user.id)
@ -134,7 +134,7 @@ module Chat::ChatChannelFetcher
query
.joins(:user_chat_channel_memberships)
.where(user_chat_channel_memberships: { user_id: user_id, following: true })
.where(chatable_type: "DirectMessageChannel")
.where(chatable_type: "DirectMessage")
.where("chat_channels.id IN (#{generate_allowed_channel_ids_sql(guardian)})")
.order(last_message_sent_at: :desc)
.to_a

View File

@ -50,7 +50,7 @@ class Chat::ChatMailer
(uccm.last_unread_mention_when_emailed_id IS NULL OR c_msg.id > uccm.last_unread_mention_when_emailed_id) AND
(
(uccm.user_id = c_mentions.user_id AND uccm.following IS true AND cc.chatable_type = 'Category') OR
(cc.chatable_type = 'DirectMessageChannel')
(cc.chatable_type = 'DirectMessage')
)
SQL
.group("users.id, uccm.user_id")

View File

@ -7,13 +7,13 @@ module Chat::DirectMessageChannelCreator
def self.create!(acting_user:, target_users:)
Guardian.new(acting_user).ensure_can_create_direct_message!
target_users.uniq!
direct_messages_channel = DirectMessageChannel.for_user_ids(target_users.map(&:id))
if direct_messages_channel
chat_channel = ChatChannel.find_by!(chatable: direct_messages_channel)
direct_message = DirectMessage.for_user_ids(target_users.map(&:id))
if direct_message
chat_channel = ChatChannel.find_by!(chatable: direct_message)
else
ensure_actor_can_communicate!(acting_user, target_users)
direct_messages_channel = DirectMessageChannel.create!(user_ids: target_users.map(&:id))
chat_channel = direct_messages_channel.create_chat_channel!
direct_message = DirectMessage.create!(user_ids: target_users.map(&:id))
chat_channel = direct_message.create_chat_channel!
end
update_memberships(acting_user, target_users, chat_channel.id)

View File

@ -6,7 +6,7 @@ require "faker"
module DiscourseDev
class DirectChannel < Record
def initialize
super(::DirectMessageChannel, 5)
super(::DirectMessage, 5)
end
def data

View File

@ -11,7 +11,7 @@ module DiscourseDev
def data
if Faker::Boolean.boolean(true_ratio: 0.5)
channel = ::ChatChannel.where(chatable_type: "DirectMessageChannel").order("RANDOM()").first
channel = ::ChatChannel.where(chatable_type: "DirectMessage").order("RANDOM()").first
channel.user_chat_channel_memberships.update_all(following: true)
user = channel.chatable.users.order("RANDOM()").first
else

View File

@ -20,7 +20,7 @@ module Chat::UserNotificationsExtension
(uccm.last_unread_mention_when_emailed_id IS NULL OR chat_messages.id > uccm.last_unread_mention_when_emailed_id) AND
(
(cm.user_id = :user_id AND uccm.following IS true AND chat_channels.chatable_type = 'Category') OR
(chat_channels.chatable_type = 'DirectMessageChannel')
(chat_channels.chatable_type = 'DirectMessage')
)
SQL
.to_a

View File

@ -153,10 +153,10 @@ module Chat::GuardianExtensions
return false if !can_modify_channel_message?(message.chat_channel)
if message.user_id == current_user.id
case chatable.class.name
when "Category"
case chatable
when Category
return can_see_category?(chatable)
when "DirectMessageChannel"
when DirectMessage
return true
end
end

View File

@ -129,8 +129,8 @@ after_initialize do
load File.expand_path("../app/models/chat_mention.rb", __FILE__)
load File.expand_path("../app/models/chat_upload.rb", __FILE__)
load File.expand_path("../app/models/chat_webhook_event.rb", __FILE__)
load File.expand_path("../app/models/d_m_channel.rb", __FILE__)
load File.expand_path("../app/models/direct_message_channel.rb", __FILE__)
load File.expand_path("../app/models/direct_message.rb", __FILE__)
load File.expand_path("../app/models/direct_message_user.rb", __FILE__)
load File.expand_path("../app/models/incoming_chat_webhook.rb", __FILE__)
load File.expand_path("../app/models/reviewable_chat_message.rb", __FILE__)
@ -149,7 +149,7 @@ after_initialize do
"../app/serializers/user_with_custom_fields_and_status_serializer.rb",
__FILE__,
)
load File.expand_path("../app/serializers/direct_message_channel_serializer.rb", __FILE__)
load File.expand_path("../app/serializers/direct_message_serializer.rb", __FILE__)
load File.expand_path("../app/serializers/incoming_chat_webhook_serializer.rb", __FILE__)
load File.expand_path("../app/serializers/admin_chat_index_serializer.rb", __FILE__)
load File.expand_path("../app/serializers/user_chat_message_bookmark_serializer.rb", __FILE__)

View File

@ -27,8 +27,14 @@ describe Chat::ChatMessageCreator do
fab!(:public_chat_channel) { Fabricate(:category_channel) }
fab!(:dm_chat_channel) do
Fabricate(
:dm_channel,
chatable: Fabricate(:direct_message_channel, users: [user1, user2, user3]),
:direct_message_channel,
chatable: Fabricate(:direct_message, users: [user1, user2, user3]),
)
end
let(:direct_message_channel) do
Chat::DirectMessageChannelCreator.create!(
acting_user: user1,
target_users: [user1, user2],
)
end
@ -43,8 +49,7 @@ describe Chat::ChatMessageCreator do
end
Group.refresh_automatic_groups!
@direct_message_channel =
Chat::DirectMessageChannelCreator.create!(acting_user: user1, target_users: [user1, user2])
direct_message_channel
end
describe "Integration tests with jobs running immediately" do
@ -210,7 +215,7 @@ describe Chat::ChatMessageCreator do
it "creates only mention notifications for users with access in private chat" do
expect {
Chat::ChatMessageCreator.create(
chat_channel: @direct_message_channel,
chat_channel: direct_message_channel,
user: user1,
content: "hello there @#{user2.username} and @#{user3.username}",
)
@ -221,7 +226,7 @@ describe Chat::ChatMessageCreator do
it "creates a mention notifications for group users that are participating in private chat" do
expect {
Chat::ChatMessageCreator.create(
chat_channel: @direct_message_channel,
chat_channel: direct_message_channel,
user: user1,
content: "hello there @#{user_group.name}",
)
@ -261,7 +266,7 @@ describe Chat::ChatMessageCreator do
user2.update(suspended_till: Time.now + 10.years)
expect {
Chat::ChatMessageCreator.create(
chat_channel: @direct_message_channel,
chat_channel: direct_message_channel,
user: user1,
content: "hello @#{user2.username}",
)

View File

@ -10,14 +10,10 @@ end
Fabricator(:category_channel, from: :chat_channel, class_name: :category_channel) {}
Fabricator(:dm_channel, from: :chat_channel, class_name: :d_m_channel) do
chatable { Fabricate(:direct_message_channel) }
end
Fabricator(:direct_message_chat_channel, from: :chat_channel, class_name: :d_m_channel) do
Fabricator(:direct_message_channel, from: :chat_channel, class_name: :direct_message_channel) do
transient :users
chatable do |attrs|
Fabricate(:direct_message_channel, users: attrs[:users] || [Fabricate(:user), Fabricate(:user)])
Fabricate(:direct_message, users: attrs[:users] || [Fabricate(:user), Fabricate(:user)])
end
status { :open }
end
@ -62,7 +58,7 @@ Fabricator(:reviewable_chat_message) do
reviewable_scores { |p| [Fabricate.build(:reviewable_score, reviewable_id: p[:id])] }
end
Fabricator(:direct_message_channel) { users { [Fabricate(:user), Fabricate(:user)] } }
Fabricator(:direct_message) { users { [Fabricate(:user), Fabricate(:user)] } }
Fabricator(:chat_webhook_event) do
chat_message { Fabricate(:chat_message) }

View File

@ -42,12 +42,7 @@ describe Jobs::DeleteOldChatMessages do
)
end
fab!(:dm_channel) do
Fabricate(
:chat_channel,
chatable: Fabricate(:direct_message_channel, users: [Fabricate(:user)]),
)
end
fab!(:dm_channel) { Fabricate(:direct_message_channel, users: [Fabricate(:user)]) }
fab!(:dm_days_old_0) do
Fabricate(:chat_message, chat_channel: dm_channel, message: "hi", created_at: base_date)
end

View File

@ -54,8 +54,8 @@ describe Jobs::AutoJoinChannelBatch do
end
it "does nothing if the channel chatable is not a category" do
dm_channel = Fabricate(:direct_message_channel)
channel.update!(chatable: dm_channel)
direct_message = Fabricate(:direct_message)
channel.update!(chatable: direct_message)
subject.execute(chat_channel_id: channel.id, starts_at: user.id, ends_at: user.id)

View File

@ -5,7 +5,7 @@ require "rails_helper"
describe Jobs::AutoManageChannelMemberships do
let(:user) { Fabricate(:user, last_seen_at: 15.minutes.ago) }
let(:category) { Fabricate(:category, user: user) }
let(:channel) { Fabricate(:chat_channel, auto_join_users: true, chatable: category) }
let(:channel) { Fabricate(:category_channel, auto_join_users: true, chatable: category) }
describe "queues batches to automatically add users to a channel" do
it "queues a batch for users with channel access" do
@ -17,8 +17,8 @@ describe Jobs::AutoManageChannelMemberships do
end
it "does nothing when the chatable is not a category" do
dm_channel = Fabricate(:direct_message_channel)
channel.update!(chatable: dm_channel)
direct_message = Fabricate(:direct_message)
channel.update!(chatable: direct_message)
assert_batches_enqueued(channel, 0)
end

View File

@ -151,7 +151,7 @@ RSpec.describe Jobs::ChatNotifyWatching do
end
context "for a direct message channel" do
fab!(:channel) { Fabricate(:direct_message_chat_channel, users: [user1, user2, user3]) }
fab!(:channel) { Fabricate(:direct_message_channel, users: [user1, user2, user3]) }
fab!(:membership1) do
Fabricate(:user_chat_channel_membership, user: user1, chat_channel: channel)
end

View File

@ -4,10 +4,10 @@ describe Chat::ChatChannelFetcher do
fab!(:category) { Fabricate(:category, name: "support") }
fab!(:private_category) { Fabricate(:private_category, group: Fabricate(:group)) }
fab!(:category_channel) { Fabricate(:category_channel, chatable: category) }
fab!(:dm_channel1) { Fabricate(:direct_message_channel) }
fab!(:dm_channel2) { Fabricate(:direct_message_channel) }
fab!(:direct_message_channel1) { Fabricate(:dm_channel, chatable: dm_channel1) }
fab!(:direct_message_channel2) { Fabricate(:dm_channel, chatable: dm_channel2) }
fab!(:dm_channel1) { Fabricate(:direct_message) }
fab!(:dm_channel2) { Fabricate(:direct_message) }
fab!(:direct_message_channel1) { Fabricate(:direct_message_channel, chatable: dm_channel1) }
fab!(:direct_message_channel2) { Fabricate(:direct_message_channel, chatable: dm_channel2) }
fab!(:user1) { Fabricate(:user) }
fab!(:user2) { Fabricate(:user) }
@ -124,7 +124,7 @@ describe Chat::ChatChannelFetcher do
end
it "returns all the channels if the user is a member of the DM channel also" do
DirectMessageUser.create!(user: user1, direct_message_channel: dm_channel1)
DirectMessageUser.create!(user: user1, direct_message: dm_channel1)
expect(subject.all_secured_channel_ids(guardian)).to match_array(
[category_channel.id, direct_message_channel1.id],
)
@ -285,16 +285,16 @@ describe Chat::ChatChannelFetcher do
user: user1,
following: true,
)
DirectMessageUser.create!(direct_message_channel: dm_channel1, user: user1)
DirectMessageUser.create!(direct_message_channel: dm_channel1, user: user2)
DirectMessageUser.create!(direct_message: dm_channel1, user: user1)
DirectMessageUser.create!(direct_message: dm_channel1, user: user2)
Fabricate(
:user_chat_channel_membership_for_dm,
chat_channel: direct_message_channel2,
user: user1,
following: true,
)
DirectMessageUser.create!(direct_message_channel: dm_channel2, user: user1)
DirectMessageUser.create!(direct_message_channel: dm_channel2, user: user2)
DirectMessageUser.create!(direct_message: dm_channel2, user: user1)
DirectMessageUser.create!(direct_message: dm_channel2, user: user2)
direct_message_channel1.update!(last_message_sent_at: 1.day.ago)
direct_message_channel2.update!(last_message_sent_at: 1.hour.ago)
@ -311,7 +311,7 @@ describe Chat::ChatChannelFetcher do
user: user1,
following: true,
)
DirectMessageUser.create!(direct_message_channel: dm_channel1, user: user2)
DirectMessageUser.create!(direct_message: dm_channel1, user: user2)
expect(
subject.secured_direct_message_channels(user1.id, memberships, guardian).map(&:id),
@ -326,8 +326,8 @@ describe Chat::ChatChannelFetcher do
user: user1,
following: true,
)
DirectMessageUser.create!(direct_message_channel: dm_channel1, user: user1)
DirectMessageUser.create!(direct_message_channel: dm_channel1, user: user2)
DirectMessageUser.create!(direct_message: dm_channel1, user: user1)
DirectMessageUser.create!(direct_message: dm_channel1, user: user2)
Fabricate(:chat_message, user: user2, chat_channel: direct_message_channel1)
Fabricate(:chat_message, user: user2, chat_channel: direct_message_channel1)

View File

@ -45,10 +45,10 @@ describe ChatMessageBookmarkable do
end
it "does not return bookmarks for messages inside direct message chat channels the user cannot access" do
dm_channel = Fabricate(:direct_message_channel)
channel.update(chatable: dm_channel)
direct_message = Fabricate(:direct_message)
channel.update(chatable: direct_message)
expect(subject.perform_list_query(user, guardian)).to eq(nil)
DirectMessageUser.create(user: user, direct_message_channel: dm_channel)
DirectMessageUser.create(user: user, direct_message: direct_message)
bookmark1.reload
user.reload
guardian = Guardian.new(user)

View File

@ -369,9 +369,7 @@ describe Chat::ChatReviewQueue do
end
context "when flagging a DM" do
fab!(:dm_channel) do
Fabricate(:direct_message_chat_channel, users: [message_poster, flagger])
end
fab!(:dm_channel) { Fabricate(:direct_message_channel, users: [message_poster, flagger]) }
12.times do |i|
fab!("dm_message_#{i + 1}") do

View File

@ -10,15 +10,8 @@ describe Chat::DirectMessageChannelCreator do
before { Group.refresh_automatic_groups! }
context "with an existing direct message channel" do
fab!(:dm_chat_channel) do
Fabricate(
:chat_channel,
chatable: Fabricate(:direct_message_channel, users: [user_1, user_2, user_3]),
)
end
fab!(:own_chat_channel) do
Fabricate(:chat_channel, chatable: Fabricate(:direct_message_channel, users: [user_1]))
end
fab!(:dm_chat_channel) { Fabricate(:direct_message_channel, users: [user_1, user_2, user_3]) }
fab!(:own_chat_channel) { Fabricate(:direct_message_channel, users: [user_1]) }
it "doesn't create a new chat channel" do
existing_channel = nil

View File

@ -7,7 +7,7 @@ RSpec.describe Chat::GuardianExtensions do
fab!(:staff) { Fabricate(:user, admin: true) }
fab!(:chat_group) { Fabricate(:group) }
fab!(:channel) { Fabricate(:category_channel) }
fab!(:dm_channel) { Fabricate(:direct_message_chat_channel) }
fab!(:dm_channel) { Fabricate(:direct_message_channel) }
let(:guardian) { Guardian.new(user) }
let(:staff_guardian) { Guardian.new(staff) }
@ -63,15 +63,15 @@ RSpec.describe Chat::GuardianExtensions do
describe "#can_see_chat_channel?" do
context "for direct message channels" do
fab!(:chatable) { Fabricate(:direct_message_channel) }
fab!(:channel) { Fabricate(:dm_channel, chatable: chatable) }
fab!(:chatable) { Fabricate(:direct_message) }
fab!(:channel) { Fabricate(:direct_message_channel, chatable: chatable) }
it "returns false if the user is not part of the direct message" do
expect(guardian.can_see_chat_channel?(channel)).to eq(false)
end
it "returns true if the user is part of the direct message" do
DirectMessageUser.create!(user: user, direct_message_channel_id: chatable.id)
DirectMessageUser.create!(user: user, direct_message: chatable)
expect(guardian.can_see_chat_channel?(channel)).to eq(true)
end
end
@ -98,7 +98,7 @@ RSpec.describe Chat::GuardianExtensions do
alias_matcher :be_able_to_flag_in_chat_channel, :be_can_flag_in_chat_channel
context "when channel is a direct message channel" do
let(:channel) { Fabricate(:dm_channel) }
let(:channel) { Fabricate(:direct_message_channel) }
it "returns false" do
expect(guardian).not_to be_able_to_flag_in_chat_channel(channel)
@ -158,7 +158,7 @@ RSpec.describe Chat::GuardianExtensions do
end
context "for DM channel" do
fab!(:dm_channel) { DirectMessageChannel.create! }
fab!(:dm_channel) { DirectMessage.create! }
before { channel.update(chatable_type: "DirectMessageType", chatable: dm_channel) }
@ -186,7 +186,7 @@ RSpec.describe Chat::GuardianExtensions do
end
context "when chatable is a direct message" do
fab!(:chatable) { DirectMessageChannel.create! }
fab!(:chatable) { DirectMessage.create! }
it "allows owner to restore" do
expect(guardian.can_restore_chat?(message, chatable)).to eq(true)
@ -236,7 +236,7 @@ RSpec.describe Chat::GuardianExtensions do
end
context "when chatable is a direct message" do
fab!(:chatable) { DirectMessageChannel.create! }
fab!(:chatable) { DirectMessage.create! }
it "allows staff to restore" do
expect(staff_guardian.can_restore_chat?(message, chatable)).to eq(true)
@ -269,7 +269,7 @@ RSpec.describe Chat::GuardianExtensions do
end
context "when chatable is a direct message" do
fab!(:chatable) { DirectMessageChannel.create! }
fab!(:chatable) { DirectMessage.create! }
it "allows staff to restore" do
expect(staff_guardian.can_restore_chat?(message, chatable)).to eq(true)

View File

@ -53,7 +53,7 @@ describe Chat::MessageMover do
expect {
described_class.new(
acting_user: acting_user,
source_channel: Fabricate(:dm_channel),
source_channel: Fabricate(:direct_message_channel),
message_ids: move_message_ids,
).move_to_channel(destination_channel)
}.to raise_error(Chat::MessageMover::InvalidChannel)
@ -62,7 +62,7 @@ describe Chat::MessageMover do
acting_user: acting_user,
source_channel: source_channel,
message_ids: move_message_ids,
).move_to_channel(Fabricate(:dm_channel))
).move_to_channel(Fabricate(:direct_message_channel))
}.to raise_error(Chat::MessageMover::InvalidChannel)
end

View File

@ -48,10 +48,7 @@ describe UserNotifications do
user: another_participant,
chat_channel: channel,
)
DirectMessageUser.create!(
direct_message_channel: channel.chatable,
user: another_participant,
)
DirectMessageUser.create!(direct_message: channel.chatable, user: another_participant)
expected_subject =
I18n.t(
"user_notifications.chat_summary.subject.direct_message",

View File

@ -1,66 +0,0 @@
# frozen_string_literal: true
RSpec.describe DMChannel do
subject(:channel) { Fabricate.build(:dm_channel) }
it_behaves_like "a chat channel model"
it { is_expected.to delegate_method(:allowed_user_ids).to(:direct_message_channel).as(:user_ids) }
describe "#category_channel?" do
it "always returns false" do
expect(channel).not_to be_a_category_channel
end
end
describe "#public_channel?" do
it "always returns false" do
expect(channel).not_to be_a_public_channel
end
end
describe "#chatable_has_custom_fields?" do
it "always returns false" do
expect(channel).not_to be_a_chatable_has_custom_fields
end
end
describe "#direct_message_channel?" do
it "always returns true" do
expect(channel).to be_a_direct_message_channel
end
end
describe "#read_restricted?" do
it "always returns true" do
expect(channel).to be_read_restricted
end
end
describe "#allowed_group_ids" do
it "always returns nothing" do
expect(channel.allowed_group_ids).to be_nil
end
end
describe "#chatable_url" do
it "always returns nothing" do
expect(channel.chatable_url).to be_nil
end
end
describe "#title" do
subject(:title) { channel.title(user) }
let(:user) { stub }
let(:direct_message_channel) { channel.direct_message_channel }
it "delegates to direct_message_channel" do
direct_message_channel
.expects(:chat_channel_title_for_user)
.with(channel, user)
.returns("something")
expect(title).to eq("something")
end
end
end

View File

@ -1,73 +1,63 @@
# frozen_string_literal: true
require "rails_helper"
RSpec.describe DirectMessageChannel do
subject(:channel) { Fabricate.build(:direct_message_channel) }
describe DirectMessageChannel do
fab!(:user1) { Fabricate(:user, username: "chatdmfellow1") }
fab!(:user2) { Fabricate(:user, username: "chatdmuser") }
fab!(:chat_channel) { Fabricate(:chat_channel) }
it_behaves_like "a chat channel model"
it_behaves_like "a chatable model" do
fab!(:chatable) { Fabricate(:direct_message_channel) }
let(:channel_class) { DMChannel }
it { is_expected.to delegate_method(:allowed_user_ids).to(:direct_message).as(:user_ids) }
describe "#category_channel?" do
it "always returns false" do
expect(channel).not_to be_a_category_channel
end
end
describe "#chat_channel_title_for_user" do
it "returns a nicely formatted name if it's more than one user" do
user3 = Fabricate.build(:user, username: "chatdmregent")
direct_message_channel = Fabricate(:direct_message_channel, users: [user1, user2, user3])
expect(direct_message_channel.chat_channel_title_for_user(chat_channel, user1)).to eq(
I18n.t(
"chat.channel.dm_title.multi_user",
users: [user3, user2].map { |u| "@#{u.username}" }.join(", "),
),
)
describe "#public_channel?" do
it "always returns false" do
expect(channel).not_to be_a_public_channel
end
end
it "returns a nicely formatted truncated name if it's more than 5 users" do
user3 = Fabricate.build(:user, username: "chatdmregent")
users = [user1, user2, user3].concat(
5.times.map.with_index { |i| Fabricate(:user, username: "chatdmuser#{i}") },
)
direct_message_channel = Fabricate(:direct_message_channel, users: users)
expect(direct_message_channel.chat_channel_title_for_user(chat_channel, user1)).to eq(
I18n.t(
"chat.channel.dm_title.multi_user_truncated",
users: users[1..5].sort_by(&:username).map { |u| "@#{u.username}" }.join(", "),
leftover: 2,
),
)
describe "#chatable_has_custom_fields?" do
it "always returns false" do
expect(channel).not_to be_a_chatable_has_custom_fields
end
end
it "returns the other user's username if it's a dm to that user" do
direct_message_channel = Fabricate(:direct_message_channel, users: [user1, user2])
expect(direct_message_channel.chat_channel_title_for_user(chat_channel, user1)).to eq(
I18n.t("chat.channel.dm_title.single_user", user: "@#{user2.username}"),
)
describe "#direct_message_channel?" do
it "always returns true" do
expect(channel).to be_a_direct_message_channel
end
end
it "returns the current user's username if it's a dm to self" do
direct_message_channel = Fabricate(:direct_message_channel, users: [user1])
expect(direct_message_channel.chat_channel_title_for_user(chat_channel, user1)).to eq(
I18n.t("chat.channel.dm_title.single_user", user: "@#{user1.username}"),
)
describe "#read_restricted?" do
it "always returns true" do
expect(channel).to be_read_restricted
end
end
context "when user is deleted" do
it "returns a placeholder username" do
direct_message_channel = Fabricate(:direct_message_channel, users: [user1, user2])
user2.destroy!
direct_message_channel.reload
describe "#allowed_group_ids" do
it "always returns nothing" do
expect(channel.allowed_group_ids).to be_nil
end
end
expect(direct_message_channel.chat_channel_title_for_user(chat_channel, user1)).to eq(
"@#{I18n.t("chat.deleted_chat_username")}",
)
end
describe "#chatable_url" do
it "always returns nothing" do
expect(channel.chatable_url).to be_nil
end
end
describe "#title" do
subject(:title) { channel.title(user) }
let(:user) { stub }
let(:direct_message) { channel.direct_message }
it "delegates to direct_message" do
direct_message.expects(:chat_channel_title_for_user).with(channel, user).returns("something")
expect(title).to eq("something")
end
end
end

View File

@ -0,0 +1,73 @@
# frozen_string_literal: true
require "rails_helper"
describe DirectMessage do
fab!(:user1) { Fabricate(:user, username: "chatdmfellow1") }
fab!(:user2) { Fabricate(:user, username: "chatdmuser") }
fab!(:chat_channel) { Fabricate(:direct_message_channel) }
it_behaves_like "a chatable model" do
fab!(:chatable) { Fabricate(:direct_message) }
let(:channel_class) { DirectMessageChannel }
end
describe "#chat_channel_title_for_user" do
it "returns a nicely formatted name if it's more than one user" do
user3 = Fabricate.build(:user, username: "chatdmregent")
direct_message = Fabricate(:direct_message, users: [user1, user2, user3])
expect(direct_message.chat_channel_title_for_user(chat_channel, user1)).to eq(
I18n.t(
"chat.channel.dm_title.multi_user",
users: [user3, user2].map { |u| "@#{u.username}" }.join(", "),
),
)
end
it "returns a nicely formatted truncated name if it's more than 5 users" do
user3 = Fabricate.build(:user, username: "chatdmregent")
users = [user1, user2, user3].concat(
5.times.map.with_index { |i| Fabricate(:user, username: "chatdmuser#{i}") },
)
direct_message = Fabricate(:direct_message, users: users)
expect(direct_message.chat_channel_title_for_user(chat_channel, user1)).to eq(
I18n.t(
"chat.channel.dm_title.multi_user_truncated",
users: users[1..5].sort_by(&:username).map { |u| "@#{u.username}" }.join(", "),
leftover: 2,
),
)
end
it "returns the other user's username if it's a dm to that user" do
direct_message = Fabricate(:direct_message, users: [user1, user2])
expect(direct_message.chat_channel_title_for_user(chat_channel, user1)).to eq(
I18n.t("chat.channel.dm_title.single_user", user: "@#{user2.username}"),
)
end
it "returns the current user's username if it's a dm to self" do
direct_message = Fabricate(:direct_message, users: [user1])
expect(direct_message.chat_channel_title_for_user(chat_channel, user1)).to eq(
I18n.t("chat.channel.dm_title.single_user", user: "@#{user1.username}"),
)
end
context "when user is deleted" do
it "returns a placeholder username" do
direct_message = Fabricate(:direct_message, users: [user1, user2])
user2.destroy!
direct_message.reload
expect(direct_message.chat_channel_title_for_user(chat_channel, user1)).to eq(
"@#{I18n.t("chat.deleted_chat_username")}",
)
end
end
end
end

View File

@ -347,19 +347,11 @@ describe Chat do
context "when followed public channels exist" do
fab!(:user_2) { Fabricate(:user) }
fab!(:channel) do
Fabricate(
:chat_channel,
chatable: Fabricate(:direct_message_channel, users: [user, user_2]),
)
end
fab!(:channel) { Fabricate(:direct_message_channel, users: [user, user_2]) }
before do
Fabricate(:user_chat_channel_membership, user: user, chat_channel: channel, following: true)
Fabricate(
:chat_channel,
chatable: Fabricate(:direct_message_channel, users: [user, user_2]),
)
Fabricate(:direct_message_channel, users: [user, user_2])
end
it "returns them" do

View File

@ -108,8 +108,7 @@ describe ChatChannelMembershipsQuery do
end
context "when chatable is direct channel" do
fab!(:chatable_1) { Fabricate(:direct_message_channel, users: [user_1, user_2]) }
fab!(:channel_1) { Fabricate(:dm_channel, chatable: chatable_1) }
fab!(:channel_1) { Fabricate(:direct_message_channel, users: [user_1, user_2]) }
context "when no memberships exists" do
it "returns an empty array" do

View File

@ -79,8 +79,7 @@ RSpec.describe Chat::Api::ChatChannelNotificationsSettingsController do
context "when direct message channel has invalid params" do
fab!(:user) { Fabricate(:user) }
fab!(:chatable) { Fabricate(:direct_message_channel, users: [user, Fabricate(:user)]) }
fab!(:chat_channel) { Fabricate(:dm_channel, chatable: chatable) }
fab!(:chat_channel) { Fabricate(:direct_message_channel, users: [user, Fabricate(:user)]) }
fab!(:membership) do
Fabricate(:user_chat_channel_membership, user: user, chat_channel: chat_channel)
end
@ -102,8 +101,7 @@ RSpec.describe Chat::Api::ChatChannelNotificationsSettingsController do
context "when direct message channel has valid params" do
fab!(:user) { Fabricate(:user) }
fab!(:chatable) { Fabricate(:direct_message_channel, users: [user, Fabricate(:user)]) }
fab!(:chat_channel) { Fabricate(:dm_channel, chatable: chatable) }
fab!(:chat_channel) { Fabricate(:direct_message_channel, users: [user, Fabricate(:user)]) }
fab!(:membership) do
Fabricate(
:user_chat_channel_membership,

View File

@ -234,8 +234,7 @@ describe Chat::Api::ChatChannelsController do
context "when channel is a direct message channel" do
fab!(:user) { Fabricate(:admin) }
fab!(:chatable) { Fabricate(:direct_message_channel) }
fab!(:chat_channel) { Fabricate(:dm_channel, chatable: chatable) }
fab!(:chat_channel) { Fabricate(:direct_message_channel) }
before { sign_in(user) }

View File

@ -8,9 +8,7 @@ RSpec.describe Chat::ChatChannelsController do
fab!(:admin) { Fabricate(:admin, username: "andyjones", name: "Andy Jones") }
fab!(:category) { Fabricate(:category) }
fab!(:chat_channel) { Fabricate(:category_channel, chatable: category) }
fab!(:dm_chat_channel) do
Fabricate(:dm_channel, chatable: Fabricate(:direct_message_channel, users: [user, admin]))
end
fab!(:dm_chat_channel) { Fabricate(:direct_message_channel, users: [user, admin]) }
before do
SiteSetting.chat_enabled = true
@ -514,11 +512,7 @@ RSpec.describe Chat::ChatChannelsController do
group = Fabricate(:group, name: "chatpeeps")
SiteSetting.chat_allowed_groups = group.id
GroupUser.create(user: user, group: group)
dm_chat_channel_2 =
Fabricate(
:dm_channel,
chatable: Fabricate(:direct_message_channel, users: [user, other_user]),
)
dm_chat_channel_2 = Fabricate(:direct_message_channel, users: [user, other_user])
get "/chat/chat_channels/search.json", params: { filter: "janemay" }
expect(response.status).to eq(200)

View File

@ -8,12 +8,7 @@ RSpec.describe Chat::ChatController do
fab!(:admin) { Fabricate(:admin) }
fab!(:category) { Fabricate(:category) }
fab!(:chat_channel) { Fabricate(:category_channel, chatable: category) }
fab!(:dm_chat_channel) do
Fabricate(
:dm_channel,
chatable: Fabricate(:direct_message_channel, users: [user, other_user, admin]),
)
end
fab!(:dm_chat_channel) { Fabricate(:direct_message_channel, users: [user, other_user, admin]) }
fab!(:tag) { Fabricate(:tag) }
MESSAGE_COUNT = 70
@ -355,8 +350,8 @@ RSpec.describe Chat::ChatController do
describe "for direct message" do
fab!(:user1) { Fabricate(:user) }
fab!(:user2) { Fabricate(:user) }
fab!(:chatable) { Fabricate(:direct_message_channel, users: [user1, user2]) }
fab!(:direct_message_channel) { Fabricate(:dm_channel, chatable: chatable) }
fab!(:chatable) { Fabricate(:direct_message, users: [user1, user2]) }
fab!(:direct_message_channel) { Fabricate(:direct_message_channel, chatable: chatable) }
def create_memberships
UserChatChannelMembership.create!(
@ -392,7 +387,7 @@ RSpec.describe Chat::ChatController do
it "errors when the user is not part of the direct message channel" do
create_memberships
DirectMessageUser.find_by(user: user1, direct_message_channel: chatable).destroy!
DirectMessageUser.find_by(user: user1, direct_message: chatable).destroy!
sign_in(user1)
post "/chat/#{direct_message_channel.id}.json", params: { message: message }
expect(response.status).to eq(403)
@ -1085,10 +1080,7 @@ RSpec.describe Chat::ChatController do
it "sets `dismissed_dm_retention_reminder` to true" do
sign_in(user)
expect {
post "/chat/dismiss-retention-reminder.json",
params: {
chatable_type: "DirectMessageChannel",
}
post "/chat/dismiss-retention-reminder.json", params: { chatable_type: "DirectMessage" }
}.to change { user.user_option.reload.dismissed_dm_retention_reminder }.to (true)
end
@ -1101,10 +1093,7 @@ RSpec.describe Chat::ChatController do
post "/chat/dismiss-retention-reminder.json", params: { chatable_type: "Category" }
expect(response.status).to eq(200)
post "/chat/dismiss-retention-reminder.json",
params: {
chatable_type: "DirectMessageChannel",
}
post "/chat/dismiss-retention-reminder.json", params: { chatable_type: "DirectMessage" }
expect(response.status).to eq(200)
end
end
@ -1266,7 +1255,7 @@ RSpec.describe Chat::ChatController do
describe "#set_draft" do
fab!(:chat_channel) { Fabricate(:category_channel) }
let(:dm_channel) { Fabricate(:dm_channel) }
let(:dm_channel) { Fabricate(:direct_message_channel) }
before { sign_in(user) }
@ -1298,7 +1287,7 @@ RSpec.describe Chat::ChatController do
post "/chat/drafts.json", params: { chat_channel_id: dm_channel.id, data: "{}" }
expect(response.status).to eq(403)
DirectMessageUser.create(user: user, direct_message_channel: dm_channel.chatable)
DirectMessageUser.create(user: user, direct_message: dm_channel.chatable)
expect {
post "/chat/drafts.json", params: { chat_channel_id: dm_channel.id, data: "{}" }
}.to change { ChatDraft.count }.by(1)
@ -1319,7 +1308,7 @@ RSpec.describe Chat::ChatController do
describe "#lookup_message" do
let!(:message) { Fabricate(:chat_message, chat_channel: channel) }
let(:channel) { Fabricate(:dm_channel) }
let(:channel) { Fabricate(:direct_message_channel) }
let(:chatable) { channel.chatable }
fab!(:user) { Fabricate(:user) }
@ -1362,13 +1351,13 @@ RSpec.describe Chat::ChatController do
end
context "when the chat channel is for a direct message channel" do
let(:channel) { Fabricate(:dm_channel) }
let(:channel) { Fabricate(:direct_message_channel) }
it "ensures the user can access that direct message channel" do
get "/chat/lookup/#{message.id}.json", { params: { chat_channel_id: channel.id } }
expect(response.status).to eq(403)
DirectMessageUser.create!(user: user, direct_message_channel: chatable)
DirectMessageUser.create!(user: user, direct_message: chatable)
get "/chat/lookup/#{message.id}.json", { params: { chat_channel_id: channel.id } }
expect(response.status).to eq(200)
expect(response.parsed_body["chat_messages"][0]["id"]).to eq(message.id)
@ -1396,10 +1385,7 @@ RSpec.describe Chat::ChatController do
fab!(:destination_channel) { Fabricate(:category_channel) }
let(:message_ids) { [message_to_move1.id, message_to_move2.id] }
let(:invalid_destination_channel) do
Fabricate(
:dm_channel,
chatable: Fabricate(:direct_message_channel, users: [admin, Fabricate(:user)]),
)
Fabricate(:direct_message_channel, users: [admin, Fabricate(:user)])
end
context "when the user is not admin" do

View File

@ -15,11 +15,11 @@ RSpec.describe Chat::DirectMessagesController do
end
def create_dm_channel(user_ids)
direct_messages_channel = DirectMessageChannel.create!
direct_messages_channel = DirectMessage.create!
user_ids.each do |user_id|
direct_messages_channel.direct_message_users.create!(user_id: user_id)
end
DMChannel.create!(chatable: direct_messages_channel)
DirectMessageChannel.create!(chatable: direct_messages_channel)
end
describe "#index" do
@ -41,10 +41,10 @@ RSpec.describe Chat::DirectMessagesController do
context "when channel exists" do
let!(:channel) do
direct_messages_channel = DirectMessageChannel.create!
direct_messages_channel = DirectMessage.create!
direct_messages_channel.direct_message_users.create!(user_id: user.id)
direct_messages_channel.direct_message_users.create!(user_id: user1.id)
DMChannel.create!(chatable: direct_messages_channel)
DirectMessageChannel.create!(chatable: direct_messages_channel)
end
it "returns the channel" do
@ -76,8 +76,8 @@ RSpec.describe Chat::DirectMessagesController do
it "creates a new dm channel with username(s) provided" do
expect {
post "/chat/direct_messages/create.json", params: { usernames: [usernames] }
}.to change { DirectMessageChannel.count }.by(1)
expect(DirectMessageChannel.last.direct_message_users.map(&:user_id)).to match_array(
}.to change { DirectMessage.count }.by(1)
expect(DirectMessage.last.direct_message_users.map(&:user_id)).to match_array(
direct_message_user_ids,
)
end
@ -86,7 +86,7 @@ RSpec.describe Chat::DirectMessagesController do
create_dm_channel(direct_message_user_ids)
expect {
post "/chat/direct_messages/create.json", params: { usernames: [usernames] }
}.not_to change { DirectMessageChannel.count }
}.not_to change { DirectMessage.count }
end
end
@ -127,7 +127,7 @@ RSpec.describe Chat::DirectMessagesController do
it "responds with a friendly error" do
expect {
post "/chat/direct_messages/create.json", params: { usernames: [usernames] }
}.not_to change { DirectMessageChannel.count }
}.not_to change { DirectMessage.count }
expect(response.status).to eq(422)
expect(response.parsed_body["errors"]).to eq(
[I18n.t("chat.errors.not_accepting_dms", username: user1.username)],

View File

@ -175,7 +175,7 @@ describe ChatMessageSerializer do
context "when flagging DMs" do
fab!(:dm_channel) do
Fabricate(:direct_message_chat_channel, users: [guardian_user, message_poster])
Fabricate(:direct_message_channel, users: [guardian_user, message_poster])
end
fab!(:dm_message) { Fabricate(:chat_message, user: message_poster, chat_channel: dm_channel) }

View File

@ -1,71 +0,0 @@
# frozen_string_literal: true
require "rails_helper"
describe DirectMessageChannelSerializer do
describe "#user" do
it "returns you when there are two of us" do
me = Fabricate.build(:user)
you = Fabricate.build(:user)
direct_message_channel = Fabricate.build(:direct_message_channel, users: [me, you])
serializer =
DirectMessageChannelSerializer.new(
direct_message_channel,
scope: Guardian.new(me),
root: false,
)
expect(serializer.users).to eq([you])
end
it "returns you both if there are three of us" do
me = Fabricate.build(:user)
you = Fabricate.build(:user)
other_you = Fabricate.build(:user)
direct_message_channel = Fabricate.build(:direct_message_channel, users: [me, you, other_you])
serializer =
DirectMessageChannelSerializer.new(
direct_message_channel,
scope: Guardian.new(me),
root: false,
)
expect(serializer.users).to match_array([you, other_you])
end
it "returns me if there is only me" do
me = Fabricate.build(:user)
direct_message_channel = Fabricate.build(:direct_message_channel, users: [me])
serializer =
DirectMessageChannelSerializer.new(
direct_message_channel,
scope: Guardian.new(me),
root: false,
)
expect(serializer.users).to eq([me])
end
context "when a user is destroyed" do
it "returns a placeholder user" do
me = Fabricate(:user)
you = Fabricate(:user)
direct_message_channel = Fabricate(:direct_message_channel, users: [me, you])
you.destroy!
serializer =
DirectMessageChannelSerializer.new(
direct_message_channel.reload,
scope: Guardian.new(me),
root: false,
).as_json
expect(serializer[:users][0][:username]).to eq(I18n.t("chat.deleted_chat_username"))
end
end
end
end

View File

@ -0,0 +1,52 @@
# frozen_string_literal: true
require "rails_helper"
describe DirectMessageSerializer do
describe "#user" do
it "returns you when there are two of us" do
me = Fabricate.build(:user)
you = Fabricate.build(:user)
direct_message = Fabricate.build(:direct_message, users: [me, you])
serializer = described_class.new(direct_message, scope: Guardian.new(me), root: false)
expect(serializer.users).to eq([you])
end
it "returns you both if there are three of us" do
me = Fabricate.build(:user)
you = Fabricate.build(:user)
other_you = Fabricate.build(:user)
direct_message = Fabricate.build(:direct_message, users: [me, you, other_you])
serializer = described_class.new(direct_message, scope: Guardian.new(me), root: false)
expect(serializer.users).to match_array([you, other_you])
end
it "returns me if there is only me" do
me = Fabricate.build(:user)
direct_message = Fabricate.build(:direct_message, users: [me])
serializer = described_class.new(direct_message, scope: Guardian.new(me), root: false)
expect(serializer.users).to eq([me])
end
context "when a user is destroyed" do
it "returns a placeholder user" do
me = Fabricate(:user)
you = Fabricate(:user)
direct_message = Fabricate(:direct_message, users: [me, you])
you.destroy!
serializer =
described_class.new(direct_message.reload, scope: Guardian.new(me), root: false).as_json
expect(serializer[:users][0][:username]).to eq(I18n.t("chat.deleted_chat_username"))
end
end
end
end

View File

@ -5,14 +5,10 @@ RSpec.describe StructuredChannelSerializer do
fab!(:guardian) { Guardian.new(user1) }
fab!(:user2) { Fabricate(:user) }
fab!(:user3) { Fabricate(:user) }
fab!(:channel1) { Fabricate(:chat_channel) }
fab!(:channel2) { Fabricate(:chat_channel) }
fab!(:channel3) do
Fabricate(:chat_channel, chatable: Fabricate(:direct_message_channel, users: [user1, user2]))
end
fab!(:channel4) do
Fabricate(:chat_channel, chatable: Fabricate(:direct_message_channel, users: [user1, user3]))
end
fab!(:channel1) { Fabricate(:category_channel) }
fab!(:channel2) { Fabricate(:category_channel) }
fab!(:channel3) { Fabricate(:direct_message_channel, users: [user1, user2]) }
fab!(:channel4) { Fabricate(:direct_message_channel, users: [user1, user3]) }
fab!(:membership1) do
Fabricate(:user_chat_channel_membership, user: user1, chat_channel: channel1)
end

View File

@ -7,12 +7,10 @@ RSpec.shared_examples "a chat channel model" do
fab!(:group) { Fabricate(:group) }
fab!(:private_category) { Fabricate(:private_category, group: group) }
fab!(:private_category_channel) { Fabricate(:category_channel, chatable: private_category) }
fab!(:direct_message_channel) do
Fabricate(:dm_channel, chatable: Fabricate(:direct_message_channel, users: [user1, user2]))
end
fab!(:direct_message_channel) { Fabricate(:direct_message_channel, users: [user1, user2]) }
it { is_expected.to belong_to(:chatable) }
it { is_expected.to belong_to(:direct_message_channel).with_foreign_key(:chatable_id) }
it { is_expected.to belong_to(:direct_message).with_foreign_key(:chatable_id) }
it { is_expected.to have_many(:chat_messages) }
it { is_expected.to have_many(:user_chat_channel_memberships) }
it { is_expected.to have_one(:chat_channel_archive) }

View File

@ -32,7 +32,7 @@ acceptance("Discourse Chat - Sidebar - User Status", function (needs) {
},
],
},
chatable_type: "DirectMessageChannel",
chatable_type: "DirectMessage",
title: "@user1",
};

View File

@ -95,7 +95,7 @@ acceptance("Discourse Chat - without unread", function (needs) {
chat_channels: [],
chatable: { users: [hawkAsJson] },
chatable_id: 16,
chatable_type: "DirectMessageChannel",
chatable_type: "DirectMessage",
chatable_url: null,
id: 75,
title: "@hawk",
@ -116,7 +116,7 @@ acceptance("Discourse Chat - without unread", function (needs) {
chat_channel: {
id: 75,
title: "hawk",
chatable_type: "DirectMessageChannel",
chatable_type: "DirectMessage",
last_message_sent_at: "2021-07-20T08:14:16.950Z",
chatable: {
users: [{ username: "hawk" }],

View File

@ -51,7 +51,7 @@ acceptance("Discourse Chat - Core Sidebar", function (needs) {
],
},
chatable_id: 59,
chatable_type: "DirectMessageChannel",
chatable_type: "DirectMessage",
chatable_url: null,
id: 76,
title: "@sam",
@ -79,7 +79,7 @@ acceptance("Discourse Chat - Core Sidebar", function (needs) {
},
],
},
chatable_type: "DirectMessageChannel",
chatable_type: "DirectMessage",
chatable_url: null,
id: 77,
title: "@<script>sam</script>",
@ -177,7 +177,7 @@ acceptance("Discourse Chat - Core Sidebar", function (needs) {
chat_channel: {
id: 75,
title: "hawk",
chatable_type: "DirectMessageChannel",
chatable_type: "DirectMessage",
last_message_sent_at: "2021-07-20T08:14:16.950Z",
chatable: {
users: [{ username: "hawk" }],

View File

@ -51,7 +51,7 @@ acceptance("Discourse Chat - User card test", function (needs) {
],
},
chatable_id: 16,
chatable_type: "DirectMessageChannel",
chatable_type: "DirectMessage",
chatable_url: null,
id: 75,
title: "@hawk",

View File

@ -22,7 +22,7 @@ export const directMessageChannels = [
],
},
chatable_id: 58,
chatable_type: "DirectMessageChannel",
chatable_type: "DirectMessage",
chatable_url: null,
id: 75,
title: "@hawk",
@ -53,7 +53,7 @@ export const directMessageChannels = [
],
},
chatable_id: 59,
chatable_type: "DirectMessageChannel",
chatable_type: "DirectMessage",
chatable_url: null,
id: 76,
title: "@eviltrout, @markvanlan",

View File

@ -19,7 +19,7 @@ module("Discourse Chat | Component | chat-channel-leave-btn", function (hooks) {
this.set("onLeaveChannel", () => this.set("foo", 2));
this.set("channel", {
id: 1,
chatable_type: "DirectMessageChannel",
chatable_type: "DirectMessage",
chatable: {
users: [{ id: 1 }],
},
@ -42,7 +42,7 @@ module("Discourse Chat | Component | chat-channel-leave-btn", function (hooks) {
template: hbs`{{chat-channel-leave-btn channel=channel}}`,
beforeEach() {
this.set("channel", { chatable_type: "DirectMessageChannel" });
this.set("channel", { chatable_type: "DirectMessage" });
},
async test(assert) {

View File

@ -20,7 +20,7 @@ module(
this.set(
"chatChannel",
ChatChannel.create({
chatable_type: "DirectMessageChannel",
chatable_type: "DirectMessage",
chatable: {
users: [{ id: 1 }],
},
@ -43,7 +43,7 @@ module(
this.set(
"chatChannel",
ChatChannel.create({
chatable_type: "DirectMessageChannel",
chatable_type: "DirectMessage",
chatable: {
users: [
{ name: "Tomtom" },

View File

@ -59,7 +59,7 @@ module(
async beforeEach() {
this.set(
"chatChannel",
ChatChannel.create({ chatable_type: "DirectMessageChannel" })
ChatChannel.create({ chatable_type: "DirectMessage" })
);
set(this.currentUser, "needs_dm_retention_reminder", true);
this.siteSettings.chat_dm_retention_days = 100;
@ -79,7 +79,7 @@ module(
async beforeEach() {
this.set(
"chatChannel",
ChatChannel.create({ chatable_type: "DirectMessageChannel" })
ChatChannel.create({ chatable_type: "DirectMessage" })
);
set(this.currentUser, "needs_dm_retention_reminder", false);
this.siteSettings.chat_dm_retention_days = 100;