2007-02-02 17:47:40 +03:00
# redMine - project management software
# Copyright (C) 2006-2007 Jean-Philippe Lang
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require File . dirname ( __FILE__ ) + '/../test_helper'
2009-09-13 21:14:35 +04:00
class MailerTest < ActiveSupport :: TestCase
2009-02-21 14:04:50 +03:00
include Redmine :: I18n
2009-11-14 22:40:56 +03:00
include ActionController :: Assertions :: SelectorAssertions
2010-08-05 21:05:04 +04:00
fixtures :projects , :enabled_modules , :issues , :users , :members , :member_roles , :roles , :documents , :attachments , :news , :tokens , :journals , :changesets , :trackers , :issue_statuses , :enumerations , :messages , :boards , :repositories
2010-02-20 13:07:53 +03:00
def setup
ActionMailer :: Base . deliveries . clear
Setting . host_name = 'mydomain.foo'
Setting . protocol = 'http'
end
2008-02-17 17:17:20 +03:00
def test_generated_links_in_emails
Setting . host_name = 'mydomain.foo'
Setting . protocol = 'https'
journal = Journal . find ( 2 )
assert Mailer . deliver_issue_edit ( journal )
mail = ActionMailer :: Base . deliveries . last
assert_kind_of TMail :: Mail , mail
2009-01-26 04:47:51 +03:00
2009-11-14 22:40:56 +03:00
assert_select_email do
# link to the main ticket
assert_select " a[href=?] " , " https://mydomain.foo/issues/1 " , :text = > " Bug # 1: Can't print recipes "
# link to a referenced ticket
assert_select " a[href=?][title=?] " , " https://mydomain.foo/issues/2 " , " Add ingredients categories (Assigned) " , :text = > " # 2 "
# link to a changeset
assert_select " a[href=?][title=?] " , " https://mydomain.foo/projects/ecookbook/repository/revisions/2 " , " This commit fixes # 1, # 2 and references # 1 & # 3 " , :text = > " r2 "
end
2008-02-17 17:17:20 +03:00
end
2008-11-08 16:25:45 +03:00
def test_generated_links_with_prefix
2009-01-04 20:09:25 +03:00
relative_url_root = Redmine :: Utils . relative_url_root
2008-11-08 16:25:45 +03:00
Setting . host_name = 'mydomain.foo/rdm'
Setting . protocol = 'http'
2009-01-04 20:09:25 +03:00
Redmine :: Utils . relative_url_root = '/rdm'
2008-11-08 16:25:45 +03:00
journal = Journal . find ( 2 )
assert Mailer . deliver_issue_edit ( journal )
mail = ActionMailer :: Base . deliveries . last
assert_kind_of TMail :: Mail , mail
2009-11-14 22:40:56 +03:00
assert_select_email do
# link to the main ticket
assert_select " a[href=?] " , " http://mydomain.foo/rdm/issues/1 " , :text = > " Bug # 1: Can't print recipes "
# link to a referenced ticket
assert_select " a[href=?][title=?] " , " http://mydomain.foo/rdm/issues/2 " , " Add ingredients categories (Assigned) " , :text = > " # 2 "
# link to a changeset
assert_select " a[href=?][title=?] " , " http://mydomain.foo/rdm/projects/ecookbook/repository/revisions/2 " , " This commit fixes # 1, # 2 and references # 1 & # 3 " , :text = > " r2 "
end
2008-11-08 16:25:45 +03:00
ensure
# restore it
2009-01-04 20:09:25 +03:00
Redmine :: Utils . relative_url_root = relative_url_root
2008-11-08 16:25:45 +03:00
end
def test_generated_links_with_prefix_and_no_relative_url_root
2009-01-04 20:09:25 +03:00
relative_url_root = Redmine :: Utils . relative_url_root
2008-11-08 16:25:45 +03:00
Setting . host_name = 'mydomain.foo/rdm'
Setting . protocol = 'http'
2009-01-04 20:09:25 +03:00
Redmine :: Utils . relative_url_root = nil
2008-11-08 16:25:45 +03:00
journal = Journal . find ( 2 )
assert Mailer . deliver_issue_edit ( journal )
mail = ActionMailer :: Base . deliveries . last
assert_kind_of TMail :: Mail , mail
2009-11-14 22:40:56 +03:00
assert_select_email do
# link to the main ticket
assert_select " a[href=?] " , " http://mydomain.foo/rdm/issues/1 " , :text = > " Bug # 1: Can't print recipes "
# link to a referenced ticket
assert_select " a[href=?][title=?] " , " http://mydomain.foo/rdm/issues/2 " , " Add ingredients categories (Assigned) " , :text = > " # 2 "
# link to a changeset
assert_select " a[href=?][title=?] " , " http://mydomain.foo/rdm/projects/ecookbook/repository/revisions/2 " , " This commit fixes # 1, # 2 and references # 1 & # 3 " , :text = > " r2 "
end
2008-11-08 16:25:45 +03:00
ensure
# restore it
2009-01-04 20:09:25 +03:00
Redmine :: Utils . relative_url_root = relative_url_root
2008-11-08 16:25:45 +03:00
end
2009-04-05 16:33:45 +04:00
def test_email_headers
issue = Issue . find ( 1 )
Mailer . deliver_issue_add ( issue )
mail = ActionMailer :: Base . deliveries . last
assert_not_nil mail
assert_equal 'bulk' , mail . header_string ( 'Precedence' )
assert_equal 'auto-generated' , mail . header_string ( 'Auto-Submitted' )
end
2008-10-16 03:50:33 +04:00
def test_plain_text_mail
Setting . plain_text_mail = 1
journal = Journal . find ( 2 )
Mailer . deliver_issue_edit ( journal )
mail = ActionMailer :: Base . deliveries . last
2009-10-24 15:57:01 +04:00
assert_equal " text/plain " , mail . content_type
assert_equal 0 , mail . parts . size
2009-09-13 21:14:35 +04:00
assert ! mail . encoded . include? ( 'href' )
2008-10-16 03:50:33 +04:00
end
2009-09-13 21:14:35 +04:00
def test_html_mail
Setting . plain_text_mail = 0
journal = Journal . find ( 2 )
Mailer . deliver_issue_edit ( journal )
mail = ActionMailer :: Base . deliveries . last
assert_equal 2 , mail . parts . size
assert mail . encoded . include? ( 'href' )
end
2010-02-17 22:08:04 +03:00
def test_mail_from_with_phrase
with_settings :mail_from = > 'Redmine app <redmine@example.net>' do
Mailer . deliver_test ( User . find ( 1 ) )
end
mail = ActionMailer :: Base . deliveries . last
assert_not_nil mail
assert_equal 'Redmine app' , mail . from_addrs . first . name
end
2010-02-28 20:18:21 +03:00
def test_should_not_send_email_without_recipient
news = News . find ( :first )
user = news . author
# Remove members except news author
news . project . memberships . each { | m | m . destroy unless m . user == user }
user . pref [ :no_self_notified ] = false
user . pref . save
User . current = user
Mailer . deliver_news_added ( news . reload )
assert_equal 1 , last_email . bcc . size
# nobody to notify
user . pref [ :no_self_notified ] = true
user . pref . save
User . current = user
ActionMailer :: Base . deliveries . clear
Mailer . deliver_news_added ( news . reload )
assert ActionMailer :: Base . deliveries . empty?
end
2009-09-13 21:14:35 +04:00
2009-01-18 18:16:31 +03:00
def test_issue_add_message_id
issue = Issue . find ( 1 )
Mailer . deliver_issue_add ( issue )
mail = ActionMailer :: Base . deliveries . last
assert_not_nil mail
assert_equal Mailer . message_id_for ( issue ) , mail . message_id
assert_nil mail . references
end
def test_issue_edit_message_id
journal = Journal . find ( 1 )
Mailer . deliver_issue_edit ( journal )
mail = ActionMailer :: Base . deliveries . last
assert_not_nil mail
assert_equal Mailer . message_id_for ( journal ) , mail . message_id
2010-09-14 20:07:38 +04:00
assert_equal Mailer . message_id_for ( journal . journaled ) , mail . references . first . to_s
2009-01-18 18:16:31 +03:00
end
def test_message_posted_message_id
message = Message . find ( 1 )
2009-12-13 17:26:54 +03:00
Mailer . deliver_message_posted ( message )
2009-01-18 18:16:31 +03:00
mail = ActionMailer :: Base . deliveries . last
assert_not_nil mail
assert_equal Mailer . message_id_for ( message ) , mail . message_id
assert_nil mail . references
2010-02-20 13:07:53 +03:00
assert_select_email do
# link to the message
assert_select " a[href=?] " , " http://mydomain.foo/boards/ #{ message . board . id } /topics/ #{ message . id } " , :text = > message . subject
end
2009-01-18 18:16:31 +03:00
end
def test_reply_posted_message_id
message = Message . find ( 3 )
2009-12-13 17:26:54 +03:00
Mailer . deliver_message_posted ( message )
2009-01-18 18:16:31 +03:00
mail = ActionMailer :: Base . deliveries . last
assert_not_nil mail
assert_equal Mailer . message_id_for ( message ) , mail . message_id
2009-10-10 19:14:08 +04:00
assert_equal Mailer . message_id_for ( message . parent ) , mail . references . first . to_s
2010-02-20 13:07:53 +03:00
assert_select_email do
# link to the reply
assert_select " a[href=?] " , " http://mydomain.foo/boards/ #{ message . board . id } /topics/ #{ message . root . id } ?r= #{ message . id } # message- #{ message . id } " , :text = > message . subject
end
2009-01-18 18:16:31 +03:00
end
2007-02-02 17:47:40 +03:00
2009-12-13 17:26:54 +03:00
context ( " # issue_add " ) do
setup do
ActionMailer :: Base . deliveries . clear
Setting . bcc_recipients = '1'
@issue = Issue . find ( 1 )
end
should " notify project members " do
assert Mailer . deliver_issue_add ( @issue )
assert last_email . bcc . include? ( 'dlopper@somenet.foo' )
end
should " not notify project members that are not allow to view the issue " do
Role . find ( 2 ) . remove_permission! ( :view_issues )
assert Mailer . deliver_issue_add ( @issue )
assert ! last_email . bcc . include? ( 'dlopper@somenet.foo' )
end
should " notify issue watchers " do
user = User . find ( 9 )
2010-01-17 14:48:46 +03:00
# minimal email notification options
user . pref [ :no_self_notified ] = '1'
user . pref . save
user . mail_notification = false
user . save
2009-12-13 17:26:54 +03:00
Watcher . create! ( :watchable = > @issue , :user = > user )
assert Mailer . deliver_issue_add ( @issue )
assert last_email . bcc . include? ( user . mail )
end
should " not notify watchers not allowed to view the issue " do
user = User . find ( 9 )
Watcher . create! ( :watchable = > @issue , :user = > user )
Role . non_member . remove_permission! ( :view_issues )
assert Mailer . deliver_issue_add ( @issue )
assert ! last_email . bcc . include? ( user . mail )
end
end
2007-02-02 17:47:40 +03:00
# test mailer methods for each language
def test_issue_add
issue = Issue . find ( 1 )
2009-02-21 14:04:50 +03:00
valid_languages . each do | lang |
2007-03-10 18:09:49 +03:00
Setting . default_language = lang . to_s
2007-02-02 17:47:40 +03:00
assert Mailer . deliver_issue_add ( issue )
end
end
def test_issue_edit
journal = Journal . find ( 1 )
2009-02-21 14:04:50 +03:00
valid_languages . each do | lang |
2007-03-10 18:09:49 +03:00
Setting . default_language = lang . to_s
2007-02-02 17:47:40 +03:00
assert Mailer . deliver_issue_edit ( journal )
end
end
2007-11-04 13:43:39 +03:00
def test_document_added
2007-02-02 17:47:40 +03:00
document = Document . find ( 1 )
2009-02-21 14:04:50 +03:00
valid_languages . each do | lang |
2007-03-10 18:09:49 +03:00
Setting . default_language = lang . to_s
2007-10-12 22:04:56 +04:00
assert Mailer . deliver_document_added ( document )
2007-02-02 17:47:40 +03:00
end
end
2007-11-04 13:43:39 +03:00
def test_attachments_added
attachements = [ Attachment . find_by_container_type ( 'Document' ) ]
2009-02-21 14:04:50 +03:00
valid_languages . each do | lang |
2007-11-04 13:43:39 +03:00
Setting . default_language = lang . to_s
assert Mailer . deliver_attachments_added ( attachements )
end
end
2010-03-04 00:32:41 +03:00
def test_version_file_added
attachements = [ Attachment . find_by_container_type ( 'Version' ) ]
assert Mailer . deliver_attachments_added ( attachements )
assert_not_nil last_email . bcc
assert last_email . bcc . any?
end
def test_project_file_added
attachements = [ Attachment . find_by_container_type ( 'Project' ) ]
assert Mailer . deliver_attachments_added ( attachements )
assert_not_nil last_email . bcc
assert last_email . bcc . any?
end
2007-11-04 13:43:39 +03:00
def test_news_added
news = News . find ( :first )
2009-02-21 14:04:50 +03:00
valid_languages . each do | lang |
2007-11-04 13:43:39 +03:00
Setting . default_language = lang . to_s
assert Mailer . deliver_news_added ( news )
end
end
def test_message_posted
message = Message . find ( :first )
recipients = ( [ message . root ] + message . root . children ) . collect { | m | m . author . mail if m . author }
recipients = recipients . compact . uniq
2009-02-21 14:04:50 +03:00
valid_languages . each do | lang |
2007-11-04 13:43:39 +03:00
Setting . default_language = lang . to_s
2009-12-13 17:26:54 +03:00
assert Mailer . deliver_message_posted ( message )
2007-11-04 13:43:39 +03:00
end
end
def test_account_information
2010-04-30 15:27:08 +04:00
user = User . find ( 2 )
2009-02-21 14:04:50 +03:00
valid_languages . each do | lang |
2007-11-04 13:43:39 +03:00
user . update_attribute :language , lang . to_s
user . reload
assert Mailer . deliver_account_information ( user , 'pAsswORd' )
end
end
2007-02-02 17:47:40 +03:00
def test_lost_password
token = Token . find ( 2 )
2009-02-21 14:04:50 +03:00
valid_languages . each do | lang |
2007-03-10 18:09:49 +03:00
token . user . update_attribute :language , lang . to_s
2007-11-04 13:43:39 +03:00
token . reload
2007-02-02 17:47:40 +03:00
assert Mailer . deliver_lost_password ( token )
end
end
def test_register
token = Token . find ( 1 )
2009-03-07 15:45:46 +03:00
Setting . host_name = 'redmine.foo'
Setting . protocol = 'https'
2009-02-21 14:04:50 +03:00
valid_languages . each do | lang |
2007-03-10 18:09:49 +03:00
token . user . update_attribute :language , lang . to_s
2007-11-04 13:43:39 +03:00
token . reload
2009-03-07 15:45:46 +03:00
ActionMailer :: Base . deliveries . clear
2007-02-02 17:47:40 +03:00
assert Mailer . deliver_register ( token )
2009-03-07 15:45:46 +03:00
mail = ActionMailer :: Base . deliveries . last
assert mail . body . include? ( " https://redmine.foo/account/activate?token= #{ token . value } " )
2007-02-02 17:47:40 +03:00
end
end
2008-05-25 21:31:50 +04:00
2010-03-21 14:17:29 +03:00
def test_test
user = User . find ( 1 )
valid_languages . each do | lang |
user . update_attribute :language , lang . to_s
assert Mailer . deliver_test ( user )
end
end
2008-05-25 21:31:50 +04:00
def test_reminders
Mailer . reminders ( :days = > 42 )
assert_equal 1 , ActionMailer :: Base . deliveries . size
mail = ActionMailer :: Base . deliveries . last
assert mail . bcc . include? ( 'dlopper@somenet.foo' )
assert mail . body . include? ( 'Bug #3: Error 281 when updating a recipe' )
2010-08-19 08:30:23 +04:00
assert_equal '1 issue(s) due in the next 42 days' , mail . subject
2008-05-25 21:31:50 +04:00
end
2009-12-13 17:26:54 +03:00
2010-09-21 03:17:51 +04:00
def test_reminders_for_users
Mailer . reminders ( :days = > 42 , :users = > [ '5' ] )
assert_equal 0 , ActionMailer :: Base . deliveries . size # No mail for dlopper
Mailer . reminders ( :days = > 42 , :users = > [ '3' ] )
assert_equal 1 , ActionMailer :: Base . deliveries . size # No mail for dlopper
mail = ActionMailer :: Base . deliveries . last
assert mail . bcc . include? ( 'dlopper@somenet.foo' )
assert mail . body . include? ( 'Bug #3: Error 281 when updating a recipe' )
end
2009-12-13 17:26:54 +03:00
def last_email
mail = ActionMailer :: Base . deliveries . last
assert_not_nil mail
mail
end
2010-01-10 17:54:02 +03:00
def test_mailer_should_not_change_locale
Setting . default_language = 'en'
# Set current language to italian
set_language_if_valid 'it'
# Send an email to a french user
user = User . find ( 1 )
user . language = 'fr'
Mailer . deliver_account_activated ( user )
mail = ActionMailer :: Base . deliveries . last
assert mail . body . include? ( 'Votre compte' )
assert_equal :it , current_language
end
2010-03-21 14:17:29 +03:00
def test_with_deliveries_off
Mailer . with_deliveries false do
Mailer . deliver_test ( User . find ( 1 ) )
end
assert ActionMailer :: Base . deliveries . empty?
# should restore perform_deliveries
assert ActionMailer :: Base . perform_deliveries
end
2010-11-02 22:00:36 +03:00
context " layout " do
should " include the emails_header " do
with_settings ( :emails_header = > " *Header content* " ) do
assert Mailer . deliver_test ( User . find ( 1 ) )
assert_select_email do
assert_select " .header " do
assert_select " strong " , :text = > " Header content "
end
end
end
end
end
2007-11-04 13:43:39 +03:00
end