2015-10-11 10:41:23 +01:00
require 'rails_helper'
2013-02-05 14:16:51 -05:00
describe UserEmailObserver do
2016-01-19 01:39:57 +01:00
let ( :topic ) { Fabricate ( :topic ) }
let ( :post ) { Fabricate ( :post , topic : topic ) }
2015-09-23 15:24:30 +10:00
# something is off with fabricator
2015-11-24 16:58:26 +01:00
def create_notification ( type , user = nil )
2015-09-23 15:24:30 +10:00
user || = Fabricate ( :user )
2016-01-27 12:19:49 +11:00
Notification . create ( data : " { \" a \" : 1} " , user : user , notification_type : type , topic : topic , post_number : post . post_number )
2015-09-23 15:24:30 +10:00
end
2013-02-05 14:16:51 -05:00
2015-11-24 16:58:26 +01:00
shared_examples " enqueue " do
2013-02-05 14:16:51 -05:00
it " enqueues a job for the email " do
2016-01-27 12:19:49 +11:00
Jobs . expects ( :enqueue_in ) . with ( delay , :user_email , UserEmailObserver :: EmailUser . notification_params ( notification , type ) )
UserEmailObserver . process_notification ( notification )
2013-08-26 14:55:35 +10:00
end
2015-11-24 16:58:26 +01:00
context " inactive user " do
2013-02-05 14:16:51 -05:00
2015-11-24 16:58:26 +01:00
before { notification . user . active = false }
it " doesn't enqueue a job " do
2015-11-27 19:09:35 +01:00
Jobs . expects ( :enqueue_in ) . with ( delay , :user_email , has_entry ( type : type ) ) . never
2016-01-27 12:19:49 +11:00
UserEmailObserver . process_notification ( notification )
2015-11-24 16:58:26 +01:00
end
it " enqueues a job if the user is staged " do
notification . user . staged = true
2016-01-27 12:19:49 +11:00
Jobs . expects ( :enqueue_in ) . with ( delay , :user_email , UserEmailObserver :: EmailUser . notification_params ( notification , type ) )
UserEmailObserver . process_notification ( notification )
2015-11-24 16:58:26 +01:00
end
2013-02-05 14:16:51 -05:00
2015-08-31 11:24:37 +05:30
end
2016-01-19 01:39:57 +01:00
context " small action " do
it " doesn't enqueue a job " do
Post . any_instance . expects ( :post_type ) . returns ( Post . types [ :small_action ] )
Jobs . expects ( :enqueue_in ) . with ( delay , :user_email , has_entry ( type : type ) ) . never
2016-01-27 12:19:49 +11:00
UserEmailObserver . process_notification ( notification )
2016-01-19 01:39:57 +01:00
end
end
2013-02-05 14:16:51 -05:00
end
2015-11-24 16:58:26 +01:00
shared_examples " enqueue_public " do
include_examples " enqueue "
2013-02-27 15:38:44 -05:00
2015-11-24 16:58:26 +01:00
it " doesn't enqueue a job if the user has mention emails disabled " do
2016-02-17 15:46:19 +11:00
notification . user . user_option . update_columns ( email_direct : false )
2015-11-27 19:09:35 +01:00
Jobs . expects ( :enqueue_in ) . with ( delay , :user_email , has_entry ( type : type ) ) . never
2016-01-27 12:19:49 +11:00
UserEmailObserver . process_notification ( notification )
2013-02-27 15:38:44 -05:00
end
2015-11-24 16:58:26 +01:00
end
2013-02-27 15:38:44 -05:00
2015-11-24 16:58:26 +01:00
shared_examples " enqueue_private " do
include_examples " enqueue "
2013-02-27 15:38:44 -05:00
2015-11-24 16:58:26 +01:00
it " doesn't enqueue a job if the user has private message emails disabled " do
2016-02-17 15:46:19 +11:00
notification . user . user_option . update_columns ( email_private_messages : false )
2015-11-27 19:09:35 +01:00
Jobs . expects ( :enqueue_in ) . with ( delay , :user_email , has_entry ( type : type ) ) . never
2016-01-27 12:19:49 +11:00
UserEmailObserver . process_notification ( notification )
2015-08-31 11:24:37 +05:30
end
2016-02-01 19:12:10 +01:00
2013-02-27 15:38:44 -05:00
end
2015-11-24 16:58:26 +01:00
context 'user_mentioned' do
let ( :type ) { :user_mentioned }
2015-11-27 19:09:35 +01:00
let ( :delay ) { SiteSetting . email_time_window_mins . minutes }
2015-11-24 16:58:26 +01:00
let! ( :notification ) { create_notification ( 1 ) }
2013-02-05 14:16:51 -05:00
2015-11-24 16:58:26 +01:00
include_examples " enqueue_public "
2013-02-05 14:16:51 -05:00
2015-11-24 16:58:26 +01:00
it " enqueue a delayed job for users that are online " do
notification . user . last_seen_at = 1 . minute . ago
2016-01-27 12:19:49 +11:00
Jobs . expects ( :enqueue_in ) . with ( delay , :user_email , UserEmailObserver :: EmailUser . notification_params ( notification , type ) )
UserEmailObserver . process_notification ( notification )
2013-02-05 14:16:51 -05:00
end
2015-11-24 16:58:26 +01:00
end
2013-02-05 14:16:51 -05:00
2015-11-24 16:58:26 +01:00
context 'user_replied' do
let ( :type ) { :user_replied }
2015-11-27 19:09:35 +01:00
let ( :delay ) { SiteSetting . email_time_window_mins . minutes }
2015-11-24 16:58:26 +01:00
let! ( :notification ) { create_notification ( 2 ) }
2015-08-31 11:24:37 +05:30
2015-11-24 16:58:26 +01:00
include_examples " enqueue_public "
2013-02-05 14:16:51 -05:00
end
context 'user_quoted' do
2015-11-24 16:58:26 +01:00
let ( :type ) { :user_quoted }
2015-11-27 19:09:35 +01:00
let ( :delay ) { SiteSetting . email_time_window_mins . minutes }
2015-09-23 15:24:30 +10:00
let! ( :notification ) { create_notification ( 3 ) }
2015-08-31 11:24:37 +05:30
2015-11-24 16:58:26 +01:00
include_examples " enqueue_public "
2013-02-05 14:16:51 -05:00
end
2016-02-16 18:29:23 +01:00
context 'user_linked' do
let ( :type ) { :user_linked }
let ( :delay ) { SiteSetting . email_time_window_mins . minutes }
let! ( :notification ) { create_notification ( 11 ) }
include_examples " enqueue_public "
end
2015-11-24 16:58:26 +01:00
context 'user_posted' do
let ( :type ) { :user_posted }
2015-11-27 19:09:35 +01:00
let ( :delay ) { SiteSetting . email_time_window_mins . minutes }
2015-11-24 16:58:26 +01:00
let! ( :notification ) { create_notification ( 9 ) }
2015-08-31 11:24:37 +05:30
2015-11-24 16:58:26 +01:00
include_examples " enqueue_public "
2013-02-05 14:16:51 -05:00
end
2015-11-24 16:58:26 +01:00
context 'user_private_message' do
let ( :type ) { :user_private_message }
2016-02-04 17:22:16 +01:00
let ( :delay ) { SiteSetting . private_email_time_window_seconds }
2015-09-23 15:24:30 +10:00
let! ( :notification ) { create_notification ( 6 ) }
2015-06-09 13:05:26 +05:30
2015-11-24 16:58:26 +01:00
include_examples " enqueue_private "
2016-02-01 19:12:10 +01:00
it " doesn't enqueue a job for a small action " do
notification . data_hash [ " original_post_type " ] = Post . types [ :small_action ]
Jobs . expects ( :enqueue_in ) . with ( delay , :user_email , has_entry ( type : type ) ) . never
UserEmailObserver . process_notification ( notification )
end
2015-11-24 16:58:26 +01:00
end
2015-06-09 13:05:26 +05:30
2015-11-24 16:58:26 +01:00
context 'user_invited_to_private_message' do
let ( :type ) { :user_invited_to_private_message }
2016-02-04 17:22:16 +01:00
let ( :delay ) { SiteSetting . private_email_time_window_seconds }
2015-11-24 16:58:26 +01:00
let! ( :notification ) { create_notification ( 7 ) }
2015-08-31 11:24:37 +05:30
2015-11-24 16:58:26 +01:00
include_examples " enqueue_public "
2015-06-09 13:05:26 +05:30
end
2015-03-31 00:06:47 +05:30
context 'user_invited_to_topic' do
2015-11-24 16:58:26 +01:00
let ( :type ) { :user_invited_to_topic }
2016-02-04 17:22:16 +01:00
let ( :delay ) { SiteSetting . private_email_time_window_seconds }
2015-09-23 15:24:30 +10:00
let! ( :notification ) { create_notification ( 13 ) }
2015-08-31 11:24:37 +05:30
2015-11-24 16:58:26 +01:00
include_examples " enqueue_public "
2015-03-31 00:06:47 +05:30
end
2013-08-26 14:55:35 +10:00
end