diff test/unit/mailer_test.rb @ 909:cbb26bc654de redmine-1.3

Update to Redmine 1.3-stable branch (Redmine SVN rev 8964)
author Chris Cannam
date Fri, 24 Feb 2012 19:09:32 +0000
parents cbce1fd3b1b7
children 5f33065ddc4b
line wrap: on
line diff
--- a/test/unit/mailer_test.rb	Fri Feb 24 18:36:29 2012 +0000
+++ b/test/unit/mailer_test.rb	Fri Feb 24 19:09:32 2012 +0000
@@ -5,12 +5,12 @@
 # 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.
@@ -20,91 +20,121 @@
 class MailerTest < ActiveSupport::TestCase
   include Redmine::I18n
   include ActionController::Assertions::SelectorAssertions
-  fixtures :all
-  
+  fixtures :projects, :enabled_modules, :issues, :users, :members,
+           :member_roles, :roles, :documents, :attachments, :news,
+           :tokens, :journals, :journal_details, :changesets, :trackers,
+           :issue_statuses, :enumerations, :messages, :boards, :repositories,
+           :wikis, :wiki_pages, :wiki_contents, :wiki_content_versions,
+           :versions,
+           :comments
+
   def setup
     ActionMailer::Base.deliveries.clear
     Setting.host_name = 'mydomain.foo'
     Setting.protocol = 'http'
     Setting.plain_text_mail = '0'
   end
-  
+
   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
-    
+
     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"
+      assert_select "a[href=?]",
+                    "https://mydomain.foo/issues/1#change-2",
+                    :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"
+      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 &amp; #3", :text => "r2"
+      assert_select "a[href=?][title=?]",
+                    "https://mydomain.foo/projects/ecookbook/repository/revisions/2",
+                    "This commit fixes #1, #2 and references #1 &amp; #3",
+                    :text => "r2"
     end
   end
-  
+
   def test_generated_links_with_prefix
     relative_url_root = Redmine::Utils.relative_url_root
     Setting.host_name = 'mydomain.foo/rdm'
     Setting.protocol = 'http'
     Redmine::Utils.relative_url_root = '/rdm'
-    
+
     journal = Journal.find(2)
     assert Mailer.deliver_issue_edit(journal)
-    
+
     mail = ActionMailer::Base.deliveries.last
     assert_kind_of TMail::Mail, mail
 
     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"
+      assert_select "a[href=?]",
+                    "http://mydomain.foo/rdm/issues/1#change-2",
+                    :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"
+      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 &amp; #3", :text => "r2"
+      assert_select "a[href=?][title=?]",
+                    "http://mydomain.foo/rdm/projects/ecookbook/repository/revisions/2",
+                    "This commit fixes #1, #2 and references #1 &amp; #3",
+                    :text => "r2"
     end
   ensure
     # restore it
     Redmine::Utils.relative_url_root = relative_url_root
   end
-  
+
   def test_generated_links_with_prefix_and_no_relative_url_root
     relative_url_root = Redmine::Utils.relative_url_root
     Setting.host_name = 'mydomain.foo/rdm'
     Setting.protocol = 'http'
     Redmine::Utils.relative_url_root = nil
-    
+
     journal = Journal.find(2)
     assert Mailer.deliver_issue_edit(journal)
-    
+
     mail = ActionMailer::Base.deliveries.last
     assert_kind_of TMail::Mail, mail
 
     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"
+      assert_select "a[href=?]",
+                    "http://mydomain.foo/rdm/issues/1#change-2",
+                    :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"
+      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 &amp; #3", :text => "r2"
+      assert_select "a[href=?][title=?]",
+                    "http://mydomain.foo/rdm/projects/ecookbook/repository/revisions/2",
+                    "This commit fixes #1, #2 and references #1 &amp; #3",
+                    :text => "r2"
     end
   ensure
     # restore it
     Redmine::Utils.relative_url_root = relative_url_root
   end
-  
+
   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 'OOF', mail.header_string('X-Auto-Response-Suppress')
     assert_equal 'auto-generated', mail.header_string('Auto-Submitted')
   end
 
@@ -126,22 +156,32 @@
     assert_equal 2, mail.parts.size
     assert mail.encoded.include?('href')
   end
-  
-  def test_mail_from_with_phrase
+
+  def test_from_header
+    with_settings :mail_from => 'redmine@example.net' do
+      Mailer.deliver_test(User.find(1))
+    end
+    mail = ActionMailer::Base.deliveries.last
+    assert_not_nil mail
+    assert_equal 'redmine@example.net', mail.from_addrs.first.address
+  end
+
+  def test_from_header_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@example.net', mail.from_addrs.first.address
     assert_equal 'Redmine app', mail.from_addrs.first.name
   end
-  
+
   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
@@ -165,7 +205,7 @@
     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)
@@ -173,8 +213,13 @@
     assert_not_nil mail
     assert_equal Mailer.message_id_for(journal), mail.message_id
     assert_equal Mailer.message_id_for(journal.issue), mail.references.first.to_s
+    assert_select_email do
+      # link to the update
+      assert_select "a[href=?]",
+                    "http://mydomain.foo/issues/#{journal.journalized_id}#change-#{journal.id}"
+    end
   end
-  
+
   def test_message_posted_message_id
     message = Message.find(1)
     Mailer.deliver_message_posted(message)
@@ -184,10 +229,12 @@
     assert_nil mail.references
     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
+      assert_select "a[href=?]",
+                    "http://mydomain.foo/boards/#{message.board.id}/topics/#{message.id}",
+                    :text => message.subject
     end
   end
-  
+
   def test_reply_posted_message_id
     message = Message.find(3)
     Mailer.deliver_message_posted(message)
