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