discourse/plugins/discourse-presence/spec/integration/presence_spec.rb

187 lines
7.3 KiB
Ruby

# frozen_string_literal: true
RSpec.describe "discourse-presence" do
describe "PresenceChannel configuration" do
fab!(:user)
fab!(:user2) { Fabricate(:user) }
fab!(:admin)
fab!(:group) do
group = Fabricate(:group)
group.add(user)
group
end
fab!(:category) { Fabricate(:private_category, group: group) }
fab!(:private_topic) { Fabricate(:topic, category: category) }
fab!(:public_topic) { Fabricate(:topic, first_post: Fabricate(:post)) }
fab!(:private_message) { Fabricate(:private_message_topic, allowed_groups: [group]) }
before { PresenceChannel.clear_all! }
it "handles invalid topic IDs" do
expect do PresenceChannel.new("/discourse-presence/reply/-999").config end.to raise_error(
PresenceChannel::NotFound,
)
expect do PresenceChannel.new("/discourse-presence/reply/blah").config end.to raise_error(
PresenceChannel::NotFound,
)
end
it "handles deleted topics" do
public_topic.trash!
expect do
PresenceChannel.new("/discourse-presence/reply/#{public_topic.id}").config
end.to raise_error(PresenceChannel::NotFound)
expect do
PresenceChannel.new("/discourse-presence/whisper/#{public_topic.id}").config
end.to raise_error(PresenceChannel::NotFound)
expect do
PresenceChannel.new("/discourse-presence/edit/#{public_topic.first_post.id}").config
end.to raise_error(PresenceChannel::NotFound)
end
it "handles secure category permissions for reply" do
c = PresenceChannel.new("/discourse-presence/reply/#{private_topic.id}")
expect(c.can_view?(user_id: user.id)).to eq(true)
expect(c.can_enter?(user_id: user.id)).to eq(true)
group.remove(user)
c = PresenceChannel.new("/discourse-presence/reply/#{private_topic.id}", use_cache: false)
expect(c.can_view?(user_id: user.id)).to eq(false)
expect(c.can_enter?(user_id: user.id)).to eq(false)
end
it "handles secure category permissions for edit" do
p = Fabricate(:post, topic: private_topic, user: private_topic.user)
c = PresenceChannel.new("/discourse-presence/edit/#{p.id}")
expect(c.can_view?(user_id: user.id)).to eq(false)
expect(c.can_view?(user_id: private_topic.user.id)).to eq(true)
end
it "handles category moderators for edit" do
SiteSetting.edit_all_post_groups = nil
p = Fabricate(:post, topic: private_topic, user: private_topic.user)
c = PresenceChannel.new("/discourse-presence/edit/#{p.id}")
expect(c.config.allowed_group_ids).to contain_exactly(Group::AUTO_GROUPS[:staff])
SiteSetting.enable_category_group_moderation = true
Fabricate(:category_moderation_group, category:, group:)
c = PresenceChannel.new("/discourse-presence/edit/#{p.id}", use_cache: false)
expect(c.config.allowed_group_ids).to contain_exactly(Group::AUTO_GROUPS[:staff], group.id)
end
it "adds edit_all_post_groups to the presence channel" do
p = Fabricate(:post, topic: public_topic, user: user)
g = Fabricate(:group)
SiteSetting.edit_all_post_groups = "#{Group::AUTO_GROUPS[:trust_level_1]}|#{g.id}"
c = PresenceChannel.new("/discourse-presence/edit/#{p.id}")
expect(c.config.allowed_group_ids).to contain_exactly(
Group::AUTO_GROUPS[:staff],
Group::AUTO_GROUPS[:trust_level_1],
g.id,
)
end
it "handles permissions for a public topic" do
c = PresenceChannel.new("/discourse-presence/reply/#{public_topic.id}")
expect(c.config.public).to eq(false)
expect(c.config.allowed_group_ids).to contain_exactly(::Group::AUTO_GROUPS[:trust_level_0])
end
it "handles permissions for secure category topics" do
c = PresenceChannel.new("/discourse-presence/reply/#{private_topic.id}")
expect(c.config.public).to eq(false)
expect(c.config.allowed_group_ids).to contain_exactly(group.id, Group::AUTO_GROUPS[:admins])
expect(c.config.allowed_user_ids).to eq(nil)
end
it "handles permissions for private messages" do
c = PresenceChannel.new("/discourse-presence/reply/#{private_message.id}")
expect(c.config.public).to eq(false)
expect(c.config.allowed_group_ids).to contain_exactly(group.id, Group::AUTO_GROUPS[:staff])
expect(c.config.allowed_user_ids).to contain_exactly(
*private_message.topic_allowed_users.pluck(:user_id),
)
end
it "handles permissions for whispers" do
c = PresenceChannel.new("/discourse-presence/whisper/#{public_topic.id}")
expect(c.config.public).to eq(false)
expect(c.config.allowed_group_ids).to contain_exactly(Group::AUTO_GROUPS[:staff])
expect(c.config.allowed_user_ids).to eq(nil)
end
it "only allows staff when editing whispers" do
p = Fabricate(:whisper, topic: public_topic, user: admin)
c = PresenceChannel.new("/discourse-presence/edit/#{p.id}")
expect(c.config.public).to eq(false)
expect(c.config.allowed_group_ids).to contain_exactly(Group::AUTO_GROUPS[:staff])
expect(c.config.allowed_user_ids).to eq(nil)
end
it "only allows staff when editing a locked post" do
p = Fabricate(:post, topic: public_topic, user: admin, locked_by_id: Discourse.system_user.id)
c = PresenceChannel.new("/discourse-presence/edit/#{p.id}")
expect(c.config.public).to eq(false)
expect(c.config.allowed_group_ids).to contain_exactly(Group::AUTO_GROUPS[:staff])
expect(c.config.allowed_user_ids).to eq(nil)
end
it "allows author, staff, TL4 when editing a public post" do
p = Fabricate(:post, topic: public_topic, user: user)
c = PresenceChannel.new("/discourse-presence/edit/#{p.id}")
expect(c.config.public).to eq(false)
expect(c.config.allowed_group_ids).to contain_exactly(
Group::AUTO_GROUPS[:trust_level_4],
Group::AUTO_GROUPS[:staff],
)
expect(c.config.allowed_user_ids).to contain_exactly(user.id)
end
it "follows the wiki edit allowed groups site setting" do
p = Fabricate(:post, topic: public_topic, user: user, wiki: true)
SiteSetting.edit_wiki_post_allowed_groups = Group::AUTO_GROUPS[:trust_level_3]
c = PresenceChannel.new("/discourse-presence/edit/#{p.id}")
expect(c.config.public).to eq(false)
expect(c.config.allowed_group_ids).to include(Group::AUTO_GROUPS[:trust_level_3])
expect(c.config.allowed_user_ids).to contain_exactly(user.id)
end
it "allows author and staff when editing a private message" do
post = Fabricate(:post, topic: private_message, user: user)
c = PresenceChannel.new("/discourse-presence/edit/#{post.id}")
expect(c.config.public).to eq(false)
expect(c.config.allowed_group_ids).to contain_exactly(Group::AUTO_GROUPS[:staff])
expect(c.config.allowed_user_ids).to contain_exactly(user.id)
end
it "includes all message participants for PM wiki" do
post = Fabricate(:post, topic: private_message, user: user, wiki: true)
c = PresenceChannel.new("/discourse-presence/edit/#{post.id}")
expect(c.config.public).to eq(false)
expect(c.config.allowed_group_ids).to contain_exactly(
Group::AUTO_GROUPS[:staff],
*private_message.allowed_groups.pluck(:id),
)
expect(c.config.allowed_user_ids).to contain_exactly(
user.id,
*private_message.allowed_users.pluck(:id),
)
end
end
end