2013-02-05 14:16:51 -05:00
require 'spec_helper'
describe Notification do
2013-05-14 11:59:55 +10:00
before do
ActiveRecord :: Base . observers . enable :all
end
2013-02-05 14:16:51 -05:00
2015-01-05 13:04:23 -03:00
it { is_expected . to validate_presence_of :notification_type }
it { is_expected . to validate_presence_of :data }
2013-02-05 14:16:51 -05:00
2015-01-05 13:04:23 -03:00
it { is_expected . to belong_to :user }
it { is_expected . to belong_to :topic }
2013-02-05 14:16:51 -05:00
2013-05-14 11:59:55 +10:00
describe 'post' do
let ( :topic ) { Fabricate ( :topic ) }
let ( :post_args ) do
{ user : topic . user , topic : topic }
end
let ( :coding_horror ) { Fabricate ( :coding_horror ) }
describe 'replies' do
2014-03-18 15:22:39 +11:00
def process_alerts ( post )
PostAlerter . post_created ( post )
end
let ( :post ) {
process_alerts ( Fabricate ( :post , post_args . merge ( raw : " Hello @CodingHorror " ) ) )
}
2013-05-14 11:59:55 +10:00
it 'notifies the poster on reply' do
2015-01-05 13:04:23 -03:00
expect {
2014-03-18 15:22:39 +11:00
reply = Fabricate ( :basic_reply , user : coding_horror , topic : post . topic )
process_alerts ( reply )
2015-01-05 13:04:23 -03:00
} . to change ( post . user . notifications , :count ) . by ( 1 )
2013-05-14 11:59:55 +10:00
end
it " doesn't notify the poster when they reply to their own post " do
2015-01-05 13:04:23 -03:00
expect {
2014-03-18 15:22:39 +11:00
reply = Fabricate ( :basic_reply , user : post . user , topic : post . topic )
process_alerts ( reply )
2015-01-05 13:04:23 -03:00
} . not_to change ( post . user . notifications , :count )
2013-05-14 11:59:55 +10:00
end
end
describe 'watching' do
it " does notify watching users of new posts " do
2014-03-18 15:22:39 +11:00
post = PostAlerter . post_created ( Fabricate ( :post , post_args ) )
2013-05-14 11:59:55 +10:00
user2 = Fabricate ( :coding_horror )
post_args [ :topic ] . notify_watch! ( user2 )
2015-01-05 13:04:23 -03:00
expect {
2014-03-18 15:22:39 +11:00
PostAlerter . post_created ( Fabricate ( :post , user : post . user , topic : post . topic ) )
2015-01-05 13:04:23 -03:00
} . to change ( user2 . notifications , :count ) . by ( 1 )
2013-05-14 11:59:55 +10:00
end
end
describe 'muting' do
it " does not notify users of new posts " do
post = Fabricate ( :post , post_args )
user = post_args [ :user ]
user2 = Fabricate ( :coding_horror )
post_args [ :topic ] . notify_muted! ( user )
2015-01-05 13:04:23 -03:00
expect {
2013-05-14 11:59:55 +10:00
Fabricate ( :post , user : user2 , topic : post . topic , raw : 'hello @' + user . username )
2015-01-05 13:04:23 -03:00
} . to change ( user . notifications , :count ) . by ( 0 )
2013-05-14 11:59:55 +10:00
end
end
end
2013-02-05 14:16:51 -05:00
describe 'unread counts' do
let ( :user ) { Fabricate ( :user ) }
2013-02-25 19:42:20 +03:00
context 'a regular notification' do
2013-02-05 14:16:51 -05:00
it 'increases unread_notifications' do
2015-01-05 13:04:23 -03:00
expect { Fabricate ( :notification , user : user ) ; user . reload } . to change ( user , :unread_notifications )
2013-02-05 14:16:51 -05:00
end
2014-10-13 06:26:30 -04:00
it 'increases total_unread_notifications' do
2015-01-05 13:04:23 -03:00
expect { Fabricate ( :notification , user : user ) ; user . reload } . to change ( user , :total_unread_notifications )
2014-10-13 06:26:30 -04:00
end
2013-02-05 14:16:51 -05:00
it " doesn't increase unread_private_messages " do
2015-01-05 13:04:23 -03:00
expect { Fabricate ( :notification , user : user ) ; user . reload } . not_to change ( user , :unread_private_messages )
2013-02-25 19:42:20 +03:00
end
2013-02-05 14:16:51 -05:00
end
context 'a private message' do
it " doesn't increase unread_notifications " do
2015-01-05 13:04:23 -03:00
expect { Fabricate ( :private_message_notification , user : user ) ; user . reload } . not_to change ( user , :unread_notifications )
2013-02-05 14:16:51 -05:00
end
2014-10-13 06:26:30 -04:00
it 'increases total_unread_notifications' do
2015-01-05 13:04:23 -03:00
expect { Fabricate ( :notification , user : user ) ; user . reload } . to change ( user , :total_unread_notifications )
2014-10-13 06:26:30 -04:00
end
2013-02-05 14:16:51 -05:00
it " increases unread_private_messages " do
2015-01-05 13:04:23 -03:00
expect { Fabricate ( :private_message_notification , user : user ) ; user . reload } . to change ( user , :unread_private_messages )
2013-02-25 19:42:20 +03:00
end
2013-02-05 14:16:51 -05:00
end
end
describe 'message bus' do
it 'updates the notification count on create' do
2013-05-16 15:03:03 +10:00
Notification . any_instance . expects ( :refresh_notification_count ) . returns ( nil )
2013-02-05 14:16:51 -05:00
Fabricate ( :notification )
end
context 'destroy' do
let! ( :notification ) { Fabricate ( :notification ) }
it 'updates the notification count on destroy' do
2013-05-16 15:03:03 +10:00
Notification . any_instance . expects ( :refresh_notification_count ) . returns ( nil )
2013-02-25 19:42:20 +03:00
notification . destroy
2013-02-05 14:16:51 -05:00
end
end
end
describe '@mention' do
it " calls email_user_mentioned on creating a notification " do
2013-08-24 12:21:39 +01:00
UserEmailObserver . any_instance . expects ( :after_commit ) . with ( instance_of ( Notification ) )
2013-02-05 14:16:51 -05:00
Fabricate ( :notification )
2013-02-25 19:42:20 +03:00
end
2013-02-05 14:16:51 -05:00
end
describe '@mention' do
it " calls email_user_quoted on creating a quote notification " do
2013-08-24 12:21:39 +01:00
UserEmailObserver . any_instance . expects ( :after_commit ) . with ( instance_of ( Notification ) )
2013-02-05 14:16:51 -05:00
Fabricate ( :quote_notification )
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
describe 'private message' do
before do
2013-02-05 14:16:51 -05:00
@topic = Fabricate ( :private_message_topic )
2013-03-23 20:32:59 +05:30
@post = Fabricate ( :post , topic : @topic , user : @topic . user )
2014-03-18 15:22:39 +11:00
PostAlerter . post_created ( @post )
2013-02-05 14:16:51 -05:00
@target = @post . topic . topic_allowed_users . reject { | a | a . user_id == @post . user_id } [ 0 ] . user
end
2014-01-20 16:18:43 +11:00
it 'should create and rollup private message notifications' do
2015-01-05 13:04:23 -03:00
expect ( @target . notifications . first . notification_type ) . to eq ( Notification . types [ :private_message ] )
expect ( @post . user . unread_notifications ) . to eq ( 0 )
expect ( @post . user . total_unread_notifications ) . to eq ( 0 )
expect ( @target . unread_private_messages ) . to eq ( 1 )
2014-01-20 16:18:43 +11:00
Fabricate ( :post , topic : @topic , user : @topic . user )
@target . reload
2015-01-05 13:04:23 -03:00
expect ( @target . unread_private_messages ) . to eq ( 1 )
2014-01-20 16:18:43 +11:00
2013-02-05 14:16:51 -05:00
end
2014-01-20 16:18:43 +11:00
2013-02-05 14:16:51 -05:00
end
describe '.post' do
let ( :post ) { Fabricate ( :post ) }
let! ( :notification ) { Fabricate ( :notification , user : post . user , topic : post . topic , post_number : post . post_number ) }
it 'returns the post' do
2015-01-05 13:04:23 -03:00
expect ( notification . post ) . to eq ( post )
2013-02-05 14:16:51 -05:00
end
end
describe 'data' do
let ( :notification ) { Fabricate . build ( :notification ) }
2013-02-25 19:42:20 +03:00
2013-02-05 14:16:51 -05:00
it 'should have a data hash' do
2015-01-05 13:04:23 -03:00
expect ( notification . data_hash ) . to be_present
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 'should have the data within the json' do
2015-01-05 13:04:23 -03:00
expect ( notification . data_hash [ :poison ] ) . to eq ( 'ivy' )
2013-02-05 14:16:51 -05:00
end
end
2013-05-16 16:37:47 +10:00
describe 'saw_regular_notification_id' do
it 'correctly updates the read state' do
user = Fabricate ( :user )
2014-01-20 16:18:43 +11:00
Notification . create! ( read : false ,
2013-05-16 16:37:47 +10:00
user_id : user . id ,
topic_id : 2 ,
post_number : 1 ,
2014-02-04 12:57:52 +11:00
data : '{}' ,
2013-05-16 16:37:47 +10:00
notification_type : Notification . types [ :private_message ] )
other = Notification . create! ( read : false ,
user_id : user . id ,
topic_id : 2 ,
post_number : 1 ,
2014-02-04 12:57:52 +11:00
data : '{}' ,
2013-05-16 16:37:47 +10:00
notification_type : Notification . types [ :mentioned ] )
user . saw_notification_id ( other . id )
user . reload
2015-01-05 13:04:23 -03:00
expect ( user . unread_notifications ) . to eq ( 0 )
expect ( user . total_unread_notifications ) . to eq ( 2 )
expect ( user . unread_private_messages ) . to eq ( 1 )
2013-05-16 16:37:47 +10:00
end
end
2013-02-25 19:42:20 +03:00
describe 'mark_posts_read' do
it " marks multiple posts as read if needed " do
2013-02-25 18:42:42 +11:00
user = Fabricate ( :user )
2014-01-20 16:18:43 +11:00
( 1 .. 3 ) . map do | i |
2014-02-04 12:56:28 +11:00
Notification . create! ( read : false , user_id : user . id , topic_id : 2 , post_number : i , data : '{}' , notification_type : 1 )
2013-02-25 18:42:42 +11:00
end
2014-02-04 12:56:28 +11:00
Notification . create! ( read : true , user_id : user . id , topic_id : 2 , post_number : 4 , data : '{}' , notification_type : 1 )
2013-02-25 18:42:42 +11:00
2015-01-05 13:04:23 -03:00
expect ( Notification . mark_posts_read ( user , 2 , [ 1 , 2 , 3 , 4 ] ) ) . to eq ( 3 )
2013-02-25 18:42:42 +11:00
end
end
2014-02-13 17:12:17 +11:00
2013-05-16 17:50:14 +10:00
describe 'ensure consistency' do
it 'deletes notifications if post is missing or deleted' do
ActiveRecord :: Base . observers . disable :all
p = Fabricate ( :post )
p2 = Fabricate ( :post )
Notification . create! ( read : false , user_id : p . user_id , topic_id : p . topic_id , post_number : p . post_number , data : '[]' ,
notification_type : Notification . types [ :private_message ] )
Notification . create! ( read : false , user_id : p2 . user_id , topic_id : p2 . topic_id , post_number : p2 . post_number , data : '[]' ,
notification_type : Notification . types [ :private_message ] )
Notification . create! ( read : false , user_id : p2 . user_id , topic_id : p2 . topic_id , post_number : p2 . post_number , data : '[]' ,
notification_type : Notification . types [ :liked ] )
2013-07-09 15:20:18 -04:00
p2 . trash! ( p . user )
2013-05-16 17:50:14 +10:00
# we may want to make notification "trashable" but for now we nuke pm notifications from deleted topics/posts
Notification . ensure_consistency!
2015-01-05 13:04:23 -03:00
expect ( Notification . count ) . to eq ( 2 )
2013-05-16 17:50:14 +10:00
end
end
2013-02-05 14:16:51 -05:00
end
2014-02-13 17:12:17 +11:00
# pulling this out cause I don't want an observer
describe Notification do
describe '#recent_report' do
let ( :user ) { Fabricate ( :user ) }
let ( :post ) { Fabricate ( :post ) }
def fab ( type , read )
@i || = 0
@i += 1
Notification . create! ( read : read , user_id : user . id , topic_id : post . topic_id , post_number : post . post_number , data : '[]' ,
notification_type : type , created_at : @i . days . from_now )
end
def unread_pm
fab ( Notification . types [ :private_message ] , false )
end
def pm
fab ( Notification . types [ :private_message ] , true )
end
def regular
fab ( Notification . types [ :liked ] , true )
end
it 'orders stuff correctly' do
a = unread_pm
regular
c = pm
d = regular
# bumps unread pms to front of list
notifications = Notification . recent_report ( user , 3 )
2015-01-05 13:04:23 -03:00
expect ( notifications . map { | n | n . id } ) . to eq ( [ a . id , d . id , c . id ] )
2014-02-13 17:12:17 +11:00
end
end
end