2015-10-11 10:41:23 +01:00
require 'rails_helper'
2013-02-05 14:16:51 -05:00
require 'topic_view'
describe TopicQuery do
2014-03-04 12:46:37 -05:00
let! ( :user ) { Fabricate ( :coding_horror ) }
2013-02-05 14:16:51 -05:00
let ( :creator ) { Fabricate ( :user ) }
let ( :topic_query ) { TopicQuery . new ( user ) }
let ( :moderator ) { Fabricate ( :moderator ) }
2014-02-07 07:08:56 -08:00
let ( :admin ) { Fabricate ( :admin ) }
2013-02-05 14:16:51 -05:00
2013-04-29 16:33:24 +10:00
context 'secure category' do
it " filters categories out correctly " do
category = Fabricate ( :category )
group = Fabricate ( :group )
2013-07-14 11:24:16 +10:00
category . set_permissions ( group = > :full )
2013-04-29 16:33:24 +10:00
category . save
topic = Fabricate ( :topic , category : category )
2013-06-13 10:27:17 +10:00
topic = Fabricate ( :topic , visible : false )
2013-04-29 16:33:24 +10:00
2015-01-09 13:34:37 -03:00
expect ( TopicQuery . new ( nil ) . list_latest . topics . count ) . to eq ( 0 )
expect ( TopicQuery . new ( user ) . list_latest . topics . count ) . to eq ( 0 )
2013-04-29 16:33:24 +10:00
2015-01-09 13:34:37 -03:00
expect ( Topic . top_viewed ( 10 ) . count ) . to eq ( 0 )
expect ( Topic . recent ( 10 ) . count ) . to eq ( 0 )
2013-06-13 10:27:17 +10:00
2014-02-07 07:08:56 -08:00
# mods can see hidden topics
2015-01-09 13:34:37 -03:00
expect ( TopicQuery . new ( moderator ) . list_latest . topics . count ) . to eq ( 1 )
2014-02-07 07:08:56 -08:00
# admins can see all the topics
2015-01-09 13:34:37 -03:00
expect ( TopicQuery . new ( admin ) . list_latest . topics . count ) . to eq ( 3 )
2013-04-29 16:33:24 +10:00
group . add ( user )
group . save
2015-01-09 13:34:37 -03:00
expect ( TopicQuery . new ( user ) . list_latest . topics . count ) . to eq ( 2 )
2013-06-13 10:27:17 +10:00
2013-04-29 16:33:24 +10:00
end
end
2015-03-23 18:12:37 -04:00
context " list_topics_by " do
it " allows users to view their own invisible topics " do
2015-06-22 18:09:08 +10:00
_topic = Fabricate ( :topic , user : user )
_invisible_topic = Fabricate ( :topic , user : user , visible : false )
2015-03-23 18:12:37 -04:00
expect ( TopicQuery . new ( nil ) . list_topics_by ( user ) . topics . count ) . to eq ( 1 )
expect ( TopicQuery . new ( user ) . list_topics_by ( user ) . topics . count ) . to eq ( 2 )
end
end
2015-01-07 18:20:10 +11:00
context 'bookmarks' do
it " filters and returns bookmarks correctly " do
post = Fabricate ( :post )
reply = Fabricate ( :post , topic_id : post . topic_id )
post2 = Fabricate ( :post )
PostAction . act ( user , post , PostActionType . types [ :bookmark ] )
PostAction . act ( user , reply , PostActionType . types [ :bookmark ] )
TopicUser . change ( user , post . topic , notification_level : 1 )
TopicUser . change ( user , post2 . topic , notification_level : 1 )
query = TopicQuery . new ( user , filter : 'bookmarked' ) . list_latest
2015-01-09 13:34:37 -03:00
expect ( query . topics . length ) . to eq ( 1 )
expect ( query . topics . first . user_data . post_action_data ) . to eq ( { PostActionType . types [ :bookmark ] = > [ 1 , 2 ] } )
2015-01-07 18:20:10 +11:00
end
end
2014-11-19 17:46:55 -05:00
context 'deleted filter' do
it " filters deleted topics correctly " do
2015-01-07 18:20:10 +11:00
_topic = Fabricate ( :topic , deleted_at : 1 . year . ago )
2014-11-19 17:46:55 -05:00
2015-01-09 13:34:37 -03:00
expect ( TopicQuery . new ( admin , status : 'deleted' ) . list_latest . topics . size ) . to eq ( 1 )
expect ( TopicQuery . new ( moderator , status : 'deleted' ) . list_latest . topics . size ) . to eq ( 1 )
expect ( TopicQuery . new ( user , status : 'deleted' ) . list_latest . topics . size ) . to eq ( 0 )
expect ( TopicQuery . new ( nil , status : 'deleted' ) . list_latest . topics . size ) . to eq ( 0 )
2014-11-19 17:46:55 -05:00
end
end
2013-10-31 16:10:54 -04:00
context 'category filter' do
let ( :category ) { Fabricate ( :category ) }
2013-12-13 17:18:28 -05:00
2014-10-08 12:44:47 -04:00
let ( :diff_category ) { Fabricate ( :diff_category ) }
2013-10-31 16:10:54 -04:00
it " returns topics in the category when we filter to it " do
2015-01-09 13:34:37 -03:00
expect ( TopicQuery . new ( moderator ) . list_latest . topics . size ) . to eq ( 0 )
2013-10-31 16:10:54 -04:00
# Filter by slug
2015-01-09 13:34:37 -03:00
expect ( TopicQuery . new ( moderator , category : category . slug ) . list_latest . topics . size ) . to eq ( 1 )
expect ( TopicQuery . new ( moderator , category : " #{ category . id } -category " ) . list_latest . topics . size ) . to eq ( 1 )
2014-10-08 12:44:47 -04:00
list = TopicQuery . new ( moderator , category : diff_category . slug ) . list_latest
2015-01-09 13:34:37 -03:00
expect ( list . topics . size ) . to eq ( 1 )
expect ( list . preload_key ) . to eq ( " topic_list_c/different-category/l/latest " )
2013-12-13 17:18:28 -05:00
# Defaults to no category filter when slug does not exist
2015-01-09 13:34:37 -03:00
expect ( TopicQuery . new ( moderator , category : 'made up slug' ) . list_latest . topics . size ) . to eq ( 2 )
2013-10-31 16:10:54 -04:00
end
2013-12-13 17:18:28 -05:00
context 'subcategories' do
let! ( :subcategory ) { Fabricate ( :category , parent_category_id : category . id ) }
it " works with subcategories " do
2015-01-09 13:34:37 -03:00
expect ( TopicQuery . new ( moderator , category : category . id ) . list_latest . topics . size ) . to eq ( 1 )
expect ( TopicQuery . new ( moderator , category : subcategory . id ) . list_latest . topics . size ) . to eq ( 1 )
expect ( TopicQuery . new ( moderator , category : category . id , no_subcategories : true ) . list_latest . topics . size ) . to eq ( 1 )
2013-12-13 17:18:28 -05:00
end
end
2013-10-31 16:10:54 -04:00
end
2014-02-03 16:05:49 +11:00
context 'muted categories' do
it 'is removed from new and latest lists' do
category = Fabricate ( :category )
topic = Fabricate ( :topic , category : category )
CategoryUser . create! ( user_id : user . id ,
category_id : category . id ,
notification_level : CategoryUser . notification_levels [ :muted ] )
2015-01-09 13:34:37 -03:00
expect ( topic_query . list_new . topics . map ( & :id ) ) . not_to include ( topic . id )
expect ( topic_query . list_latest . topics . map ( & :id ) ) . not_to include ( topic . id )
2014-02-03 16:05:49 +11:00
end
end
2013-10-31 16:10:54 -04:00
2013-02-05 14:16:51 -05:00
context 'a bunch of topics' do
2013-11-13 14:17:06 -05:00
let! ( :regular_topic ) do
Fabricate ( :topic , title : 'this is a regular topic' ,
user : creator ,
views : 100 ,
like_count : 66 ,
posts_count : 3 ,
2013-11-14 15:50:36 -05:00
participant_count : 11 ,
2013-11-13 14:17:06 -05:00
bumped_at : 15 . minutes . ago )
end
let! ( :pinned_topic ) do
Fabricate ( :topic , title : 'this is a pinned topic' ,
user : creator ,
views : 10 ,
like_count : 100 ,
posts_count : 5 ,
2013-11-14 15:50:36 -05:00
participant_count : 12 ,
2013-11-13 14:17:06 -05:00
pinned_at : 10 . minutes . ago ,
2014-04-07 16:38:51 +10:00
pinned_globally : true ,
2013-11-13 14:17:06 -05:00
bumped_at : 10 . minutes . ago )
end
let! ( :archived_topic ) do
Fabricate ( :topic , title : 'this is an archived topic' ,
user : creator ,
views : 50 ,
like_count : 30 ,
posts_count : 4 ,
archived : true ,
2013-11-14 15:50:36 -05:00
participant_count : 1 ,
2013-11-13 14:17:06 -05:00
bumped_at : 6 . minutes . ago )
end
let! ( :invisible_topic ) do
Fabricate ( :topic , title : 'this is an invisible topic' ,
user : creator ,
views : 1 ,
like_count : 5 ,
posts_count : 2 ,
visible : false ,
2013-11-14 15:50:36 -05:00
participant_count : 3 ,
2013-11-13 14:17:06 -05:00
bumped_at : 5 . minutes . ago )
end
let! ( :closed_topic ) do
Fabricate ( :topic , title : 'this is a closed topic' ,
user : creator ,
views : 2 ,
like_count : 1 ,
posts_count : 1 ,
closed : true ,
2013-11-14 15:50:36 -05:00
participant_count : 2 ,
2013-11-13 14:17:06 -05:00
bumped_at : 1 . minute . ago )
end
2014-08-12 09:51:54 +02:00
let! ( :future_topic ) do
Fabricate ( :topic , title : 'this is a topic in far future' ,
user : creator ,
views : 30 ,
like_count : 11 ,
posts_count : 6 ,
participant_count : 5 ,
bumped_at : 1000 . years . from_now )
end
2013-11-13 14:17:06 -05:00
2013-03-27 16:17:49 -04:00
let ( :topics ) { topic_query . list_latest . topics }
2013-02-05 14:16:51 -05:00
2013-03-27 16:17:49 -04:00
context 'list_latest' do
2013-02-05 14:16:51 -05:00
it " returns the topics in the correct order " do
2015-01-09 13:34:37 -03:00
expect ( topics . map ( & :id ) ) . to eq ( [ pinned_topic , future_topic , closed_topic , archived_topic , regular_topic ] . map ( & :id ) )
2013-02-05 14:16:51 -05:00
2014-02-03 16:05:49 +11:00
# includes the invisible topic if you're a moderator
2015-01-09 13:34:37 -03:00
expect ( TopicQuery . new ( moderator ) . list_latest . topics . include? ( invisible_topic ) ) . to eq ( true )
2013-02-05 14:16:51 -05:00
2014-02-03 16:05:49 +11:00
# includes the invisible topic if you're an admin" do
2015-01-09 13:34:37 -03:00
expect ( TopicQuery . new ( admin ) . list_latest . topics . include? ( invisible_topic ) ) . to eq ( true )
2013-02-05 14:16:51 -05:00
end
2013-11-13 14:17:06 -05:00
context 'sort_order' do
def ids_in_order ( order , descending = true )
2014-04-16 12:05:54 -04:00
TopicQuery . new ( admin , order : order , ascending : descending ? 'false' : 'true' ) . list_latest . topics . map ( & :id )
2013-11-13 14:17:06 -05:00
end
2014-02-03 16:05:49 +11:00
it " returns the topics in correct order " do
# returns the topics in likes order if requested
2015-01-09 13:34:37 -03:00
expect ( ids_in_order ( 'posts' ) ) . to eq ( [ future_topic , pinned_topic , archived_topic , regular_topic , invisible_topic , closed_topic ] . map ( & :id ) )
2013-11-13 14:17:06 -05:00
2014-02-03 16:05:49 +11:00
# returns the topics in reverse likes order if requested
2015-01-09 13:34:37 -03:00
expect ( ids_in_order ( 'posts' , false ) ) . to eq ( [ closed_topic , invisible_topic , regular_topic , archived_topic , pinned_topic , future_topic ] . map ( & :id ) )
2013-11-13 14:17:06 -05:00
2014-02-03 16:05:49 +11:00
# returns the topics in likes order if requested
2015-01-09 13:34:37 -03:00
expect ( ids_in_order ( 'likes' ) ) . to eq ( [ pinned_topic , regular_topic , archived_topic , future_topic , invisible_topic , closed_topic ] . map ( & :id ) )
2013-11-13 14:17:06 -05:00
2014-02-03 16:05:49 +11:00
# returns the topics in reverse likes order if requested
2015-01-09 13:34:37 -03:00
expect ( ids_in_order ( 'likes' , false ) ) . to eq ( [ closed_topic , invisible_topic , future_topic , archived_topic , regular_topic , pinned_topic ] . map ( & :id ) )
2013-11-13 14:17:06 -05:00
2014-02-03 16:05:49 +11:00
# returns the topics in views order if requested
2015-01-09 13:34:37 -03:00
expect ( ids_in_order ( 'views' ) ) . to eq ( [ regular_topic , archived_topic , future_topic , pinned_topic , closed_topic , invisible_topic ] . map ( & :id ) )
2013-11-13 14:17:06 -05:00
2014-02-03 16:05:49 +11:00
# returns the topics in reverse views order if requested" do
2015-01-09 13:34:37 -03:00
expect ( ids_in_order ( 'views' , false ) ) . to eq ( [ invisible_topic , closed_topic , pinned_topic , future_topic , archived_topic , regular_topic ] . map ( & :id ) )
2013-11-13 14:17:06 -05:00
2014-02-03 16:05:49 +11:00
# returns the topics in posters order if requested" do
2015-01-09 13:34:37 -03:00
expect ( ids_in_order ( 'posters' ) ) . to eq ( [ pinned_topic , regular_topic , future_topic , invisible_topic , closed_topic , archived_topic ] . map ( & :id ) )
2013-11-14 15:50:36 -05:00
2014-02-03 16:05:49 +11:00
# returns the topics in reverse posters order if requested" do
2015-01-09 13:34:37 -03:00
expect ( ids_in_order ( 'posters' , false ) ) . to eq ( [ archived_topic , closed_topic , invisible_topic , future_topic , regular_topic , pinned_topic ] . map ( & :id ) )
2013-11-14 15:50:36 -05:00
end
2013-11-13 14:17:06 -05:00
end
2013-02-05 14:16:51 -05:00
end
2014-02-03 16:05:49 +11:00
2013-03-06 15:17:07 -05:00
context 'after clearring a pinned topic' do
before do
pinned_topic . clear_pin_for ( user )
end
it " no longer shows the pinned topic at the top " do
2015-01-09 13:34:37 -03:00
expect ( topics ) . to eq ( [ future_topic , closed_topic , archived_topic , pinned_topic , regular_topic ] )
2013-03-06 15:17:07 -05:00
end
end
2013-02-05 14:16:51 -05:00
end
context 'categorized' do
2013-02-25 19:42:20 +03:00
let ( :category ) { Fabricate ( :category ) }
2013-03-07 12:45:49 -05:00
let ( :topic_category ) { category . topic }
2013-02-25 19:42:20 +03:00
let! ( :topic_no_cat ) { Fabricate ( :topic ) }
2015-02-25 14:39:50 +11:00
let! ( :topic_in_cat1 ) { Fabricate ( :topic , category : category ,
bumped_at : 10 . minutes . ago ,
created_at : 10 . minutes . ago ) }
let! ( :topic_in_cat2 ) { Fabricate ( :topic , category : category ) }
2013-02-27 19:36:12 -08:00
describe '#list_new_in_category' do
2013-03-07 12:45:49 -05:00
it 'returns the topic category and the categorized topic' do
2015-02-25 14:39:50 +11:00
expect (
topic_query . list_new_in_category ( category ) . topics . map ( & :id )
) . to eq ( [ topic_in_cat2 . id , topic_category . id , topic_in_cat1 . id ] )
2013-02-27 19:36:12 -08:00
end
end
2013-02-05 14:16:51 -05:00
end
context 'unread / read topics' do
context 'with no data' do
it " has no unread topics " do
2015-01-09 13:34:37 -03:00
expect ( topic_query . list_unread . topics ) . to be_blank
2013-02-05 14:16:51 -05:00
end
end
context 'with read data' do
let! ( :partially_read ) { Fabricate ( :post , user : creator ) . topic }
let! ( :fully_read ) { Fabricate ( :post , user : creator ) . topic }
before do
TopicUser . update_last_read ( user , partially_read . id , 0 , 0 )
TopicUser . update_last_read ( user , fully_read . id , 1 , 0 )
end
context 'list_unread' do
it 'contains no topics' do
2015-01-09 13:34:37 -03:00
expect ( topic_query . list_unread . topics ) . to eq ( [ ] )
2013-02-05 14:16:51 -05:00
end
end
2013-02-25 19:42:20 +03:00
context 'user with auto_track_topics list_unread' do
before do
2016-02-18 16:57:22 +11:00
user . user_option . auto_track_topics_after_msecs = 0
user . user_option . save
2013-02-05 14:16:51 -05:00
end
2013-02-25 19:42:20 +03:00
2013-02-05 14:16:51 -05:00
it 'only contains the partially read topic' do
2015-01-09 13:34:37 -03:00
expect ( topic_query . list_unread . topics ) . to eq ( [ partially_read ] )
2013-02-05 14:16:51 -05:00
end
end
context 'list_read' do
it 'contain both topics ' do
2015-01-09 13:34:37 -03:00
expect ( topic_query . list_read . topics ) . to match_array ( [ fully_read , partially_read ] )
2013-02-25 19:42:20 +03:00
end
2013-02-05 14:16:51 -05:00
end
end
end
context 'list_new' do
context 'without a new topic' do
it " has no new topics " do
2015-01-09 13:34:37 -03:00
expect ( topic_query . list_new . topics ) . to be_blank
2013-02-05 14:16:51 -05:00
end
end
2015-08-05 16:01:52 +10:00
context 'preload api' do
let ( :topics ) { }
it " preloads data correctly " do
TopicList . preloaded_custom_fields << " tag "
TopicList . preloaded_custom_fields << " age "
TopicList . preloaded_custom_fields << " foo "
topic = Fabricate . build ( :topic , user : creator , bumped_at : 10 . minutes . ago )
topic . custom_fields [ " tag " ] = [ " a " , " b " , " c " ]
topic . custom_fields [ " age " ] = 22
topic . save
new_topic = topic_query . list_new . topics . first
expect ( new_topic . custom_fields [ " tag " ] . sort ) . to eq ( [ " a " , " b " , " c " ] )
expect ( new_topic . custom_fields [ " age " ] ) . to eq ( " 22 " )
expect ( new_topic . custom_field_preloaded? ( " tag " ) ) . to eq ( true )
expect ( new_topic . custom_field_preloaded? ( " age " ) ) . to eq ( true )
expect ( new_topic . custom_field_preloaded? ( " foo " ) ) . to eq ( true )
expect ( new_topic . custom_field_preloaded? ( " bar " ) ) . to eq ( false )
TopicList . preloaded_custom_fields . clear
# if we attempt to access non preloaded fields explode
expect { new_topic . custom_fields [ " boom " ] } . to raise_error
end
end
2013-02-05 14:16:51 -05:00
context 'with a new topic' do
2013-02-25 19:42:20 +03:00
let! ( :new_topic ) { Fabricate ( :topic , user : creator , bumped_at : 10 . minutes . ago ) }
2013-02-05 14:16:51 -05:00
let ( :topics ) { topic_query . list_new . topics }
2013-02-14 17:32:58 +11:00
it " contains no new topics for a user that has missed the window " do
2015-08-05 16:01:52 +10:00
expect ( topic_query . list_new . topics ) . to eq ( [ new_topic ] )
2016-02-18 16:57:22 +11:00
user . user_option . new_topic_duration_minutes = 5
user . user_option . save
2013-02-14 17:32:58 +11:00
new_topic . created_at = 10 . minutes . ago
new_topic . save
2015-08-05 16:01:52 +10:00
expect ( topic_query . list_new . topics ) . to eq ( [ ] )
2013-02-14 17:32:58 +11:00
end
2013-02-05 14:16:51 -05:00
context " muted topics " do
before do
new_topic . notify_muted! ( user )
end
2013-02-25 19:42:20 +03:00
it " returns an empty set " do
2015-01-09 13:34:37 -03:00
expect ( topics ) . to be_blank
2015-11-02 15:05:08 +11:00
expect ( topic_query . list_latest . topics ) . to be_blank
2013-02-05 14:16:51 -05:00
end
context 'un-muted' do
before do
new_topic . notify_tracking! ( user )
end
it " returns the topic again " do
2015-01-09 13:34:37 -03:00
expect ( topics ) . to eq ( [ new_topic ] )
2015-11-02 15:05:08 +11:00
expect ( topic_query . list_latest . topics ) . not_to be_blank
2013-02-05 14:16:51 -05:00
end
end
2013-02-25 19:42:20 +03:00
end
2013-02-05 14:16:51 -05:00
end
2013-02-25 19:42:20 +03:00
2013-02-05 14:16:51 -05:00
end
context 'list_posted' do
let ( :topics ) { topic_query . list_posted . topics }
it " returns blank when there are no posted topics " do
2015-01-09 13:34:37 -03:00
expect ( topics ) . to be_blank
2013-02-05 14:16:51 -05:00
end
context 'created topics' do
2013-07-22 15:06:53 +10:00
let! ( :created_topic ) { create_post ( user : user ) . topic }
2013-02-05 14:16:51 -05:00
it " includes the created topic " do
2015-01-09 13:34:37 -03:00
expect ( topics . include? ( created_topic ) ) . to eq ( true )
2013-02-05 14:16:51 -05:00
end
end
context " topic you've posted in " do
2013-07-22 15:06:53 +10:00
let ( :other_users_topic ) { create_post ( user : creator ) . topic }
let! ( :your_post ) { create_post ( user : user , topic : other_users_topic ) }
2013-02-05 14:16:51 -05:00
it " includes the posted topic " do
2015-01-09 13:34:37 -03:00
expect ( topics . include? ( other_users_topic ) ) . to eq ( true )
2013-02-05 14:16:51 -05:00
end
2014-03-30 14:13:06 -07:00
end
context " topic you haven't posted in " do
let ( :other_users_topic ) { create_post ( user : creator ) . topic }
it " does not include the topic " do
2015-01-09 13:34:37 -03:00
expect ( topics ) . to be_blank
2014-03-30 14:13:06 -07:00
end
context " but interacted with " do
it " is not included if read " do
TopicUser . update_last_read ( user , other_users_topic . id , 0 , 0 )
2015-01-09 13:34:37 -03:00
expect ( topics ) . to be_blank
2014-03-30 14:13:06 -07:00
end
it " is not included if muted " do
other_users_topic . notify_muted! ( user )
2015-01-09 13:34:37 -03:00
expect ( topics ) . to be_blank
2014-03-30 14:13:06 -07:00
end
it " is not included if tracking " do
other_users_topic . notify_tracking! ( user )
2015-01-09 13:34:37 -03:00
expect ( topics ) . to be_blank
2014-03-30 14:13:06 -07:00
end
end
2013-02-05 14:16:51 -05:00
end
end
2016-02-03 18:50:05 +11:00
context 'suggested_for message do' do
let ( :user ) do
Fabricate ( :admin )
end
let ( :sender ) do
Fabricate ( :admin )
end
let ( :group_with_user ) do
group = Fabricate ( :group )
group . add ( user )
group . save
group
end
def create_pm ( user , opts = nil )
unless opts
opts = user
user = nil
end
create_post ( opts . merge ( user : user , archetype : Archetype . private_message ) ) . topic
end
def read ( user , topic , post_number )
TopicUser . update_last_read ( user , topic , post_number , 10000 )
end
2013-02-05 14:16:51 -05:00
2016-02-03 18:50:05 +11:00
it 'returns the correct suggestions' do
pm_to_group = create_pm ( sender , target_group_names : [ group_with_user . name ] )
pm_to_user = create_pm ( sender , target_usernames : [ user . username ] )
new_pm = create_pm ( target_usernames : [ user . username ] )
unread_pm = create_pm ( target_usernames : [ user . username ] )
read ( user , unread_pm , 0 )
old_unrelated_pm = create_pm ( target_usernames : [ user . username ] )
read ( user , old_unrelated_pm , 1 )
related_by_user_pm = create_pm ( sender , target_usernames : [ user . username ] )
read ( user , related_by_user_pm , 1 )
related_by_group_pm = create_pm ( sender , target_group_names : [ group_with_user . name ] )
read ( user , related_by_group_pm , 1 )
expect ( TopicQuery . new ( user ) . list_suggested_for ( pm_to_group ) . topics . map ( & :id ) ) . to (
eq ( [ related_by_group_pm . id , related_by_user_pm . id , pm_to_user . id ] )
)
expect ( TopicQuery . new ( user ) . list_suggested_for ( pm_to_user ) . topics . map ( & :id ) ) . to (
eq ( [ new_pm . id , unread_pm . id , related_by_user_pm . id ] )
)
end
end
context 'suggested_for' do
2015-02-25 18:09:45 +11:00
before do
2015-02-27 09:40:10 +11:00
RandomTopicSelector . clear_cache!
2015-02-25 18:09:45 +11:00
end
2013-02-05 14:16:51 -05:00
context 'when anonymous' do
let ( :topic ) { Fabricate ( :topic ) }
let! ( :new_topic ) { Fabricate ( :post , user : creator ) . topic }
it " should return the new topic " do
2015-01-09 13:34:37 -03:00
expect ( TopicQuery . new . list_suggested_for ( topic ) . topics ) . to eq ( [ new_topic ] )
2013-02-25 19:42:20 +03:00
end
2013-02-19 14:38:59 -05:00
end
2013-02-05 14:16:51 -05:00
2014-02-04 12:26:38 -05:00
context " anonymously browsing with invisible, closed and archived " do
2013-02-19 14:38:59 -05:00
let! ( :topic ) { Fabricate ( :topic ) }
let! ( :regular_topic ) { Fabricate ( :post , user : creator ) . topic }
let! ( :closed_topic ) { Fabricate ( :topic , user : creator , closed : true ) }
let! ( :archived_topic ) { Fabricate ( :topic , user : creator , archived : true ) }
let! ( :invisible_topic ) { Fabricate ( :topic , user : creator , visible : false ) }
it " should omit the closed/archived/invisbiel topics from suggested " do
2015-01-09 13:34:37 -03:00
expect ( TopicQuery . new . list_suggested_for ( topic ) . topics ) . to eq ( [ regular_topic ] )
2013-02-19 14:38:59 -05:00
end
2013-02-05 14:16:51 -05:00
end
context 'when logged in' do
let ( :topic ) { Fabricate ( :topic ) }
2015-03-05 17:47:34 +11:00
let ( :suggested_topics ) {
tt = topic
# lets clear cache once category is created - working around caching is hard
RandomTopicSelector . clear_cache!
topic_query . list_suggested_for ( tt ) . topics . map { | t | t . id }
}
2013-02-05 14:16:51 -05:00
it " should return empty results when there is nothing to find " do
2015-01-09 13:34:37 -03:00
expect ( suggested_topics ) . to be_blank
2013-02-05 14:16:51 -05:00
end
context 'with some existing topics' do
let! ( :partially_read ) { Fabricate ( :post , user : creator ) . topic }
let! ( :new_topic ) { Fabricate ( :post , user : creator ) . topic }
2013-02-25 19:42:20 +03:00
let! ( :fully_read ) { Fabricate ( :post , user : creator ) . topic }
2013-02-19 14:38:59 -05:00
let! ( :closed_topic ) { Fabricate ( :topic , user : creator , closed : true ) }
let! ( :archived_topic ) { Fabricate ( :topic , user : creator , archived : true ) }
let! ( :invisible_topic ) { Fabricate ( :topic , user : creator , visible : false ) }
2014-02-04 12:26:38 -05:00
let! ( :fully_read_closed ) { Fabricate ( :post , user : creator ) . topic }
let! ( :fully_read_archived ) { Fabricate ( :post , user : creator ) . topic }
2013-02-05 14:16:51 -05:00
before do
2016-02-18 16:57:22 +11:00
user . user_option . auto_track_topics_after_msecs = 0
user . user_option . save
2013-02-05 14:16:51 -05:00
TopicUser . update_last_read ( user , partially_read . id , 0 , 0 )
TopicUser . update_last_read ( user , fully_read . id , 1 , 0 )
2014-02-04 12:26:38 -05:00
TopicUser . update_last_read ( user , fully_read_closed . id , 1 , 0 )
TopicUser . update_last_read ( user , fully_read_archived . id , 1 , 0 )
fully_read_closed . closed = true
fully_read_closed . save
fully_read_archived . archived = true
fully_read_archived . save
2013-02-05 14:16:51 -05:00
end
2015-03-03 10:20:42 +11:00
it " returns unread, then new, then random " do
SiteSetting . suggested_topics = 7
expect ( suggested_topics [ 0 ] ) . to eq ( partially_read . id )
expect ( suggested_topics [ 1 , 3 ] ) . to include ( new_topic . id )
expect ( suggested_topics [ 1 , 3 ] ) . to include ( closed_topic . id )
expect ( suggested_topics [ 1 , 3 ] ) . to include ( archived_topic . id )
2015-03-12 13:44:13 +11:00
# The line below appears to randomly fail, no idea why need to restructure test
#expect(suggested_topics[4]).to eq(fully_read.id)
2015-03-03 10:20:42 +11:00
# random doesn't include closed and archived
end
2013-02-05 14:16:51 -05:00
it " won't return new or fully read if there are enough partially read topics " do
2015-02-27 09:40:10 +11:00
SiteSetting . suggested_topics = 1
2015-01-09 13:34:37 -03:00
expect ( suggested_topics ) . to eq ( [ partially_read . id ] )
2013-02-05 14:16:51 -05:00
end
2014-02-04 12:26:38 -05:00
it " won't return fully read if there are enough partially read topics and new topics " do
2015-02-27 09:40:10 +11:00
SiteSetting . suggested_topics = 4
2015-01-09 13:34:37 -03:00
expect ( suggested_topics [ 0 ] ) . to eq ( partially_read . id )
expect ( suggested_topics [ 1 , 3 ] ) . to include ( new_topic . id )
expect ( suggested_topics [ 1 , 3 ] ) . to include ( closed_topic . id )
expect ( suggested_topics [ 1 , 3 ] ) . to include ( archived_topic . id )
2013-02-05 14:16:51 -05:00
end
2013-02-25 19:42:20 +03:00
end
2013-02-05 14:16:51 -05:00
end
end
end