comparison test/unit/mailer_test.rb @ 1526:404aa68d4227

Merge from live branch
author Chris Cannam
date Thu, 11 Sep 2014 12:46:20 +0100
parents dffacf8a6908
children
comparison
equal deleted inserted replaced
1493:a5f2bdf3b486 1526:404aa68d4227
1 # Redmine - project management software 1 # Redmine - project management software
2 # Copyright (C) 2006-2012 Jean-Philippe Lang 2 # Copyright (C) 2006-2014 Jean-Philippe Lang
3 # 3 #
4 # This program is free software; you can redistribute it and/or 4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License 5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2 6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version. 7 # of the License, or (at your option) any later version.
40 Setting.default_language = 'en' 40 Setting.default_language = 'en'
41 Setting.host_name = 'mydomain.foo' 41 Setting.host_name = 'mydomain.foo'
42 Setting.protocol = 'https' 42 Setting.protocol = 'https'
43 43
44 journal = Journal.find(3) 44 journal = Journal.find(3)
45 assert Mailer.issue_edit(journal).deliver 45 assert Mailer.deliver_issue_edit(journal)
46 46
47 mail = last_email 47 mail = last_email
48 assert_not_nil mail 48 assert_not_nil mail
49 49
50 assert_select_email do 50 assert_select_email do
53 'https://mydomain.foo/issues/2#change-3', 53 'https://mydomain.foo/issues/2#change-3',
54 :text => 'Feature request #2: Add ingredients categories' 54 :text => 'Feature request #2: Add ingredients categories'
55 # link to a referenced ticket 55 # link to a referenced ticket
56 assert_select 'a[href=?][title=?]', 56 assert_select 'a[href=?][title=?]',
57 'https://mydomain.foo/issues/1', 57 'https://mydomain.foo/issues/1',
58 'Can't print recipes (New)', 58 "#{ESCAPED_UCANT} print recipes (New)",
59 :text => '#1' 59 :text => '#1'
60 # link to a changeset 60 # link to a changeset
61 assert_select 'a[href=?][title=?]', 61 assert_select 'a[href=?][title=?]',
62 'https://mydomain.foo/projects/ecookbook/repository/revisions/2', 62 'https://mydomain.foo/projects/ecookbook/repository/revisions/2',
63 'This commit fixes #1, #2 and references #1 & #3', 63 'This commit fixes #1, #2 and references #1 & #3',
79 relative_url_root = Redmine::Utils.relative_url_root 79 relative_url_root = Redmine::Utils.relative_url_root
80 Setting.host_name = 'mydomain.foo/rdm' 80 Setting.host_name = 'mydomain.foo/rdm'
81 Setting.protocol = 'http' 81 Setting.protocol = 'http'
82 82
83 journal = Journal.find(3) 83 journal = Journal.find(3)
84 assert Mailer.issue_edit(journal).deliver 84 assert Mailer.deliver_issue_edit(journal)
85 85
86 mail = last_email 86 mail = last_email
87 assert_not_nil mail 87 assert_not_nil mail
88 88
89 assert_select_email do 89 assert_select_email do
92 'http://mydomain.foo/rdm/issues/2#change-3', 92 'http://mydomain.foo/rdm/issues/2#change-3',
93 :text => 'Feature request #2: Add ingredients categories' 93 :text => 'Feature request #2: Add ingredients categories'
94 # link to a referenced ticket 94 # link to a referenced ticket
95 assert_select 'a[href=?][title=?]', 95 assert_select 'a[href=?][title=?]',
96 'http://mydomain.foo/rdm/issues/1', 96 'http://mydomain.foo/rdm/issues/1',
97 'Can't print recipes (New)', 97 "#{ESCAPED_UCANT} print recipes (New)",
98 :text => '#1' 98 :text => '#1'
99 # link to a changeset 99 # link to a changeset
100 assert_select 'a[href=?][title=?]', 100 assert_select 'a[href=?][title=?]',
101 'http://mydomain.foo/rdm/projects/ecookbook/repository/revisions/2', 101 'http://mydomain.foo/rdm/projects/ecookbook/repository/revisions/2',
102 'This commit fixes #1, #2 and references #1 & #3', 102 'This commit fixes #1, #2 and references #1 & #3',
111 'http://mydomain.foo/rdm/attachments/download/4/source.rb', 111 'http://mydomain.foo/rdm/attachments/download/4/source.rb',
112 :text => 'source.rb' 112 :text => 'source.rb'
113 end 113 end
114 end 114 end
115 115
116 def test_issue_edit_should_generate_url_with_hostname_for_relations
117 journal = Journal.new(:journalized => Issue.find(1), :user => User.find(1), :created_on => Time.now)
118 journal.details << JournalDetail.new(:property => 'relation', :prop_key => 'label_relates_to', :value => 2)
119 Mailer.deliver_issue_edit(journal)
120 assert_not_nil last_email
121 assert_select_email do
122 assert_select 'a[href=?]', 'http://mydomain.foo/issues/2', :text => 'Feature request #2'
123 end
124 end
125
116 def test_generated_links_with_prefix_and_no_relative_url_root 126 def test_generated_links_with_prefix_and_no_relative_url_root
117 Setting.default_language = 'en' 127 Setting.default_language = 'en'
118 relative_url_root = Redmine::Utils.relative_url_root 128 relative_url_root = Redmine::Utils.relative_url_root
119 Setting.host_name = 'mydomain.foo/rdm' 129 Setting.host_name = 'mydomain.foo/rdm'
120 Setting.protocol = 'http' 130 Setting.protocol = 'http'
121 Redmine::Utils.relative_url_root = nil 131 Redmine::Utils.relative_url_root = nil
122 132
123 journal = Journal.find(3) 133 journal = Journal.find(3)
124 assert Mailer.issue_edit(journal).deliver 134 assert Mailer.deliver_issue_edit(journal)
125 135
126 mail = last_email 136 mail = last_email
127 assert_not_nil mail 137 assert_not_nil mail
128 138
129 assert_select_email do 139 assert_select_email do
132 'http://mydomain.foo/rdm/issues/2#change-3', 142 'http://mydomain.foo/rdm/issues/2#change-3',
133 :text => 'Feature request #2: Add ingredients categories' 143 :text => 'Feature request #2: Add ingredients categories'
134 # link to a referenced ticket 144 # link to a referenced ticket
135 assert_select 'a[href=?][title=?]', 145 assert_select 'a[href=?][title=?]',
136 'http://mydomain.foo/rdm/issues/1', 146 'http://mydomain.foo/rdm/issues/1',
137 'Can&#x27;t print recipes (New)', 147 "#{ESCAPED_UCANT} print recipes (New)",
138 :text => '#1' 148 :text => '#1'
139 # link to a changeset 149 # link to a changeset
140 assert_select 'a[href=?][title=?]', 150 assert_select 'a[href=?][title=?]',
141 'http://mydomain.foo/rdm/projects/ecookbook/repository/revisions/2', 151 'http://mydomain.foo/rdm/projects/ecookbook/repository/revisions/2',
142 'This commit fixes #1, #2 and references #1 &amp; #3', 152 'This commit fixes #1, #2 and references #1 &amp; #3',
156 Redmine::Utils.relative_url_root = relative_url_root 166 Redmine::Utils.relative_url_root = relative_url_root
157 end 167 end
158 168
159 def test_email_headers 169 def test_email_headers
160 issue = Issue.find(1) 170 issue = Issue.find(1)
161 Mailer.issue_add(issue).deliver 171 Mailer.deliver_issue_add(issue)
162 mail = last_email 172 mail = last_email
163 assert_not_nil mail 173 assert_not_nil mail
164 assert_equal 'OOF', mail.header['X-Auto-Response-Suppress'].to_s 174 assert_equal 'OOF', mail.header['X-Auto-Response-Suppress'].to_s
165 assert_equal 'auto-generated', mail.header['Auto-Submitted'].to_s 175 assert_equal 'auto-generated', mail.header['Auto-Submitted'].to_s
166 assert_equal '<redmine.example.net>', mail.header['List-Id'].to_s 176 assert_equal '<redmine.example.net>', mail.header['List-Id'].to_s
167 end 177 end
168 178
169 def test_email_headers_should_include_sender 179 def test_email_headers_should_include_sender
170 issue = Issue.find(1) 180 issue = Issue.find(1)
171 Mailer.issue_add(issue).deliver 181 Mailer.deliver_issue_add(issue)
172 mail = last_email 182 mail = last_email
173 assert_equal issue.author.login, mail.header['X-Redmine-Sender'].to_s 183 assert_equal issue.author.login, mail.header['X-Redmine-Sender'].to_s
174 end 184 end
175 185
176 def test_plain_text_mail 186 def test_plain_text_mail
177 Setting.plain_text_mail = 1 187 Setting.plain_text_mail = 1
178 journal = Journal.find(2) 188 journal = Journal.find(2)
179 Mailer.issue_edit(journal).deliver 189 Mailer.deliver_issue_edit(journal)
180 mail = last_email 190 mail = last_email
181 assert_equal "text/plain; charset=UTF-8", mail.content_type 191 assert_equal "text/plain; charset=UTF-8", mail.content_type
182 assert_equal 0, mail.parts.size 192 assert_equal 0, mail.parts.size
183 assert !mail.encoded.include?('href') 193 assert !mail.encoded.include?('href')
184 end 194 end
185 195
186 def test_html_mail 196 def test_html_mail
187 Setting.plain_text_mail = 0 197 Setting.plain_text_mail = 0
188 journal = Journal.find(2) 198 journal = Journal.find(2)
189 Mailer.issue_edit(journal).deliver 199 Mailer.deliver_issue_edit(journal)
190 mail = last_email 200 mail = last_email
191 assert_equal 2, mail.parts.size 201 assert_equal 2, mail.parts.size
192 assert mail.encoded.include?('href') 202 assert mail.encoded.include?('href')
193 end 203 end
194 204
208 assert_equal 'redmine@example.net', mail.from_addrs.first 218 assert_equal 'redmine@example.net', mail.from_addrs.first
209 assert_equal 'Redmine app <redmine@example.net>', mail.header['From'].to_s 219 assert_equal 'Redmine app <redmine@example.net>', mail.header['From'].to_s
210 end 220 end
211 221
212 def test_should_not_send_email_without_recipient 222 def test_should_not_send_email_without_recipient
213 news = News.find(:first) 223 news = News.first
214 user = news.author 224 user = news.author
215 # Remove members except news author 225 # Remove members except news author
216 news.project.memberships.each {|m| m.destroy unless m.user == user} 226 news.project.memberships.each {|m| m.destroy unless m.user == user}
217 227
218 user.pref[:no_self_notified] = false 228 user.pref.no_self_notified = false
219 user.pref.save 229 user.pref.save
220 User.current = user 230 User.current = user
221 Mailer.news_added(news.reload).deliver 231 Mailer.news_added(news.reload).deliver
222 assert_equal 1, last_email.bcc.size 232 assert_equal 1, last_email.bcc.size
223 233
224 # nobody to notify 234 # nobody to notify
225 user.pref[:no_self_notified] = true 235 user.pref.no_self_notified = true
226 user.pref.save 236 user.pref.save
227 User.current = user 237 User.current = user
228 ActionMailer::Base.deliveries.clear 238 ActionMailer::Base.deliveries.clear
229 Mailer.news_added(news.reload).deliver 239 Mailer.news_added(news.reload).deliver
230 assert ActionMailer::Base.deliveries.empty? 240 assert ActionMailer::Base.deliveries.empty?
231 end 241 end
232 242
233 def test_issue_add_message_id 243 def test_issue_add_message_id
234 issue = Issue.find(1) 244 issue = Issue.find(2)
235 Mailer.issue_add(issue).deliver 245 Mailer.deliver_issue_add(issue)
236 mail = last_email 246 mail = last_email
237 assert_equal Mailer.message_id_for(issue), mail.message_id 247 assert_match /^redmine\.issue-2\.20060719190421\.[a-f0-9]+@example\.net/, mail.message_id
238 assert_nil mail.references 248 assert_include "redmine.issue-2.20060719190421@example.net", mail.references
239 end 249 end
240 250
241 def test_issue_edit_message_id 251 def test_issue_edit_message_id
242 journal = Journal.find(1) 252 journal = Journal.find(3)
243 Mailer.issue_edit(journal).deliver 253 journal.issue = Issue.find(2)
244 mail = last_email 254
245 assert_equal Mailer.message_id_for(journal), mail.message_id 255 Mailer.deliver_issue_edit(journal)
246 assert_include Mailer.message_id_for(journal.issue), mail.references 256 mail = last_email
257 assert_match /^redmine\.journal-3\.\d+\.[a-f0-9]+@example\.net/, mail.message_id
258 assert_include "redmine.issue-2.20060719190421@example.net", mail.references
247 assert_select_email do 259 assert_select_email do
248 # link to the update 260 # link to the update
249 assert_select "a[href=?]", 261 assert_select "a[href=?]",
250 "http://mydomain.foo/issues/#{journal.journalized_id}#change-#{journal.id}" 262 "http://mydomain.foo/issues/#{journal.journalized_id}#change-#{journal.id}"
251 end 263 end
253 265
254 def test_message_posted_message_id 266 def test_message_posted_message_id
255 message = Message.find(1) 267 message = Message.find(1)
256 Mailer.message_posted(message).deliver 268 Mailer.message_posted(message).deliver
257 mail = last_email 269 mail = last_email
258 assert_equal Mailer.message_id_for(message), mail.message_id 270 assert_match /^redmine\.message-1\.\d+\.[a-f0-9]+@example\.net/, mail.message_id
259 assert_nil mail.references 271 assert_include "redmine.message-1.20070512151532@example.net", mail.references
260 assert_select_email do 272 assert_select_email do
261 # link to the message 273 # link to the message
262 assert_select "a[href=?]", 274 assert_select "a[href=?]",
263 "http://mydomain.foo/boards/#{message.board.id}/topics/#{message.id}", 275 "http://mydomain.foo/boards/#{message.board.id}/topics/#{message.id}",
264 :text => message.subject 276 :text => message.subject
267 279
268 def test_reply_posted_message_id 280 def test_reply_posted_message_id
269 message = Message.find(3) 281 message = Message.find(3)
270 Mailer.message_posted(message).deliver 282 Mailer.message_posted(message).deliver
271 mail = last_email 283 mail = last_email
272 assert_equal Mailer.message_id_for(message), mail.message_id 284 assert_match /^redmine\.message-3\.\d+\.[a-f0-9]+@example\.net/, mail.message_id
273 assert_include Mailer.message_id_for(message.parent), mail.references 285 assert_include "redmine.message-1.20070512151532@example.net", mail.references
274 assert_select_email do 286 assert_select_email do
275 # link to the reply 287 # link to the reply
276 assert_select "a[href=?]", 288 assert_select "a[href=?]",
277 "http://mydomain.foo/boards/#{message.board.id}/topics/#{message.root.id}?r=#{message.id}#message-#{message.id}", 289 "http://mydomain.foo/boards/#{message.board.id}/topics/#{message.root.id}?r=#{message.id}#message-#{message.id}",
278 :text => message.subject 290 :text => message.subject
279 end 291 end
280 end 292 end
281 293
282 context("#issue_add") do 294 test "#issue_add should notify project members" do
283 setup do 295 issue = Issue.find(1)
284 ActionMailer::Base.deliveries.clear 296 assert Mailer.deliver_issue_add(issue)
285 Setting.bcc_recipients = '1' 297 assert last_email.bcc.include?('dlopper@somenet.foo')
286 @issue = Issue.find(1) 298 end
287 end 299
288 300 test "#issue_add should not notify project members that are not allow to view the issue" do
289 should "notify project members" do 301 issue = Issue.find(1)
290 assert Mailer.issue_add(@issue).deliver 302 Role.find(2).remove_permission!(:view_issues)
291 assert last_email.bcc.include?('dlopper@somenet.foo') 303 assert Mailer.deliver_issue_add(issue)
292 end 304 assert !last_email.bcc.include?('dlopper@somenet.foo')
293 305 end
294 should "not notify project members that are not allow to view the issue" do 306
295 Role.find(2).remove_permission!(:view_issues) 307 test "#issue_add should notify issue watchers" do
296 assert Mailer.issue_add(@issue).deliver 308 issue = Issue.find(1)
297 assert !last_email.bcc.include?('dlopper@somenet.foo') 309 user = User.find(9)
298 end 310 # minimal email notification options
299 311 user.pref.no_self_notified = '1'
300 should "notify issue watchers" do 312 user.pref.save
301 user = User.find(9) 313 user.mail_notification = false
302 # minimal email notification options 314 user.save
303 user.pref[:no_self_notified] = '1' 315
304 user.pref.save 316 Watcher.create!(:watchable => issue, :user => user)
305 user.mail_notification = false 317 assert Mailer.deliver_issue_add(issue)
306 user.save 318 assert last_email.bcc.include?(user.mail)
307 319 end
308 Watcher.create!(:watchable => @issue, :user => user) 320
309 assert Mailer.issue_add(@issue).deliver 321 test "#issue_add should not notify watchers not allowed to view the issue" do
310 assert last_email.bcc.include?(user.mail) 322 issue = Issue.find(1)
311 end 323 user = User.find(9)
312 324 Watcher.create!(:watchable => issue, :user => user)
313 should "not notify watchers not allowed to view the issue" do 325 Role.non_member.remove_permission!(:view_issues)
314 user = User.find(9) 326 assert Mailer.deliver_issue_add(issue)
315 Watcher.create!(:watchable => @issue, :user => user) 327 assert !last_email.bcc.include?(user.mail)
316 Role.non_member.remove_permission!(:view_issues) 328 end
317 assert Mailer.issue_add(@issue).deliver 329
318 assert !last_email.bcc.include?(user.mail) 330 def test_issue_add_should_include_enabled_fields
331 Setting.default_language = 'en'
332 issue = Issue.find(2)
333 assert Mailer.deliver_issue_add(issue)
334 assert_mail_body_match '* Target version: 1.0', last_email
335 assert_select_email do
336 assert_select 'li', :text => 'Target version: 1.0'
337 end
338 end
339
340 def test_issue_add_should_not_include_disabled_fields
341 Setting.default_language = 'en'
342 issue = Issue.find(2)
343 tracker = issue.tracker
344 tracker.core_fields -= ['fixed_version_id']
345 tracker.save!
346 assert Mailer.deliver_issue_add(issue)
347 assert_mail_body_no_match 'Target version', last_email
348 assert_select_email do
349 assert_select 'li', :text => /Target version/, :count => 0
319 end 350 end
320 end 351 end
321 352
322 # test mailer methods for each language 353 # test mailer methods for each language
323 def test_issue_add 354 def test_issue_add
324 issue = Issue.find(1) 355 issue = Issue.find(1)
325 valid_languages.each do |lang| 356 valid_languages.each do |lang|
326 Setting.default_language = lang.to_s 357 Setting.default_language = lang.to_s
327 assert Mailer.issue_add(issue).deliver 358 assert Mailer.deliver_issue_add(issue)
328 end 359 end
329 end 360 end
330 361
331 def test_issue_edit 362 def test_issue_edit
332 journal = Journal.find(1) 363 journal = Journal.find(1)
333 valid_languages.each do |lang| 364 valid_languages.each do |lang|
334 Setting.default_language = lang.to_s 365 Setting.default_language = lang.to_s
335 assert Mailer.issue_edit(journal).deliver 366 assert Mailer.deliver_issue_edit(journal)
336 end 367 end
337 end 368 end
338 369
339 def test_issue_edit_should_send_private_notes_to_users_with_permission_only 370 def test_issue_edit_should_send_private_notes_to_users_with_permission_only
340 journal = Journal.find(1) 371 journal = Journal.find(1)
341 journal.private_notes = true 372 journal.private_notes = true
342 journal.save! 373 journal.save!
343 374
344 Role.find(2).add_permission! :view_private_notes 375 Role.find(2).add_permission! :view_private_notes
345 Mailer.issue_edit(journal).deliver 376 Mailer.deliver_issue_edit(journal)
346 assert_equal %w(dlopper@somenet.foo jsmith@somenet.foo), ActionMailer::Base.deliveries.last.bcc.sort 377 assert_equal %w(dlopper@somenet.foo jsmith@somenet.foo), ActionMailer::Base.deliveries.last.bcc.sort
347 378
348 Role.find(2).remove_permission! :view_private_notes 379 Role.find(2).remove_permission! :view_private_notes
349 Mailer.issue_edit(journal).deliver 380 Mailer.deliver_issue_edit(journal)
350 assert_equal %w(jsmith@somenet.foo), ActionMailer::Base.deliveries.last.bcc.sort 381 assert_equal %w(jsmith@somenet.foo), ActionMailer::Base.deliveries.last.bcc.sort
351 end 382 end
352 383
353 def test_issue_edit_should_send_private_notes_to_watchers_with_permission_only 384 def test_issue_edit_should_send_private_notes_to_watchers_with_permission_only
354 Issue.find(1).set_watcher(User.find_by_login('someone')) 385 Issue.find(1).set_watcher(User.find_by_login('someone'))
355 journal = Journal.find(1) 386 journal = Journal.find(1)
356 journal.private_notes = true 387 journal.private_notes = true
357 journal.save! 388 journal.save!
358 389
359 Role.non_member.add_permission! :view_private_notes 390 Role.non_member.add_permission! :view_private_notes
360 Mailer.issue_edit(journal).deliver 391 Mailer.deliver_issue_edit(journal)
361 assert_include 'someone@foo.bar', ActionMailer::Base.deliveries.last.bcc.sort 392 assert_include 'someone@foo.bar', ActionMailer::Base.deliveries.last.bcc.sort
362 393
363 Role.non_member.remove_permission! :view_private_notes 394 Role.non_member.remove_permission! :view_private_notes
364 Mailer.issue_edit(journal).deliver 395 Mailer.deliver_issue_edit(journal)
365 assert_not_include 'someone@foo.bar', ActionMailer::Base.deliveries.last.bcc.sort 396 assert_not_include 'someone@foo.bar', ActionMailer::Base.deliveries.last.bcc.sort
397 end
398
399 def test_issue_edit_should_mark_private_notes
400 journal = Journal.find(2)
401 journal.private_notes = true
402 journal.save!
403
404 with_settings :default_language => 'en' do
405 Mailer.deliver_issue_edit(journal)
406 end
407 assert_mail_body_match '(Private notes)', last_email
408 end
409
410 def test_issue_edit_with_relation_should_notify_users_who_can_see_the_related_issue
411 issue = Issue.generate!
412 private_issue = Issue.generate!(:is_private => true)
413 IssueRelation.create!(:issue_from => issue, :issue_to => private_issue, :relation_type => 'relates')
414 issue.reload
415 assert_equal 1, issue.journals.size
416 journal = issue.journals.first
417 ActionMailer::Base.deliveries.clear
418
419 Mailer.deliver_issue_edit(journal)
420 last_email.bcc.each do |email|
421 user = User.find_by_mail(email)
422 assert private_issue.visible?(user), "Issue was not visible to #{user}"
423 end
366 end 424 end
367 425
368 def test_document_added 426 def test_document_added
369 document = Document.find(1) 427 document = Document.find(1)
370 valid_languages.each do |lang| 428 valid_languages.each do |lang|
400 assert_select "a[href=?]", "http://mydomain.foo/projects/ecookbook/files" 458 assert_select "a[href=?]", "http://mydomain.foo/projects/ecookbook/files"
401 end 459 end
402 end 460 end
403 461
404 def test_news_added 462 def test_news_added
405 news = News.find(:first) 463 news = News.first
406 valid_languages.each do |lang| 464 valid_languages.each do |lang|
407 Setting.default_language = lang.to_s 465 Setting.default_language = lang.to_s
408 assert Mailer.news_added(news).deliver 466 assert Mailer.news_added(news).deliver
409 end 467 end
468 end
469
470 def test_news_added_should_notify_project_news_watchers
471 user1 = User.generate!
472 user2 = User.generate!
473 news = News.find(1)
474 news.project.enabled_module('news').add_watcher(user1)
475
476 Mailer.news_added(news).deliver
477 assert_include user1.mail, last_email.bcc
478 assert_not_include user2.mail, last_email.bcc
410 end 479 end
411 480
412 def test_news_comment_added 481 def test_news_comment_added
413 comment = Comment.find(2) 482 comment = Comment.find(2)
414 valid_languages.each do |lang| 483 valid_languages.each do |lang|
416 assert Mailer.news_comment_added(comment).deliver 485 assert Mailer.news_comment_added(comment).deliver
417 end 486 end
418 end 487 end
419 488
420 def test_message_posted 489 def test_message_posted
421 message = Message.find(:first) 490 message = Message.first
422 recipients = ([message.root] + message.root.children).collect {|m| m.author.mail if m.author} 491 recipients = ([message.root] + message.root.children).collect {|m| m.author.mail if m.author}
423 recipients = recipients.compact.uniq 492 recipients = recipients.compact.uniq
424 valid_languages.each do |lang| 493 valid_languages.each do |lang|
425 Setting.default_language = lang.to_s 494 Setting.default_language = lang.to_s
426 assert Mailer.message_posted(message).deliver 495 assert Mailer.message_posted(message).deliver
579 assert ActionMailer::Base.deliveries.empty? 648 assert ActionMailer::Base.deliveries.empty?
580 # should restore perform_deliveries 649 # should restore perform_deliveries
581 assert ActionMailer::Base.perform_deliveries 650 assert ActionMailer::Base.perform_deliveries
582 end 651 end
583 652
653 def test_token_for_should_strip_trailing_gt_from_address_with_full_name
654 with_settings :mail_from => "Redmine Mailer<no-reply@redmine.org>" do
655 assert_match /\Aredmine.issue-\d+\.\d+\.[0-9a-f]+@redmine.org\z/, Mailer.token_for(Issue.generate!)
656 end
657 end
658
584 def test_layout_should_include_the_emails_header 659 def test_layout_should_include_the_emails_header
585 with_settings :emails_header => "*Header content*" do 660 with_settings :emails_header => "*Header content*" do
661 with_settings :plain_text_mail => 0 do
662 assert Mailer.test_email(User.find(1)).deliver
663 assert_select_email do
664 assert_select ".header" do
665 assert_select "strong", :text => "Header content"
666 end
667 end
668 end
669 with_settings :plain_text_mail => 1 do
670 assert Mailer.test_email(User.find(1)).deliver
671 mail = last_email
672 assert_not_nil mail
673 assert_include "*Header content*", mail.body.decoded
674 end
675 end
676 end
677
678 def test_layout_should_not_include_empty_emails_header
679 with_settings :emails_header => "", :plain_text_mail => 0 do
586 assert Mailer.test_email(User.find(1)).deliver 680 assert Mailer.test_email(User.find(1)).deliver
587 assert_select_email do 681 assert_select_email do
588 assert_select ".header" do 682 assert_select ".header", false
589 assert_select "strong", :text => "Header content" 683 end
684 end
685 end
686
687 def test_layout_should_include_the_emails_footer
688 with_settings :emails_footer => "*Footer content*" do
689 with_settings :plain_text_mail => 0 do
690 assert Mailer.test_email(User.find(1)).deliver
691 assert_select_email do
692 assert_select ".footer" do
693 assert_select "strong", :text => "Footer content"
694 end
590 end 695 end
696 end
697 with_settings :plain_text_mail => 1 do
698 assert Mailer.test_email(User.find(1)).deliver
699 mail = last_email
700 assert_not_nil mail
701 assert_include "\n-- \n", mail.body.decoded
702 assert_include "*Footer content*", mail.body.decoded
703 end
704 end
705 end
706
707 def test_layout_should_not_include_empty_emails_footer
708 with_settings :emails_footer => "" do
709 with_settings :plain_text_mail => 0 do
710 assert Mailer.test_email(User.find(1)).deliver
711 assert_select_email do
712 assert_select ".footer", false
713 end
714 end
715 with_settings :plain_text_mail => 1 do
716 assert Mailer.test_email(User.find(1)).deliver
717 mail = last_email
718 assert_not_nil mail
719 assert_not_include "\n-- \n", mail.body.decoded
591 end 720 end
592 end 721 end
593 end 722 end
594 723
595 def test_should_escape_html_templates_only 724 def test_should_escape_html_templates_only
596 Issue.generate!(:project_id => 1, :tracker_id => 1, :subject => 'Subject with a <tag>') 725 Issue.generate!(:project_id => 1, :tracker_id => 1, :subject => 'Subject with a <tag>')
597 mail = last_email 726 mail = last_email
598 assert_equal 2, mail.parts.size 727 assert_equal 2, mail.parts.size
599 assert_include '<tag>', text_part.body.encoded 728 assert_include '<tag>', text_part.body.encoded
600 assert_include '&lt;tag&gt;', html_part.body.encoded 729 assert_include '&lt;tag&gt;', html_part.body.encoded
730 end
731
732 def test_should_raise_delivery_errors_when_raise_delivery_errors_is_true
733 mail = Mailer.test_email(User.find(1))
734 mail.delivery_method.stubs(:deliver!).raises(Exception.new("delivery error"))
735
736 ActionMailer::Base.raise_delivery_errors = true
737 assert_raise Exception, "delivery error" do
738 mail.deliver
739 end
740 ensure
741 ActionMailer::Base.raise_delivery_errors = false
742 end
743
744 def test_should_log_delivery_errors_when_raise_delivery_errors_is_false
745 mail = Mailer.test_email(User.find(1))
746 mail.delivery_method.stubs(:deliver!).raises(Exception.new("delivery error"))
747
748 Rails.logger.expects(:error).with("Email delivery error: delivery error")
749 ActionMailer::Base.raise_delivery_errors = false
750 assert_nothing_raised do
751 mail.deliver
752 end
753 end
754
755 def test_mail_should_return_a_mail_message
756 assert_kind_of ::Mail::Message, Mailer.test_email(User.find(1))
601 end 757 end
602 758
603 private 759 private
604 760
605 def last_email 761 def last_email