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