2015-10-11 10:41:23 +01:00
require 'rails_helper'
2013-06-10 15:33:37 -04:00
require 'email/sender'
2013-02-05 14:16:51 -05:00
2013-06-10 15:33:37 -04:00
describe Email :: Sender do
2013-02-05 14:16:51 -05:00
2014-08-23 11:07:37 +02:00
it " doesn't deliver mail when mails are disabled " do
SiteSetting . expects ( :disable_emails ) . returns ( true )
2014-10-15 00:04:47 -07:00
Mail :: Message . any_instance . expects ( :deliver_now ) . never
2014-08-23 11:07:37 +02:00
message = Mail :: Message . new ( to : " hello@world.com " , body : " hello " )
Email :: Sender . new ( message , :hello ) . send
end
2013-02-05 14:16:51 -05:00
it " doesn't deliver mail when the message is nil " do
2014-10-15 00:04:47 -07:00
Mail :: Message . any_instance . expects ( :deliver_now ) . never
2013-06-10 15:33:37 -04:00
Email :: Sender . new ( nil , :hello ) . send
2013-02-05 14:16:51 -05:00
end
it " doesn't deliver when the to address is nil " do
message = Mail :: Message . new ( body : 'hello' )
2014-10-15 00:04:47 -07:00
message . expects ( :deliver_now ) . never
2013-06-10 15:33:37 -04:00
Email :: Sender . new ( message , :hello ) . send
2013-02-05 14:16:51 -05:00
end
it " doesn't deliver when the body is nil " do
message = Mail :: Message . new ( to : 'eviltrout@test.domain' )
2014-10-15 00:04:47 -07:00
message . expects ( :deliver_now ) . never
2013-06-10 15:33:37 -04:00
Email :: Sender . new ( message , :hello ) . send
2013-02-05 14:16:51 -05:00
end
2013-07-08 11:48:40 -04:00
context " host_for " do
it " defaults to localhost " do
2015-01-09 13:34:37 -03:00
expect ( Email :: Sender . host_for ( nil ) ) . to eq ( " localhost " )
2013-07-02 14:13:46 -04:00
end
2013-07-08 11:48:40 -04:00
it " returns localhost for a weird host " do
2015-01-09 13:34:37 -03:00
expect ( Email :: Sender . host_for ( " this is not a real host " ) ) . to eq ( " localhost " )
2013-07-02 14:13:46 -04:00
end
2013-07-08 11:48:40 -04:00
it " parses hosts from urls " do
2015-01-09 13:34:37 -03:00
expect ( Email :: Sender . host_for ( " http://meta.discourse.org " ) ) . to eq ( " meta.discourse.org " )
2013-07-02 14:13:46 -04:00
end
2013-07-08 11:48:40 -04:00
it " downcases hosts " do
2015-01-09 13:34:37 -03:00
expect ( Email :: Sender . host_for ( " http://ForumSite.com " ) ) . to eq ( " forumsite.com " )
2013-07-02 14:13:46 -04:00
end
2013-07-08 11:48:40 -04:00
end
2013-02-05 14:16:51 -05:00
context 'with a valid message' do
2013-06-13 10:56:16 -04:00
let ( :reply_key ) { " abcd " * 8 }
2013-02-25 19:42:20 +03:00
let ( :message ) do
2013-02-05 14:16:51 -05:00
message = Mail :: Message . new to : 'eviltrout@test.domain' ,
body : '**hello**'
2014-10-15 00:04:47 -07:00
message . stubs ( :deliver_now )
2013-02-05 14:16:51 -05:00
message
end
2013-06-10 15:33:37 -04:00
let ( :email_sender ) { Email :: Sender . new ( message , :valid_type ) }
2013-02-05 14:16:51 -05:00
it 'calls deliver' do
2014-10-15 00:04:47 -07:00
message . expects ( :deliver_now ) . once
2013-02-05 14:16:51 -05:00
email_sender . send
end
2014-10-08 23:39:21 +05:30
context " adds a List-ID header to identify the forum " do
before do
2015-10-21 00:00:06 +05:30
category = Fabricate ( :category , name : 'Name With Space' )
topic = Fabricate ( :topic , category_id : category . id )
message . header [ 'X-Discourse-Topic-Id' ] = topic . id
2014-10-08 23:39:21 +05:30
end
When { email_sender . send }
Then { expect ( message . header [ 'List-ID' ] ) . to be_present }
2015-10-21 00:00:06 +05:30
Then { expect ( message . header [ 'List-ID' ] . to_s ) . to match ( 'name-with-space' ) }
2014-10-08 23:39:21 +05:30
end
2013-07-02 14:13:46 -04:00
2015-01-28 14:42:49 +05:30
context " adds a Message-ID header even when topic id is not present " do
When { email_sender . send }
Then { expect ( message . header [ 'Message-ID' ] ) . to be_present }
end
2014-10-09 01:27:30 +05:30
context " adds Precedence header " do
before do
message . header [ 'X-Discourse-Topic-Id' ] = 5577
end
When { email_sender . send }
Then { expect ( message . header [ 'Precedence' ] ) . to be_present }
end
2015-01-29 17:23:10 +05:30
context " removes custom Discourse headers from topic notification mails " do
before do
message . header [ 'X-Discourse-Topic-Id' ] = 5577
end
When { email_sender . send }
Then { expect ( message . header [ 'X-Discourse-Topic-Id' ] ) . not_to be_present }
Then { expect ( message . header [ 'X-Discourse-Post-Id' ] ) . not_to be_present }
Then { expect ( message . header [ 'X-Discourse-Reply-Key' ] ) . not_to be_present }
end
context " removes custom Discourse headers from digest/registration/other mails " do
When { email_sender . send }
Then { expect ( message . header [ 'X-Discourse-Topic-Id' ] ) . not_to be_present }
Then { expect ( message . header [ 'X-Discourse-Post-Id' ] ) . not_to be_present }
Then { expect ( message . header [ 'X-Discourse-Reply-Key' ] ) . not_to be_present }
end
2013-02-05 14:16:51 -05:00
context 'email logs' do
2013-06-13 10:56:16 -04:00
let ( :email_log ) { EmailLog . last }
When { email_sender . send }
Then { expect ( email_log ) . to be_present }
Then { expect ( email_log . email_type ) . to eq ( 'valid_type' ) }
Then { expect ( email_log . to_address ) . to eq ( 'eviltrout@test.domain' ) }
Then { expect ( email_log . reply_key ) . to be_blank }
Then { expect ( email_log . user_id ) . to be_blank }
end
2013-02-05 14:16:51 -05:00
2013-06-13 18:11:10 -04:00
context " email log with a post id and topic id " do
before do
2013-06-18 15:54:02 -04:00
message . header [ 'X-Discourse-Post-Id' ] = 3344
message . header [ 'X-Discourse-Topic-Id' ] = 5577
2013-06-13 18:11:10 -04:00
end
let ( :email_log ) { EmailLog . last }
When { email_sender . send }
Then { expect ( email_log . post_id ) . to eq ( 3344 ) }
Then { expect ( email_log . topic_id ) . to eq ( 5577 ) }
2013-07-08 11:48:40 -04:00
Then { expect ( message . header [ 'In-Reply-To' ] ) . to be_present }
Then { expect ( message . header [ 'References' ] ) . to be_present }
2013-06-13 18:11:10 -04:00
end
2013-06-13 10:56:16 -04:00
context " email log with a reply key " do
2013-02-05 14:16:51 -05:00
before do
2013-06-18 15:54:02 -04:00
message . header [ 'X-Discourse-Reply-Key' ] = reply_key
2013-02-05 14:16:51 -05:00
end
2013-06-13 10:56:16 -04:00
let ( :email_log ) { EmailLog . last }
When { email_sender . send }
Then { expect ( email_log . reply_key ) . to eq ( reply_key ) }
2013-02-05 14:16:51 -05:00
end
2013-06-13 10:56:16 -04:00
context 'email parts' do
When { email_sender . send }
Then { expect ( message ) . to be_multipart }
Then { expect ( message . text_part . content_type ) . to eq ( 'text/plain; charset=UTF-8' ) }
Then { expect ( message . html_part . content_type ) . to eq ( 'text/html; charset=UTF-8' ) }
Then { expect ( message . html_part . body . to_s ) . to match ( " <p><strong>hello</strong></p> " ) }
2013-02-05 14:16:51 -05:00
end
end
context 'with a user' do
2013-02-25 19:42:20 +03:00
let ( :message ) do
2013-02-05 14:16:51 -05:00
message = Mail :: Message . new to : 'eviltrout@test.domain' , body : 'test body'
2014-10-15 00:04:47 -07:00
message . stubs ( :deliver_now )
2013-02-05 14:16:51 -05:00
message
end
let ( :user ) { Fabricate ( :user ) }
2013-06-10 15:33:37 -04:00
let ( :email_sender ) { Email :: Sender . new ( message , :valid_type , user ) }
2013-02-05 14:16:51 -05:00
before do
email_sender . send
@email_log = EmailLog . last
end
it 'should have the current user_id' do
2015-01-09 13:34:37 -03:00
expect ( @email_log . user_id ) . to eq ( user . id )
2013-02-05 14:16:51 -05:00
end
end
end