2013-02-06 03:16:51 +08:00
require 'spec_helper'
2013-03-19 05:52:29 +08:00
require_dependency 'post_destroyer'
2013-02-06 03:16:51 +08:00
describe PostAction do
it { should belong_to :user }
it { should belong_to :post }
it { should belong_to :post_action_type }
it { should rate_limit }
2013-03-19 05:52:29 +08:00
let ( :moderator ) { Fabricate ( :moderator ) }
2013-02-06 03:16:51 +08:00
let ( :codinghorror ) { Fabricate ( :coding_horror ) }
2014-08-19 22:14:17 +08:00
let ( :eviltrout ) { Fabricate ( :evil_trout ) }
2014-08-05 01:39:36 +08:00
let ( :admin ) { Fabricate ( :admin ) }
2013-02-06 03:16:51 +08:00
let ( :post ) { Fabricate ( :post ) }
2014-07-29 04:08:31 +08:00
let ( :second_post ) { Fabricate ( :post , topic_id : post . topic_id ) }
2013-03-01 20:07:44 +08:00
let ( :bookmark ) { PostAction . new ( user_id : post . user_id , post_action_type_id : PostActionType . types [ :bookmark ] , post_id : post . id ) }
2013-02-06 03:16:51 +08:00
2013-04-12 15:55:45 +08:00
describe " messaging " do
2013-04-22 15:45:03 +08:00
2014-12-12 02:34:52 +08:00
it " doesn't generate title longer than 255 characters " do
topic = create_topic ( title : " Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc sit amet rutrum neque. Pellentesque suscipit vehicula facilisis. Phasellus lacus sapien, aliquam nec convallis sit amet, vestibulum laoreet ante. Curabitur et pellentesque tortor. Donec non. " )
post = create_post ( topic : topic )
- > { PostAction . act ( admin , post , PostActionType . types [ :notify_user ] , message : " WAT " ) } . should_not raise_error
end
2013-05-04 08:52:45 +08:00
it " notify moderators integration test " do
2013-07-22 13:06:53 +08:00
post = create_post
2013-04-22 15:45:03 +08:00
mod = moderator
2014-06-25 00:31:36 +08:00
Group . refresh_automatic_groups!
2013-06-01 05:38:28 +08:00
action = PostAction . act ( codinghorror , post , PostActionType . types [ :notify_moderators ] , message : " this is my special long message " ) ;
2013-04-22 15:45:03 +08:00
2013-05-04 08:52:45 +08:00
posts = Post . joins ( :topic )
2013-05-13 09:48:01 +08:00
. select ( 'posts.id, topics.subtype, posts.topic_id' )
2013-05-04 08:52:45 +08:00
. where ( 'topics.archetype' = > Archetype . private_message )
. to_a
2013-04-22 15:45:03 +08:00
posts . count . should == 1
action . related_post_id . should == posts [ 0 ] . id . to_i
posts [ 0 ] . subtype . should == TopicSubtype . notify_moderators
2014-06-25 00:31:36 +08:00
topic = posts [ 0 ] . topic
2014-05-13 03:26:36 +08:00
# Moderators should be invited to the private topic, otherwise they're not permitted to see it
2014-06-25 00:31:36 +08:00
topic_user_ids = topic . topic_users ( true ) . map { | x | x . user_id }
2014-05-13 03:26:36 +08:00
topic_user_ids . should include ( codinghorror . id )
2014-06-25 00:31:36 +08:00
topic_user_ids . should include ( mod . id )
2014-05-13 23:44:23 +08:00
2014-06-25 00:31:36 +08:00
# Notification level should be "Watching" for everyone
topic . topic_users ( true ) . map ( & :notification_level ) . uniq . should == [ TopicUser . notification_levels [ :watching ] ]
2014-05-13 03:26:36 +08:00
2014-07-29 01:17:37 +08:00
# reply to PM should not clear flag
2014-08-18 23:00:14 +08:00
PostCreator . new ( mod , topic_id : posts [ 0 ] . topic_id , raw : " This is my test reply to the user, it should clear flags " ) . create
2013-05-13 09:48:01 +08:00
action . reload
2014-09-25 23:44:48 +08:00
action . deleted_at . should == nil
2014-08-05 01:39:36 +08:00
# Acting on the flag should post an automated status message
topic . posts . count . should == 2
PostAction . agree_flags! ( post , admin )
topic . reload
topic . posts . count . should == 3
topic . posts . last . post_type . should == Post . types [ :moderator_action ]
# Clearing the flags should not post another automated status message
PostAction . act ( mod , post , PostActionType . types [ :notify_moderators ] , message : " another special message " )
PostAction . clear_flags! ( post , admin )
topic . reload
topic . posts . count . should == 3
2013-04-22 15:45:03 +08:00
end
2013-04-17 04:56:18 +08:00
describe 'notify_moderators' do
before do
PostAction . stubs ( :create )
end
2013-09-06 16:03:30 +08:00
it " creates a pm if selected " do
2013-04-22 15:45:03 +08:00
post = build ( :post , id : 1000 )
PostCreator . any_instance . expects ( :create ) . returns ( post )
2013-06-01 05:38:28 +08:00
PostAction . act ( build ( :user ) , build ( :post ) , PostActionType . types [ :notify_moderators ] , message : " this is my special message " ) ;
2013-04-17 04:56:18 +08:00
end
2013-04-12 15:55:45 +08:00
end
2013-04-12 19:09:41 +08:00
2013-04-17 04:56:18 +08:00
describe " notify_user " do
before do
PostAction . stubs ( :create )
post = build ( :post )
post . user = build ( :user )
end
it " sends an email to user if selected " do
2013-04-22 15:45:03 +08:00
PostCreator . any_instance . expects ( :create ) . returns ( build ( :post ) )
2013-06-01 05:38:28 +08:00
PostAction . act ( build ( :user ) , post , PostActionType . types [ :notify_user ] , message : " this is my special message " ) ;
2013-04-17 04:56:18 +08:00
end
2013-04-12 16:14:36 +08:00
end
2013-04-12 15:55:45 +08:00
end
2013-02-26 00:42:20 +08:00
describe " flag counts " do
2013-02-06 03:16:51 +08:00
before do
PostAction . update_flagged_posts_count
2013-02-26 00:42:20 +08:00
end
2013-02-06 03:16:51 +08:00
it " increments the numbers correctly " do
2013-04-22 15:45:03 +08:00
PostAction . flagged_posts_count . should == 0
2013-03-01 20:07:44 +08:00
PostAction . act ( codinghorror , post , PostActionType . types [ :off_topic ] )
2013-02-06 03:16:51 +08:00
PostAction . flagged_posts_count . should == 1
2014-07-29 01:17:37 +08:00
PostAction . clear_flags! ( post , Discourse . system_user )
2013-02-06 03:16:51 +08:00
PostAction . flagged_posts_count . should == 0
end
2013-02-26 00:42:20 +08:00
it " should reset counts when a topic is deleted " do
2013-03-01 20:07:44 +08:00
PostAction . act ( codinghorror , post , PostActionType . types [ :off_topic ] )
2013-05-07 12:39:01 +08:00
post . topic . trash!
2013-02-06 09:13:41 +08:00
PostAction . flagged_posts_count . should == 0
end
2013-02-26 00:42:20 +08:00
2013-06-20 15:42:15 +08:00
it " should ignore validated flags " do
2013-07-22 13:06:53 +08:00
post = create_post
2014-08-19 22:14:17 +08:00
2013-06-20 15:42:15 +08:00
PostAction . act ( codinghorror , post , PostActionType . types [ :off_topic ] )
2014-09-25 23:44:48 +08:00
post . hidden . should == false
2014-06-21 03:03:02 +08:00
post . hidden_at . should be_blank
2014-07-29 01:17:37 +08:00
PostAction . defer_flags! ( post , admin )
2013-06-20 15:42:15 +08:00
PostAction . flagged_posts_count . should == 0
2014-08-19 22:14:17 +08:00
2013-06-20 15:42:15 +08:00
post . reload
2014-09-25 23:44:48 +08:00
post . hidden . should == false
2014-06-21 03:03:02 +08:00
post . hidden_at . should be_blank
2013-06-20 15:42:15 +08:00
2014-04-30 22:58:01 +08:00
PostAction . hide_post! ( post , PostActionType . types [ :off_topic ] )
2014-08-19 22:14:17 +08:00
2013-06-20 15:42:15 +08:00
post . reload
2014-09-25 23:44:48 +08:00
post . hidden . should == true
2014-06-21 03:03:02 +08:00
post . hidden_at . should be_present
2013-06-20 15:42:15 +08:00
end
2013-02-06 03:16:51 +08:00
end
2014-07-29 04:08:31 +08:00
describe " update_counters " do
it " properly updates topic counters " do
PostAction . act ( moderator , post , PostActionType . types [ :like ] )
PostAction . act ( codinghorror , second_post , PostActionType . types [ :like ] )
2014-08-19 22:14:17 +08:00
2014-07-29 04:08:31 +08:00
post . topic . reload
post . topic . like_count . should == 2
end
end
2013-05-04 08:52:45 +08:00
describe " when a user bookmarks something " do
it " increases the post's bookmark count when saved " do
lambda { bookmark . save ; post . reload } . should change ( post , :bookmark_count ) . by ( 1 )
end
2013-02-06 03:16:51 +08:00
2013-05-04 08:52:45 +08:00
it " increases the forum topic's bookmark count when saved " do
lambda { bookmark . save ; post . topic . reload } . should change ( post . topic , :bookmark_count ) . by ( 1 )
end
describe 'when deleted' do
before do
bookmark . save
post . reload
@topic = post . topic
@topic . reload
bookmark . deleted_at = DateTime . now
bookmark . save
end
2013-02-06 03:16:51 +08:00
2013-05-04 08:52:45 +08:00
it 'reduces the bookmark count of the post' do
lambda { post . reload } . should change ( post , :bookmark_count ) . by ( - 1 )
end
it 'reduces the bookmark count of the forum topic' do
lambda { @topic . reload } . should change ( post . topic , :bookmark_count ) . by ( - 1 )
end
end
end
2013-02-26 00:42:20 +08:00
describe 'when a user likes something' do
2013-05-28 00:45:10 +08:00
it 'should increase the `like_count` and `like_score` when a user likes something' do
PostAction . act ( codinghorror , post , PostActionType . types [ :like ] )
post . reload
post . like_count . should == 1
post . like_score . should == 1
post . topic . reload
post . topic . like_count . should == 1
# When a staff member likes it
PostAction . act ( moderator , post , PostActionType . types [ :like ] )
post . reload
post . like_count . should == 2
post . like_score . should == 4
# Removing likes
PostAction . remove_act ( codinghorror , post , PostActionType . types [ :like ] )
post . reload
post . like_count . should == 1
post . like_score . should == 3
PostAction . remove_act ( moderator , post , PostActionType . types [ :like ] )
post . reload
post . like_count . should == 0
post . like_score . should == 0
2013-02-06 03:16:51 +08:00
end
end
2014-07-19 04:14:47 +08:00
describe " undo/redo repeatedly " do
it " doesn't create a second action for the same user/type " do
PostAction . act ( codinghorror , post , PostActionType . types [ :like ] )
PostAction . remove_act ( codinghorror , post , PostActionType . types [ :like ] )
PostAction . act ( codinghorror , post , PostActionType . types [ :like ] )
PostAction . where ( post : post ) . with_deleted . count . should == 1
PostAction . remove_act ( codinghorror , post , PostActionType . types [ :like ] )
# Check that we don't lose consistency into negatives
post . reload . like_count . should == 0
end
end
2013-02-26 00:42:20 +08:00
describe 'when a user votes for something' do
2013-05-04 08:52:45 +08:00
it 'should increase the vote counts when a user votes' do
2013-02-06 03:16:51 +08:00
lambda {
2013-03-01 20:07:44 +08:00
PostAction . act ( codinghorror , post , PostActionType . types [ :vote ] )
2013-02-06 03:16:51 +08:00
post . reload
} . should change ( post , :vote_count ) . by ( 1 )
end
2013-02-26 00:42:20 +08:00
it 'should increase the forum topic vote count when a user votes' do
2013-02-06 03:16:51 +08:00
lambda {
2013-03-01 20:07:44 +08:00
PostAction . act ( codinghorror , post , PostActionType . types [ :vote ] )
2013-02-06 03:16:51 +08:00
post . topic . reload
} . should change ( post . topic , :vote_count ) . by ( 1 )
end
end
describe 'flagging' do
2013-05-11 04:58:23 +08:00
context " flag_counts_for " do
it " returns the correct flag counts " do
2013-07-22 13:06:53 +08:00
post = create_post
2013-05-11 04:58:23 +08:00
SiteSetting . stubs ( :flags_required_to_hide_post ) . returns ( 7 )
# A post with no flags has 0 for flag counts
PostAction . flag_counts_for ( post . id ) . should == [ 0 , 0 ]
2014-08-19 22:14:17 +08:00
flag = PostAction . act ( eviltrout , post , PostActionType . types [ :spam ] )
2013-05-11 04:58:23 +08:00
PostAction . flag_counts_for ( post . id ) . should == [ 0 , 1 ]
2013-06-01 05:38:28 +08:00
# If staff takes action, it is ranked higher
2014-07-29 01:17:37 +08:00
PostAction . act ( admin , post , PostActionType . types [ :spam ] , take_action : true )
2013-05-11 04:58:23 +08:00
PostAction . flag_counts_for ( post . id ) . should == [ 0 , 8 ]
# If a flag is dismissed
PostAction . clear_flags! ( post , admin )
PostAction . flag_counts_for ( post . id ) . should == [ 8 , 0 ]
end
end
2014-08-19 22:14:17 +08:00
it 'does not allow you to flag stuff with the same reason more than once' do
2013-02-07 07:45:58 +08:00
post = Fabricate ( :post )
2014-08-19 22:14:17 +08:00
PostAction . act ( eviltrout , post , PostActionType . types [ :spam ] )
lambda { PostAction . act ( eviltrout , post , PostActionType . types [ :off_topic ] ) } . should raise_error ( PostAction :: AlreadyActed )
2013-05-04 08:52:45 +08:00
end
it 'allows you to flag stuff with another reason' do
post = Fabricate ( :post )
2014-08-19 22:14:17 +08:00
PostAction . act ( eviltrout , post , PostActionType . types [ :spam ] )
PostAction . remove_act ( eviltrout , post , PostActionType . types [ :spam ] )
lambda { PostAction . act ( eviltrout , post , PostActionType . types [ :off_topic ] ) } . should_not raise_error ( )
2013-02-07 07:45:58 +08:00
end
2013-02-26 00:42:20 +08:00
it 'should update counts when you clear flags' do
2013-02-06 03:16:51 +08:00
post = Fabricate ( :post )
2014-08-19 22:14:17 +08:00
PostAction . act ( eviltrout , post , PostActionType . types [ :spam ] )
2013-02-06 03:16:51 +08:00
post . reload
post . spam_count . should == 1
2014-07-29 01:17:37 +08:00
PostAction . clear_flags! ( post , Discourse . system_user )
2013-02-06 03:16:51 +08:00
2014-08-19 22:14:17 +08:00
post . reload
2013-02-06 03:16:51 +08:00
post . spam_count . should == 0
end
2013-02-26 00:42:20 +08:00
it 'should follow the rules for automatic hiding workflow' do
2013-07-22 13:06:53 +08:00
post = create_post
2014-08-19 22:14:17 +08:00
walterwhite = Fabricate ( :walter_white )
2013-02-06 03:16:51 +08:00
2013-06-20 15:42:15 +08:00
SiteSetting . stubs ( :flags_required_to_hide_post ) . returns ( 2 )
2014-08-19 22:14:17 +08:00
Discourse . stubs ( :site_contact_user ) . returns ( admin )
2013-02-06 03:16:51 +08:00
2014-08-19 22:14:17 +08:00
PostAction . act ( eviltrout , post , PostActionType . types [ :spam ] )
PostAction . act ( walterwhite , post , PostActionType . types [ :spam ] )
2013-02-06 03:16:51 +08:00
post . reload
2014-09-25 23:44:48 +08:00
post . hidden . should == true
2014-06-21 03:03:02 +08:00
post . hidden_at . should be_present
2014-07-31 05:35:42 +08:00
post . hidden_reason_id . should == Post . hidden_reasons [ :flag_threshold_reached ]
2014-09-25 23:44:48 +08:00
post . topic . visible . should == false
2013-02-06 03:16:51 +08:00
2014-10-28 05:06:43 +08:00
post . revise ( post . user , { raw : post . raw + " ha I edited it " } )
2014-07-31 05:35:42 +08:00
2013-02-06 03:16:51 +08:00
post . reload
2014-09-25 23:44:48 +08:00
post . hidden . should == false
post . hidden_reason_id . should == nil
2014-06-21 03:03:02 +08:00
post . hidden_at . should be_blank
2014-09-25 23:44:48 +08:00
post . topic . visible . should == true
2013-02-06 03:16:51 +08:00
2014-08-19 22:14:17 +08:00
PostAction . act ( eviltrout , post , PostActionType . types [ :spam ] )
PostAction . act ( walterwhite , post , PostActionType . types [ :off_topic ] )
2013-02-06 03:16:51 +08:00
post . reload
2014-09-25 23:44:48 +08:00
post . hidden . should == true
2014-07-31 05:35:42 +08:00
post . hidden_at . should be_present
2013-03-19 02:59:34 +08:00
post . hidden_reason_id . should == Post . hidden_reasons [ :flag_threshold_reached_again ]
2014-09-25 23:44:48 +08:00
post . topic . visible . should == false
2013-02-06 03:16:51 +08:00
2014-10-28 05:06:43 +08:00
post . revise ( post . user , { raw : post . raw + " ha I edited it again " } )
2013-02-26 00:42:20 +08:00
2013-02-06 03:16:51 +08:00
post . reload
2014-09-25 23:44:48 +08:00
post . hidden . should == true
post . hidden_at . should be_present
2013-03-19 02:59:34 +08:00
post . hidden_reason_id . should == Post . hidden_reasons [ :flag_threshold_reached_again ]
2014-09-25 23:44:48 +08:00
post . topic . visible . should == false
2013-02-06 03:16:51 +08:00
end
2014-02-19 04:18:31 +08:00
2014-10-02 00:53:17 +08:00
it " hide tl0 posts that are flagged as spam by a tl3 user " do
newuser = Fabricate ( :newuser )
post = create_post ( user : newuser )
Discourse . stubs ( :site_contact_user ) . returns ( admin )
PostAction . act ( Fabricate ( :leader ) , post , PostActionType . types [ :spam ] )
post . reload
post . hidden . should == true
post . hidden_at . should be_present
post . hidden_reason_id . should == Post . hidden_reasons [ :flagged_by_tl3_user ]
end
2014-02-19 04:18:31 +08:00
it " can flag the topic instead of a post " do
post1 = create_post
post2 = create_post ( topic : post1 . topic )
2014-08-19 22:14:17 +08:00
post_action = PostAction . act ( Fabricate ( :user ) , post1 , PostActionType . types [ :spam ] , { flag_topic : true } )
2014-02-19 04:18:31 +08:00
post_action . targets_topic . should == true
end
it " will flag the first post if you flag a topic but there is only one post in the topic " do
post = create_post
2014-08-19 22:14:17 +08:00
post_action = PostAction . act ( Fabricate ( :user ) , post , PostActionType . types [ :spam ] , { flag_topic : true } )
2014-02-19 04:18:31 +08:00
post_action . targets_topic . should == false
post_action . post_id . should == post . id
end
2014-08-19 22:14:17 +08:00
it " will unhide the post when a moderator undos the flag on which s/he took action " do
Discourse . stubs ( :site_contact_user ) . returns ( admin )
post = create_post
PostAction . act ( moderator , post , PostActionType . types [ :spam ] , { take_action : true } )
post . reload
post . hidden . should == true
PostAction . remove_act ( moderator , post , PostActionType . types [ :spam ] )
post . reload
post . hidden . should == false
end
2014-12-06 02:37:43 +08:00
it " will automatically close a topic due to large community flagging " do
SiteSetting . stubs ( :flags_required_to_hide_post ) . returns ( 0 )
2014-12-06 23:29:54 +08:00
SiteSetting . stubs ( :num_flags_to_close_topic ) . returns ( 3 )
SiteSetting . stubs ( :num_flaggers_to_close_topic ) . returns ( 2 )
2014-12-06 02:37:43 +08:00
topic = Fabricate ( :topic )
post1 = create_post ( topic : topic )
post2 = create_post ( topic : topic )
post3 = create_post ( topic : topic )
flagger1 = Fabricate ( :user )
flagger2 = Fabricate ( :user )
# reaching `num_flaggers_to_close_topic` isn't enough
2014-12-06 23:29:54 +08:00
[ flagger1 , flagger2 ] . each do | flagger |
2014-12-06 02:37:43 +08:00
PostAction . act ( flagger , post1 , PostActionType . types [ :inappropriate ] )
end
topic . reload . closed . should == false
# clean up
PostAction . where ( post : post1 ) . delete_all
# reaching `num_flags_to_close_topic` isn't enough
2014-12-06 23:29:54 +08:00
[ post1 , post2 , post3 ] . each do | post |
PostAction . act ( flagger1 , post , PostActionType . types [ :inappropriate ] )
2014-12-06 02:37:43 +08:00
end
topic . reload . closed . should == false
# clean up
2014-12-06 23:29:54 +08:00
PostAction . where ( post : [ post1 , post2 , post3 ] ) . delete_all
2014-12-06 02:37:43 +08:00
# reaching both should close the topic
2014-12-06 23:29:54 +08:00
[ flagger1 , flagger2 ] . each do | flagger |
[ post1 , post2 , post3 ] . each do | post |
2014-12-06 02:37:43 +08:00
PostAction . act ( flagger , post , PostActionType . types [ :inappropriate ] )
end
end
topic . reload . closed . should == true
end
2013-02-06 03:16:51 +08:00
end
2013-05-04 08:52:45 +08:00
it " prevents user to act twice at the same time " do
post = Fabricate ( :post )
# flags are already being tested
all_types_except_flags = PostActionType . types . except ( PostActionType . flag_types )
all_types_except_flags . values . each do | action |
lambda do
2014-08-19 22:14:17 +08:00
PostAction . act ( eviltrout , post , action )
PostAction . act ( eviltrout , post , action )
2013-05-04 08:52:45 +08:00
end . should raise_error ( PostAction :: AlreadyActed )
end
end
2013-02-06 03:16:51 +08:00
end