To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.
root / test / unit / .svn / text-base / mailer_test.rb.svn-base @ 442:753f1380d6bc
History | View | Annotate | Download (14.4 KB)
| 1 | 441:cbce1fd3b1b7 | Chris | # Redmine - project management software |
|---|---|---|---|
| 2 | # Copyright (C) 2006-2011 Jean-Philippe Lang |
||
| 3 | 0:513646585e45 | Chris | # |
| 4 | # This program is free software; you can redistribute it and/or |
||
| 5 | # modify it under the terms of the GNU General Public License |
||
| 6 | # as published by the Free Software Foundation; either version 2 |
||
| 7 | # of the License, or (at your option) any later version. |
||
| 8 | # |
||
| 9 | # This program is distributed in the hope that it will be useful, |
||
| 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
| 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
| 12 | # GNU General Public License for more details. |
||
| 13 | # |
||
| 14 | # You should have received a copy of the GNU General Public License |
||
| 15 | # along with this program; if not, write to the Free Software |
||
| 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||
| 17 | |||
| 18 | 119:8661b858af72 | Chris | require File.expand_path('../../test_helper', __FILE__)
|
| 19 | 0:513646585e45 | Chris | |
| 20 | class MailerTest < ActiveSupport::TestCase |
||
| 21 | include Redmine::I18n |
||
| 22 | include ActionController::Assertions::SelectorAssertions |
||
| 23 | 441:cbce1fd3b1b7 | Chris | fixtures :all |
| 24 | 0:513646585e45 | Chris | |
| 25 | def setup |
||
| 26 | ActionMailer::Base.deliveries.clear |
||
| 27 | Setting.host_name = 'mydomain.foo' |
||
| 28 | Setting.protocol = 'http' |
||
| 29 | 441:cbce1fd3b1b7 | Chris | Setting.plain_text_mail = '0' |
| 30 | 0:513646585e45 | Chris | end |
| 31 | |||
| 32 | def test_generated_links_in_emails |
||
| 33 | Setting.host_name = 'mydomain.foo' |
||
| 34 | Setting.protocol = 'https' |
||
| 35 | |||
| 36 | journal = Journal.find(2) |
||
| 37 | assert Mailer.deliver_issue_edit(journal) |
||
| 38 | |||
| 39 | mail = ActionMailer::Base.deliveries.last |
||
| 40 | assert_kind_of TMail::Mail, mail |
||
| 41 | |||
| 42 | assert_select_email do |
||
| 43 | # link to the main ticket |
||
| 44 | assert_select "a[href=?]", "https://mydomain.foo/issues/1", :text => "Bug #1: Can't print recipes" |
||
| 45 | # link to a referenced ticket |
||
| 46 | assert_select "a[href=?][title=?]", "https://mydomain.foo/issues/2", "Add ingredients categories (Assigned)", :text => "#2" |
||
| 47 | # link to a changeset |
||
| 48 | assert_select "a[href=?][title=?]", "https://mydomain.foo/projects/ecookbook/repository/revisions/2", "This commit fixes #1, #2 and references #1 & #3", :text => "r2" |
||
| 49 | end |
||
| 50 | end |
||
| 51 | |||
| 52 | def test_generated_links_with_prefix |
||
| 53 | relative_url_root = Redmine::Utils.relative_url_root |
||
| 54 | Setting.host_name = 'mydomain.foo/rdm' |
||
| 55 | Setting.protocol = 'http' |
||
| 56 | Redmine::Utils.relative_url_root = '/rdm' |
||
| 57 | |||
| 58 | journal = Journal.find(2) |
||
| 59 | assert Mailer.deliver_issue_edit(journal) |
||
| 60 | |||
| 61 | mail = ActionMailer::Base.deliveries.last |
||
| 62 | assert_kind_of TMail::Mail, mail |
||
| 63 | |||
| 64 | assert_select_email do |
||
| 65 | # link to the main ticket |
||
| 66 | assert_select "a[href=?]", "http://mydomain.foo/rdm/issues/1", :text => "Bug #1: Can't print recipes" |
||
| 67 | # link to a referenced ticket |
||
| 68 | assert_select "a[href=?][title=?]", "http://mydomain.foo/rdm/issues/2", "Add ingredients categories (Assigned)", :text => "#2" |
||
| 69 | # link to a changeset |
||
| 70 | assert_select "a[href=?][title=?]", "http://mydomain.foo/rdm/projects/ecookbook/repository/revisions/2", "This commit fixes #1, #2 and references #1 & #3", :text => "r2" |
||
| 71 | end |
||
| 72 | ensure |
||
| 73 | # restore it |
||
| 74 | Redmine::Utils.relative_url_root = relative_url_root |
||
| 75 | end |
||
| 76 | |||
| 77 | def test_generated_links_with_prefix_and_no_relative_url_root |
||
| 78 | relative_url_root = Redmine::Utils.relative_url_root |
||
| 79 | Setting.host_name = 'mydomain.foo/rdm' |
||
| 80 | Setting.protocol = 'http' |
||
| 81 | Redmine::Utils.relative_url_root = nil |
||
| 82 | |||
| 83 | journal = Journal.find(2) |
||
| 84 | assert Mailer.deliver_issue_edit(journal) |
||
| 85 | |||
| 86 | mail = ActionMailer::Base.deliveries.last |
||
| 87 | assert_kind_of TMail::Mail, mail |
||
| 88 | |||
| 89 | assert_select_email do |
||
| 90 | # link to the main ticket |
||
| 91 | assert_select "a[href=?]", "http://mydomain.foo/rdm/issues/1", :text => "Bug #1: Can't print recipes" |
||
| 92 | # link to a referenced ticket |
||
| 93 | assert_select "a[href=?][title=?]", "http://mydomain.foo/rdm/issues/2", "Add ingredients categories (Assigned)", :text => "#2" |
||
| 94 | # link to a changeset |
||
| 95 | assert_select "a[href=?][title=?]", "http://mydomain.foo/rdm/projects/ecookbook/repository/revisions/2", "This commit fixes #1, #2 and references #1 & #3", :text => "r2" |
||
| 96 | end |
||
| 97 | ensure |
||
| 98 | # restore it |
||
| 99 | Redmine::Utils.relative_url_root = relative_url_root |
||
| 100 | end |
||
| 101 | |||
| 102 | def test_email_headers |
||
| 103 | issue = Issue.find(1) |
||
| 104 | Mailer.deliver_issue_add(issue) |
||
| 105 | mail = ActionMailer::Base.deliveries.last |
||
| 106 | assert_not_nil mail |
||
| 107 | assert_equal 'bulk', mail.header_string('Precedence')
|
||
| 108 | assert_equal 'auto-generated', mail.header_string('Auto-Submitted')
|
||
| 109 | end |
||
| 110 | |||
| 111 | def test_plain_text_mail |
||
| 112 | Setting.plain_text_mail = 1 |
||
| 113 | journal = Journal.find(2) |
||
| 114 | Mailer.deliver_issue_edit(journal) |
||
| 115 | mail = ActionMailer::Base.deliveries.last |
||
| 116 | assert_equal "text/plain", mail.content_type |
||
| 117 | assert_equal 0, mail.parts.size |
||
| 118 | assert !mail.encoded.include?('href')
|
||
| 119 | end |
||
| 120 | |||
| 121 | def test_html_mail |
||
| 122 | Setting.plain_text_mail = 0 |
||
| 123 | journal = Journal.find(2) |
||
| 124 | Mailer.deliver_issue_edit(journal) |
||
| 125 | mail = ActionMailer::Base.deliveries.last |
||
| 126 | assert_equal 2, mail.parts.size |
||
| 127 | assert mail.encoded.include?('href')
|
||
| 128 | end |
||
| 129 | |||
| 130 | def test_mail_from_with_phrase |
||
| 131 | with_settings :mail_from => 'Redmine app <redmine@example.net>' do |
||
| 132 | Mailer.deliver_test(User.find(1)) |
||
| 133 | end |
||
| 134 | mail = ActionMailer::Base.deliveries.last |
||
| 135 | assert_not_nil mail |
||
| 136 | assert_equal 'Redmine app', mail.from_addrs.first.name |
||
| 137 | end |
||
| 138 | |||
| 139 | def test_should_not_send_email_without_recipient |
||
| 140 | news = News.find(:first) |
||
| 141 | user = news.author |
||
| 142 | # Remove members except news author |
||
| 143 | news.project.memberships.each {|m| m.destroy unless m.user == user}
|
||
| 144 | |||
| 145 | user.pref[:no_self_notified] = false |
||
| 146 | user.pref.save |
||
| 147 | User.current = user |
||
| 148 | Mailer.deliver_news_added(news.reload) |
||
| 149 | assert_equal 1, last_email.bcc.size |
||
| 150 | |||
| 151 | # nobody to notify |
||
| 152 | user.pref[:no_self_notified] = true |
||
| 153 | user.pref.save |
||
| 154 | User.current = user |
||
| 155 | ActionMailer::Base.deliveries.clear |
||
| 156 | Mailer.deliver_news_added(news.reload) |
||
| 157 | assert ActionMailer::Base.deliveries.empty? |
||
| 158 | end |
||
| 159 | |||
| 160 | def test_issue_add_message_id |
||
| 161 | issue = Issue.find(1) |
||
| 162 | Mailer.deliver_issue_add(issue) |
||
| 163 | mail = ActionMailer::Base.deliveries.last |
||
| 164 | assert_not_nil mail |
||
| 165 | assert_equal Mailer.message_id_for(issue), mail.message_id |
||
| 166 | assert_nil mail.references |
||
| 167 | end |
||
| 168 | |||
| 169 | def test_issue_edit_message_id |
||
| 170 | journal = Journal.find(1) |
||
| 171 | Mailer.deliver_issue_edit(journal) |
||
| 172 | mail = ActionMailer::Base.deliveries.last |
||
| 173 | assert_not_nil mail |
||
| 174 | assert_equal Mailer.message_id_for(journal), mail.message_id |
||
| 175 | assert_equal Mailer.message_id_for(journal.issue), mail.references.first.to_s |
||
| 176 | end |
||
| 177 | |||
| 178 | def test_message_posted_message_id |
||
| 179 | message = Message.find(1) |
||
| 180 | Mailer.deliver_message_posted(message) |
||
| 181 | mail = ActionMailer::Base.deliveries.last |
||
| 182 | assert_not_nil mail |
||
| 183 | assert_equal Mailer.message_id_for(message), mail.message_id |
||
| 184 | assert_nil mail.references |
||
| 185 | assert_select_email do |
||
| 186 | # link to the message |
||
| 187 | assert_select "a[href=?]", "http://mydomain.foo/boards/#{message.board.id}/topics/#{message.id}", :text => message.subject
|
||
| 188 | end |
||
| 189 | end |
||
| 190 | |||
| 191 | def test_reply_posted_message_id |
||
| 192 | message = Message.find(3) |
||
| 193 | Mailer.deliver_message_posted(message) |
||
| 194 | mail = ActionMailer::Base.deliveries.last |
||
| 195 | assert_not_nil mail |
||
| 196 | assert_equal Mailer.message_id_for(message), mail.message_id |
||
| 197 | assert_equal Mailer.message_id_for(message.parent), mail.references.first.to_s |
||
| 198 | assert_select_email do |
||
| 199 | # link to the reply |
||
| 200 | assert_select "a[href=?]", "http://mydomain.foo/boards/#{message.board.id}/topics/#{message.root.id}?r=#{message.id}#message-#{message.id}", :text => message.subject
|
||
| 201 | end |
||
| 202 | end |
||
| 203 | |||
| 204 | context("#issue_add") do
|
||
| 205 | setup do |
||
| 206 | ActionMailer::Base.deliveries.clear |
||
| 207 | Setting.bcc_recipients = '1' |
||
| 208 | @issue = Issue.find(1) |
||
| 209 | end |
||
| 210 | |||
| 211 | should "notify project members" do |
||
| 212 | assert Mailer.deliver_issue_add(@issue) |
||
| 213 | assert last_email.bcc.include?('dlopper@somenet.foo')
|
||
| 214 | end |
||
| 215 | |||
| 216 | should "not notify project members that are not allow to view the issue" do |
||
| 217 | Role.find(2).remove_permission!(:view_issues) |
||
| 218 | assert Mailer.deliver_issue_add(@issue) |
||
| 219 | assert !last_email.bcc.include?('dlopper@somenet.foo')
|
||
| 220 | end |
||
| 221 | |||
| 222 | should "notify issue watchers" do |
||
| 223 | user = User.find(9) |
||
| 224 | # minimal email notification options |
||
| 225 | user.pref[:no_self_notified] = '1' |
||
| 226 | user.pref.save |
||
| 227 | user.mail_notification = false |
||
| 228 | user.save |
||
| 229 | |||
| 230 | Watcher.create!(:watchable => @issue, :user => user) |
||
| 231 | assert Mailer.deliver_issue_add(@issue) |
||
| 232 | assert last_email.bcc.include?(user.mail) |
||
| 233 | end |
||
| 234 | |||
| 235 | should "not notify watchers not allowed to view the issue" do |
||
| 236 | user = User.find(9) |
||
| 237 | Watcher.create!(:watchable => @issue, :user => user) |
||
| 238 | Role.non_member.remove_permission!(:view_issues) |
||
| 239 | assert Mailer.deliver_issue_add(@issue) |
||
| 240 | assert !last_email.bcc.include?(user.mail) |
||
| 241 | end |
||
| 242 | end |
||
| 243 | |||
| 244 | # test mailer methods for each language |
||
| 245 | def test_issue_add |
||
| 246 | issue = Issue.find(1) |
||
| 247 | valid_languages.each do |lang| |
||
| 248 | Setting.default_language = lang.to_s |
||
| 249 | assert Mailer.deliver_issue_add(issue) |
||
| 250 | end |
||
| 251 | end |
||
| 252 | |||
| 253 | def test_issue_edit |
||
| 254 | journal = Journal.find(1) |
||
| 255 | valid_languages.each do |lang| |
||
| 256 | Setting.default_language = lang.to_s |
||
| 257 | assert Mailer.deliver_issue_edit(journal) |
||
| 258 | end |
||
| 259 | end |
||
| 260 | |||
| 261 | def test_document_added |
||
| 262 | document = Document.find(1) |
||
| 263 | valid_languages.each do |lang| |
||
| 264 | Setting.default_language = lang.to_s |
||
| 265 | assert Mailer.deliver_document_added(document) |
||
| 266 | end |
||
| 267 | end |
||
| 268 | |||
| 269 | def test_attachments_added |
||
| 270 | attachements = [ Attachment.find_by_container_type('Document') ]
|
||
| 271 | valid_languages.each do |lang| |
||
| 272 | Setting.default_language = lang.to_s |
||
| 273 | assert Mailer.deliver_attachments_added(attachements) |
||
| 274 | end |
||
| 275 | end |
||
| 276 | |||
| 277 | def test_version_file_added |
||
| 278 | attachements = [ Attachment.find_by_container_type('Version') ]
|
||
| 279 | assert Mailer.deliver_attachments_added(attachements) |
||
| 280 | assert_not_nil last_email.bcc |
||
| 281 | assert last_email.bcc.any? |
||
| 282 | 441:cbce1fd3b1b7 | Chris | assert_select_email do |
| 283 | assert_select "a[href=?]", "http://mydomain.foo/projects/ecookbook/files" |
||
| 284 | end |
||
| 285 | 0:513646585e45 | Chris | end |
| 286 | |||
| 287 | def test_project_file_added |
||
| 288 | attachements = [ Attachment.find_by_container_type('Project') ]
|
||
| 289 | assert Mailer.deliver_attachments_added(attachements) |
||
| 290 | assert_not_nil last_email.bcc |
||
| 291 | assert last_email.bcc.any? |
||
| 292 | 441:cbce1fd3b1b7 | Chris | assert_select_email do |
| 293 | assert_select "a[href=?]", "http://mydomain.foo/projects/ecookbook/files" |
||
| 294 | end |
||
| 295 | 0:513646585e45 | Chris | end |
| 296 | |||
| 297 | def test_news_added |
||
| 298 | news = News.find(:first) |
||
| 299 | valid_languages.each do |lang| |
||
| 300 | Setting.default_language = lang.to_s |
||
| 301 | assert Mailer.deliver_news_added(news) |
||
| 302 | end |
||
| 303 | end |
||
| 304 | |||
| 305 | 441:cbce1fd3b1b7 | Chris | def test_news_comment_added |
| 306 | comment = Comment.find(2) |
||
| 307 | valid_languages.each do |lang| |
||
| 308 | Setting.default_language = lang.to_s |
||
| 309 | assert Mailer.deliver_news_comment_added(comment) |
||
| 310 | end |
||
| 311 | end |
||
| 312 | |||
| 313 | 0:513646585e45 | Chris | def test_message_posted |
| 314 | message = Message.find(:first) |
||
| 315 | recipients = ([message.root] + message.root.children).collect {|m| m.author.mail if m.author}
|
||
| 316 | recipients = recipients.compact.uniq |
||
| 317 | valid_languages.each do |lang| |
||
| 318 | Setting.default_language = lang.to_s |
||
| 319 | assert Mailer.deliver_message_posted(message) |
||
| 320 | end |
||
| 321 | end |
||
| 322 | |||
| 323 | 119:8661b858af72 | Chris | def test_wiki_content_added |
| 324 | content = WikiContent.find(:first) |
||
| 325 | valid_languages.each do |lang| |
||
| 326 | Setting.default_language = lang.to_s |
||
| 327 | assert_difference 'ActionMailer::Base.deliveries.size' do |
||
| 328 | assert Mailer.deliver_wiki_content_added(content) |
||
| 329 | end |
||
| 330 | end |
||
| 331 | end |
||
| 332 | |||
| 333 | def test_wiki_content_updated |
||
| 334 | content = WikiContent.find(:first) |
||
| 335 | valid_languages.each do |lang| |
||
| 336 | Setting.default_language = lang.to_s |
||
| 337 | assert_difference 'ActionMailer::Base.deliveries.size' do |
||
| 338 | assert Mailer.deliver_wiki_content_updated(content) |
||
| 339 | end |
||
| 340 | end |
||
| 341 | end |
||
| 342 | |||
| 343 | 0:513646585e45 | Chris | def test_account_information |
| 344 | user = User.find(2) |
||
| 345 | valid_languages.each do |lang| |
||
| 346 | user.update_attribute :language, lang.to_s |
||
| 347 | user.reload |
||
| 348 | assert Mailer.deliver_account_information(user, 'pAsswORd') |
||
| 349 | end |
||
| 350 | end |
||
| 351 | |||
| 352 | def test_lost_password |
||
| 353 | token = Token.find(2) |
||
| 354 | valid_languages.each do |lang| |
||
| 355 | token.user.update_attribute :language, lang.to_s |
||
| 356 | token.reload |
||
| 357 | assert Mailer.deliver_lost_password(token) |
||
| 358 | end |
||
| 359 | end |
||
| 360 | |||
| 361 | def test_register |
||
| 362 | token = Token.find(1) |
||
| 363 | Setting.host_name = 'redmine.foo' |
||
| 364 | Setting.protocol = 'https' |
||
| 365 | |||
| 366 | valid_languages.each do |lang| |
||
| 367 | token.user.update_attribute :language, lang.to_s |
||
| 368 | token.reload |
||
| 369 | ActionMailer::Base.deliveries.clear |
||
| 370 | assert Mailer.deliver_register(token) |
||
| 371 | mail = ActionMailer::Base.deliveries.last |
||
| 372 | assert mail.body.include?("https://redmine.foo/account/activate?token=#{token.value}")
|
||
| 373 | end |
||
| 374 | end |
||
| 375 | |||
| 376 | def test_test |
||
| 377 | user = User.find(1) |
||
| 378 | valid_languages.each do |lang| |
||
| 379 | user.update_attribute :language, lang.to_s |
||
| 380 | assert Mailer.deliver_test(user) |
||
| 381 | end |
||
| 382 | end |
||
| 383 | |||
| 384 | def test_reminders |
||
| 385 | Mailer.reminders(:days => 42) |
||
| 386 | assert_equal 1, ActionMailer::Base.deliveries.size |
||
| 387 | mail = ActionMailer::Base.deliveries.last |
||
| 388 | assert mail.bcc.include?('dlopper@somenet.foo')
|
||
| 389 | assert mail.body.include?('Bug #3: Error 281 when updating a recipe')
|
||
| 390 | 14:1d32c0a0efbf | Chris | assert_equal '1 issue(s) due in the next 42 days', mail.subject |
| 391 | 0:513646585e45 | Chris | end |
| 392 | |||
| 393 | 22:40f7cfd4df19 | chris | def test_reminders_for_users |
| 394 | Mailer.reminders(:days => 42, :users => ['5']) |
||
| 395 | assert_equal 0, ActionMailer::Base.deliveries.size # No mail for dlopper |
||
| 396 | Mailer.reminders(:days => 42, :users => ['3']) |
||
| 397 | assert_equal 1, ActionMailer::Base.deliveries.size # No mail for dlopper |
||
| 398 | mail = ActionMailer::Base.deliveries.last |
||
| 399 | assert mail.bcc.include?('dlopper@somenet.foo')
|
||
| 400 | assert mail.body.include?('Bug #3: Error 281 when updating a recipe')
|
||
| 401 | end |
||
| 402 | |||
| 403 | 0:513646585e45 | Chris | def last_email |
| 404 | mail = ActionMailer::Base.deliveries.last |
||
| 405 | assert_not_nil mail |
||
| 406 | |||
| 407 | end |
||
| 408 | |||
| 409 | def test_mailer_should_not_change_locale |
||
| 410 | Setting.default_language = 'en' |
||
| 411 | # Set current language to italian |
||
| 412 | set_language_if_valid 'it' |
||
| 413 | # Send an email to a french user |
||
| 414 | user = User.find(1) |
||
| 415 | user.language = 'fr' |
||
| 416 | Mailer.deliver_account_activated(user) |
||
| 417 | mail = ActionMailer::Base.deliveries.last |
||
| 418 | assert mail.body.include?('Votre compte')
|
||
| 419 | |||
| 420 | assert_equal :it, current_language |
||
| 421 | end |
||
| 422 | |||
| 423 | def test_with_deliveries_off |
||
| 424 | Mailer.with_deliveries false do |
||
| 425 | Mailer.deliver_test(User.find(1)) |
||
| 426 | end |
||
| 427 | assert ActionMailer::Base.deliveries.empty? |
||
| 428 | # should restore perform_deliveries |
||
| 429 | assert ActionMailer::Base.perform_deliveries |
||
| 430 | end |
||
| 431 | 37:94944d00e43c | chris | |
| 432 | context "layout" do |
||
| 433 | should "include the emails_header" do |
||
| 434 | with_settings(:emails_header => "*Header content*") do |
||
| 435 | assert Mailer.deliver_test(User.find(1)) |
||
| 436 | |||
| 437 | assert_select_email do |
||
| 438 | assert_select ".header" do |
||
| 439 | assert_select "strong", :text => "Header content" |
||
| 440 | end |
||
| 441 | end |
||
| 442 | end |
||
| 443 | end |
||
| 444 | end |
||
| 445 | 0:513646585e45 | Chris | end |