2015-10-11 17:41:23 +08:00
require " rails_helper "
2013-02-06 03:16:51 +08:00
describe UserNotifications do
2013-02-26 00:42:20 +08:00
2013-06-19 03:54:02 +08:00
let ( :user ) { Fabricate ( :admin ) }
2013-02-06 03:16:51 +08:00
2014-01-31 13:37:40 +08:00
describe " # get_context_posts " do
it " does not include hidden/deleted/user_deleted posts in context " do
2016-02-12 19:10:30 +08:00
post1 = create_post
2016-02-19 10:56:52 +08:00
_post2 = Fabricate ( :post , topic : post1 . topic , deleted_at : 1 . day . ago )
_post3 = Fabricate ( :post , topic : post1 . topic , user_deleted : true )
_post4 = Fabricate ( :post , topic : post1 . topic , hidden : true )
_post5 = Fabricate ( :post , topic : post1 . topic , post_type : Post . types [ :moderator_action ] )
_post6 = Fabricate ( :post , topic : post1 . topic , post_type : Post . types [ :small_action ] )
_post7 = Fabricate ( :post , topic : post1 . topic , post_type : Post . types [ :whisper ] )
2017-07-28 09:20:09 +08:00
last = Fabricate ( :post , topic : post1 . topic )
2016-02-12 19:10:30 +08:00
2016-02-25 21:05:40 +08:00
post1 . user . user_option . email_previous_replies = UserOption . previous_replies_type [ :always ]
2016-02-12 19:10:30 +08:00
# default is only post #1
2016-02-25 21:05:40 +08:00
expect ( UserNotifications . get_context_posts ( last , nil , post1 . user ) . count ) . to eq ( 1 )
2016-02-12 19:10:30 +08:00
# staff members can also see the whisper
2016-02-25 21:05:40 +08:00
moderator = build ( :moderator )
moderator . user_option = UserOption . new
moderator . user_option . email_previous_replies = UserOption . previous_replies_type [ :always ]
tu = TopicUser . new ( topic : post1 . topic , user : moderator )
expect ( UserNotifications . get_context_posts ( last , tu , tu . user ) . count ) . to eq ( 2 )
2014-01-31 13:37:40 +08:00
end
2016-02-19 10:56:52 +08:00
it " allows users to control context " do
post1 = create_post
2017-07-28 09:20:09 +08:00
_post2 = Fabricate ( :post , topic : post1 . topic )
post3 = Fabricate ( :post , topic : post1 . topic )
2016-02-19 10:56:52 +08:00
user = Fabricate ( :user )
TopicUser . change ( user . id , post1 . topic_id , last_emailed_post_number : 1 )
topic_user = TopicUser . find_by ( user_id : user . id , topic_id : post1 . topic_id )
# to avoid reloads after update_columns
user = topic_user . user
2016-02-25 21:05:40 +08:00
user . user_option . update_columns ( email_previous_replies : UserOption . previous_replies_type [ :unless_emailed ] )
expect ( UserNotifications . get_context_posts ( post3 , topic_user , user ) . count ) . to eq ( 1 )
2016-02-19 10:56:52 +08:00
user . user_option . update_columns ( email_previous_replies : UserOption . previous_replies_type [ :never ] )
2016-02-25 21:05:40 +08:00
expect ( UserNotifications . get_context_posts ( post3 , topic_user , user ) . count ) . to eq ( 0 )
2016-02-19 10:56:52 +08:00
user . user_option . update_columns ( email_previous_replies : UserOption . previous_replies_type [ :always ] )
2016-02-25 21:05:40 +08:00
expect ( UserNotifications . get_context_posts ( post3 , topic_user , user ) . count ) . to eq ( 2 )
2016-02-19 10:56:52 +08:00
2017-04-25 03:26:06 +08:00
SiteSetting . private_email = true
expect ( UserNotifications . get_context_posts ( post3 , topic_user , user ) . count ) . to eq ( 0 )
2016-02-19 10:56:52 +08:00
end
2017-04-25 03:26:06 +08:00
2014-01-31 13:37:40 +08:00
end
2013-02-06 03:16:51 +08:00
describe " .signup " do
2014-10-29 23:06:50 +08:00
2013-02-06 03:16:51 +08:00
subject { UserNotifications . signup ( user ) }
2014-10-29 23:06:50 +08:00
it " works " do
2014-12-31 22:55:03 +08:00
expect ( subject . to ) . to eq ( [ user . email ] )
expect ( subject . subject ) . to be_present
expect ( subject . from ) . to eq ( [ SiteSetting . notification_email ] )
expect ( subject . body ) . to be_present
2014-10-29 23:06:50 +08:00
end
2013-02-06 03:16:51 +08:00
end
describe " .forgot_password " do
2014-10-29 23:06:50 +08:00
2013-02-06 03:16:51 +08:00
subject { UserNotifications . forgot_password ( user ) }
2014-10-29 23:06:50 +08:00
it " works " do
2014-12-31 22:55:03 +08:00
expect ( subject . to ) . to eq ( [ user . email ] )
expect ( subject . subject ) . to be_present
expect ( subject . from ) . to eq ( [ SiteSetting . notification_email ] )
expect ( subject . body ) . to be_present
2014-10-29 23:06:50 +08:00
end
2013-02-06 03:16:51 +08:00
end
2017-04-20 23:17:24 +08:00
describe '.email_login' do
let ( :email_token ) { user . email_tokens . create! ( email : user . email ) . token }
subject { UserNotifications . email_login ( user , email_token : email_token ) }
it " generates the right email " do
expect ( subject . to ) . to eq ( [ user . email ] )
expect ( subject . from ) . to eq ( [ SiteSetting . notification_email ] )
expect ( subject . subject ) . to eq ( I18n . t (
'user_notifications.email_login.subject_template' ,
email_prefix : SiteSetting . title
) )
expect ( subject . body . to_s ) . to match ( I18n . t (
'user_notifications.email_login.text_body_template' ,
site_name : SiteSetting . title ,
base_url : Discourse . base_url ,
email_token : email_token
) )
end
end
2013-06-11 04:46:08 +08:00
describe '.digest' do
2014-10-29 23:06:50 +08:00
2013-02-06 03:16:51 +08:00
subject { UserNotifications . digest ( user ) }
context " without new topics " do
2014-10-29 23:06:50 +08:00
it " doesn't send the email " do
2014-12-31 22:55:03 +08:00
expect ( subject . to ) . to be_blank
2014-10-29 23:06:50 +08:00
end
2013-02-06 03:16:51 +08:00
end
2016-12-20 03:53:53 +08:00
context " with topics only from new users " do
let! ( :new_today ) { Fabricate ( :topic , user : Fabricate ( :user , trust_level : TrustLevel [ 0 ] , created_at : 10 . minutes . ago ) , title : " Hey everyone look at me " ) }
let! ( :new_yesterday ) { Fabricate ( :topic , user : Fabricate ( :user , trust_level : TrustLevel [ 0 ] , created_at : 25 . hours . ago ) , created_at : 25 . hours . ago , title : " This topic is of interest to you " ) }
it " returns topics from new users if they're more than 24 hours old " do
expect ( subject . to ) . to eq ( [ user . email ] )
html = subject . html_part . body . to_s
expect ( html ) . to include ( new_yesterday . title )
expect ( html ) . to_not include ( new_today . title )
end
end
2013-02-06 03:16:51 +08:00
context " with new topics " do
2014-10-29 23:06:50 +08:00
2013-02-06 03:16:51 +08:00
before do
2017-08-15 00:47:33 +08:00
Fabricate ( :topic , user : Fabricate ( :coding_horror ) , created_at : 1 . hour . ago )
2013-02-06 03:16:51 +08:00
end
2014-10-29 23:06:50 +08:00
it " works " do
2014-12-31 22:55:03 +08:00
expect ( subject . to ) . to eq ( [ user . email ] )
expect ( subject . subject ) . to be_present
expect ( subject . from ) . to eq ( [ SiteSetting . notification_email ] )
expect ( subject . html_part . body . to_s ) . to be_present
expect ( subject . text_part . body . to_s ) . to be_present
2016-07-15 17:39:29 +08:00
expect ( subject . header [ " List-Unsubscribe " ] . to_s ) . to match ( / \/ email \/ unsubscribe \/ \ h{64} / )
2013-11-29 06:20:56 +08:00
end
2015-06-04 00:49:51 +08:00
it " includes email_prefix in email subject instead of site title " do
SiteSetting . email_prefix = " Try Discourse "
SiteSetting . title = " Discourse Meta "
expect ( subject . subject ) . to match ( / Try Discourse / )
expect ( subject . subject ) . not_to match ( / Discourse Meta / )
end
2016-11-23 02:23:21 +08:00
it " excludes deleted topics and their posts " do
2017-08-15 00:47:33 +08:00
deleted = Fabricate ( :topic , user : Fabricate ( :user ) , title : " Delete this topic plz " , created_at : 1 . hour . ago )
post = Fabricate ( :post , topic : deleted , score : 100 . 0 , post_number : 2 , raw : " Your wish is my command " , created_at : 1 . hour . ago )
2016-11-23 02:23:21 +08:00
deleted . trash!
html = subject . html_part . body . to_s
expect ( html ) . to_not include deleted . title
expect ( html ) . to_not include post . raw
end
2016-12-02 01:01:23 +08:00
it " excludes whispers and other post types that don't belong " do
2017-08-15 00:47:33 +08:00
t = Fabricate ( :topic , user : Fabricate ( :user ) , title : " Who likes the same stuff I like? " , created_at : 1 . hour . ago )
whisper = Fabricate ( :post , topic : t , score : 100 . 0 , post_number : 2 , raw : " You like weird stuff " , post_type : Post . types [ :whisper ] , created_at : 1 . hour . ago )
mod_action = Fabricate ( :post , topic : t , score : 100 . 0 , post_number : 3 , raw : " This topic unlisted " , post_type : Post . types [ :moderator_action ] , created_at : 1 . hour . ago )
small_action = Fabricate ( :post , topic : t , score : 100 . 0 , post_number : 4 , raw : " A small action " , post_type : Post . types [ :small_action ] , created_at : 1 . hour . ago )
2016-12-02 01:01:23 +08:00
html = subject . html_part . body . to_s
expect ( html ) . to_not include whisper . raw
expect ( html ) . to_not include mod_action . raw
expect ( html ) . to_not include small_action . raw
end
it " excludes deleted and hidden posts " do
2017-08-15 00:47:33 +08:00
t = Fabricate ( :topic , user : Fabricate ( :user ) , title : " Post objectionable stuff here " , created_at : 1 . hour . ago )
deleted = Fabricate ( :post , topic : t , score : 100 . 0 , post_number : 2 , raw : " This post is uncalled for " , deleted_at : 5 . minutes . ago , created_at : 1 . hour . ago )
hidden = Fabricate ( :post , topic : t , score : 100 . 0 , post_number : 3 , raw : " Try to find this post " , hidden : true , hidden_at : 5 . minutes . ago , hidden_reason_id : Post . hidden_reasons [ :flagged_by_tl3_user ] , created_at : 1 . hour . ago )
user_deleted = Fabricate ( :post , topic : t , score : 100 . 0 , post_number : 4 , raw : " I regret this post " , user_deleted : true , created_at : 1 . hour . ago )
2016-12-02 01:01:23 +08:00
html = subject . html_part . body . to_s
expect ( html ) . to_not include deleted . raw
expect ( html ) . to_not include hidden . raw
expect ( html ) . to_not include user_deleted . raw
end
2017-05-04 02:35:13 +08:00
2017-08-15 00:47:33 +08:00
it " excludes posts that are newer than editing grace period " do
SiteSetting . editing_grace_period = 5 . minutes
too_new = Fabricate ( :topic , user : Fabricate ( :user ) , title : " Oops I need to edit this " , created_at : 1 . minute . ago )
too_new_post = Fabricate ( :post , user : too_new . user , topic : too_new , score : 100 . 0 , post_number : 1 , created_at : 1 . minute . ago )
html = subject . html_part . body . to_s
expect ( html ) . to_not include too_new . title
end
2017-05-04 02:35:13 +08:00
it " uses theme color " do
cs = Fabricate ( :color_scheme , name : 'Fancy' , color_scheme_colors : [
Fabricate ( :color_scheme_color , name : 'header_primary' , hex : 'F0F0F0' ) ,
Fabricate ( :color_scheme_color , name : 'header_background' , hex : '1E1E1E' ) ,
Fabricate ( :color_scheme_color , name : 'tertiary' , hex : '858585' )
] )
theme = Theme . create! (
name : 'my name' ,
user_id : Fabricate ( :admin ) . id ,
user_selectable : true ,
color_scheme_id : cs . id
)
theme . set_default!
html = subject . html_part . body . to_s
expect ( html ) . to include 'F0F0F0'
expect ( html ) . to include '1E1E1E'
expect ( html ) . to include '858585'
end
2013-02-06 03:16:51 +08:00
end
2016-11-23 02:23:21 +08:00
2013-02-06 03:16:51 +08:00
end
2013-07-26 15:27:46 +08:00
describe '.user_replied' do
2014-10-21 22:06:55 +08:00
let ( :response_by_user ) { Fabricate ( :user , name : " John Doe " ) }
2014-10-03 19:44:08 +08:00
let ( :category ) { Fabricate ( :category , name : 'India' ) }
let ( :topic ) { Fabricate ( :topic , category : category ) }
2016-02-25 21:05:40 +08:00
let ( :post ) { Fabricate ( :post , topic : topic , raw : 'This is My super duper cool topic' ) }
2017-07-28 09:20:09 +08:00
let ( :response ) { Fabricate ( :post , reply_to_post_number : 1 , topic : post . topic , user : response_by_user ) }
2014-02-12 13:51:26 +08:00
let ( :user ) { Fabricate ( :user ) }
let ( :notification ) { Fabricate ( :notification , user : user ) }
2013-07-26 15:27:46 +08:00
it 'generates a correct email' do
2016-02-25 21:05:40 +08:00
# Fabricator is not fabricating this ...
2015-02-18 03:37:22 +08:00
SiteSetting . enable_names = true
SiteSetting . display_name_on_posts = true
2016-01-27 09:19:49 +08:00
mail = UserNotifications . user_replied ( response . user ,
post : response ,
notification_type : notification . notification_type ,
notification_data_hash : notification . data_hash
)
2014-10-21 22:06:55 +08:00
# from should include full user name
expect ( mail [ :from ] . display_names ) . to eql ( [ 'John Doe' ] )
2014-10-03 19:44:08 +08:00
# subject should include category name
expect ( mail . subject ) . to match ( / India / )
2016-02-25 21:05:40 +08:00
mail_html = mail . html_part . to_s
expect ( mail_html . scan ( / My super duper cool topic / ) . count ) . to eq ( 1 )
expect ( mail_html . scan ( / In Reply To / ) . count ) . to eq ( 1 )
2016-02-09 16:09:10 +08:00
# 2 "visit topic" link
2016-02-25 21:05:40 +08:00
expect ( mail_html . scan ( / Visit Topic / ) . count ) . to eq ( 2 )
2016-02-09 16:09:10 +08:00
2013-07-26 15:27:46 +08:00
# 2 respond to links cause we have 1 context post
2016-02-25 21:05:40 +08:00
expect ( mail_html . scan ( / to respond / ) . count ) . to eq ( 2 )
2013-07-26 15:27:46 +08:00
# 1 unsubscribe
2016-02-25 21:05:40 +08:00
expect ( mail_html . scan ( / To unsubscribe / ) . count ) . to eq ( 1 )
2013-07-26 15:27:46 +08:00
2013-12-30 10:02:12 +08:00
# side effect, topic user is updated with post number
tu = TopicUser . get ( post . topic_id , response . user )
2014-12-31 22:55:03 +08:00
expect ( tu . last_emailed_post_number ) . to eq ( response . post_number )
2016-02-25 21:05:40 +08:00
# no In Reply To if user opts out
response . user . user_option . email_in_reply_to = false
mail = UserNotifications . user_replied ( response . user ,
post : response ,
notification_type : notification . notification_type ,
notification_data_hash : notification . data_hash
)
expect ( mail . html_part . to_s . scan ( / In Reply To / ) . count ) . to eq ( 0 )
2016-11-14 08:09:24 +08:00
SiteSetting . enable_names = true
SiteSetting . display_name_on_posts = true
SiteSetting . prioritize_username_in_ux = false
response . user . username = " bobmarley "
response . user . name = " Bob Marley "
response . user . save
mail = UserNotifications . user_replied ( response . user ,
post : response ,
notification_type : notification . notification_type ,
notification_data_hash : notification . data_hash
)
mail_html = mail . html_part . to_s
expect ( mail_html . scan ( / >Bob Marley / ) . count ) . to eq ( 1 )
expect ( mail_html . scan ( / >bobmarley / ) . count ) . to eq ( 0 )
SiteSetting . prioritize_username_in_ux = true
mail = UserNotifications . user_replied ( response . user ,
post : response ,
notification_type : notification . notification_type ,
notification_data_hash : notification . data_hash
)
mail_html = mail . html_part . to_s
expect ( mail_html . scan ( / >Bob Marley / ) . count ) . to eq ( 0 )
expect ( mail_html . scan ( / >bobmarley / ) . count ) . to eq ( 1 )
2013-07-26 15:27:46 +08:00
end
2017-04-25 03:26:06 +08:00
it " doesn't include details when private_email is enabled " do
SiteSetting . private_email = true
mail = UserNotifications . user_replied (
response . user ,
post : response ,
notification_type : notification . notification_type ,
notification_data_hash : notification . data_hash
)
expect ( mail . html_part . to_s ) . to_not include ( response . raw )
expect ( mail . html_part . to_s ) . to_not include ( topic . url )
expect ( mail . text_part . to_s ) . to_not include ( response . raw )
expect ( mail . text_part . to_s ) . to_not include ( topic . url )
end
2013-07-26 15:27:46 +08:00
end
2014-09-29 13:16:55 +08:00
describe '.user_posted' do
2014-12-03 15:42:05 +08:00
let ( :response_by_user ) { Fabricate ( :user , name : " John Doe " , username : " john " ) }
2014-09-29 13:16:55 +08:00
let ( :post ) { Fabricate ( :post ) }
2017-07-28 09:20:09 +08:00
let ( :response ) { Fabricate ( :post , topic : post . topic , user : response_by_user ) }
2014-09-29 13:16:55 +08:00
let ( :user ) { Fabricate ( :user ) }
2017-07-28 09:20:09 +08:00
let ( :notification ) { Fabricate ( :notification , user : user , data : { original_username : response_by_user . username } . to_json ) }
2014-09-29 13:16:55 +08:00
it 'generates a correct email' do
2015-02-18 03:37:22 +08:00
SiteSetting . enable_names = false
2016-01-27 09:19:49 +08:00
mail = UserNotifications . user_posted ( response . user ,
post : response ,
notification_type : notification . notification_type ,
notification_data_hash : notification . data_hash
)
2014-09-29 13:16:55 +08:00
2014-10-21 22:06:55 +08:00
# from should not include full user name if "show user full names" is disabled
expect ( mail [ :from ] . display_names ) . to_not eql ( [ 'John Doe' ] )
2014-12-03 15:42:05 +08:00
# from should include username if "show user full names" is disabled
expect ( mail [ :from ] . display_names ) . to eql ( [ 'john' ] )
2014-10-03 19:44:08 +08:00
# subject should not include category name
expect ( mail . subject ) . not_to match ( / Uncategorized / )
2016-02-25 21:05:40 +08:00
# 1 respond to links as no context by default
expect ( mail . html_part . to_s . scan ( / to respond / ) . count ) . to eq ( 1 )
2014-09-29 13:16:55 +08:00
# 1 unsubscribe link
2014-12-31 22:55:03 +08:00
expect ( mail . html_part . to_s . scan ( / To unsubscribe / ) . count ) . to eq ( 1 )
2014-09-29 13:16:55 +08:00
# side effect, topic user is updated with post number
tu = TopicUser . get ( post . topic_id , response . user )
2014-12-31 22:55:03 +08:00
expect ( tu . last_emailed_post_number ) . to eq ( response . post_number )
2014-09-29 13:16:55 +08:00
end
2017-04-25 03:26:06 +08:00
it " doesn't include details when private_email is enabled " do
SiteSetting . private_email = true
mail = UserNotifications . user_posted (
response . user ,
post : response ,
notification_type : notification . notification_type ,
notification_data_hash : notification . data_hash
)
expect ( mail . html_part . to_s ) . to_not include ( response . raw )
expect ( mail . text_part . to_s ) . to_not include ( response . raw )
end
2014-09-29 13:16:55 +08:00
end
describe '.user_private_message' do
2014-12-03 15:42:05 +08:00
let ( :response_by_user ) { Fabricate ( :user , name : " " , username : " john " ) }
2014-09-29 13:16:55 +08:00
let ( :topic ) { Fabricate ( :private_message_topic ) }
2017-07-28 09:20:09 +08:00
let ( :response ) { Fabricate ( :post , topic : topic , user : response_by_user ) }
2014-09-29 13:16:55 +08:00
let ( :user ) { Fabricate ( :user ) }
2017-07-28 09:20:09 +08:00
let ( :notification ) { Fabricate ( :notification , user : user , data : { original_username : response_by_user . username } . to_json ) }
2014-09-29 13:16:55 +08:00
it 'generates a correct email' do
2015-02-18 03:37:22 +08:00
SiteSetting . enable_names = true
2016-01-27 09:19:49 +08:00
mail = UserNotifications . user_private_message (
response . user ,
post : response ,
notification_type : notification . notification_type ,
notification_data_hash : notification . data_hash
)
2014-09-29 13:16:55 +08:00
2014-12-03 15:42:05 +08:00
# from should include username if full user name is not provided
expect ( mail [ :from ] . display_names ) . to eql ( [ 'john' ] )
2014-10-21 22:06:55 +08:00
2014-09-29 13:16:55 +08:00
# subject should include "[PM]"
2018-02-19 17:20:17 +08:00
expect ( mail . subject ) . to include ( " [PM] " )
2014-09-29 13:16:55 +08:00
2016-02-09 16:09:10 +08:00
# 1 "visit message" link
expect ( mail . html_part . to_s . scan ( / Visit Message / ) . count ) . to eq ( 1 )
2014-09-29 13:16:55 +08:00
# 1 respond to link
2016-01-12 10:56:58 +08:00
expect ( mail . html_part . to_s . scan ( / to respond / ) . count ) . to eq ( 1 )
2014-09-29 13:16:55 +08:00
# 1 unsubscribe link
2014-12-31 22:55:03 +08:00
expect ( mail . html_part . to_s . scan ( / To unsubscribe / ) . count ) . to eq ( 1 )
2014-09-29 13:16:55 +08:00
# side effect, topic user is updated with post number
tu = TopicUser . get ( topic . id , response . user )
2014-12-31 22:55:03 +08:00
expect ( tu . last_emailed_post_number ) . to eq ( response . post_number )
2014-09-29 13:16:55 +08:00
end
2017-04-25 03:26:06 +08:00
it " doesn't include details when private_email is enabled " do
SiteSetting . private_email = true
mail = UserNotifications . user_private_message (
response . user ,
post : response ,
notification_type : notification . notification_type ,
notification_data_hash : notification . data_hash
)
expect ( mail . html_part . to_s ) . to_not include ( response . raw )
expect ( mail . html_part . to_s ) . to_not include ( topic . url )
expect ( mail . text_part . to_s ) . to_not include ( response . raw )
expect ( mail . text_part . to_s ) . to_not include ( topic . url )
end
2018-02-19 17:20:17 +08:00
it " doesn't include group name in subject " do
group = Fabricate ( :group )
topic . allowed_groups = [ group ]
mail = UserNotifications . user_private_message (
response . user ,
post : response ,
notification_type : notification . notification_type ,
notification_data_hash : notification . data_hash
)
expect ( mail . subject ) . to include ( " [PM] " )
end
2018-05-04 06:50:06 +08:00
it " includes a list of participants, groups first with member lists " do
2018-05-07 11:25:01 +08:00
group1 = Fabricate ( :group , name : " group1 " )
group2 = Fabricate ( :group , name : " group2 " )
user1 = Fabricate ( :user , username : " one " , groups : [ group1 , group2 ] )
user2 = Fabricate ( :user , username : " two " , groups : [ group1 ] )
topic . allowed_users = [ user1 , user2 ]
topic . allowed_groups = [ group1 , group2 ]
2018-05-04 06:50:06 +08:00
mail = UserNotifications . user_private_message (
response . user ,
post : response ,
notification_type : notification . notification_type ,
notification_data_hash : notification . data_hash
)
expect ( mail . body ) . to include ( " #{ I18n . t ( " user_notifications.pm_participants " ) } [group1 (2)](http://test.localhost/groups/group1), [group2 (1)](http://test.localhost/groups/group2), [one](http://test.localhost/u/one), [two](http://test.localhost/u/two) " )
end
2018-02-19 17:20:17 +08:00
context " when SiteSetting.group_name_in_subject is true " do
before do
SiteSetting . group_in_subject = true
end
let ( :group ) { Fabricate ( :group , name : " my_group " ) }
let ( :mail ) { UserNotifications . user_private_message (
response . user ,
post : response ,
notification_type : notification . notification_type ,
notification_data_hash : notification . data_hash
) }
shared_examples " includes first group name " do
it " includes first group name in subject " do
expect ( mail . subject ) . to include ( " [my_group] " )
end
context " when first group has full name " do
it " includes full name in subject " do
group . full_name = " My Group "
group . save
expect ( mail . subject ) . to include ( " [My Group] " )
end
end
end
context " one group in pm " do
before do
topic . allowed_groups = [ group ]
end
include_examples " includes first group name "
end
context " multiple groups in pm " do
let ( :group2 ) { Fabricate ( :group ) }
before do
topic . allowed_groups = [ group , group2 ]
end
include_examples " includes first group name "
end
2018-03-11 20:22:11 +08:00
context " no groups in pm " do
it " includes %{optional_pm} in subject " do
expect ( mail . subject ) . to include ( " [PM] " )
end
end
2018-02-19 17:20:17 +08:00
end
2014-09-29 13:16:55 +08:00
end
2013-02-06 03:16:51 +08:00
2016-03-23 12:08:34 +08:00
it 'adds a warning when mail limit is reached' do
SiteSetting . max_emails_per_day_per_user = 2
user = Fabricate ( :user )
user . email_logs . create ( email_type : 'blah' , to_address : user . email , user_id : user . id , skipped : false )
post = Fabricate ( :post )
reply = Fabricate ( :post , topic_id : post . topic_id )
notification = Fabricate ( :notification , topic_id : post . topic_id , post_number : reply . post_number ,
2017-07-28 09:20:09 +08:00
user : post . user , data : { original_username : 'bob' } . to_json )
2016-03-23 12:08:34 +08:00
mail = UserNotifications . user_replied (
user ,
post : reply ,
notification_type : notification . notification_type ,
notification_data_hash : notification . data_hash
)
# WARNING: you reached the limit of 100 email notifications per day. Further emails will be suppressed.
# Consider watching less topics or disabling mailing list mode.
2017-05-17 19:30:13 +08:00
expect ( mail . html_part . to_s ) . to match ( I18n . t ( " user_notifications.reached_limit " , count : 2 ) )
expect ( mail . body . to_s ) . to match ( I18n . t ( " user_notifications.reached_limit " , count : 2 ) )
2016-03-23 12:08:34 +08:00
end
2013-06-13 04:35:46 +08:00
def expects_build_with ( condition )
UserNotifications . any_instance . expects ( :build_email ) . with ( user . email , condition )
2016-01-27 09:19:49 +08:00
mailer = UserNotifications . send ( mail_type , user ,
notification_type : Notification . types [ notification . notification_type ] ,
notification_data_hash : notification . data_hash ,
post : notification . post )
mailer . message
2013-06-13 04:35:46 +08:00
end
shared_examples " supports reply by email " do
context " reply_by_email " do
it " should have allow_reply_by_email set when that feature is enabled " do
expects_build_with ( has_entry ( :allow_reply_by_email , true ) )
end
end
end
shared_examples " no reply by email " do
context " reply_by_email " do
2013-06-13 22:56:16 +08:00
it " doesn't support reply by email " do
2013-06-13 04:35:46 +08:00
expects_build_with ( Not ( has_entry ( :allow_reply_by_email , true ) ) )
end
end
end
2017-04-25 03:26:06 +08:00
shared_examples " respect for private_email " do
context " private_email " do
it " doesn't support reply by email " do
SiteSetting . private_email = true
mailer = UserNotifications . send (
mail_type ,
user ,
notification_type : Notification . types [ notification . notification_type ] ,
notification_data_hash : notification . data_hash ,
post : notification . post
)
message = mailer . message
topic = notification . post . topic
expect ( message . html_part . body . to_s ) . not_to include ( topic . title )
expect ( message . html_part . body . to_s ) . not_to include ( topic . slug )
expect ( message . text_part . body . to_s ) . not_to include ( topic . title )
expect ( message . text_part . body . to_s ) . not_to include ( topic . slug )
end
end
end
2016-02-10 07:54:13 +08:00
# The parts of emails that are derived from templates are translated
shared_examples " sets user locale " do
context " set locale for translating templates " do
it " sets the locale " do
expects_build_with ( has_key ( :locale ) )
end
end
end
2013-06-13 04:35:46 +08:00
shared_examples " notification email building " do
2013-02-06 03:16:51 +08:00
let ( :post ) { Fabricate ( :post , user : user ) }
2017-07-28 09:20:09 +08:00
let ( :mail_type ) { " user_ #{ notification_type } " }
2017-07-26 14:51:44 +08:00
let ( :mail_template ) { " user_notifications. #{ mail_type } " }
2017-07-28 09:20:09 +08:00
let ( :username ) { " walterwhite " }
2013-02-06 03:16:51 +08:00
let ( :notification ) do
2013-06-13 04:35:46 +08:00
Fabricate ( :notification ,
user : user ,
topic : post . topic ,
notification_type : Notification . types [ notification_type ] ,
post_number : post . post_number ,
2017-07-28 09:20:09 +08:00
data : { original_username : username } . to_json )
2013-02-06 03:16:51 +08:00
end
2017-03-11 03:07:41 +08:00
describe 'email building' do
2013-06-13 04:35:46 +08:00
it " has a username " do
expects_build_with ( has_entry ( :username , username ) )
end
2013-02-06 03:16:51 +08:00
2013-06-13 04:35:46 +08:00
it " has a url " do
expects_build_with ( has_key ( :url ) )
end
it " has a template " do
2017-07-26 14:51:44 +08:00
expects_build_with ( has_entry ( :template , mail_template ) )
2013-06-13 04:35:46 +08:00
end
2017-03-11 03:07:41 +08:00
it " overrides the html part " do
expects_build_with ( has_key ( :html_override ) )
end
2013-06-13 04:35:46 +08:00
it " has a message " do
2013-07-23 03:06:37 +08:00
expects_build_with ( has_key ( :message ) )
end
it " has a context " do
expects_build_with ( has_key ( :context ) )
2013-06-13 04:35:46 +08:00
end
2013-02-28 07:30:14 +08:00
2013-06-13 04:35:46 +08:00
it " has an unsubscribe link " do
expects_build_with ( has_key ( :add_unsubscribe_link ) )
end
2013-06-14 06:11:10 +08:00
it " has an post_id " do
expects_build_with ( has_key ( :post_id ) )
end
it " has an topic_id " do
expects_build_with ( has_key ( :topic_id ) )
end
2015-02-18 03:37:22 +08:00
it " should have user name as from_alias " do
SiteSetting . enable_names = true
SiteSetting . display_name_on_posts = true
2014-10-21 22:06:55 +08:00
expects_build_with ( has_entry ( :from_alias , " #{ user . name } " ) )
2013-06-13 04:35:46 +08:00
end
2014-05-07 03:01:19 +08:00
2015-02-18 03:37:22 +08:00
it " should not have user name as from_alias if display_name_on_posts is disabled " do
SiteSetting . enable_names = false
SiteSetting . display_name_on_posts = false
expects_build_with ( has_entry ( :from_alias , " walterwhite " ) )
end
2014-05-07 03:01:19 +08:00
it " should explain how to respond " do
expects_build_with ( Not ( has_entry ( :include_respond_instructions , false ) ) )
end
it " should not explain how to respond if the user is suspended " do
User . any_instance . stubs ( :suspended? ) . returns ( true )
expects_build_with ( has_entry ( :include_respond_instructions , false ) )
end
2017-03-11 03:07:41 +08:00
context " when customized " do
2017-06-16 08:39:54 +08:00
let ( :custom_body ) do
body = << ~ BODY
You are now officially notified .
%{ header_instructions }
%{ message } %{ respond_instructions }
2017-11-20 16:10:06 +08:00
%{ topic_title_url_encoded }
%{ site_title_url_encoded }
2017-06-16 08:39:54 +08:00
BODY
body << " %{context} " if notification_type != :invited_to_topic
body
end
2017-03-11 03:07:41 +08:00
before do
2017-07-26 14:51:44 +08:00
TranslationOverride . upsert! (
" en " ,
" #{ mail_template } .text_body_template " ,
custom_body
)
2017-03-11 03:07:41 +08:00
end
it " shouldn't use the default html_override " do
expects_build_with ( Not ( has_key ( :html_override ) ) )
end
end
2013-02-28 07:30:14 +08:00
end
2013-06-13 04:35:46 +08:00
end
2013-02-28 07:30:14 +08:00
2013-06-13 04:35:46 +08:00
describe " user mentioned email " do
include_examples " notification email building " do
let ( :notification_type ) { :mentioned }
2017-04-25 03:26:06 +08:00
include_examples " respect for private_email "
2013-06-13 04:35:46 +08:00
include_examples " supports reply by email "
2016-02-10 07:54:13 +08:00
include_examples " sets user locale "
2013-06-13 04:35:46 +08:00
end
end
2013-02-28 07:30:14 +08:00
2013-06-13 04:35:46 +08:00
describe " user replied " do
include_examples " notification email building " do
let ( :notification_type ) { :replied }
2017-04-25 03:26:06 +08:00
include_examples " respect for private_email "
2013-06-13 04:35:46 +08:00
include_examples " supports reply by email "
2016-02-10 07:54:13 +08:00
include_examples " sets user locale "
2013-06-13 04:35:46 +08:00
end
2013-02-06 03:16:51 +08:00
end
2013-06-13 04:35:46 +08:00
describe " user quoted " do
include_examples " notification email building " do
let ( :notification_type ) { :quoted }
2017-04-25 03:26:06 +08:00
include_examples " respect for private_email "
2013-06-13 04:35:46 +08:00
include_examples " supports reply by email "
2016-02-10 07:54:13 +08:00
include_examples " sets user locale "
2013-06-13 04:35:46 +08:00
end
end
describe " user posted " do
include_examples " notification email building " do
let ( :notification_type ) { :posted }
2017-04-25 03:26:06 +08:00
include_examples " respect for private_email "
2013-06-13 04:35:46 +08:00
include_examples " supports reply by email "
2016-02-10 07:54:13 +08:00
include_examples " sets user locale "
2013-06-13 04:35:46 +08:00
end
end
describe " user invited to a private message " do
include_examples " notification email building " do
let ( :notification_type ) { :invited_to_private_message }
2017-07-26 14:51:44 +08:00
let ( :post ) { Fabricate ( :private_message_post ) }
let ( :user ) { post . user }
let ( :mail_template ) { " user_notifications.user_ #{ notification_type } _pm " }
include_examples " respect for private_email "
include_examples " no reply by email "
include_examples " sets user locale "
end
end
describe " group invited to a private message " do
include_examples " notification email building " do
let ( :notification_type ) { :invited_to_private_message }
let ( :post ) { Fabricate ( :private_message_post ) }
let ( :user ) { post . user }
let ( :group ) { Fabricate ( :group ) }
let ( :mail_template ) { " user_notifications.user_ #{ notification_type } _pm_group " }
before do
notification . data_hash [ :group_id ] = group . id
notification . save!
end
it " should include the group name " do
expects_build_with ( has_entry ( :group_name , group . name ) )
end
2017-04-25 03:26:06 +08:00
include_examples " respect for private_email "
2013-06-13 04:35:46 +08:00
include_examples " no reply by email "
2016-02-10 07:54:13 +08:00
include_examples " sets user locale "
2013-06-13 04:35:46 +08:00
end
end
2015-03-31 02:36:47 +08:00
describe " user invited to a topic " do
include_examples " notification email building " do
let ( :notification_type ) { :invited_to_topic }
2017-04-25 03:26:06 +08:00
include_examples " respect for private_email "
2016-07-08 00:23:19 +08:00
include_examples " no reply by email "
include_examples " sets user locale "
end
end
describe " watching first post " do
include_examples " notification email building " do
let ( :notification_type ) { :invited_to_topic }
2017-04-25 03:26:06 +08:00
include_examples " respect for private_email "
2015-03-31 02:36:47 +08:00
include_examples " no reply by email "
2016-02-10 07:54:13 +08:00
include_examples " sets user locale "
2015-03-31 02:36:47 +08:00
end
end
2016-02-10 07:54:13 +08:00
# notification emails derived from templates are translated into the user's locale
shared_examples " notification derived from template " do
let ( :user ) { Fabricate ( :user , locale : locale ) }
let ( :mail_type ) { mail_type }
let ( :notification ) { Fabricate ( :notification , user : user ) }
end
describe " notifications from template " do
context " user locale has been set " do
2016-03-08 03:40:11 +08:00
%w( signup signup_after_approval confirm_old_email notify_old_email confirm_new_email
forgot_password admin_login account_created ) . each do | mail_type |
2016-02-10 07:54:13 +08:00
include_examples " notification derived from template " do
SiteSetting . default_locale = " en "
let ( :locale ) { " fr " }
let ( :mail_type ) { mail_type }
it " sets the locale " do
expects_build_with ( has_entry ( :locale , " fr " ) )
end
end
end
end
context " user locale has not been set " do
2016-03-08 03:40:11 +08:00
%w( signup signup_after_approval notify_old_email confirm_old_email confirm_new_email
forgot_password admin_login account_created ) . each do | mail_type |
2016-02-10 07:54:13 +08:00
include_examples " notification derived from template " do
SiteSetting . default_locale = " en "
let ( :locale ) { nil }
let ( :mail_type ) { mail_type }
it " sets the locale " do
expects_build_with ( has_entry ( :locale , nil ) )
end
end
end
end
2016-03-05 05:21:30 +08:00
2016-03-05 12:20:58 +08:00
context " user locale is an empty string " do
2016-03-08 03:40:11 +08:00
%w( signup signup_after_approval notify_old_email confirm_new_email confirm_old_email
forgot_password admin_login account_created ) . each do | mail_type |
2016-03-05 05:21:30 +08:00
include_examples " notification derived from template " do
SiteSetting . default_locale = " en "
2016-03-05 12:20:58 +08:00
let ( :locale ) { " " }
2016-03-05 05:21:30 +08:00
let ( :mail_type ) { mail_type }
it " sets the locale " do
expects_build_with ( has_entry ( :locale , nil ) )
end
end
end
end
2016-02-10 07:54:13 +08:00
end
2013-02-06 03:16:51 +08:00
end