##// END OF EJS Templates
use assert_select instead of include? at "test_register" of unit mailer test...
Toshi MARUYAMA -
r8796:5b48e4ae58ec
parent child
Show More
@@ -1,518 +1,522
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2011 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 ActionController::Assertions::SelectorAssertions
23 23 fixtures :projects, :enabled_modules, :issues, :users, :members,
24 24 :member_roles, :roles, :documents, :attachments, :news,
25 25 :tokens, :journals, :journal_details, :changesets, :trackers,
26 26 :issue_statuses, :enumerations, :messages, :boards, :repositories,
27 27 :wikis, :wiki_pages, :wiki_contents, :wiki_content_versions,
28 28 :versions,
29 29 :comments
30 30
31 31 def setup
32 32 ActionMailer::Base.deliveries.clear
33 33 Setting.host_name = 'mydomain.foo'
34 34 Setting.protocol = 'http'
35 35 Setting.plain_text_mail = '0'
36 36 end
37 37
38 38 def test_generated_links_in_emails
39 39 Setting.host_name = 'mydomain.foo'
40 40 Setting.protocol = 'https'
41 41
42 42 journal = Journal.find(2)
43 43 assert Mailer.deliver_issue_edit(journal)
44 44
45 45 mail = ActionMailer::Base.deliveries.last
46 46 assert_kind_of TMail::Mail, mail
47 47
48 48 assert_select_email do
49 49 # link to the main ticket
50 50 assert_select "a[href=?]",
51 51 "https://mydomain.foo/issues/1#change-2",
52 52 :text => "Bug #1: Can't print recipes"
53 53 # link to a referenced ticket
54 54 assert_select "a[href=?][title=?]",
55 55 "https://mydomain.foo/issues/2",
56 56 "Add ingredients categories (Assigned)",
57 57 :text => "#2"
58 58 # link to a changeset
59 59 assert_select "a[href=?][title=?]",
60 60 "https://mydomain.foo/projects/ecookbook/repository/revisions/2",
61 61 "This commit fixes #1, #2 and references #1 &amp; #3",
62 62 :text => "r2"
63 63 end
64 64 end
65 65
66 66 def test_generated_links_with_prefix
67 67 relative_url_root = Redmine::Utils.relative_url_root
68 68 Setting.host_name = 'mydomain.foo/rdm'
69 69 Setting.protocol = 'http'
70 70 Redmine::Utils.relative_url_root = '/rdm'
71 71
72 72 journal = Journal.find(2)
73 73 assert Mailer.deliver_issue_edit(journal)
74 74
75 75 mail = ActionMailer::Base.deliveries.last
76 76 assert_kind_of TMail::Mail, mail
77 77
78 78 assert_select_email do
79 79 # link to the main ticket
80 80 assert_select "a[href=?]",
81 81 "http://mydomain.foo/rdm/issues/1#change-2",
82 82 :text => "Bug #1: Can't print recipes"
83 83 # link to a referenced ticket
84 84 assert_select "a[href=?][title=?]",
85 85 "http://mydomain.foo/rdm/issues/2",
86 86 "Add ingredients categories (Assigned)",
87 87 :text => "#2"
88 88 # link to a changeset
89 89 assert_select "a[href=?][title=?]",
90 90 "http://mydomain.foo/rdm/projects/ecookbook/repository/revisions/2",
91 91 "This commit fixes #1, #2 and references #1 &amp; #3",
92 92 :text => "r2"
93 93 end
94 94 ensure
95 95 # restore it
96 96 Redmine::Utils.relative_url_root = relative_url_root
97 97 end
98 98
99 99 def test_generated_links_with_prefix_and_no_relative_url_root
100 100 relative_url_root = Redmine::Utils.relative_url_root
101 101 Setting.host_name = 'mydomain.foo/rdm'
102 102 Setting.protocol = 'http'
103 103 Redmine::Utils.relative_url_root = nil
104 104
105 105 journal = Journal.find(2)
106 106 assert Mailer.deliver_issue_edit(journal)
107 107
108 108 mail = ActionMailer::Base.deliveries.last
109 109 assert_kind_of TMail::Mail, mail
110 110
111 111 assert_select_email do
112 112 # link to the main ticket
113 113 assert_select "a[href=?]",
114 114 "http://mydomain.foo/rdm/issues/1#change-2",
115 115 :text => "Bug #1: Can't print recipes"
116 116 # link to a referenced ticket
117 117 assert_select "a[href=?][title=?]",
118 118 "http://mydomain.foo/rdm/issues/2",
119 119 "Add ingredients categories (Assigned)",
120 120 :text => "#2"
121 121 # link to a changeset
122 122 assert_select "a[href=?][title=?]",
123 123 "http://mydomain.foo/rdm/projects/ecookbook/repository/revisions/2",
124 124 "This commit fixes #1, #2 and references #1 &amp; #3",
125 125 :text => "r2"
126 126 end
127 127 ensure
128 128 # restore it
129 129 Redmine::Utils.relative_url_root = relative_url_root
130 130 end
131 131
132 132 def test_email_headers
133 133 issue = Issue.find(1)
134 134 Mailer.deliver_issue_add(issue)
135 135 mail = ActionMailer::Base.deliveries.last
136 136 assert_not_nil mail
137 137 assert_equal 'OOF', mail.header_string('X-Auto-Response-Suppress')
138 138 assert_equal 'auto-generated', mail.header_string('Auto-Submitted')
139 139 end
140 140
141 141 def test_email_headers_should_include_sender
142 142 issue = Issue.find(1)
143 143 Mailer.deliver_issue_add(issue)
144 144 mail = ActionMailer::Base.deliveries.last
145 145 assert_not_nil mail
146 146 assert_equal issue.author.login, mail.header_string('X-Redmine-Sender')
147 147 end
148 148
149 149 def test_plain_text_mail
150 150 Setting.plain_text_mail = 1
151 151 journal = Journal.find(2)
152 152 Mailer.deliver_issue_edit(journal)
153 153 mail = ActionMailer::Base.deliveries.last
154 154 assert_equal "text/plain", mail.content_type
155 155 assert_equal 0, mail.parts.size
156 156 assert !mail.encoded.include?('href')
157 157 end
158 158
159 159 def test_html_mail
160 160 Setting.plain_text_mail = 0
161 161 journal = Journal.find(2)
162 162 Mailer.deliver_issue_edit(journal)
163 163 mail = ActionMailer::Base.deliveries.last
164 164 assert_equal 2, mail.parts.size
165 165 assert mail.encoded.include?('href')
166 166 end
167 167
168 168 def test_from_header
169 169 with_settings :mail_from => 'redmine@example.net' do
170 170 Mailer.deliver_test(User.find(1))
171 171 end
172 172 mail = ActionMailer::Base.deliveries.last
173 173 assert_not_nil mail
174 174 assert_equal 'redmine@example.net', mail.from_addrs.first.address
175 175 end
176 176
177 177 def test_from_header_with_phrase
178 178 with_settings :mail_from => 'Redmine app <redmine@example.net>' do
179 179 Mailer.deliver_test(User.find(1))
180 180 end
181 181 mail = ActionMailer::Base.deliveries.last
182 182 assert_not_nil mail
183 183 assert_equal 'redmine@example.net', mail.from_addrs.first.address
184 184 assert_equal 'Redmine app', mail.from_addrs.first.name
185 185 end
186 186
187 187 def test_should_not_send_email_without_recipient
188 188 news = News.find(:first)
189 189 user = news.author
190 190 # Remove members except news author
191 191 news.project.memberships.each {|m| m.destroy unless m.user == user}
192 192
193 193 user.pref[:no_self_notified] = false
194 194 user.pref.save
195 195 User.current = user
196 196 Mailer.deliver_news_added(news.reload)
197 197 assert_equal 1, last_email.bcc.size
198 198
199 199 # nobody to notify
200 200 user.pref[:no_self_notified] = true
201 201 user.pref.save
202 202 User.current = user
203 203 ActionMailer::Base.deliveries.clear
204 204 Mailer.deliver_news_added(news.reload)
205 205 assert ActionMailer::Base.deliveries.empty?
206 206 end
207 207
208 208 def test_issue_add_message_id
209 209 issue = Issue.find(1)
210 210 Mailer.deliver_issue_add(issue)
211 211 mail = ActionMailer::Base.deliveries.last
212 212 assert_not_nil mail
213 213 assert_equal Mailer.message_id_for(issue), mail.message_id
214 214 assert_nil mail.references
215 215 end
216 216
217 217 def test_issue_edit_message_id
218 218 journal = Journal.find(1)
219 219 Mailer.deliver_issue_edit(journal)
220 220 mail = ActionMailer::Base.deliveries.last
221 221 assert_not_nil mail
222 222 assert_equal Mailer.message_id_for(journal), mail.message_id
223 223 assert_equal Mailer.message_id_for(journal.issue), mail.references.first.to_s
224 224 assert_select_email do
225 225 # link to the update
226 226 assert_select "a[href=?]",
227 227 "http://mydomain.foo/issues/#{journal.journalized_id}#change-#{journal.id}"
228 228 end
229 229 end
230 230
231 231 def test_message_posted_message_id
232 232 message = Message.find(1)
233 233 Mailer.deliver_message_posted(message)
234 234 mail = ActionMailer::Base.deliveries.last
235 235 assert_not_nil mail
236 236 assert_equal Mailer.message_id_for(message), mail.message_id
237 237 assert_nil mail.references
238 238 assert_select_email do
239 239 # link to the message
240 240 assert_select "a[href=?]",
241 241 "http://mydomain.foo/boards/#{message.board.id}/topics/#{message.id}",
242 242 :text => message.subject
243 243 end
244 244 end
245 245
246 246 def test_reply_posted_message_id
247 247 message = Message.find(3)
248 248 Mailer.deliver_message_posted(message)
249 249 mail = ActionMailer::Base.deliveries.last
250 250 assert_not_nil mail
251 251 assert_equal Mailer.message_id_for(message), mail.message_id
252 252 assert_equal Mailer.message_id_for(message.parent), mail.references.first.to_s
253 253 assert_select_email do
254 254 # link to the reply
255 255 assert_select "a[href=?]",
256 256 "http://mydomain.foo/boards/#{message.board.id}/topics/#{message.root.id}?r=#{message.id}#message-#{message.id}",
257 257 :text => message.subject
258 258 end
259 259 end
260 260
261 261 context("#issue_add") do
262 262 setup do
263 263 ActionMailer::Base.deliveries.clear
264 264 Setting.bcc_recipients = '1'
265 265 @issue = Issue.find(1)
266 266 end
267 267
268 268 should "notify project members" do
269 269 assert Mailer.deliver_issue_add(@issue)
270 270 assert last_email.bcc.include?('dlopper@somenet.foo')
271 271 end
272 272
273 273 should "not notify project members that are not allow to view the issue" do
274 274 Role.find(2).remove_permission!(:view_issues)
275 275 assert Mailer.deliver_issue_add(@issue)
276 276 assert !last_email.bcc.include?('dlopper@somenet.foo')
277 277 end
278 278
279 279 should "notify issue watchers" do
280 280 user = User.find(9)
281 281 # minimal email notification options
282 282 user.pref[:no_self_notified] = '1'
283 283 user.pref.save
284 284 user.mail_notification = false
285 285 user.save
286 286
287 287 Watcher.create!(:watchable => @issue, :user => user)
288 288 assert Mailer.deliver_issue_add(@issue)
289 289 assert last_email.bcc.include?(user.mail)
290 290 end
291 291
292 292 should "not notify watchers not allowed to view the issue" do
293 293 user = User.find(9)
294 294 Watcher.create!(:watchable => @issue, :user => user)
295 295 Role.non_member.remove_permission!(:view_issues)
296 296 assert Mailer.deliver_issue_add(@issue)
297 297 assert !last_email.bcc.include?(user.mail)
298 298 end
299 299 end
300 300
301 301 # test mailer methods for each language
302 302 def test_issue_add
303 303 issue = Issue.find(1)
304 304 valid_languages.each do |lang|
305 305 Setting.default_language = lang.to_s
306 306 assert Mailer.deliver_issue_add(issue)
307 307 end
308 308 end
309 309
310 310 def test_issue_edit
311 311 journal = Journal.find(1)
312 312 valid_languages.each do |lang|
313 313 Setting.default_language = lang.to_s
314 314 assert Mailer.deliver_issue_edit(journal)
315 315 end
316 316 end
317 317
318 318 def test_document_added
319 319 document = Document.find(1)
320 320 valid_languages.each do |lang|
321 321 Setting.default_language = lang.to_s
322 322 assert Mailer.deliver_document_added(document)
323 323 end
324 324 end
325 325
326 326 def test_attachments_added
327 327 attachements = [ Attachment.find_by_container_type('Document') ]
328 328 valid_languages.each do |lang|
329 329 Setting.default_language = lang.to_s
330 330 assert Mailer.deliver_attachments_added(attachements)
331 331 end
332 332 end
333 333
334 334 def test_version_file_added
335 335 attachements = [ Attachment.find_by_container_type('Version') ]
336 336 assert Mailer.deliver_attachments_added(attachements)
337 337 assert_not_nil last_email.bcc
338 338 assert last_email.bcc.any?
339 339 assert_select_email do
340 340 assert_select "a[href=?]", "http://mydomain.foo/projects/ecookbook/files"
341 341 end
342 342 end
343 343
344 344 def test_project_file_added
345 345 attachements = [ Attachment.find_by_container_type('Project') ]
346 346 assert Mailer.deliver_attachments_added(attachements)
347 347 assert_not_nil last_email.bcc
348 348 assert last_email.bcc.any?
349 349 assert_select_email do
350 350 assert_select "a[href=?]", "http://mydomain.foo/projects/ecookbook/files"
351 351 end
352 352 end
353 353
354 354 def test_news_added
355 355 news = News.find(:first)
356 356 valid_languages.each do |lang|
357 357 Setting.default_language = lang.to_s
358 358 assert Mailer.deliver_news_added(news)
359 359 end
360 360 end
361 361
362 362 def test_news_comment_added
363 363 comment = Comment.find(2)
364 364 valid_languages.each do |lang|
365 365 Setting.default_language = lang.to_s
366 366 assert Mailer.deliver_news_comment_added(comment)
367 367 end
368 368 end
369 369
370 370 def test_message_posted
371 371 message = Message.find(:first)
372 372 recipients = ([message.root] + message.root.children).collect {|m| m.author.mail if m.author}
373 373 recipients = recipients.compact.uniq
374 374 valid_languages.each do |lang|
375 375 Setting.default_language = lang.to_s
376 376 assert Mailer.deliver_message_posted(message)
377 377 end
378 378 end
379 379
380 380 def test_wiki_content_added
381 381 content = WikiContent.find(:first)
382 382 valid_languages.each do |lang|
383 383 Setting.default_language = lang.to_s
384 384 assert_difference 'ActionMailer::Base.deliveries.size' do
385 385 assert Mailer.deliver_wiki_content_added(content)
386 386 end
387 387 end
388 388 end
389 389
390 390 def test_wiki_content_updated
391 391 content = WikiContent.find(:first)
392 392 valid_languages.each do |lang|
393 393 Setting.default_language = lang.to_s
394 394 assert_difference 'ActionMailer::Base.deliveries.size' do
395 395 assert Mailer.deliver_wiki_content_updated(content)
396 396 end
397 397 end
398 398 end
399 399
400 400 def test_account_information
401 401 user = User.find(2)
402 402 valid_languages.each do |lang|
403 403 user.update_attribute :language, lang.to_s
404 404 user.reload
405 405 assert Mailer.deliver_account_information(user, 'pAsswORd')
406 406 end
407 407 end
408 408
409 409 def test_lost_password
410 410 token = Token.find(2)
411 411 valid_languages.each do |lang|
412 412 token.user.update_attribute :language, lang.to_s
413 413 token.reload
414 414 assert Mailer.deliver_lost_password(token)
415 415 end
416 416 end
417 417
418 418 def test_register
419 419 token = Token.find(1)
420 420 Setting.host_name = 'redmine.foo'
421 421 Setting.protocol = 'https'
422 422
423 423 valid_languages.each do |lang|
424 424 token.user.update_attribute :language, lang.to_s
425 425 token.reload
426 426 ActionMailer::Base.deliveries.clear
427 427 assert Mailer.deliver_register(token)
428 428 mail = ActionMailer::Base.deliveries.last
429 assert mail.body.include?("https://redmine.foo/account/activate?token=#{token.value}")
429 assert_select_email do
430 assert_select "a[href=?]",
431 "https://redmine.foo/account/activate?token=#{token.value}",
432 :text => "https://redmine.foo/account/activate?token=#{token.value}"
433 end
430 434 end
431 435 end
432 436
433 437 def test_test
434 438 user = User.find(1)
435 439 valid_languages.each do |lang|
436 440 user.update_attribute :language, lang.to_s
437 441 assert Mailer.deliver_test(user)
438 442 end
439 443 end
440 444
441 445 def test_reminders
442 446 Mailer.reminders(:days => 42)
443 447 assert_equal 1, ActionMailer::Base.deliveries.size
444 448 mail = ActionMailer::Base.deliveries.last
445 449 assert mail.bcc.include?('dlopper@somenet.foo')
446 450 assert mail.body.include?('Bug #3: Error 281 when updating a recipe')
447 451 assert_equal '1 issue(s) due in the next 42 days', mail.subject
448 452 end
449 453
450 454 def test_reminders_should_not_include_closed_issues
451 455 Issue.generate!(:project_id => 1, :tracker_id => 1, :status_id => 5, :subject => 'Closed issue', :assigned_to_id => 3, :due_date => 5.days.from_now)
452 456 ActionMailer::Base.deliveries.clear
453 457
454 458 Mailer.reminders(:days => 42)
455 459 assert_equal 1, ActionMailer::Base.deliveries.size
456 460 mail = ActionMailer::Base.deliveries.last
457 461 assert mail.bcc.include?('dlopper@somenet.foo')
458 462 assert !mail.body.include?('Closed issue')
459 463 end
460 464
461 465 def test_reminders_for_users
462 466 Mailer.reminders(:days => 42, :users => ['5'])
463 467 assert_equal 0, ActionMailer::Base.deliveries.size # No mail for dlopper
464 468 Mailer.reminders(:days => 42, :users => ['3'])
465 469 assert_equal 1, ActionMailer::Base.deliveries.size # No mail for dlopper
466 470 mail = ActionMailer::Base.deliveries.last
467 471 assert mail.bcc.include?('dlopper@somenet.foo')
468 472 assert mail.body.include?('Bug #3: Error 281 when updating a recipe')
469 473 end
470 474
471 475 def last_email
472 476 mail = ActionMailer::Base.deliveries.last
473 477 assert_not_nil mail
474 478 mail
475 479 end
476 480
477 481 def test_mailer_should_not_change_locale
478 482 Setting.default_language = 'en'
479 483 # Set current language to italian
480 484 set_language_if_valid 'it'
481 485 # Send an email to a french user
482 486 user = User.find(1)
483 487 user.language = 'fr'
484 488 Mailer.deliver_account_activated(user)
485 489 mail = ActionMailer::Base.deliveries.last
486 490 assert mail.body.include?('Votre compte')
487 491
488 492 assert_equal :it, current_language
489 493 end
490 494
491 495 def test_with_deliveries_off
492 496 Mailer.with_deliveries false do
493 497 Mailer.deliver_test(User.find(1))
494 498 end
495 499 assert ActionMailer::Base.deliveries.empty?
496 500 # should restore perform_deliveries
497 501 assert ActionMailer::Base.perform_deliveries
498 502 end
499 503
500 504 def test_tmail_to_header_field_should_not_include_blank_lines
501 505 mail = TMail::Mail.new
502 506 mail.to = ["a.user@example.com", "v.user2@example.com", "e.smith@example.com", "info@example.com", "v.pupkin@example.com",
503 507 "b.user@example.com", "w.user2@example.com", "f.smith@example.com", "info2@example.com", "w.pupkin@example.com"]
504 508
505 509 assert !mail.encoded.strip.split("\r\n").detect(&:blank?), "#{mail.encoded} malformed"
506 510 end
507 511
508 512 def test_layout_should_include_the_emails_header
509 513 with_settings :emails_header => "*Header content*" do
510 514 assert Mailer.deliver_test(User.find(1))
511 515 assert_select_email do
512 516 assert_select ".header" do
513 517 assert_select "strong", :text => "Header content"
514 518 end
515 519 end
516 520 end
517 521 end
518 522 end
General Comments 0
You need to be logged in to leave comments. Login now