@@ -197,28 +244,30 @@
     assert_equal Mailer.message_id_for(message.parent), mail.references.first.to_s
     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
+      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
   end
-  
+
   context("#issue_add") do
     setup do
       ActionMailer::Base.deliveries.clear
       Setting.bcc_recipients = '1'
-      @issue = Issue.find(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)
       # minimal email notification options
@@ -226,12 +275,12 @@
       user.pref.save
       user.mail_notification = false
       user.save
-      
+
       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)
@@ -240,7 +289,7 @@
       assert !last_email.bcc.include?(user.mail)
     end
   end
-  
+
   # test mailer methods for each language
   def test_issue_add
     issue = Issue.find(1)
@@ -257,7 +306,7 @@
       assert Mailer.deliver_issue_edit(journal)
     end
   end
-  
+
   def test_document_added
     document = Document.find(1)
     valid_languages.each do |lang|
@@ -265,7 +314,7 @@
       assert Mailer.deliver_document_added(document)
     end
   end
-  
+
   def test_attachments_added
     attachements = [ Attachment.find_by_container_type('Document') ]
     valid_languages.each do |lang|
@@ -273,7 +322,7 @@
       assert Mailer.deliver_attachments_added(attachements)
     end
   end
-  
+
   def test_version_file_added
     attachements = [ Attachment.find_by_container_type('Version') ]
     assert Mailer.deliver_attachments_added(attachements)
@@ -283,7 +332,7 @@
       assert_select "a[href=?]", "http://mydomain.foo/projects/ecookbook/files"
     end
   end
-  
+
   def test_project_file_added
     attachements = [ Attachment.find_by_container_type('Project') ]
     assert Mailer.deliver_attachments_added(attachements)
@@ -293,7 +342,7 @@
       assert_select "a[href=?]", "http://mydomain.foo/projects/ecookbook/files"
     end
   end
-  
+
   def test_news_added
     news = News.find(:first)
     valid_languages.each do |lang|
@@ -301,7 +350,7 @@
       assert Mailer.deliver_news_added(news)
     end
   end
-  
+
   def test_news_comment_added
     comment = Comment.find(2)
     valid_languages.each do |lang|
@@ -309,7 +358,7 @@
       assert Mailer.deliver_news_comment_added(comment)
     end
   end
-  
+
   def test_message_posted
     message = Message.find(:first)
     recipients = ([message.root] + message.root.children).collect {|m| m.author.mail if m.author}
@@ -319,7 +368,7 @@
       assert Mailer.deliver_message_posted(message)
     end
   end
-  
+
   def test_wiki_content_added
     content = WikiContent.find(:first)
     valid_languages.each do |lang|
@@ -329,7 +378,7 @@
       end
     end
   end
-  
+
   def test_wiki_content_updated
     content = WikiContent.find(:first)
     valid_languages.each do |lang|
@@ -339,7 +388,7 @@
       end
     end
   end
-  
+
   def test_account_information
     user = User.find(2)
     valid_languages.each do |lang|
@@ -362,7 +411,7 @@
     token = Token.find(1)
     Setting.host_name = 'redmine.foo'
     Setting.protocol = 'https'
-    
+
     valid_languages.each do |lang|
       token.user.update_attribute :language, lang.to_s
       token.reload
@@ -372,7 +421,7 @@
       assert mail.body.include?("https://redmine.foo/account/activate?token=#{token.value}")
     end
   end
-  
+
   def test_test
     user = User.find(1)
     valid_languages.each do |lang|
@@ -380,7 +429,7 @@
       assert Mailer.deliver_test(user)
     end
   end
-  
+
   def test_reminders
     Mailer.reminders(:days => 42)
     assert_equal 1, ActionMailer::Base.deliveries.size
@@ -389,7 +438,7 @@
     assert mail.body.include?('Bug #3: Error 281 when updating a recipe')
     assert_equal '1 issue(s) due in the next 42 days', mail.subject
   end
-  
+
   def test_reminders_for_users
     Mailer.reminders(:days => 42, :users => ['5'])
     assert_equal 0, ActionMailer::Base.deliveries.size # No mail for dlopper
@@ -399,13 +448,13 @@
     assert mail.bcc.include?('dlopper@somenet.foo')
     assert mail.body.include?('Bug #3: Error 281 when updating a recipe')
   end
-  
+
   def last_email
     mail = ActionMailer::Base.deliveries.last
     assert_not_nil mail
     mail
   end
-  
+
   def test_mailer_should_not_change_locale
     Setting.default_language = 'en'
     # Set current language to italian
@@ -416,10 +465,10 @@
     Mailer.deliver_account_activated(user)
     mail = ActionMailer::Base.deliveries.last
     assert mail.body.include?('Votre compte')
-    
+
     assert_equal :it, current_language
   end
-  
+
   def test_with_deliveries_off
     Mailer.with_deliveries false do
       Mailer.deliver_test(User.find(1))
@@ -428,6 +477,14 @@
     # should restore perform_deliveries
     assert ActionMailer::Base.perform_deliveries
   end
+  
+  def test_tmail_to_header_field_should_not_include_blank_lines
+    mail = TMail::Mail.new
+    mail.to = ["a.user@example.com", "v.user2@example.com", "e.smith@example.com", "info@example.com", "v.pupkin@example.com",
+      "b.user@example.com", "w.user2@example.com", "f.smith@example.com", "info2@example.com", "w.pupkin@example.com"]
+    
+    assert !mail.encoded.strip.split("\r\n").detect(&:blank?), "#{mail.encoded} malformed"
+  end
 
   context "layout" do
     should "include the emails_header" do