annotate test/unit/mailer_test.rb @ 1519:afce8026aaeb redmine-2.4-integration

Merge from branch "live"
author Chris Cannam
date Tue, 09 Sep 2014 09:34:53 +0100
parents e248c7af89ec
children dffacf8a6908
rev   line source
Chris@441 1 # Redmine - project management software
Chris@1494 2 # Copyright (C) 2006-2014 Jean-Philippe Lang
Chris@0 3 #
Chris@0 4 # This program is free software; you can redistribute it and/or
Chris@0 5 # modify it under the terms of the GNU General Public License
Chris@0 6 # as published by the Free Software Foundation; either version 2
Chris@0 7 # of the License, or (at your option) any later version.
Chris@909 8 #
Chris@0 9 # This program is distributed in the hope that it will be useful,
Chris@0 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@0 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0 12 # GNU General Public License for more details.
Chris@909 13 #
Chris@0 14 # You should have received a copy of the GNU General Public License
Chris@0 15 # along with this program; if not, write to the Free Software
Chris@0 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Chris@0 17
Chris@119 18 require File.expand_path('../../test_helper', __FILE__)
Chris@0 19
Chris@0 20 class MailerTest < ActiveSupport::TestCase
Chris@0 21 include Redmine::I18n
Chris@1115 22 include ActionDispatch::Assertions::SelectorAssertions
Chris@909 23 fixtures :projects, :enabled_modules, :issues, :users, :members,
Chris@909 24 :member_roles, :roles, :documents, :attachments, :news,
Chris@1115 25 :tokens, :journals, :journal_details, :changesets,
Chris@1115 26 :trackers, :projects_trackers,
Chris@909 27 :issue_statuses, :enumerations, :messages, :boards, :repositories,
Chris@909 28 :wikis, :wiki_pages, :wiki_contents, :wiki_content_versions,
Chris@909 29 :versions,
Chris@909 30 :comments
Chris@909 31
Chris@0 32 def setup
Chris@0 33 ActionMailer::Base.deliveries.clear
Chris@0 34 Setting.host_name = 'mydomain.foo'
Chris@0 35 Setting.protocol = 'http'
Chris@441 36 Setting.plain_text_mail = '0'
Chris@0 37 end
Chris@909 38
Chris@0 39 def test_generated_links_in_emails
Chris@1115 40 Setting.default_language = 'en'
Chris@0 41 Setting.host_name = 'mydomain.foo'
Chris@0 42 Setting.protocol = 'https'
Chris@909 43
Chris@1115 44 journal = Journal.find(3)
Chris@1464 45 assert Mailer.deliver_issue_edit(journal)
Chris@909 46
Chris@1115 47 mail = last_email
Chris@1115 48 assert_not_nil mail
Chris@909 49
Chris@0 50 assert_select_email do
Chris@0 51 # link to the main ticket
Chris@1115 52 assert_select 'a[href=?]',
Chris@1115 53 'https://mydomain.foo/issues/2#change-3',
Chris@1115 54 :text => 'Feature request #2: Add ingredients categories'
Chris@0 55 # link to a referenced ticket
Chris@1115 56 assert_select 'a[href=?][title=?]',
Chris@1115 57 'https://mydomain.foo/issues/1',
Chris@1115 58 'Can&#x27;t print recipes (New)',
Chris@1115 59 :text => '#1'
Chris@0 60 # link to a changeset
Chris@1115 61 assert_select 'a[href=?][title=?]',
Chris@1115 62 'https://mydomain.foo/projects/ecookbook/repository/revisions/2',
Chris@1115 63 'This commit fixes #1, #2 and references #1 &amp; #3',
Chris@1115 64 :text => 'r2'
Chris@1115 65 # link to a description diff
Chris@1115 66 assert_select 'a[href=?][title=?]',
Chris@1115 67 'https://mydomain.foo/journals/diff/3?detail_id=4',
Chris@1115 68 'View differences',
Chris@1115 69 :text => 'diff'
Chris@1115 70 # link to an attachment
Chris@1115 71 assert_select 'a[href=?]',
Chris@1115 72 'https://mydomain.foo/attachments/download/4/source.rb',
Chris@1115 73 :text => 'source.rb'
Chris@0 74 end
Chris@0 75 end
Chris@909 76
Chris@0 77 def test_generated_links_with_prefix
Chris@1115 78 Setting.default_language = 'en'
Chris@0 79 relative_url_root = Redmine::Utils.relative_url_root
Chris@0 80 Setting.host_name = 'mydomain.foo/rdm'
Chris@0 81 Setting.protocol = 'http'
Chris@909 82
Chris@1115 83 journal = Journal.find(3)
Chris@1464 84 assert Mailer.deliver_issue_edit(journal)
Chris@909 85
Chris@1115 86 mail = last_email
Chris@1115 87 assert_not_nil mail
Chris@0 88
Chris@0 89 assert_select_email do
Chris@0 90 # link to the main ticket
Chris@1115 91 assert_select 'a[href=?]',
Chris@1115 92 'http://mydomain.foo/rdm/issues/2#change-3',
Chris@1115 93 :text => 'Feature request #2: Add ingredients categories'
Chris@0 94 # link to a referenced ticket
Chris@1115 95 assert_select 'a[href=?][title=?]',
Chris@1115 96 'http://mydomain.foo/rdm/issues/1',
Chris@1115 97 'Can&#x27;t print recipes (New)',
Chris@1115 98 :text => '#1'
Chris@0 99 # link to a changeset
Chris@1115 100 assert_select 'a[href=?][title=?]',
Chris@1115 101 'http://mydomain.foo/rdm/projects/ecookbook/repository/revisions/2',
Chris@1115 102 'This commit fixes #1, #2 and references #1 &amp; #3',
Chris@1115 103 :text => 'r2'
Chris@1115 104 # link to a description diff
Chris@1115 105 assert_select 'a[href=?][title=?]',
Chris@1115 106 'http://mydomain.foo/rdm/journals/diff/3?detail_id=4',
Chris@1115 107 'View differences',
Chris@1115 108 :text => 'diff'
Chris@1115 109 # link to an attachment
Chris@1115 110 assert_select 'a[href=?]',
Chris@1115 111 'http://mydomain.foo/rdm/attachments/download/4/source.rb',
Chris@1115 112 :text => 'source.rb'
Chris@0 113 end
Chris@0 114 end
Chris@909 115
Chris@1464 116 def test_issue_edit_should_generate_url_with_hostname_for_relations
Chris@1464 117 journal = Journal.new(:journalized => Issue.find(1), :user => User.find(1), :created_on => Time.now)
Chris@1464 118 journal.details << JournalDetail.new(:property => 'relation', :prop_key => 'label_relates_to', :value => 2)
Chris@1464 119 Mailer.deliver_issue_edit(journal)
Chris@1464 120 assert_not_nil last_email
Chris@1464 121 assert_select_email do
Chris@1464 122 assert_select 'a[href=?]', 'http://mydomain.foo/issues/2', :text => 'Feature request #2'
Chris@1464 123 end
Chris@1464 124 end
Chris@1464 125
Chris@0 126 def test_generated_links_with_prefix_and_no_relative_url_root
Chris@1115 127 Setting.default_language = 'en'
Chris@0 128 relative_url_root = Redmine::Utils.relative_url_root
Chris@0 129 Setting.host_name = 'mydomain.foo/rdm'
Chris@0 130 Setting.protocol = 'http'
Chris@0 131 Redmine::Utils.relative_url_root = nil
Chris@909 132
Chris@1115 133 journal = Journal.find(3)
Chris@1464 134 assert Mailer.deliver_issue_edit(journal)
Chris@909 135
Chris@1115 136 mail = last_email
Chris@1115 137 assert_not_nil mail
Chris@0 138
Chris@0 139 assert_select_email do
Chris@0 140 # link to the main ticket
Chris@1115 141 assert_select 'a[href=?]',
Chris@1115 142 'http://mydomain.foo/rdm/issues/2#change-3',
Chris@1115 143 :text => 'Feature request #2: Add ingredients categories'
Chris@0 144 # link to a referenced ticket
Chris@1115 145 assert_select 'a[href=?][title=?]',
Chris@1115 146 'http://mydomain.foo/rdm/issues/1',
Chris@1115 147 'Can&#x27;t print recipes (New)',
Chris@1115 148 :text => '#1'
Chris@0 149 # link to a changeset
Chris@1115 150 assert_select 'a[href=?][title=?]',
Chris@1115 151 'http://mydomain.foo/rdm/projects/ecookbook/repository/revisions/2',
Chris@1115 152 'This commit fixes #1, #2 and references #1 &amp; #3',
Chris@1115 153 :text => 'r2'
Chris@1115 154 # link to a description diff
Chris@1115 155 assert_select 'a[href=?][title=?]',
Chris@1115 156 'http://mydomain.foo/rdm/journals/diff/3?detail_id=4',
Chris@1115 157 'View differences',
Chris@1115 158 :text => 'diff'
Chris@1115 159 # link to an attachment
Chris@1115 160 assert_select 'a[href=?]',
Chris@1115 161 'http://mydomain.foo/rdm/attachments/download/4/source.rb',
Chris@1115 162 :text => 'source.rb'
Chris@0 163 end
Chris@0 164 ensure
Chris@0 165 # restore it
Chris@0 166 Redmine::Utils.relative_url_root = relative_url_root
Chris@0 167 end
Chris@909 168
Chris@0 169 def test_email_headers
Chris@0 170 issue = Issue.find(1)
Chris@1464 171 Mailer.deliver_issue_add(issue)
Chris@1115 172 mail = last_email
Chris@0 173 assert_not_nil mail
Chris@1115 174 assert_equal 'OOF', mail.header['X-Auto-Response-Suppress'].to_s
Chris@1115 175 assert_equal 'auto-generated', mail.header['Auto-Submitted'].to_s
Chris@1115 176 assert_equal '<redmine.example.net>', mail.header['List-Id'].to_s
Chris@1115 177 end
Chris@1115 178
Chris@1115 179 def test_email_headers_should_include_sender
Chris@1115 180 issue = Issue.find(1)
Chris@1464 181 Mailer.deliver_issue_add(issue)
Chris@1115 182 mail = last_email
Chris@1115 183 assert_equal issue.author.login, mail.header['X-Redmine-Sender'].to_s
Chris@0 184 end
Chris@0 185
Chris@0 186 def test_plain_text_mail
Chris@0 187 Setting.plain_text_mail = 1
Chris@0 188 journal = Journal.find(2)
Chris@1464 189 Mailer.deliver_issue_edit(journal)
Chris@1115 190 mail = last_email
Chris@1115 191 assert_equal "text/plain; charset=UTF-8", mail.content_type
Chris@0 192 assert_equal 0, mail.parts.size
Chris@0 193 assert !mail.encoded.include?('href')
Chris@0 194 end
Chris@0 195
Chris@0 196 def test_html_mail
Chris@0 197 Setting.plain_text_mail = 0
Chris@0 198 journal = Journal.find(2)
Chris@1464 199 Mailer.deliver_issue_edit(journal)
Chris@1115 200 mail = last_email
Chris@0 201 assert_equal 2, mail.parts.size
Chris@0 202 assert mail.encoded.include?('href')
Chris@0 203 end
Chris@909 204
Chris@909 205 def test_from_header
Chris@909 206 with_settings :mail_from => 'redmine@example.net' do
Chris@1115 207 Mailer.test_email(User.find(1)).deliver
Chris@909 208 end
Chris@1115 209 mail = last_email
Chris@1115 210 assert_equal 'redmine@example.net', mail.from_addrs.first
Chris@909 211 end
Chris@909 212
Chris@909 213 def test_from_header_with_phrase
Chris@0 214 with_settings :mail_from => 'Redmine app <redmine@example.net>' do
Chris@1115 215 Mailer.test_email(User.find(1)).deliver
Chris@0 216 end
Chris@1115 217 mail = last_email
Chris@1115 218 assert_equal 'redmine@example.net', mail.from_addrs.first
Chris@1115 219 assert_equal 'Redmine app <redmine@example.net>', mail.header['From'].to_s
Chris@0 220 end
Chris@909 221
Chris@0 222 def test_should_not_send_email_without_recipient
Chris@1464 223 news = News.first
Chris@0 224 user = news.author
Chris@0 225 # Remove members except news author
Chris@0 226 news.project.memberships.each {|m| m.destroy unless m.user == user}
Chris@909 227
Chris@1464 228 user.pref.no_self_notified = false
Chris@0 229 user.pref.save
Chris@0 230 User.current = user
Chris@1115 231 Mailer.news_added(news.reload).deliver
Chris@0 232 assert_equal 1, last_email.bcc.size
Chris@0 233
Chris@0 234 # nobody to notify
Chris@1464 235 user.pref.no_self_notified = true
Chris@0 236 user.pref.save
Chris@0 237 User.current = user
Chris@0 238 ActionMailer::Base.deliveries.clear
Chris@1115 239 Mailer.news_added(news.reload).deliver
Chris@0 240 assert ActionMailer::Base.deliveries.empty?
Chris@0 241 end
Chris@0 242
Chris@0 243 def test_issue_add_message_id
Chris@1464 244 issue = Issue.find(2)
Chris@1464 245 Mailer.deliver_issue_add(issue)
Chris@1115 246 mail = last_email
Chris@1464 247 assert_match /^redmine\.issue-2\.20060719190421\.[a-f0-9]+@example\.net/, mail.message_id
Chris@1464 248 assert_include "redmine.issue-2.20060719190421@example.net", mail.references
Chris@0 249 end
Chris@909 250
Chris@0 251 def test_issue_edit_message_id
Chris@1464 252 journal = Journal.find(3)
Chris@1464 253 journal.issue = Issue.find(2)
Chris@1464 254
Chris@1464 255 Mailer.deliver_issue_edit(journal)
Chris@1115 256 mail = last_email
Chris@1464 257 assert_match /^redmine\.journal-3\.\d+\.[a-f0-9]+@example\.net/, mail.message_id
Chris@1464 258 assert_include "redmine.issue-2.20060719190421@example.net", mail.references
Chris@909 259 assert_select_email do
Chris@909 260 # link to the update
Chris@909 261 assert_select "a[href=?]",
Chris@909 262 "http://mydomain.foo/issues/#{journal.journalized_id}#change-#{journal.id}"
Chris@909 263 end
Chris@0 264 end
Chris@909 265
Chris@0 266 def test_message_posted_message_id
Chris@0 267 message = Message.find(1)
Chris@1115 268 Mailer.message_posted(message).deliver
Chris@1115 269 mail = last_email
Chris@1464 270 assert_match /^redmine\.message-1\.\d+\.[a-f0-9]+@example\.net/, mail.message_id
Chris@1464 271 assert_include "redmine.message-1.20070512151532@example.net", mail.references
Chris@0 272 assert_select_email do
Chris@0 273 # link to the message
Chris@909 274 assert_select "a[href=?]",
Chris@909 275 "http://mydomain.foo/boards/#{message.board.id}/topics/#{message.id}",
Chris@909 276 :text => message.subject
Chris@0 277 end
Chris@0 278 end
Chris@909 279
Chris@0 280 def test_reply_posted_message_id
Chris@0 281 message = Message.find(3)
Chris@1115 282 Mailer.message_posted(message).deliver
Chris@1115 283 mail = last_email
Chris@1464 284 assert_match /^redmine\.message-3\.\d+\.[a-f0-9]+@example\.net/, mail.message_id
Chris@1464 285 assert_include "redmine.message-1.20070512151532@example.net", mail.references
Chris@0 286 assert_select_email do
Chris@0 287 # link to the reply
Chris@909 288 assert_select "a[href=?]",
Chris@909 289 "http://mydomain.foo/boards/#{message.board.id}/topics/#{message.root.id}?r=#{message.id}#message-#{message.id}",
Chris@909 290 :text => message.subject
Chris@0 291 end
Chris@0 292 end
Chris@909 293
Chris@1464 294 test "#issue_add should notify project members" do
Chris@1464 295 issue = Issue.find(1)
Chris@1464 296 assert Mailer.deliver_issue_add(issue)
Chris@1464 297 assert last_email.bcc.include?('dlopper@somenet.foo')
Chris@1464 298 end
Chris@1464 299
Chris@1464 300 test "#issue_add should not notify project members that are not allow to view the issue" do
Chris@1464 301 issue = Issue.find(1)
Chris@1464 302 Role.find(2).remove_permission!(:view_issues)
Chris@1464 303 assert Mailer.deliver_issue_add(issue)
Chris@1464 304 assert !last_email.bcc.include?('dlopper@somenet.foo')
Chris@1464 305 end
Chris@1464 306
Chris@1464 307 test "#issue_add should notify issue watchers" do
Chris@1464 308 issue = Issue.find(1)
Chris@1464 309 user = User.find(9)
Chris@1464 310 # minimal email notification options
Chris@1464 311 user.pref.no_self_notified = '1'
Chris@1464 312 user.pref.save
Chris@1464 313 user.mail_notification = false
Chris@1464 314 user.save
Chris@1464 315
Chris@1464 316 Watcher.create!(:watchable => issue, :user => user)
Chris@1464 317 assert Mailer.deliver_issue_add(issue)
Chris@1464 318 assert last_email.bcc.include?(user.mail)
Chris@1464 319 end
Chris@1464 320
Chris@1464 321 test "#issue_add should not notify watchers not allowed to view the issue" do
Chris@1464 322 issue = Issue.find(1)
Chris@1464 323 user = User.find(9)
Chris@1464 324 Watcher.create!(:watchable => issue, :user => user)
Chris@1464 325 Role.non_member.remove_permission!(:view_issues)
Chris@1464 326 assert Mailer.deliver_issue_add(issue)
Chris@1464 327 assert !last_email.bcc.include?(user.mail)
Chris@1464 328 end
Chris@1464 329
Chris@1464 330 def test_issue_add_should_include_enabled_fields
Chris@1464 331 Setting.default_language = 'en'
Chris@1464 332 issue = Issue.find(2)
Chris@1464 333 assert Mailer.deliver_issue_add(issue)
Chris@1464 334 assert_mail_body_match '* Target version: 1.0', last_email
Chris@1464 335 assert_select_email do
Chris@1464 336 assert_select 'li', :text => 'Target version: 1.0'
Chris@0 337 end
Chris@1464 338 end
Chris@909 339
Chris@1464 340 def test_issue_add_should_not_include_disabled_fields
Chris@1464 341 Setting.default_language = 'en'
Chris@1464 342 issue = Issue.find(2)
Chris@1464 343 tracker = issue.tracker
Chris@1464 344 tracker.core_fields -= ['fixed_version_id']
Chris@1464 345 tracker.save!
Chris@1464 346 assert Mailer.deliver_issue_add(issue)
Chris@1464 347 assert_mail_body_no_match 'Target version', last_email
Chris@1464 348 assert_select_email do
Chris@1464 349 assert_select 'li', :text => /Target version/, :count => 0
Chris@0 350 end
Chris@0 351 end
Chris@909 352
Chris@0 353 # test mailer methods for each language
Chris@0 354 def test_issue_add
Chris@0 355 issue = Issue.find(1)
Chris@0 356 valid_languages.each do |lang|
Chris@0 357 Setting.default_language = lang.to_s
Chris@1464 358 assert Mailer.deliver_issue_add(issue)
Chris@0 359 end
Chris@0 360 end
Chris@0 361
Chris@0 362 def test_issue_edit
Chris@0 363 journal = Journal.find(1)
Chris@0 364 valid_languages.each do |lang|
Chris@0 365 Setting.default_language = lang.to_s
Chris@1464 366 assert Mailer.deliver_issue_edit(journal)
Chris@0 367 end
Chris@0 368 end
Chris@909 369
Chris@1115 370 def test_issue_edit_should_send_private_notes_to_users_with_permission_only
Chris@1115 371 journal = Journal.find(1)
Chris@1115 372 journal.private_notes = true
Chris@1115 373 journal.save!
Chris@1115 374
Chris@1115 375 Role.find(2).add_permission! :view_private_notes
Chris@1464 376 Mailer.deliver_issue_edit(journal)
Chris@1115 377 assert_equal %w(dlopper@somenet.foo jsmith@somenet.foo), ActionMailer::Base.deliveries.last.bcc.sort
Chris@1115 378
Chris@1115 379 Role.find(2).remove_permission! :view_private_notes
Chris@1464 380 Mailer.deliver_issue_edit(journal)
Chris@1115 381 assert_equal %w(jsmith@somenet.foo), ActionMailer::Base.deliveries.last.bcc.sort
Chris@1115 382 end
Chris@1115 383
Chris@1115 384 def test_issue_edit_should_send_private_notes_to_watchers_with_permission_only
Chris@1115 385 Issue.find(1).set_watcher(User.find_by_login('someone'))
Chris@1115 386 journal = Journal.find(1)
Chris@1115 387 journal.private_notes = true
Chris@1115 388 journal.save!
Chris@1115 389
Chris@1115 390 Role.non_member.add_permission! :view_private_notes
Chris@1464 391 Mailer.deliver_issue_edit(journal)
Chris@1115 392 assert_include 'someone@foo.bar', ActionMailer::Base.deliveries.last.bcc.sort
Chris@1115 393
Chris@1115 394 Role.non_member.remove_permission! :view_private_notes
Chris@1464 395 Mailer.deliver_issue_edit(journal)
Chris@1115 396 assert_not_include 'someone@foo.bar', ActionMailer::Base.deliveries.last.bcc.sort
Chris@1115 397 end
Chris@1115 398
Chris@1464 399 def test_issue_edit_should_mark_private_notes
Chris@1464 400 journal = Journal.find(2)
Chris@1464 401 journal.private_notes = true
Chris@1464 402 journal.save!
Chris@1464 403
Chris@1464 404 with_settings :default_language => 'en' do
Chris@1464 405 Mailer.deliver_issue_edit(journal)
Chris@1464 406 end
Chris@1464 407 assert_mail_body_match '(Private notes)', last_email
Chris@1464 408 end
Chris@1464 409
Chris@1464 410 def test_issue_edit_with_relation_should_notify_users_who_can_see_the_related_issue
Chris@1464 411 issue = Issue.generate!
Chris@1464 412 private_issue = Issue.generate!(:is_private => true)
Chris@1464 413 IssueRelation.create!(:issue_from => issue, :issue_to => private_issue, :relation_type => 'relates')
Chris@1464 414 issue.reload
Chris@1464 415 assert_equal 1, issue.journals.size
Chris@1464 416 journal = issue.journals.first
Chris@1464 417 ActionMailer::Base.deliveries.clear
Chris@1464 418
Chris@1464 419 Mailer.deliver_issue_edit(journal)
Chris@1464 420 last_email.bcc.each do |email|
Chris@1464 421 user = User.find_by_mail(email)
Chris@1464 422 assert private_issue.visible?(user), "Issue was not visible to #{user}"
Chris@1464 423 end
Chris@1464 424 end
Chris@1464 425
Chris@0 426 def test_document_added
Chris@0 427 document = Document.find(1)
Chris@0 428 valid_languages.each do |lang|
Chris@0 429 Setting.default_language = lang.to_s
Chris@1115 430 assert Mailer.document_added(document).deliver
Chris@0 431 end
Chris@0 432 end
Chris@909 433
Chris@0 434 def test_attachments_added
Chris@0 435 attachements = [ Attachment.find_by_container_type('Document') ]
Chris@0 436 valid_languages.each do |lang|
Chris@0 437 Setting.default_language = lang.to_s
Chris@1115 438 assert Mailer.attachments_added(attachements).deliver
Chris@0 439 end
Chris@0 440 end
Chris@909 441
Chris@0 442 def test_version_file_added
Chris@0 443 attachements = [ Attachment.find_by_container_type('Version') ]
Chris@1115 444 assert Mailer.attachments_added(attachements).deliver
Chris@0 445 assert_not_nil last_email.bcc
Chris@0 446 assert last_email.bcc.any?
Chris@441 447 assert_select_email do
Chris@441 448 assert_select "a[href=?]", "http://mydomain.foo/projects/ecookbook/files"
Chris@441 449 end
Chris@0 450 end
Chris@909 451
Chris@0 452 def test_project_file_added
Chris@0 453 attachements = [ Attachment.find_by_container_type('Project') ]
Chris@1115 454 assert Mailer.attachments_added(attachements).deliver
Chris@0 455 assert_not_nil last_email.bcc
Chris@0 456 assert last_email.bcc.any?
Chris@441 457 assert_select_email do
Chris@441 458 assert_select "a[href=?]", "http://mydomain.foo/projects/ecookbook/files"
Chris@441 459 end
Chris@0 460 end
Chris@909 461
Chris@0 462 def test_news_added
Chris@1464 463 news = News.first
Chris@0 464 valid_languages.each do |lang|
Chris@0 465 Setting.default_language = lang.to_s
Chris@1115 466 assert Mailer.news_added(news).deliver
Chris@0 467 end
Chris@0 468 end
Chris@909 469
Chris@441 470 def test_news_comment_added
Chris@441 471 comment = Comment.find(2)
Chris@441 472 valid_languages.each do |lang|
Chris@441 473 Setting.default_language = lang.to_s
Chris@1115 474 assert Mailer.news_comment_added(comment).deliver
Chris@441 475 end
Chris@441 476 end
Chris@909 477
Chris@0 478 def test_message_posted
Chris@1464 479 message = Message.first
Chris@0 480 recipients = ([message.root] + message.root.children).collect {|m| m.author.mail if m.author}
Chris@0 481 recipients = recipients.compact.uniq
Chris@0 482 valid_languages.each do |lang|
Chris@0 483 Setting.default_language = lang.to_s
Chris@1115 484 assert Mailer.message_posted(message).deliver
Chris@0 485 end
Chris@0 486 end
Chris@909 487
Chris@119 488 def test_wiki_content_added
Chris@929 489 content = WikiContent.find(1)
Chris@119 490 valid_languages.each do |lang|
Chris@119 491 Setting.default_language = lang.to_s
Chris@119 492 assert_difference 'ActionMailer::Base.deliveries.size' do
Chris@1115 493 assert Mailer.wiki_content_added(content).deliver
Chris@1115 494 assert_select_email do
Chris@1115 495 assert_select 'a[href=?]',
Chris@1115 496 'http://mydomain.foo/projects/ecookbook/wiki/CookBook_documentation',
Chris@1115 497 :text => 'CookBook documentation'
Chris@1115 498 end
Chris@119 499 end
Chris@119 500 end
Chris@119 501 end
Chris@909 502
Chris@119 503 def test_wiki_content_updated
Chris@929 504 content = WikiContent.find(1)
Chris@119 505 valid_languages.each do |lang|
Chris@119 506 Setting.default_language = lang.to_s
Chris@119 507 assert_difference 'ActionMailer::Base.deliveries.size' do
Chris@1115 508 assert Mailer.wiki_content_updated(content).deliver
Chris@1115 509 assert_select_email do
Chris@1115 510 assert_select 'a[href=?]',
Chris@1115 511 'http://mydomain.foo/projects/ecookbook/wiki/CookBook_documentation',
Chris@1115 512 :text => 'CookBook documentation'
Chris@1115 513 end
Chris@119 514 end
Chris@119 515 end
Chris@119 516 end
Chris@909 517
Chris@0 518 def test_account_information
Chris@0 519 user = User.find(2)
Chris@0 520 valid_languages.each do |lang|
Chris@0 521 user.update_attribute :language, lang.to_s
Chris@0 522 user.reload
Chris@1115 523 assert Mailer.account_information(user, 'pAsswORd').deliver
Chris@0 524 end
Chris@0 525 end
Chris@0 526
Chris@0 527 def test_lost_password
Chris@0 528 token = Token.find(2)
Chris@0 529 valid_languages.each do |lang|
Chris@0 530 token.user.update_attribute :language, lang.to_s
Chris@0 531 token.reload
Chris@1115 532 assert Mailer.lost_password(token).deliver
Chris@0 533 end
Chris@0 534 end
Chris@0 535
Chris@0 536 def test_register
Chris@0 537 token = Token.find(1)
Chris@0 538 Setting.host_name = 'redmine.foo'
Chris@0 539 Setting.protocol = 'https'
Chris@909 540
Chris@0 541 valid_languages.each do |lang|
Chris@0 542 token.user.update_attribute :language, lang.to_s
Chris@0 543 token.reload
Chris@0 544 ActionMailer::Base.deliveries.clear
Chris@1115 545 assert Mailer.register(token).deliver
Chris@1115 546 mail = last_email
Chris@1115 547 assert_select_email do
Chris@1115 548 assert_select "a[href=?]",
Chris@1115 549 "https://redmine.foo/account/activate?token=#{token.value}",
Chris@1115 550 :text => "https://redmine.foo/account/activate?token=#{token.value}"
Chris@1115 551 end
Chris@0 552 end
Chris@0 553 end
Chris@909 554
Chris@0 555 def test_test
Chris@0 556 user = User.find(1)
Chris@0 557 valid_languages.each do |lang|
Chris@0 558 user.update_attribute :language, lang.to_s
Chris@1115 559 assert Mailer.test_email(user).deliver
Chris@0 560 end
Chris@0 561 end
Chris@909 562
Chris@0 563 def test_reminders
Chris@0 564 Mailer.reminders(:days => 42)
Chris@0 565 assert_equal 1, ActionMailer::Base.deliveries.size
Chris@1115 566 mail = last_email
Chris@0 567 assert mail.bcc.include?('dlopper@somenet.foo')
Chris@1115 568 assert_mail_body_match 'Bug #3: Error 281 when updating a recipe', mail
Chris@14 569 assert_equal '1 issue(s) due in the next 42 days', mail.subject
Chris@0 570 end
Chris@909 571
Chris@1115 572 def test_reminders_should_not_include_closed_issues
Chris@1115 573 with_settings :default_language => 'en' do
Chris@1115 574 Issue.create!(:project_id => 1, :tracker_id => 1, :status_id => 5,
Chris@1115 575 :subject => 'Closed issue', :assigned_to_id => 3,
Chris@1115 576 :due_date => 5.days.from_now,
Chris@1115 577 :author_id => 2)
Chris@1115 578 ActionMailer::Base.deliveries.clear
Chris@1115 579
Chris@1115 580 Mailer.reminders(:days => 42)
Chris@1115 581 assert_equal 1, ActionMailer::Base.deliveries.size
Chris@1115 582 mail = last_email
Chris@1115 583 assert mail.bcc.include?('dlopper@somenet.foo')
Chris@1115 584 assert_mail_body_no_match 'Closed issue', mail
Chris@1115 585 end
Chris@1115 586 end
Chris@1115 587
chris@22 588 def test_reminders_for_users
chris@22 589 Mailer.reminders(:days => 42, :users => ['5'])
chris@22 590 assert_equal 0, ActionMailer::Base.deliveries.size # No mail for dlopper
chris@22 591 Mailer.reminders(:days => 42, :users => ['3'])
chris@22 592 assert_equal 1, ActionMailer::Base.deliveries.size # No mail for dlopper
Chris@1115 593 mail = last_email
chris@22 594 assert mail.bcc.include?('dlopper@somenet.foo')
Chris@1115 595 assert_mail_body_match 'Bug #3: Error 281 when updating a recipe', mail
chris@22 596 end
Chris@909 597
Chris@1115 598 def test_reminder_should_include_issues_assigned_to_groups
Chris@1115 599 with_settings :default_language => 'en' do
Chris@1115 600 group = Group.generate!
Chris@1115 601 group.users << User.find(2)
Chris@1115 602 group.users << User.find(3)
Chris@1115 603
Chris@1115 604 Issue.create!(:project_id => 1, :tracker_id => 1, :status_id => 1,
Chris@1115 605 :subject => 'Assigned to group', :assigned_to => group,
Chris@1115 606 :due_date => 5.days.from_now,
Chris@1115 607 :author_id => 2)
Chris@1115 608 ActionMailer::Base.deliveries.clear
Chris@1115 609
Chris@1115 610 Mailer.reminders(:days => 7)
Chris@1115 611 assert_equal 2, ActionMailer::Base.deliveries.size
Chris@1115 612 assert_equal %w(dlopper@somenet.foo jsmith@somenet.foo), ActionMailer::Base.deliveries.map(&:bcc).flatten.sort
Chris@1115 613 ActionMailer::Base.deliveries.each do |mail|
Chris@1115 614 assert_mail_body_match 'Assigned to group', mail
Chris@1115 615 end
Chris@1115 616 end
Chris@0 617 end
Chris@909 618
Chris@0 619 def test_mailer_should_not_change_locale
Chris@0 620 Setting.default_language = 'en'
Chris@0 621 # Set current language to italian
Chris@0 622 set_language_if_valid 'it'
Chris@0 623 # Send an email to a french user
Chris@0 624 user = User.find(1)
Chris@0 625 user.language = 'fr'
Chris@1115 626 Mailer.account_activated(user).deliver
Chris@1115 627 mail = last_email
Chris@1115 628 assert_mail_body_match 'Votre compte', mail
Chris@909 629
Chris@0 630 assert_equal :it, current_language
Chris@0 631 end
Chris@909 632
Chris@0 633 def test_with_deliveries_off
Chris@0 634 Mailer.with_deliveries false do
Chris@1115 635 Mailer.test_email(User.find(1)).deliver
Chris@0 636 end
Chris@0 637 assert ActionMailer::Base.deliveries.empty?
Chris@0 638 # should restore perform_deliveries
Chris@0 639 assert ActionMailer::Base.perform_deliveries
Chris@0 640 end
chris@37 641
Chris@1115 642 def test_layout_should_include_the_emails_header
Chris@1115 643 with_settings :emails_header => "*Header content*" do
Chris@1464 644 with_settings :plain_text_mail => 0 do
Chris@1464 645 assert Mailer.test_email(User.find(1)).deliver
Chris@1464 646 assert_select_email do
Chris@1464 647 assert_select ".header" do
Chris@1464 648 assert_select "strong", :text => "Header content"
Chris@1464 649 end
Chris@1464 650 end
Chris@1464 651 end
Chris@1464 652 with_settings :plain_text_mail => 1 do
Chris@1464 653 assert Mailer.test_email(User.find(1)).deliver
Chris@1464 654 mail = last_email
Chris@1464 655 assert_not_nil mail
Chris@1464 656 assert_include "*Header content*", mail.body.decoded
Chris@1464 657 end
Chris@1464 658 end
Chris@1464 659 end
Chris@1464 660
Chris@1464 661 def test_layout_should_not_include_empty_emails_header
Chris@1464 662 with_settings :emails_header => "", :plain_text_mail => 0 do
Chris@1115 663 assert Mailer.test_email(User.find(1)).deliver
Chris@1115 664 assert_select_email do
Chris@1464 665 assert_select ".header", false
Chris@1464 666 end
Chris@1464 667 end
Chris@1464 668 end
Chris@1464 669
Chris@1464 670 def test_layout_should_include_the_emails_footer
Chris@1464 671 with_settings :emails_footer => "*Footer content*" do
Chris@1464 672 with_settings :plain_text_mail => 0 do
Chris@1464 673 assert Mailer.test_email(User.find(1)).deliver
Chris@1464 674 assert_select_email do
Chris@1464 675 assert_select ".footer" do
Chris@1464 676 assert_select "strong", :text => "Footer content"
Chris@1464 677 end
chris@37 678 end
chris@37 679 end
Chris@1464 680 with_settings :plain_text_mail => 1 do
Chris@1464 681 assert Mailer.test_email(User.find(1)).deliver
Chris@1464 682 mail = last_email
Chris@1464 683 assert_not_nil mail
Chris@1464 684 assert_include "\n-- \n", mail.body.decoded
Chris@1464 685 assert_include "*Footer content*", mail.body.decoded
Chris@1464 686 end
Chris@1464 687 end
Chris@1464 688 end
Chris@1464 689
Chris@1464 690 def test_layout_should_not_include_empty_emails_footer
Chris@1464 691 with_settings :emails_footer => "" do
Chris@1464 692 with_settings :plain_text_mail => 0 do
Chris@1464 693 assert Mailer.test_email(User.find(1)).deliver
Chris@1464 694 assert_select_email do
Chris@1464 695 assert_select ".footer", false
Chris@1464 696 end
Chris@1464 697 end
Chris@1464 698 with_settings :plain_text_mail => 1 do
Chris@1464 699 assert Mailer.test_email(User.find(1)).deliver
Chris@1464 700 mail = last_email
Chris@1464 701 assert_not_nil mail
Chris@1464 702 assert_not_include "\n-- \n", mail.body.decoded
Chris@1464 703 end
chris@37 704 end
chris@37 705 end
Chris@1115 706
Chris@1115 707 def test_should_escape_html_templates_only
Chris@1115 708 Issue.generate!(:project_id => 1, :tracker_id => 1, :subject => 'Subject with a <tag>')
Chris@1115 709 mail = last_email
Chris@1115 710 assert_equal 2, mail.parts.size
Chris@1115 711 assert_include '<tag>', text_part.body.encoded
Chris@1115 712 assert_include '&lt;tag&gt;', html_part.body.encoded
Chris@1115 713 end
Chris@1115 714
Chris@1464 715 def test_should_raise_delivery_errors_when_raise_delivery_errors_is_true
Chris@1464 716 mail = Mailer.test_email(User.find(1))
Chris@1464 717 mail.delivery_method.stubs(:deliver!).raises(Exception.new("delivery error"))
Chris@1464 718
Chris@1464 719 ActionMailer::Base.raise_delivery_errors = true
Chris@1464 720 assert_raise Exception, "delivery error" do
Chris@1464 721 mail.deliver
Chris@1464 722 end
Chris@1464 723 ensure
Chris@1464 724 ActionMailer::Base.raise_delivery_errors = false
Chris@1464 725 end
Chris@1464 726
Chris@1464 727 def test_should_log_delivery_errors_when_raise_delivery_errors_is_false
Chris@1464 728 mail = Mailer.test_email(User.find(1))
Chris@1464 729 mail.delivery_method.stubs(:deliver!).raises(Exception.new("delivery error"))
Chris@1464 730
Chris@1464 731 Rails.logger.expects(:error).with("Email delivery error: delivery error")
Chris@1464 732 ActionMailer::Base.raise_delivery_errors = false
Chris@1464 733 assert_nothing_raised do
Chris@1464 734 mail.deliver
Chris@1464 735 end
Chris@1464 736 end
Chris@1464 737
Chris@1464 738 def test_mail_should_return_a_mail_message
Chris@1464 739 assert_kind_of ::Mail::Message, Mailer.test_email(User.find(1))
Chris@1464 740 end
Chris@1464 741
Chris@1115 742 private
Chris@1115 743
Chris@1115 744 def last_email
Chris@1115 745 mail = ActionMailer::Base.deliveries.last
Chris@1115 746 assert_not_nil mail
Chris@1115 747 mail
Chris@1115 748 end
Chris@1115 749
Chris@1115 750 def text_part
Chris@1115 751 last_email.parts.detect {|part| part.content_type.include?('text/plain')}
Chris@1115 752 end
Chris@1115 753
Chris@1115 754 def html_part
Chris@1115 755 last_email.parts.detect {|part| part.content_type.include?('text/html')}
Chris@1115 756 end
Chris@0 757 end