2019-04-29 20:27:42 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2015-10-11 05:41:23 -04:00
|
|
|
require 'rails_helper'
|
2013-05-21 02:39:51 -04:00
|
|
|
|
2013-05-29 04:11:04 -04:00
|
|
|
describe TopicTrackingState do
|
2013-05-21 02:39:51 -04:00
|
|
|
|
2019-05-06 23:12:20 -04:00
|
|
|
fab!(:user) do
|
2013-05-21 02:39:51 -04:00
|
|
|
Fabricate(:user)
|
|
|
|
end
|
|
|
|
|
|
|
|
let(:post) do
|
2013-07-22 01:06:53 -04:00
|
|
|
create_post
|
2013-05-21 02:39:51 -04:00
|
|
|
end
|
|
|
|
|
2018-03-05 03:18:23 -05:00
|
|
|
let(:topic) { post.topic }
|
2019-05-06 23:12:20 -04:00
|
|
|
fab!(:private_message_post) { Fabricate(:private_message_post) }
|
2018-03-06 01:38:43 -05:00
|
|
|
let(:private_message_topic) { private_message_post.topic }
|
2018-03-05 03:18:23 -05:00
|
|
|
|
|
|
|
describe '#publish_latest' do
|
|
|
|
it 'can correctly publish latest' do
|
|
|
|
message = MessageBus.track_publish("/latest") do
|
|
|
|
described_class.publish_latest(topic)
|
|
|
|
end.first
|
|
|
|
|
|
|
|
data = message.data
|
|
|
|
|
|
|
|
expect(data["topic_id"]).to eq(topic.id)
|
|
|
|
expect(data["message_type"]).to eq(described_class::LATEST_MESSAGE_TYPE)
|
|
|
|
expect(data["payload"]["archetype"]).to eq(Archetype.default)
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'private message' do
|
|
|
|
it 'should not publish any message' do
|
|
|
|
messages = MessageBus.track_publish do
|
2018-03-06 01:38:43 -05:00
|
|
|
described_class.publish_latest(private_message_topic)
|
2018-03-05 03:18:23 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
expect(messages).to eq([])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#publish_unread' do
|
|
|
|
it "can correctly publish unread" do
|
|
|
|
message = MessageBus.track_publish(described_class.unread_channel_key(post.user.id)) do
|
|
|
|
TopicTrackingState.publish_unread(post)
|
|
|
|
end.first
|
|
|
|
|
|
|
|
data = message.data
|
|
|
|
|
|
|
|
expect(data["topic_id"]).to eq(topic.id)
|
|
|
|
expect(data["message_type"]).to eq(described_class::UNREAD_MESSAGE_TYPE)
|
|
|
|
expect(data["payload"]["archetype"]).to eq(Archetype.default)
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'for a private message' do
|
|
|
|
before do
|
|
|
|
TopicUser.change(
|
2018-03-06 01:38:43 -05:00
|
|
|
private_message_topic.allowed_users.first.id,
|
|
|
|
private_message_topic.id,
|
2018-03-05 03:18:23 -05:00
|
|
|
notification_level: TopicUser.notification_levels[:tracking]
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should not publish any message' do
|
|
|
|
messages = MessageBus.track_publish do
|
|
|
|
TopicTrackingState.publish_unread(private_message_post)
|
|
|
|
end
|
|
|
|
|
|
|
|
expect(messages).to eq([])
|
|
|
|
end
|
|
|
|
end
|
2013-05-29 04:11:04 -04:00
|
|
|
end
|
|
|
|
|
2018-03-06 01:38:43 -05:00
|
|
|
describe '#publish_private_message' do
|
2019-05-06 23:12:20 -04:00
|
|
|
fab!(:admin) { Fabricate(:admin) }
|
2018-03-06 01:38:43 -05:00
|
|
|
|
|
|
|
describe 'normal topic' do
|
|
|
|
it 'should publish the right message' do
|
|
|
|
allowed_users = private_message_topic.allowed_users
|
|
|
|
|
|
|
|
messages = MessageBus.track_publish do
|
|
|
|
TopicTrackingState.publish_private_message(private_message_topic)
|
|
|
|
end
|
|
|
|
|
|
|
|
expect(messages.count).to eq(1)
|
|
|
|
|
|
|
|
message = messages.first
|
|
|
|
|
|
|
|
expect(message.channel).to eq('/private-messages/inbox')
|
|
|
|
expect(message.data["topic_id"]).to eq(private_message_topic.id)
|
2018-03-06 22:28:29 -05:00
|
|
|
expect(message.user_ids).to eq(allowed_users.map(&:id))
|
2018-03-06 01:38:43 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'topic with groups' do
|
2019-05-06 23:12:20 -04:00
|
|
|
fab!(:group1) { Fabricate(:group, users: [Fabricate(:user)]) }
|
|
|
|
fab!(:group2) { Fabricate(:group, users: [Fabricate(:user), Fabricate(:user)]) }
|
2018-03-06 01:38:43 -05:00
|
|
|
|
|
|
|
before do
|
|
|
|
[group1, group2].each do |group|
|
|
|
|
private_message_topic.allowed_groups << group
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it "should publish the right message" do
|
|
|
|
messages = MessageBus.track_publish do
|
|
|
|
TopicTrackingState.publish_private_message(
|
2018-03-15 04:01:40 -04:00
|
|
|
private_message_topic
|
2018-03-06 01:38:43 -05:00
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2018-05-24 03:36:41 -04:00
|
|
|
expect(messages.map(&:channel)).to contain_exactly(
|
|
|
|
'/private-messages/inbox',
|
|
|
|
"/private-messages/group/#{group1.name}",
|
|
|
|
"/private-messages/group/#{group2.name}"
|
|
|
|
)
|
|
|
|
|
2018-09-03 22:16:21 -04:00
|
|
|
message = messages.find do |m|
|
|
|
|
m.channel == '/private-messages/inbox'
|
2018-05-24 03:36:41 -04:00
|
|
|
end
|
2018-03-15 04:01:40 -04:00
|
|
|
|
|
|
|
expect(message.data["topic_id"]).to eq(private_message_topic.id)
|
|
|
|
expect(message.user_ids).to eq(private_message_topic.allowed_users.map(&:id))
|
2018-03-07 01:01:20 -05:00
|
|
|
|
2018-03-06 01:38:43 -05:00
|
|
|
[group1, group2].each do |group|
|
2018-09-03 22:16:21 -04:00
|
|
|
message = messages.find do |m|
|
|
|
|
m.channel == "/private-messages/group/#{group.name}"
|
2018-03-06 01:38:43 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
expect(message.data["topic_id"]).to eq(private_message_topic.id)
|
2018-03-06 22:28:29 -05:00
|
|
|
expect(message.user_ids).to eq(group.users.map(&:id))
|
2018-03-06 01:38:43 -05:00
|
|
|
end
|
|
|
|
end
|
2018-03-07 01:01:20 -05:00
|
|
|
|
|
|
|
describe "archiving topic" do
|
|
|
|
it "should publish the right message" do
|
|
|
|
messages = MessageBus.track_publish do
|
|
|
|
TopicTrackingState.publish_private_message(
|
|
|
|
private_message_topic,
|
|
|
|
group_archive: true
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2018-05-24 03:36:41 -04:00
|
|
|
expect(messages.map(&:channel)).to contain_exactly(
|
|
|
|
'/private-messages/inbox',
|
|
|
|
"/private-messages/group/#{group1.name}",
|
|
|
|
"/private-messages/group/#{group1.name}/archive",
|
|
|
|
"/private-messages/group/#{group2.name}",
|
|
|
|
"/private-messages/group/#{group2.name}/archive",
|
|
|
|
)
|
|
|
|
|
2018-09-03 22:16:21 -04:00
|
|
|
message = messages.find { |m| m.channel == '/private-messages/inbox' }
|
2018-03-15 04:01:40 -04:00
|
|
|
|
|
|
|
expect(message.data["topic_id"]).to eq(private_message_topic.id)
|
|
|
|
expect(message.user_ids).to eq(private_message_topic.allowed_users.map(&:id))
|
2018-03-07 01:01:20 -05:00
|
|
|
|
|
|
|
[group1, group2].each do |group|
|
|
|
|
group_channel = "/private-messages/group/#{group.name}"
|
|
|
|
|
|
|
|
[
|
|
|
|
group_channel,
|
|
|
|
"#{group_channel}/archive"
|
|
|
|
].each do |channel|
|
2018-09-03 22:16:21 -04:00
|
|
|
message = messages.find { |m| m.channel == channel }
|
2018-03-07 01:01:20 -05:00
|
|
|
expect(message.data["topic_id"]).to eq(private_message_topic.id)
|
|
|
|
expect(message.user_ids).to eq(group.users.map(&:id))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2018-03-06 01:38:43 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
describe 'topic with new post' do
|
|
|
|
let(:user) { private_message_topic.allowed_users.last }
|
|
|
|
|
|
|
|
let!(:post) do
|
|
|
|
Fabricate(:post,
|
|
|
|
topic: private_message_topic,
|
|
|
|
user: user
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2018-03-15 04:01:40 -04:00
|
|
|
let!(:group) do
|
|
|
|
group = Fabricate(:group, users: [Fabricate(:user)])
|
|
|
|
private_message_topic.allowed_groups << group
|
|
|
|
group
|
|
|
|
end
|
|
|
|
|
2018-03-06 01:38:43 -05:00
|
|
|
it 'should publish the right message' do
|
|
|
|
messages = MessageBus.track_publish do
|
|
|
|
TopicTrackingState.publish_private_message(
|
|
|
|
private_message_topic,
|
|
|
|
post: post
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2018-05-24 03:36:41 -04:00
|
|
|
expected_channels = [
|
|
|
|
'/private-messages/inbox',
|
|
|
|
'/private-messages/sent',
|
|
|
|
"/private-messages/group/#{group.name}"
|
|
|
|
]
|
|
|
|
|
|
|
|
expect(messages.map(&:channel)).to contain_exactly(*expected_channels)
|
2018-03-06 01:38:43 -05:00
|
|
|
|
2018-05-24 03:36:41 -04:00
|
|
|
expected_channels.zip([
|
|
|
|
private_message_topic.allowed_users.map(&:id),
|
|
|
|
[user.id],
|
|
|
|
[group.users.first.id]
|
|
|
|
]).each do |channel, user_ids|
|
2018-09-03 22:16:21 -04:00
|
|
|
message = messages.find { |m| m.channel == channel }
|
2018-03-06 01:38:43 -05:00
|
|
|
|
|
|
|
expect(message.data["topic_id"]).to eq(private_message_topic.id)
|
2018-03-06 22:28:29 -05:00
|
|
|
expect(message.user_ids).to eq(user_ids)
|
2018-03-06 01:38:43 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'archived topic' do
|
|
|
|
it 'should publish the right message' do
|
|
|
|
messages = MessageBus.track_publish do
|
|
|
|
TopicTrackingState.publish_private_message(
|
|
|
|
private_message_topic,
|
2018-03-12 20:35:15 -04:00
|
|
|
archive_user_id: private_message_post.user_id,
|
2018-03-06 01:38:43 -05:00
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2018-05-24 03:36:41 -04:00
|
|
|
expected_channels = [
|
2018-03-06 22:39:23 -05:00
|
|
|
"/private-messages/archive",
|
|
|
|
"/private-messages/inbox",
|
|
|
|
"/private-messages/sent",
|
2018-05-24 03:36:41 -04:00
|
|
|
]
|
|
|
|
|
|
|
|
expect(messages.map(&:channel)).to eq(expected_channels)
|
|
|
|
|
|
|
|
expected_channels.each do |channel|
|
2018-09-03 22:16:21 -04:00
|
|
|
message = messages.find { |m| m.channel = channel }
|
2018-03-06 22:28:29 -05:00
|
|
|
expect(message.data["topic_id"]).to eq(private_message_topic.id)
|
|
|
|
expect(message.user_ids).to eq([private_message_post.user_id])
|
|
|
|
end
|
2018-03-06 01:38:43 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'for a regular topic' do
|
|
|
|
it 'should not publish any message' do
|
|
|
|
topic.allowed_users << Fabricate(:user)
|
|
|
|
|
|
|
|
messages = MessageBus.track_publish do
|
|
|
|
TopicTrackingState.publish_private_message(topic)
|
|
|
|
end
|
|
|
|
|
|
|
|
expect(messages).to eq([])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-04-17 00:03:08 -04:00
|
|
|
it "correctly handles muted categories" do
|
|
|
|
|
|
|
|
user = Fabricate(:user)
|
|
|
|
post
|
|
|
|
|
2016-12-02 01:03:31 -05:00
|
|
|
report = TopicTrackingState.report(user)
|
2015-04-17 00:03:08 -04:00
|
|
|
expect(report.length).to eq(1)
|
|
|
|
|
|
|
|
CategoryUser.create!(user_id: user.id,
|
|
|
|
notification_level: CategoryUser.notification_levels[:muted],
|
|
|
|
category_id: post.topic.category_id
|
|
|
|
)
|
|
|
|
|
|
|
|
create_post(topic_id: post.topic_id)
|
|
|
|
|
2016-12-02 01:03:31 -05:00
|
|
|
report = TopicTrackingState.report(user)
|
2015-04-17 00:03:08 -04:00
|
|
|
expect(report.length).to eq(0)
|
|
|
|
|
|
|
|
TopicUser.create!(user_id: user.id, topic_id: post.topic_id, last_read_post_number: 1, notification_level: 3)
|
|
|
|
|
2016-12-02 01:03:31 -05:00
|
|
|
report = TopicTrackingState.report(user)
|
2015-07-21 07:53:54 -04:00
|
|
|
expect(report.length).to eq(1)
|
2015-04-17 00:03:08 -04:00
|
|
|
end
|
|
|
|
|
2015-09-06 21:57:50 -04:00
|
|
|
it "correctly handles capping" do
|
|
|
|
user = Fabricate(:user)
|
|
|
|
|
|
|
|
post1 = create_post
|
|
|
|
Fabricate(:post, topic: post1.topic)
|
|
|
|
|
|
|
|
post2 = create_post
|
|
|
|
Fabricate(:post, topic: post2.topic)
|
|
|
|
|
|
|
|
post3 = create_post
|
|
|
|
Fabricate(:post, topic: post3.topic)
|
|
|
|
|
|
|
|
tracking = {
|
|
|
|
notification_level: TopicUser.notification_levels[:tracking],
|
|
|
|
last_read_post_number: 1,
|
|
|
|
highest_seen_post_number: 1
|
|
|
|
}
|
|
|
|
|
|
|
|
TopicUser.change(user.id, post1.topic_id, tracking)
|
|
|
|
TopicUser.change(user.id, post2.topic_id, tracking)
|
|
|
|
TopicUser.change(user.id, post3.topic_id, tracking)
|
|
|
|
|
2016-12-02 01:03:31 -05:00
|
|
|
report = TopicTrackingState.report(user)
|
2015-09-06 21:57:50 -04:00
|
|
|
expect(report.length).to eq(3)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
2013-05-23 01:21:07 -04:00
|
|
|
it "correctly gets the tracking state" do
|
2016-12-02 01:03:31 -05:00
|
|
|
report = TopicTrackingState.report(user)
|
2014-12-31 09:55:03 -05:00
|
|
|
expect(report.length).to eq(0)
|
2013-05-21 02:39:51 -04:00
|
|
|
|
2013-07-21 21:40:39 -04:00
|
|
|
post.topic.notifier.watch_topic!(post.topic.user_id)
|
2013-05-21 02:39:51 -04:00
|
|
|
|
2016-12-02 01:03:31 -05:00
|
|
|
report = TopicTrackingState.report(user)
|
2013-05-23 01:21:07 -04:00
|
|
|
|
2014-12-31 09:55:03 -05:00
|
|
|
expect(report.length).to eq(1)
|
2013-05-23 01:21:07 -04:00
|
|
|
row = report[0]
|
|
|
|
|
2014-12-31 09:55:03 -05:00
|
|
|
expect(row.topic_id).to eq(post.topic_id)
|
|
|
|
expect(row.highest_post_number).to eq(1)
|
|
|
|
expect(row.last_read_post_number).to eq(nil)
|
|
|
|
expect(row.user_id).to eq(user.id)
|
2013-05-23 01:21:07 -04:00
|
|
|
|
|
|
|
# lets not leak out random users
|
2016-12-02 01:03:31 -05:00
|
|
|
expect(TopicTrackingState.report(post.user)).to be_empty
|
2013-05-23 01:21:07 -04:00
|
|
|
|
|
|
|
# lets not return anything if we scope on non-existing topic
|
2016-12-02 01:03:31 -05:00
|
|
|
expect(TopicTrackingState.report(user, post.topic_id + 1)).to be_empty
|
2013-05-23 01:21:07 -04:00
|
|
|
|
|
|
|
# when we reply the poster should have an unread row
|
2013-07-22 01:06:53 -04:00
|
|
|
create_post(user: user, topic: post.topic)
|
2013-05-21 02:39:51 -04:00
|
|
|
|
2016-12-02 01:03:31 -05:00
|
|
|
report = TopicTrackingState.report(user)
|
2015-07-21 07:48:07 -04:00
|
|
|
expect(report.length).to eq(0)
|
|
|
|
|
2016-12-02 01:03:31 -05:00
|
|
|
report = TopicTrackingState.report(post.user)
|
2014-12-31 09:55:03 -05:00
|
|
|
expect(report.length).to eq(1)
|
2013-05-21 02:39:51 -04:00
|
|
|
|
2013-05-23 01:21:07 -04:00
|
|
|
row = report[0]
|
2013-05-21 02:39:51 -04:00
|
|
|
|
2014-12-31 09:55:03 -05:00
|
|
|
expect(row.topic_id).to eq(post.topic_id)
|
|
|
|
expect(row.highest_post_number).to eq(2)
|
|
|
|
expect(row.last_read_post_number).to eq(1)
|
|
|
|
expect(row.user_id).to eq(post.user_id)
|
2013-05-21 02:39:51 -04:00
|
|
|
|
2013-05-23 23:32:41 -04:00
|
|
|
# when we have no permission to see a category, don't show its stats
|
2013-07-13 21:24:16 -04:00
|
|
|
category = Fabricate(:category, read_restricted: true)
|
2013-05-23 23:32:41 -04:00
|
|
|
|
|
|
|
post.topic.category_id = category.id
|
|
|
|
post.topic.save
|
|
|
|
|
2016-12-02 01:03:31 -05:00
|
|
|
expect(TopicTrackingState.report(post.user)).to be_empty
|
|
|
|
expect(TopicTrackingState.report(user)).to be_empty
|
2013-05-21 02:39:51 -04:00
|
|
|
end
|
|
|
|
end
|