2019-04-30 10:27:42 +10:00
# frozen_string_literal: true
2022-07-28 05:27:38 +03:00
RSpec . describe TopicTrackingState do
2024-01-26 13:25:03 +08:00
fab! ( :user ) { Fabricate ( :user , refresh_auto_groups : true ) }
2022-06-30 10:18:12 +10:00
fab! ( :whisperers_group ) { Fabricate ( :group ) }
2023-11-09 16:47:59 -06:00
fab! ( :private_message_post )
2018-03-06 14:38:43 +08:00
let ( :private_message_topic ) { private_message_post . topic }
2023-01-12 08:22:28 +08:00
let ( :post ) { create_post }
let ( :topic ) { post . topic }
2018-03-05 16:18:23 +08:00
2023-01-12 08:22:28 +08:00
shared_examples "does not publish message for private topics" do | method |
it "should not publish any message for a private topic" do
messages =
MessageBus . track_publish { described_class . public_send ( method , private_message_topic ) }
2023-01-11 06:15:52 +08:00
2023-01-12 08:22:28 +08:00
expect ( messages ) . to eq ( [] )
end
end
shared_examples "publishes message to right groups and users" do | message_bus_channel , method |
fab! ( :public_category ) { Fabricate ( :category , read_restricted : false ) }
fab! ( :topic_in_public_category ) { Fabricate ( :topic , category : public_category ) }
2023-11-09 16:47:59 -06:00
fab! ( :group )
2023-01-12 08:22:28 +08:00
fab! ( :read_restricted_category_with_groups ) { Fabricate ( :private_category , group : group ) }
fab! ( :topic_in_read_restricted_category_with_groups ) do
Fabricate ( :topic , category : read_restricted_category_with_groups )
end
fab! ( :read_restricted_category_with_no_groups ) { Fabricate ( :category , read_restricted : true ) }
fab! ( :topic_in_read_restricted_category_with_no_groups ) do
Fabricate ( :topic , category : read_restricted_category_with_no_groups )
end
it "should publish message to everyone for a topic in a category that is not read restricted" do
2023-01-11 06:15:52 +08:00
message =
MessageBus
2023-01-12 08:22:28 +08:00
. track_publish ( message_bus_channel ) do
described_class . public_send ( method , topic_in_public_category )
end
2023-01-11 06:15:52 +08:00
. first
data = message . data
2023-01-12 08:22:28 +08:00
expect ( data [ "topic_id" ] ) . to eq ( topic_in_public_category . id )
expect ( message . group_ids ) . to eq ( nil )
expect ( message . user_ids ) . to eq ( nil )
end
it "should publish message only to admin group and groups that have permission to read a category when topic is in category that is restricted to certain groups" do
message =
MessageBus
. track_publish ( message_bus_channel ) do
described_class . public_send ( method , topic_in_read_restricted_category_with_groups )
end
. first
data = message . data
expect ( data [ "topic_id" ] ) . to eq ( topic_in_read_restricted_category_with_groups . id )
expect ( message . group_ids ) . to contain_exactly ( Group :: AUTO_GROUPS [ :admins ] , group . id )
expect ( message . user_ids ) . to eq ( nil )
end
it "should publish message only to admin group when topic is in category that is read restricted but no groups have been granted access" do
message =
MessageBus
. track_publish ( message_bus_channel ) do
described_class . public_send ( method , topic_in_read_restricted_category_with_no_groups )
end
. first
data = message . data
expect ( data [ "topic_id" ] ) . to eq ( topic_in_read_restricted_category_with_no_groups . id )
expect ( message . group_ids ) . to contain_exactly ( Group :: AUTO_GROUPS [ :admins ] )
2023-01-11 06:15:52 +08:00
expect ( message . user_ids ) . to eq ( nil )
end
end
2023-01-12 08:22:28 +08:00
describe ".publish_new" do
include_examples ( "publishes message to right groups and users" , "/new" , :publish_new )
include_examples ( "does not publish message for private topics" , :publish_new )
end
2023-01-11 06:15:52 +08:00
describe ".publish_latest" do
2023-01-12 08:22:28 +08:00
include_examples ( "publishes message to right groups and users" , "/latest" , :publish_latest )
include_examples ( "does not publish message for private topics" , :publish_latest )
2018-03-05 16:18:23 +08:00
it "can correctly publish latest" do
message = MessageBus . track_publish ( "/latest" ) { described_class . publish_latest ( topic ) } . 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 )
2023-01-12 08:22:28 +08:00
expect ( message . group_ids ) . to eq ( nil )
expect ( message . user_ids ) . to eq ( nil )
2018-03-05 16:18:23 +08:00
end
2022-06-30 10:18:12 +10:00
it "publishes whisper post to staff users and members of whisperers group" do
whisperers_group = Fabricate ( :group )
Fabricate ( :user , groups : [ whisperers_group ] )
Fabricate ( :topic_user_watching , topic : topic , user : user )
SiteSetting . whispers_allowed_groups = " #{ whisperers_group . id } "
post . update! ( post_type : Post . types [ :whisper ] )
message =
MessageBus
. track_publish ( "/latest" ) { TopicTrackingState . publish_latest ( post . topic , true ) }
. first
expect ( message . group_ids ) . to contain_exactly ( whisperers_group . id , Group :: AUTO_GROUPS [ :staff ] )
end
2018-03-05 16:18:23 +08:00
end
2021-09-08 11:55:12 +08:00
describe ".publish_read" do
it "correctly publish read" do
message =
MessageBus
. track_publish ( described_class . unread_channel_key ( post . user . id )) do
TopicTrackingState . publish_read ( post . topic_id , 1 , post . user )
end
. first
data = message . data
expect ( message . user_ids ) . to contain_exactly ( post . user_id )
expect ( message . group_ids ) . to eq ( nil )
expect ( data [ "topic_id" ] ) . to eq ( post . topic_id )
expect ( data [ "message_type" ] ) . to eq ( described_class :: READ_MESSAGE_TYPE )
expect ( data [ "payload" ][ "last_read_post_number" ] ) . to eq ( 1 )
expect ( data [ "payload" ][ "highest_post_number" ] ) . to eq ( 1 )
expect ( data [ "payload" ][ "notification_level" ] ) . to eq ( nil )
end
it "correctly publish read for staff" do
2022-12-16 18:42:51 +02:00
SiteSetting . whispers_allowed_groups = " #{ Group :: AUTO_GROUPS [ :staff ] } "
2021-09-08 11:55:12 +08:00
create_post (
raw : "this is a test post" ,
topic : post . topic ,
post_type : Post . types [ :whisper ] ,
user : Fabricate ( :admin ),
)
post . user . grant_admin!
message =
MessageBus
. track_publish ( described_class . unread_channel_key ( post . user . id )) do
TopicTrackingState . publish_read ( post . topic_id , 1 , post . user )
end
. first
data = message . data
expect ( data [ "payload" ][ "highest_post_number" ] ) . to eq ( 2 )
end
end
2018-03-05 16:18:23 +08:00
describe "#publish_unread" do
2022-04-19 11:37:01 +10:00
let ( :other_user ) { Fabricate ( :user ) }
before { Fabricate ( :topic_user_watching , topic : topic , user : other_user ) }
2018-03-05 16:18:23 +08:00
it "can correctly publish unread" do
2022-02-22 15:27:46 +00:00
message =
2018-03-05 16:18:23 +08:00
MessageBus . track_publish ( "/unread" ) { TopicTrackingState . publish_unread ( post ) } . first
data = message . data
2022-04-19 11:37:01 +10:00
expect ( message . user_ids ) . to contain_exactly ( other_user . id )
2021-08-11 11:01:13 +08:00
expect ( message . group_ids ) . to eq ( nil )
2018-03-05 16:18:23 +08:00
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
2022-04-19 11:37:01 +10:00
it "does not publish unread to the user who created the post" do
message =
MessageBus . track_publish ( "/unread" ) { TopicTrackingState . publish_unread ( post ) } . first
data = message . data
expect ( message . user_ids ) . not_to include ( post . user_id )
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
2021-10-11 13:20:55 +11:00
it "is not erroring when user_stat is missing" do
post . user . user_stat . destroy!
2022-02-22 15:27:46 +00:00
message =
2021-10-11 13:20:55 +11:00
MessageBus . track_publish ( "/unread" ) { TopicTrackingState . publish_unread ( post ) } . first
data = message . data
2022-04-19 11:37:01 +10:00
expect ( message . user_ids ) . to contain_exactly ( other_user . id )
2021-10-11 13:20:55 +11:00
end
2022-06-30 10:18:12 +10:00
it "publishes whisper post to staff users and members of whisperers group" do
whisperers_group = Fabricate ( :group )
Fabricate ( :topic_user_watching , topic : topic , user : user )
SiteSetting . whispers_allowed_groups = " #{ whisperers_group . id } "
post . update! ( post_type : Post . types [ :whisper ] )
messages = MessageBus . track_publish ( "/unread" ) { TopicTrackingState . publish_unread ( post ) }
expect ( messages ) . to eq ( [] )
user . groups << whisperers_group
other_user . grant_admin!
message =
MessageBus . track_publish ( "/unread" ) { TopicTrackingState . publish_unread ( post ) } . first
expect ( message . user_ids ) . to contain_exactly ( user . id , other_user . id )
expect ( message . group_ids ) . to eq ( nil )
end
2021-08-11 11:01:13 +08:00
it "does not publish whisper post to non-staff users" do
2022-12-16 18:42:51 +02:00
SiteSetting . whispers_allowed_groups = " #{ Group :: AUTO_GROUPS [ :staff ] } "
2021-08-11 11:01:13 +08:00
post . update! ( post_type : Post . types [ :whisper ] )
2022-02-22 15:27:46 +00:00
messages = MessageBus . track_publish ( "/unread" ) { TopicTrackingState . publish_unread ( post ) }
2021-08-11 11:01:13 +08:00
expect ( messages ) . to eq ( [] )
2022-04-19 11:37:01 +10:00
other_user . grant_admin!
2021-08-11 11:01:13 +08:00
2022-02-22 15:27:46 +00:00
message =
2021-08-11 11:01:13 +08:00
MessageBus . track_publish ( "/unread" ) { TopicTrackingState . publish_unread ( post ) } . first
2022-04-19 11:37:01 +10:00
expect ( message . user_ids ) . to contain_exactly ( other_user . id )
2021-08-11 11:01:13 +08:00
expect ( message . group_ids ) . to eq ( nil )
end
it "correctly publishes unread for a post in a restricted category" do
group = Fabricate ( :group )
category = Fabricate ( :private_category , group : group )
post . topic . update! ( category : category )
2022-02-22 15:27:46 +00:00
messages = MessageBus . track_publish ( "/unread" ) { TopicTrackingState . publish_unread ( post ) }
2021-08-11 11:01:13 +08:00
expect ( messages ) . to eq ( [] )
2022-04-19 11:37:01 +10:00
group . add ( other_user )
2021-08-11 11:01:13 +08:00
2022-02-22 15:27:46 +00:00
message =
2021-08-11 11:01:13 +08:00
MessageBus . track_publish ( "/unread" ) { TopicTrackingState . publish_unread ( post ) } . first
2022-04-19 11:37:01 +10:00
expect ( message . user_ids ) . to contain_exactly ( other_user . id )
2021-08-11 11:01:13 +08:00
expect ( message . group_ids ) . to eq ( nil )
end
2018-03-05 16:18:23 +08:00
describe "for a private message" do
before do
TopicUser . change (
2018-03-06 14:38:43 +08:00
private_message_topic . allowed_users . first . id ,
private_message_topic . id ,
2018-03-05 16:18:23 +08:00
notification_level : TopicUser . notification_levels [ :tracking ] ,
)
end
it "should not publish any message" do
messages =
MessageBus . track_publish { TopicTrackingState . publish_unread ( private_message_post ) }
expect ( messages ) . to eq ( [] )
end
end
2013-05-29 18:11:04 +10:00
end
2020-04-23 14:57:35 +10:00
describe "#publish_muted" do
2023-12-13 14:50:13 +11:00
let ( :user ) { Fabricate ( :user , last_seen_at : Date . today , refresh_auto_groups : true ) }
2020-04-23 14:57:35 +10:00
let ( :post ) { create_post ( user : user ) }
2023-01-12 08:22:28 +08:00
include_examples ( "does not publish message for private topics" , :publish_muted )
2020-04-23 14:57:35 +10:00
it "can correctly publish muted" do
2020-05-01 08:33:57 +10:00
TopicUser . find_by ( topic : topic , user : post . user ) . update ( notification_level : 0 )
2020-04-23 14:57:35 +10:00
messages = MessageBus . track_publish ( "/latest" ) { TopicTrackingState . publish_muted ( topic ) }
muted_message = messages . find { | message | message . data [ "message_type" ] == "muted" }
expect ( muted_message . data [ "topic_id" ] ) . to eq ( topic . id )
expect ( muted_message . data [ "message_type" ] ) . to eq ( described_class :: MUTED_MESSAGE_TYPE )
end
it "should not publish any message when notification level is not muted" do
messages = MessageBus . track_publish ( "/latest" ) { TopicTrackingState . publish_muted ( topic ) }
muted_messages = messages . select { | message | message . data [ "message_type" ] == "muted" }
expect ( muted_messages ) . to eq ( [] )
end
it "should not publish any message when the user was not seen in the last 7 days" do
2020-05-01 08:33:57 +10:00
TopicUser . find_by ( topic : topic , user : post . user ) . update ( notification_level : 0 )
2020-04-23 14:57:35 +10:00
post . user . update ( last_seen_at : 8 . days . ago )
messages = MessageBus . track_publish ( "/latest" ) { TopicTrackingState . publish_muted ( topic ) }
muted_messages = messages . select { | message | message . data [ "message_type" ] == "muted" }
expect ( muted_messages ) . to eq ( [] )
end
end
2020-12-10 16:49:05 +11:00
describe "#publish_unmuted" do
2023-12-13 14:50:13 +11:00
let ( :user ) { Fabricate ( :user , last_seen_at : Date . today , refresh_auto_groups : true ) }
2020-12-10 16:49:05 +11:00
let ( :second_user ) { Fabricate ( :user , last_seen_at : Date . today ) }
let ( :third_user ) { Fabricate ( :user , last_seen_at : Date . today ) }
let ( :post ) { create_post ( user : user ) }
2023-01-12 08:22:28 +08:00
include_examples ( "does not publish message for private topics" , :publish_unmuted )
2020-12-10 16:49:05 +11:00
it "can correctly publish unmuted" do
Fabricate ( :topic_tag , topic : topic )
SiteSetting . mute_all_categories_by_default = true
TopicUser . find_by ( topic : topic , user : post . user ) . update ( notification_level : 1 )
CategoryUser . create! ( category : topic . category , user : second_user , notification_level : 1 )
TagUser . create! ( tag : topic . tags . first , user : third_user , notification_level : 1 )
TagUser . create! ( tag : topic . tags . first , user : Fabricate ( :user ), notification_level : 0 )
messages = MessageBus . track_publish ( "/latest" ) { TopicTrackingState . publish_unmuted ( topic ) }
unmuted_message = messages . find { | message | message . data [ "message_type" ] == "unmuted" }
expect ( unmuted_message . user_ids . sort ) . to eq ( [ user . id , second_user . id , third_user . id ]. sort )
expect ( unmuted_message . data [ "topic_id" ] ) . to eq ( topic . id )
expect ( unmuted_message . data [ "message_type" ] ) . to eq ( described_class :: UNMUTED_MESSAGE_TYPE )
end
it "should not publish any message when notification level is not muted" do
SiteSetting . mute_all_categories_by_default = true
TopicUser . find_by ( topic : topic , user : post . user ) . update ( notification_level : 0 )
messages = MessageBus . track_publish ( "/latest" ) { TopicTrackingState . publish_unmuted ( topic ) }
unmuted_messages = messages . select { | message | message . data [ "message_type" ] == "unmuted" }
expect ( unmuted_messages ) . to eq ( [] )
end
it "should not publish any message when the user was not seen in the last 7 days" do
TopicUser . find_by ( topic : topic , user : post . user ) . update ( notification_level : 1 )
post . user . update ( last_seen_at : 8 . days . ago )
messages = MessageBus . track_publish ( "/latest" ) { TopicTrackingState . publish_unmuted ( topic ) }
unmuted_messages = messages . select { | message | message . data [ "message_type" ] == "unmuted" }
expect ( unmuted_messages ) . to eq ( [] )
end
end
2019-08-27 09:09:00 -03:00
describe "#publish_read_private_message" do
2023-11-09 16:47:59 -06:00
fab! ( :group )
2020-08-12 15:56:06 +10:00
let ( :read_topic_key ) { "/private-messages/unread-indicator/ #{ group_message . id } " }
let ( :read_post_key ) { "/topic/ #{ group_message . id } " }
let ( :group_message ) do
Fabricate (
:private_message_topic ,
2019-08-27 09:09:00 -03:00
allowed_groups : [ group ] ,
topic_allowed_users : [ Fabricate . build ( :topic_allowed_user , user : user ) ] ,
)
2023-01-09 11:18:21 +00:00
end
2022-11-22 09:48:27 +11:00
let! ( :post ) { Fabricate ( :post , topic : group_message ) }
let! ( :post_2 ) { Fabricate ( :post , topic : group_message ) }
2020-08-12 15:56:06 +10:00
before do
group . add ( user )
2022-11-22 09:48:27 +11:00
group_message . update! ( highest_post_number : post_2 . post_number )
2019-08-27 09:09:00 -03:00
end
it "does not trigger a read count update if no allowed groups have the option enabled" do
messages =
MessageBus . track_publish ( read_post_key ) do
2022-11-22 09:48:27 +11:00
TopicTrackingState . publish_read_indicator_on_read (
group_message . id ,
post_2 . post_number ,
user . id ,
)
2019-08-27 09:09:00 -03:00
end
expect ( messages ) . to be_empty
end
context "when the read indicator is enabled" do
before { group . update! ( publish_read_state : true ) }
2019-08-29 12:03:43 -03:00
it "publishes a message to hide the unread indicator" do
2019-08-27 09:09:00 -03:00
message =
MessageBus
. track_publish ( read_topic_key ) do
2022-11-22 09:48:27 +11:00
TopicTrackingState . publish_read_indicator_on_read (
group_message . id ,
post_2 . post_number ,
user . id ,
)
2019-08-27 09:09:00 -03:00
end
. first
2023-01-09 11:18:21 +00:00
2020-08-12 15:56:06 +10:00
expect ( message . data [ "topic_id" ] ) . to eq group_message . id
2019-08-29 12:03:43 -03:00
expect ( message . data [ "show_indicator" ] ) . to eq false
2019-08-27 09:09:00 -03:00
end
2019-08-29 12:03:43 -03:00
it "publishes a message to show the unread indicator when a non-member creates a new post" do
2020-08-12 15:56:06 +10:00
allowed_user = Fabricate ( :topic_allowed_user , topic : group_message )
2019-08-29 12:03:43 -03:00
message =
MessageBus
. track_publish ( read_topic_key ) do
2022-11-22 09:48:27 +11:00
TopicTrackingState . publish_read_indicator_on_write (
group_message . id ,
post_2 . post_number ,
allowed_user . id ,
)
2019-08-29 12:03:43 -03:00
end
. first
2023-01-09 11:18:21 +00:00
2020-08-12 15:56:06 +10:00
expect ( message . data [ "topic_id" ] ) . to eq group_message . id
2019-08-29 12:03:43 -03:00
expect ( message . data [ "show_indicator" ] ) . to eq true
end
it "does not publish the unread indicator if the message is not the last one" do
2019-08-27 09:09:00 -03:00
messages =
MessageBus . track_publish ( read_topic_key ) do
2022-11-22 09:48:27 +11:00
TopicTrackingState . publish_read_indicator_on_read (
group_message . id ,
post . post_number ,
user . id ,
)
2019-08-27 09:09:00 -03:00
end
expect ( messages ) . to be_empty
end
it "does not publish the read indicator if the user is not a group member" do
2020-08-12 15:56:06 +10:00
allowed_user = Fabricate ( :topic_allowed_user , topic : group_message )
2019-08-27 09:09:00 -03:00
messages =
MessageBus . track_publish ( read_topic_key ) do
2022-11-22 09:48:27 +11:00
TopicTrackingState . publish_read_indicator_on_read (
group_message . id ,
post_2 . post_number ,
allowed_user . user_id ,
)
2019-08-27 09:09:00 -03:00
end
expect ( messages ) . to be_empty
end
it "publish a read count update to every client" do
message =
MessageBus
. track_publish ( read_post_key ) do
2022-11-22 09:48:27 +11:00
TopicTrackingState . publish_read_indicator_on_read (
group_message . id ,
post_2 . post_number ,
user . id ,
)
2019-08-27 09:09:00 -03:00
end
. first
expect ( message . data [ :type ] ) . to eq :read
end
end
end
2015-04-17 14:03:08 +10:00
it "correctly handles muted categories" do
post
2016-12-02 17:03:31 +11:00
report = TopicTrackingState . report ( user )
2015-04-17 14:03:08 +10: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 17:03:31 +11:00
report = TopicTrackingState . report ( user )
2015-04-17 14:03:08 +10: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 ,
)
2020-01-06 16:15:24 +00:00
report = TopicTrackingState . report ( user )
expect ( report . length ) . to eq ( 1 )
end
2022-03-02 15:02:09 +11:00
it "correctly handles indirectly muted categories" do
parent_category = Fabricate ( :category )
sub_category = Fabricate ( :category , parent_category_id : parent_category . id )
create_post ( category : sub_category )
report = TopicTrackingState . report ( user )
expect ( report . length ) . to eq ( 1 )
CategoryUser . create! (
user_id : user . id ,
notification_level : CategoryUser . notification_levels [ :muted ] ,
category_id : parent_category . id ,
)
report = TopicTrackingState . report ( user )
expect ( report . length ) . to eq ( 0 )
CategoryUser . create! (
user_id : user . id ,
notification_level : CategoryUser . notification_levels [ :regular ] ,
category_id : sub_category . id ,
)
report = TopicTrackingState . report ( user )
expect ( report . length ) . to eq ( 1 )
end
2020-01-06 18:22:42 +00:00
it "works when categories are default muted" do
SiteSetting . mute_all_categories_by_default = true
post
report = TopicTrackingState . report ( user )
expect ( report . length ) . to eq ( 0 )
CategoryUser . create! (
user_id : user . id ,
notification_level : CategoryUser . notification_levels [ :regular ] ,
category_id : post . topic . category_id ,
)
create_post ( topic_id : post . topic_id )
2016-12-02 17:03:31 +11:00
report = TopicTrackingState . report ( user )
2015-07-21 21:53:54 +10:00
expect ( report . length ) . to eq ( 1 )
2015-04-17 14:03:08 +10:00
end
2022-07-27 18:14:14 +02:00
describe "muted tags" do
2019-12-10 09:50:05 +11:00
it "remove_muted_tags_from_latest is set to always" do
SiteSetting . remove_muted_tags_from_latest = "always"
tag1 = Fabricate ( :tag )
tag2 = Fabricate ( :tag )
Fabricate ( :topic_tag , tag : tag1 , topic : topic )
Fabricate ( :topic_tag , tag : tag2 , topic : topic )
post
report = TopicTrackingState . report ( user )
expect ( report . length ) . to eq ( 1 )
TagUser . create! (
user_id : user . id ,
notification_level : TagUser . notification_levels [ :muted ] ,
tag_id : tag1 . id ,
)
report = TopicTrackingState . report ( user )
expect ( report . length ) . to eq ( 0 )
2020-05-29 12:59:34 +10:00
TopicTag . where ( topic_id : topic . id ) . delete_all
report = TopicTrackingState . report ( user )
expect ( report . length ) . to eq ( 1 )
2019-12-10 09:50:05 +11:00
end
it "remove_muted_tags_from_latest is set to only_muted" do
SiteSetting . remove_muted_tags_from_latest = "only_muted"
tag1 = Fabricate ( :tag )
tag2 = Fabricate ( :tag )
Fabricate ( :topic_tag , tag : tag1 , topic : topic )
Fabricate ( :topic_tag , tag : tag2 , topic : topic )
post
report = TopicTrackingState . report ( user )
expect ( report . length ) . to eq ( 1 )
TagUser . create! (
user_id : user . id ,
notification_level : TagUser . notification_levels [ :muted ] ,
tag_id : tag1 . id ,
)
report = TopicTrackingState . report ( user )
expect ( report . length ) . to eq ( 1 )
TagUser . create! (
user_id : user . id ,
notification_level : TagUser . notification_levels [ :muted ] ,
tag_id : tag2 . id ,
)
report = TopicTrackingState . report ( user )
expect ( report . length ) . to eq ( 0 )
2020-05-29 12:59:34 +10:00
TopicTag . where ( topic_id : topic . id ) . delete_all
report = TopicTrackingState . report ( user )
expect ( report . length ) . to eq ( 1 )
2019-12-10 09:50:05 +11:00
end
it "remove_muted_tags_from_latest is set to never" do
SiteSetting . remove_muted_tags_from_latest = "never"
tag1 = Fabricate ( :tag )
Fabricate ( :topic_tag , tag : tag1 , topic : topic )
post
report = TopicTrackingState . report ( user )
expect ( report . length ) . to eq ( 1 )
TagUser . create! (
user_id : user . id ,
notification_level : TagUser . notification_levels [ :muted ] ,
tag_id : tag1 . id ,
)
report = TopicTrackingState . report ( user )
expect ( report . length ) . to eq ( 1 )
end
end
2021-02-04 11:27:34 +11:00
it "correctly handles dismissed topics" do
2020-03-10 22:13:17 +01:00
freeze_time 1 . minute . ago
2021-12-22 11:09:43 -06:00
user . update! ( created_at : Time . now )
2019-11-14 16:11:34 +11:00
post
report = TopicTrackingState . report ( user )
expect ( report . length ) . to eq ( 1 )
2021-02-04 11:27:34 +11:00
DismissedTopicUser . create! ( user_id : user . id , topic_id : post . topic_id , created_at : Time . zone . now )
2019-11-14 16:11:34 +11:00
CategoryUser . create! (
user_id : user . id ,
notification_level : CategoryUser . notification_levels [ :regular ] ,
category_id : post . topic . category_id ,
last_seen_at : post . topic . created_at ,
)
report = TopicTrackingState . report ( user )
expect ( report . length ) . to eq ( 0 )
end
2015-09-07 11:57:50 +10:00
it "correctly handles capping" do
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 ,
}
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 17:03:31 +11:00
report = TopicTrackingState . report ( user )
2015-09-07 11:57:50 +10:00
expect ( report . length ) . to eq ( 3 )
end
2022-07-27 18:14:14 +02:00
describe "tag support" do
2022-06-13 14:54:01 +08:00
before do
2020-05-29 12:57:46 +10:00
SiteSetting . tagging_enabled = true
2024-01-26 13:25:03 +08:00
SiteSetting . create_tag_allowed_groups = "10"
2020-05-29 12:57:46 +10:00
post . topic . notifier . watch_topic! ( post . topic . user_id )
2024-01-26 13:25:03 +08:00
DiscourseTagging . tag_topic_by_names ( post . topic , Guardian . new ( user ), %w[bananas apples] )
2022-06-13 14:54:01 +08:00
end
2020-05-29 12:57:46 +10:00
2023-10-09 07:24:10 +08:00
it "includes tags based on the `tagging_enabled` site setting" do
SiteSetting . tagging_enabled = false
2020-05-29 12:57:46 +10:00
report = TopicTrackingState . report ( user )
expect ( report . length ) . to eq ( 1 )
row = report [ 0 ]
expect ( row . respond_to? :tags ) . to eq ( false )
2022-06-13 14:54:01 +08:00
2023-10-09 07:24:10 +08:00
SiteSetting . tagging_enabled = true
2022-06-13 14:54:01 +08:00
report = TopicTrackingState . report ( user )
expect ( report . length ) . to eq ( 1 )
row = report [ 0 ]
expect ( row . tags ) . to contain_exactly ( "apples" , "bananas" )
2020-05-29 12:57:46 +10:00
end
end
2013-05-23 15:21:07 +10:00
it "correctly gets the tracking state" do
2016-12-02 17:03:31 +11:00
report = TopicTrackingState . report ( user )
2014-12-31 11:55:03 -03:00
expect ( report . length ) . to eq ( 0 )
2013-05-21 16:39:51 +10:00
2013-07-22 11:40:39 +10:00
post . topic . notifier . watch_topic! ( post . topic . user_id )
2013-05-21 16:39:51 +10:00
2016-12-02 17:03:31 +11:00
report = TopicTrackingState . report ( user )
2013-05-23 15:21:07 +10:00
2014-12-31 11:55:03 -03:00
expect ( report . length ) . to eq ( 1 )
2013-05-23 15:21:07 +10:00
row = report [ 0 ]
2014-12-31 11:55:03 -03: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 15:21:07 +10:00
# lets not leak out random users
2016-12-02 17:03:31 +11:00
expect ( TopicTrackingState . report ( post . user )) . to be_empty
2013-05-23 15:21:07 +10:00
# lets not return anything if we scope on non-existing topic
2016-12-02 17:03:31 +11:00
expect ( TopicTrackingState . report ( user , post . topic_id + 1 )) . to be_empty
2013-05-23 15:21:07 +10:00
# when we reply the poster should have an unread row
2013-07-22 15:06:53 +10:00
create_post ( user : user , topic : post . topic )
2013-05-21 16:39:51 +10:00
2016-12-02 17:03:31 +11:00
report = TopicTrackingState . report ( user )
2015-07-21 21:48:07 +10:00
expect ( report . length ) . to eq ( 0 )
2016-12-02 17:03:31 +11:00
report = TopicTrackingState . report ( post . user )
2014-12-31 11:55:03 -03:00
expect ( report . length ) . to eq ( 1 )
2013-05-21 16:39:51 +10:00
2013-05-23 15:21:07 +10:00
row = report [ 0 ]
2013-05-21 16:39:51 +10:00
2014-12-31 11:55:03 -03: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 16:39:51 +10:00
2013-05-24 13:32:41 +10:00
# when we have no permission to see a category, don't show its stats
2013-07-14 11:24:16 +10:00
category = Fabricate ( :category , read_restricted : true )
2013-05-24 13:32:41 +10:00
post . topic . category_id = category . id
post . topic . save
2016-12-02 17:03:31 +11:00
expect ( TopicTrackingState . report ( post . user )) . to be_empty
expect ( TopicTrackingState . report ( user )) . to be_empty
2013-05-21 16:39:51 +10:00
end
2021-08-12 10:31:50 +08:00
describe ".report" do
it "correctly reports topics with staff posts" do
2022-12-16 18:42:51 +02:00
SiteSetting . whispers_allowed_groups = " #{ Group :: AUTO_GROUPS [ :staff ] } "
2021-08-12 10:31:50 +08:00
create_post ( raw : "this is a test post" , topic : topic , user : post . user )
create_post (
raw : "this is a test post" ,
topic : topic ,
post_type : Post . types [ :whisper ] ,
user : user ,
)
post . user . grant_admin!
state = TopicTrackingState . report ( post . user )
expect ( state . map ( & :topic_id )) . to contain_exactly ( topic . id )
end
end
2023-01-11 06:15:52 +08:00
2024-03-15 12:08:37 -04:00
describe ".report_totals" do
fab! ( :user2 ) { Fabricate ( :user ) }
it "correctly returns new/unread totals" do
report = TopicTrackingState . report_totals ( user )
expect ( report ) . to eq ({ new : 0 , unread : 0 })
post . topic . notifier . watch_topic! ( post . topic . user_id )
report = TopicTrackingState . report_totals ( user )
expect ( report ) . to eq ({ new : 1 , unread : 0 })
create_post ( user : user , topic : post . topic )
# when user replies, they have 0 new count
report = TopicTrackingState . report_totals ( user )
expect ( report ) . to eq ({ new : 0 , unread : 0 })
# when we reply the poster will have an unread item
report = TopicTrackingState . report_totals ( post . user )
expect ( report ) . to eq ({ new : 0 , unread : 1 })
create_post ( user : user2 , topic : post . topic )
# when a third user replies, the original user should have an unread item
report = TopicTrackingState . report_totals ( user )
expect ( report ) . to eq ({ new : 0 , unread : 1 })
# the post user still has one unread
report = TopicTrackingState . report_totals ( post . user )
expect ( report ) . to eq ({ new : 0 , unread : 1 })
post2 = create_post
post2 . topic . notifier . watch_topic! ( user . id )
# watching another new topic bumps the new count
report = TopicTrackingState . report_totals ( user )
expect ( report ) . to eq ({ new : 1 , unread : 1 })
end
it "respects treat_as_new_topic_start_date user option" do
report = TopicTrackingState . report_totals ( user )
expect ( report ) . to eq ({ new : 0 , unread : 0 })
post . topic . notifier . watch_topic! ( post . topic . user_id )
report = TopicTrackingState . report_totals ( user )
expect ( report ) . to eq ({ new : 1 , unread : 0 })
user . user_option . new_topic_duration_minutes = 5
user . user_option . save
post . topic . created_at = 10 . minutes . ago
post . topic . save
report = TopicTrackingState . report_totals ( user )
expect ( report ) . to eq ({ new : 0 , unread : 0 })
end
it "respects new_new_view_enabled" do
new_new_group = Fabricate ( :group )
SiteSetting . experimental_new_new_view_groups = new_new_group . name
user . groups << new_new_group
report = TopicTrackingState . report_totals ( user )
expect ( report ) . to eq ({ new : 0 })
post . topic . notifier . watch_topic! ( post . topic . user_id )
post2 = create_post
Fabricate ( :post , topic : post2 . topic )
tracking = {
notification_level : TopicUser . notification_levels [ :tracking ] ,
last_read_post_number : 1 ,
}
TopicUser . change ( user . id , post2 . topic_id , tracking )
report = TopicTrackingState . report_totals ( user )
expect ( report ) . to eq ({ new : 2 })
end
end
2023-01-11 06:15:52 +08:00
describe ".publish_recover" do
2023-01-12 08:22:28 +08:00
include_examples ( "publishes message to right groups and users" , "/recover" , :publish_recover )
include_examples ( "does not publish message for private topics" , :publish_recover )
2023-01-11 06:15:52 +08:00
end
describe ".publish_delete" do
2023-01-12 08:22:28 +08:00
include_examples ( "publishes message to right groups and users" , "/delete" , :publish_delete )
include_examples ( "does not publish message for private topics" , :publish_delete )
2023-01-11 06:15:52 +08:00
end
describe ".publish_destroy" do
2023-01-12 08:22:28 +08:00
include_examples ( "publishes message to right groups and users" , "/destroy" , :publish_destroy )
include_examples ( "does not publish message for private topics" , :publish_destroy )
2023-01-11 06:15:52 +08:00
end
2023-07-13 18:05:56 +08:00
describe "#publish_dismiss_new_posts" do
it "publishes the right message to the right users" do
messages =
MessageBus . track_publish ( TopicTrackingState . unread_channel_key ( user . id )) do
TopicTrackingState . publish_dismiss_new_posts ( user . id , topic_ids : [ topic . id ] )
end
expect ( messages . size ) . to eq ( 1 )
message = messages . first
expect ( message . data [ "payload" ][ "topic_ids" ] ) . to contain_exactly ( topic . id )
expect ( message . user_ids ) . to eq ( [ user . id ] )
end
end
2013-05-21 16:39:51 +10:00
end