annotate .svn/pristine/11/11e346e9edcfd6783f0cb16b00aae87132a43f72.svn-base @ 1621:3a510bf6a9bc

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