##// END OF EJS Templates
Additional tests for email From header (#9564)....
Jean-Philippe Lang -
r7687:7afb7752867e
parent child
Show More
@@ -1,479 +1,489
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",
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",
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",
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_plain_text_mail
142 142 Setting.plain_text_mail = 1
143 143 journal = Journal.find(2)
144 144 Mailer.deliver_issue_edit(journal)
145 145 mail = ActionMailer::Base.deliveries.last
146 146 assert_equal "text/plain", mail.content_type
147 147 assert_equal 0, mail.parts.size
148 148 assert !mail.encoded.include?('href')
149 149 end
150 150
151 151 def test_html_mail
152 152 Setting.plain_text_mail = 0
153 153 journal = Journal.find(2)
154 154 Mailer.deliver_issue_edit(journal)
155 155 mail = ActionMailer::Base.deliveries.last
156 156 assert_equal 2, mail.parts.size
157 157 assert mail.encoded.include?('href')
158 158 end
159 159
160 def test_mail_from_with_phrase
160 def test_from_header
161 with_settings :mail_from => 'redmine@example.net' do
162 Mailer.deliver_test(User.find(1))
163 end
164 mail = ActionMailer::Base.deliveries.last
165 assert_not_nil mail
166 assert_equal 'redmine@example.net', mail.from_addrs.first.address
167 end
168
169 def test_from_header_with_phrase
161 170 with_settings :mail_from => 'Redmine app <redmine@example.net>' do
162 171 Mailer.deliver_test(User.find(1))
163 172 end
164 173 mail = ActionMailer::Base.deliveries.last
165 174 assert_not_nil mail
175 assert_equal 'redmine@example.net', mail.from_addrs.first.address
166 176 assert_equal 'Redmine app', mail.from_addrs.first.name
167 177 end
168 178
169 179 def test_should_not_send_email_without_recipient
170 180 news = News.find(:first)
171 181 user = news.author
172 182 # Remove members except news author
173 183 news.project.memberships.each {|m| m.destroy unless m.user == user}
174 184
175 185 user.pref[:no_self_notified] = false
176 186 user.pref.save
177 187 User.current = user
178 188 Mailer.deliver_news_added(news.reload)
179 189 assert_equal 1, last_email.bcc.size
180 190
181 191 # nobody to notify
182 192 user.pref[:no_self_notified] = true
183 193 user.pref.save
184 194 User.current = user
185 195 ActionMailer::Base.deliveries.clear
186 196 Mailer.deliver_news_added(news.reload)
187 197 assert ActionMailer::Base.deliveries.empty?
188 198 end
189 199
190 200 def test_issue_add_message_id
191 201 issue = Issue.find(1)
192 202 Mailer.deliver_issue_add(issue)
193 203 mail = ActionMailer::Base.deliveries.last
194 204 assert_not_nil mail
195 205 assert_equal Mailer.message_id_for(issue), mail.message_id
196 206 assert_nil mail.references
197 207 end
198 208
199 209 def test_issue_edit_message_id
200 210 journal = Journal.find(1)
201 211 Mailer.deliver_issue_edit(journal)
202 212 mail = ActionMailer::Base.deliveries.last
203 213 assert_not_nil mail
204 214 assert_equal Mailer.message_id_for(journal), mail.message_id
205 215 assert_equal Mailer.message_id_for(journal.issue), mail.references.first.to_s
206 216 end
207 217
208 218 def test_message_posted_message_id
209 219 message = Message.find(1)
210 220 Mailer.deliver_message_posted(message)
211 221 mail = ActionMailer::Base.deliveries.last
212 222 assert_not_nil mail
213 223 assert_equal Mailer.message_id_for(message), mail.message_id
214 224 assert_nil mail.references
215 225 assert_select_email do
216 226 # link to the message
217 227 assert_select "a[href=?]",
218 228 "http://mydomain.foo/boards/#{message.board.id}/topics/#{message.id}",
219 229 :text => message.subject
220 230 end
221 231 end
222 232
223 233 def test_reply_posted_message_id
224 234 message = Message.find(3)
225 235 Mailer.deliver_message_posted(message)
226 236 mail = ActionMailer::Base.deliveries.last
227 237 assert_not_nil mail
228 238 assert_equal Mailer.message_id_for(message), mail.message_id
229 239 assert_equal Mailer.message_id_for(message.parent), mail.references.first.to_s
230 240 assert_select_email do
231 241 # link to the reply
232 242 assert_select "a[href=?]",
233 243 "http://mydomain.foo/boards/#{message.board.id}/topics/#{message.root.id}?r=#{message.id}#message-#{message.id}",
234 244 :text => message.subject
235 245 end
236 246 end
237 247
238 248 context("#issue_add") do
239 249 setup do
240 250 ActionMailer::Base.deliveries.clear
241 251 Setting.bcc_recipients = '1'
242 252 @issue = Issue.find(1)
243 253 end
244 254
245 255 should "notify project members" do
246 256 assert Mailer.deliver_issue_add(@issue)
247 257 assert last_email.bcc.include?('dlopper@somenet.foo')
248 258 end
249 259
250 260 should "not notify project members that are not allow to view the issue" do
251 261 Role.find(2).remove_permission!(:view_issues)
252 262 assert Mailer.deliver_issue_add(@issue)
253 263 assert !last_email.bcc.include?('dlopper@somenet.foo')
254 264 end
255 265
256 266 should "notify issue watchers" do
257 267 user = User.find(9)
258 268 # minimal email notification options
259 269 user.pref[:no_self_notified] = '1'
260 270 user.pref.save
261 271 user.mail_notification = false
262 272 user.save
263 273
264 274 Watcher.create!(:watchable => @issue, :user => user)
265 275 assert Mailer.deliver_issue_add(@issue)
266 276 assert last_email.bcc.include?(user.mail)
267 277 end
268 278
269 279 should "not notify watchers not allowed to view the issue" do
270 280 user = User.find(9)
271 281 Watcher.create!(:watchable => @issue, :user => user)
272 282 Role.non_member.remove_permission!(:view_issues)
273 283 assert Mailer.deliver_issue_add(@issue)
274 284 assert !last_email.bcc.include?(user.mail)
275 285 end
276 286 end
277 287
278 288 # test mailer methods for each language
279 289 def test_issue_add
280 290 issue = Issue.find(1)
281 291 valid_languages.each do |lang|
282 292 Setting.default_language = lang.to_s
283 293 assert Mailer.deliver_issue_add(issue)
284 294 end
285 295 end
286 296
287 297 def test_issue_edit
288 298 journal = Journal.find(1)
289 299 valid_languages.each do |lang|
290 300 Setting.default_language = lang.to_s
291 301 assert Mailer.deliver_issue_edit(journal)
292 302 end
293 303 end
294 304
295 305 def test_document_added
296 306 document = Document.find(1)
297 307 valid_languages.each do |lang|
298 308 Setting.default_language = lang.to_s
299 309 assert Mailer.deliver_document_added(document)
300 310 end
301 311 end
302 312
303 313 def test_attachments_added
304 314 attachements = [ Attachment.find_by_container_type('Document') ]
305 315 valid_languages.each do |lang|
306 316 Setting.default_language = lang.to_s
307 317 assert Mailer.deliver_attachments_added(attachements)
308 318 end
309 319 end
310 320
311 321 def test_version_file_added
312 322 attachements = [ Attachment.find_by_container_type('Version') ]
313 323 assert Mailer.deliver_attachments_added(attachements)
314 324 assert_not_nil last_email.bcc
315 325 assert last_email.bcc.any?
316 326 assert_select_email do
317 327 assert_select "a[href=?]", "http://mydomain.foo/projects/ecookbook/files"
318 328 end
319 329 end
320 330
321 331 def test_project_file_added
322 332 attachements = [ Attachment.find_by_container_type('Project') ]
323 333 assert Mailer.deliver_attachments_added(attachements)
324 334 assert_not_nil last_email.bcc
325 335 assert last_email.bcc.any?
326 336 assert_select_email do
327 337 assert_select "a[href=?]", "http://mydomain.foo/projects/ecookbook/files"
328 338 end
329 339 end
330 340
331 341 def test_news_added
332 342 news = News.find(:first)
333 343 valid_languages.each do |lang|
334 344 Setting.default_language = lang.to_s
335 345 assert Mailer.deliver_news_added(news)
336 346 end
337 347 end
338 348
339 349 def test_news_comment_added
340 350 comment = Comment.find(2)
341 351 valid_languages.each do |lang|
342 352 Setting.default_language = lang.to_s
343 353 assert Mailer.deliver_news_comment_added(comment)
344 354 end
345 355 end
346 356
347 357 def test_message_posted
348 358 message = Message.find(:first)
349 359 recipients = ([message.root] + message.root.children).collect {|m| m.author.mail if m.author}
350 360 recipients = recipients.compact.uniq
351 361 valid_languages.each do |lang|
352 362 Setting.default_language = lang.to_s
353 363 assert Mailer.deliver_message_posted(message)
354 364 end
355 365 end
356 366
357 367 def test_wiki_content_added
358 368 content = WikiContent.find(:first)
359 369 valid_languages.each do |lang|
360 370 Setting.default_language = lang.to_s
361 371 assert_difference 'ActionMailer::Base.deliveries.size' do
362 372 assert Mailer.deliver_wiki_content_added(content)
363 373 end
364 374 end
365 375 end
366 376
367 377 def test_wiki_content_updated
368 378 content = WikiContent.find(:first)
369 379 valid_languages.each do |lang|
370 380 Setting.default_language = lang.to_s
371 381 assert_difference 'ActionMailer::Base.deliveries.size' do
372 382 assert Mailer.deliver_wiki_content_updated(content)
373 383 end
374 384 end
375 385 end
376 386
377 387 def test_account_information
378 388 user = User.find(2)
379 389 valid_languages.each do |lang|
380 390 user.update_attribute :language, lang.to_s
381 391 user.reload
382 392 assert Mailer.deliver_account_information(user, 'pAsswORd')
383 393 end
384 394 end
385 395
386 396 def test_lost_password
387 397 token = Token.find(2)
388 398 valid_languages.each do |lang|
389 399 token.user.update_attribute :language, lang.to_s
390 400 token.reload
391 401 assert Mailer.deliver_lost_password(token)
392 402 end
393 403 end
394 404
395 405 def test_register
396 406 token = Token.find(1)
397 407 Setting.host_name = 'redmine.foo'
398 408 Setting.protocol = 'https'
399 409
400 410 valid_languages.each do |lang|
401 411 token.user.update_attribute :language, lang.to_s
402 412 token.reload
403 413 ActionMailer::Base.deliveries.clear
404 414 assert Mailer.deliver_register(token)
405 415 mail = ActionMailer::Base.deliveries.last
406 416 assert mail.body.include?("https://redmine.foo/account/activate?token=#{token.value}")
407 417 end
408 418 end
409 419
410 420 def test_test
411 421 user = User.find(1)
412 422 valid_languages.each do |lang|
413 423 user.update_attribute :language, lang.to_s
414 424 assert Mailer.deliver_test(user)
415 425 end
416 426 end
417 427
418 428 def test_reminders
419 429 Mailer.reminders(:days => 42)
420 430 assert_equal 1, ActionMailer::Base.deliveries.size
421 431 mail = ActionMailer::Base.deliveries.last
422 432 assert mail.bcc.include?('dlopper@somenet.foo')
423 433 assert mail.body.include?('Bug #3: Error 281 when updating a recipe')
424 434 assert_equal '1 issue(s) due in the next 42 days', mail.subject
425 435 end
426 436
427 437 def test_reminders_for_users
428 438 Mailer.reminders(:days => 42, :users => ['5'])
429 439 assert_equal 0, ActionMailer::Base.deliveries.size # No mail for dlopper
430 440 Mailer.reminders(:days => 42, :users => ['3'])
431 441 assert_equal 1, ActionMailer::Base.deliveries.size # No mail for dlopper
432 442 mail = ActionMailer::Base.deliveries.last
433 443 assert mail.bcc.include?('dlopper@somenet.foo')
434 444 assert mail.body.include?('Bug #3: Error 281 when updating a recipe')
435 445 end
436 446
437 447 def last_email
438 448 mail = ActionMailer::Base.deliveries.last
439 449 assert_not_nil mail
440 450 mail
441 451 end
442 452
443 453 def test_mailer_should_not_change_locale
444 454 Setting.default_language = 'en'
445 455 # Set current language to italian
446 456 set_language_if_valid 'it'
447 457 # Send an email to a french user
448 458 user = User.find(1)
449 459 user.language = 'fr'
450 460 Mailer.deliver_account_activated(user)
451 461 mail = ActionMailer::Base.deliveries.last
452 462 assert mail.body.include?('Votre compte')
453 463
454 464 assert_equal :it, current_language
455 465 end
456 466
457 467 def test_with_deliveries_off
458 468 Mailer.with_deliveries false do
459 469 Mailer.deliver_test(User.find(1))
460 470 end
461 471 assert ActionMailer::Base.deliveries.empty?
462 472 # should restore perform_deliveries
463 473 assert ActionMailer::Base.perform_deliveries
464 474 end
465 475
466 476 context "layout" do
467 477 should "include the emails_header" do
468 478 with_settings(:emails_header => "*Header content*") do
469 479 assert Mailer.deliver_test(User.find(1))
470 480
471 481 assert_select_email do
472 482 assert_select ".header" do
473 483 assert_select "strong", :text => "Header content"
474 484 end
475 485 end
476 486 end
477 487 end
478 488 end
479 489 end
General Comments 0
You need to be logged in to leave comments. Login now