annotate test/unit/mail_handler_test.rb @ 976:0befb332f41a get_statistics

get stats up to current date
author luisf <luis.figueira@eecs.qmul.ac.uk>
date Thu, 25 Oct 2012 13:50:45 +0100
parents cbb26bc654de
children 433d4f72a19b
rev   line source
Chris@0 1 # encoding: utf-8
Chris@0 2 #
Chris@0 3 # Redmine - project management software
Chris@441 4 # Copyright (C) 2006-2011 Jean-Philippe Lang
Chris@0 5 #
Chris@0 6 # This program is free software; you can redistribute it and/or
Chris@0 7 # modify it under the terms of the GNU General Public License
Chris@0 8 # as published by the Free Software Foundation; either version 2
Chris@0 9 # of the License, or (at your option) any later version.
Chris@441 10 #
Chris@0 11 # This program is distributed in the hope that it will be useful,
Chris@0 12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@0 13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0 14 # GNU General Public License for more details.
Chris@441 15 #
Chris@0 16 # You should have received a copy of the GNU General Public License
Chris@0 17 # along with this program; if not, write to the Free Software
Chris@0 18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Chris@0 19
Chris@119 20 require File.expand_path('../../test_helper', __FILE__)
Chris@0 21
Chris@0 22 class MailHandlerTest < ActiveSupport::TestCase
Chris@441 23 fixtures :users, :projects,
Chris@0 24 :enabled_modules,
Chris@0 25 :roles,
Chris@0 26 :members,
Chris@0 27 :member_roles,
chris@37 28 :users,
Chris@0 29 :issues,
Chris@0 30 :issue_statuses,
Chris@0 31 :workflows,
Chris@0 32 :trackers,
Chris@0 33 :projects_trackers,
chris@37 34 :versions,
Chris@0 35 :enumerations,
Chris@0 36 :issue_categories,
Chris@0 37 :custom_fields,
Chris@0 38 :custom_fields_trackers,
Chris@119 39 :custom_fields_projects,
Chris@0 40 :boards,
Chris@0 41 :messages
Chris@441 42
Chris@0 43 FIXTURES_PATH = File.dirname(__FILE__) + '/../fixtures/mail_handler'
Chris@441 44
Chris@0 45 def setup
Chris@0 46 ActionMailer::Base.deliveries.clear
chris@37 47 Setting.notified_events = Redmine::Notifiable.all.collect(&:name)
Chris@0 48 end
Chris@441 49
Chris@0 50 def test_add_issue
Chris@0 51 ActionMailer::Base.deliveries.clear
Chris@0 52 # This email contains: 'Project: onlinestore'
Chris@0 53 issue = submit_email('ticket_on_given_project.eml')
Chris@0 54 assert issue.is_a?(Issue)
Chris@0 55 assert !issue.new_record?
Chris@0 56 issue.reload
Chris@119 57 assert_equal Project.find(2), issue.project
Chris@119 58 assert_equal issue.project.trackers.first, issue.tracker
Chris@0 59 assert_equal 'New ticket on a given project', issue.subject
Chris@0 60 assert_equal User.find_by_login('jsmith'), issue.author
Chris@0 61 assert_equal IssueStatus.find_by_name('Resolved'), issue.status
Chris@0 62 assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
Chris@0 63 assert_equal '2010-01-01', issue.start_date.to_s
Chris@0 64 assert_equal '2010-12-31', issue.due_date.to_s
Chris@0 65 assert_equal User.find_by_login('jsmith'), issue.assigned_to
Chris@507 66 assert_equal Version.find_by_name('Alpha'), issue.fixed_version
chris@37 67 assert_equal 2.5, issue.estimated_hours
chris@37 68 assert_equal 30, issue.done_ratio
Chris@119 69 assert_equal [issue.id, 1, 2], [issue.root_id, issue.lft, issue.rgt]
Chris@0 70 # keywords should be removed from the email body
Chris@0 71 assert !issue.description.match(/^Project:/i)
Chris@0 72 assert !issue.description.match(/^Status:/i)
Chris@441 73 assert !issue.description.match(/^Start Date:/i)
Chris@0 74 # Email notification should be sent
Chris@0 75 mail = ActionMailer::Base.deliveries.last
Chris@0 76 assert_not_nil mail
Chris@0 77 assert mail.subject.include?('New ticket on a given project')
Chris@0 78 end
Chris@441 79
Chris@119 80 def test_add_issue_with_default_tracker
Chris@119 81 # This email contains: 'Project: onlinestore'
Chris@119 82 issue = submit_email('ticket_on_given_project.eml', :issue => {:tracker => 'Support request'})
Chris@119 83 assert issue.is_a?(Issue)
Chris@119 84 assert !issue.new_record?
Chris@119 85 issue.reload
Chris@119 86 assert_equal 'Support request', issue.tracker.name
Chris@119 87 end
Chris@0 88
Chris@0 89 def test_add_issue_with_status
Chris@0 90 # This email contains: 'Project: onlinestore' and 'Status: Resolved'
Chris@0 91 issue = submit_email('ticket_on_given_project.eml')
Chris@0 92 assert issue.is_a?(Issue)
Chris@0 93 assert !issue.new_record?
Chris@0 94 issue.reload
Chris@0 95 assert_equal Project.find(2), issue.project
Chris@0 96 assert_equal IssueStatus.find_by_name("Resolved"), issue.status
Chris@0 97 end
Chris@441 98
Chris@0 99 def test_add_issue_with_attributes_override
Chris@0 100 issue = submit_email('ticket_with_attributes.eml', :allow_override => 'tracker,category,priority')
Chris@0 101 assert issue.is_a?(Issue)
Chris@0 102 assert !issue.new_record?
Chris@0 103 issue.reload
Chris@0 104 assert_equal 'New ticket on a given project', issue.subject
Chris@0 105 assert_equal User.find_by_login('jsmith'), issue.author
Chris@0 106 assert_equal Project.find(2), issue.project
Chris@0 107 assert_equal 'Feature request', issue.tracker.to_s
Chris@0 108 assert_equal 'Stock management', issue.category.to_s
Chris@0 109 assert_equal 'Urgent', issue.priority.to_s
Chris@0 110 assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
Chris@0 111 end
Chris@441 112
Chris@909 113 def test_add_issue_with_group_assignment
Chris@909 114 with_settings :issue_group_assignment => '1' do
Chris@909 115 issue = submit_email('ticket_on_given_project.eml') do |email|
Chris@909 116 email.gsub!('Assigned to: John Smith', 'Assigned to: B Team')
Chris@909 117 end
Chris@909 118 assert issue.is_a?(Issue)
Chris@909 119 assert !issue.new_record?
Chris@909 120 issue.reload
Chris@909 121 assert_equal Group.find(11), issue.assigned_to
Chris@909 122 end
Chris@909 123 end
Chris@909 124
Chris@0 125 def test_add_issue_with_partial_attributes_override
Chris@0 126 issue = submit_email('ticket_with_attributes.eml', :issue => {:priority => 'High'}, :allow_override => ['tracker'])
Chris@0 127 assert issue.is_a?(Issue)
Chris@0 128 assert !issue.new_record?
Chris@0 129 issue.reload
Chris@0 130 assert_equal 'New ticket on a given project', issue.subject
Chris@0 131 assert_equal User.find_by_login('jsmith'), issue.author
Chris@0 132 assert_equal Project.find(2), issue.project
Chris@0 133 assert_equal 'Feature request', issue.tracker.to_s
Chris@0 134 assert_nil issue.category
Chris@0 135 assert_equal 'High', issue.priority.to_s
Chris@0 136 assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
Chris@0 137 end
Chris@441 138
Chris@0 139 def test_add_issue_with_spaces_between_attribute_and_separator
Chris@0 140 issue = submit_email('ticket_with_spaces_between_attribute_and_separator.eml', :allow_override => 'tracker,category,priority')
Chris@0 141 assert issue.is_a?(Issue)
Chris@0 142 assert !issue.new_record?
Chris@0 143 issue.reload
Chris@0 144 assert_equal 'New ticket on a given project', issue.subject
Chris@0 145 assert_equal User.find_by_login('jsmith'), issue.author
Chris@0 146 assert_equal Project.find(2), issue.project
Chris@0 147 assert_equal 'Feature request', issue.tracker.to_s
Chris@0 148 assert_equal 'Stock management', issue.category.to_s
Chris@0 149 assert_equal 'Urgent', issue.priority.to_s
Chris@0 150 assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
Chris@0 151 end
Chris@0 152
Chris@0 153 def test_add_issue_with_attachment_to_specific_project
Chris@0 154 issue = submit_email('ticket_with_attachment.eml', :issue => {:project => 'onlinestore'})
Chris@0 155 assert issue.is_a?(Issue)
Chris@0 156 assert !issue.new_record?
Chris@0 157 issue.reload
Chris@0 158 assert_equal 'Ticket created by email with attachment', issue.subject
Chris@0 159 assert_equal User.find_by_login('jsmith'), issue.author
Chris@0 160 assert_equal Project.find(2), issue.project
Chris@0 161 assert_equal 'This is a new ticket with attachments', issue.description
Chris@0 162 # Attachment properties
Chris@0 163 assert_equal 1, issue.attachments.size
Chris@0 164 assert_equal 'Paella.jpg', issue.attachments.first.filename
Chris@0 165 assert_equal 'image/jpeg', issue.attachments.first.content_type
Chris@0 166 assert_equal 10790, issue.attachments.first.filesize
Chris@0 167 end
Chris@441 168
Chris@0 169 def test_add_issue_with_custom_fields
Chris@0 170 issue = submit_email('ticket_with_custom_fields.eml', :issue => {:project => 'onlinestore'})
Chris@0 171 assert issue.is_a?(Issue)
Chris@0 172 assert !issue.new_record?
Chris@0 173 issue.reload
Chris@0 174 assert_equal 'New ticket with custom field values', issue.subject
Chris@0 175 assert_equal 'Value for a custom field', issue.custom_value_for(CustomField.find_by_name('Searchable field')).value
Chris@0 176 assert !issue.description.match(/^searchable field:/i)
Chris@0 177 end
Chris@441 178
Chris@0 179 def test_add_issue_with_cc
Chris@0 180 issue = submit_email('ticket_with_cc.eml', :issue => {:project => 'ecookbook'})
Chris@0 181 assert issue.is_a?(Issue)
Chris@0 182 assert !issue.new_record?
Chris@0 183 issue.reload
Chris@0 184 assert issue.watched_by?(User.find_by_mail('dlopper@somenet.foo'))
chris@37 185 assert_equal 1, issue.watcher_user_ids.size
Chris@0 186 end
Chris@441 187
Chris@0 188 def test_add_issue_by_unknown_user
Chris@0 189 assert_no_difference 'User.count' do
Chris@0 190 assert_equal false, submit_email('ticket_by_unknown_user.eml', :issue => {:project => 'ecookbook'})
Chris@0 191 end
Chris@0 192 end
Chris@441 193
Chris@0 194 def test_add_issue_by_anonymous_user
Chris@0 195 Role.anonymous.add_permission!(:add_issues)
Chris@0 196 assert_no_difference 'User.count' do
Chris@0 197 issue = submit_email('ticket_by_unknown_user.eml', :issue => {:project => 'ecookbook'}, :unknown_user => 'accept')
Chris@0 198 assert issue.is_a?(Issue)
Chris@0 199 assert issue.author.anonymous?
Chris@0 200 end
Chris@0 201 end
Chris@0 202
Chris@0 203 def test_add_issue_by_anonymous_user_with_no_from_address
Chris@0 204 Role.anonymous.add_permission!(:add_issues)
Chris@0 205 assert_no_difference 'User.count' do
Chris@0 206 issue = submit_email('ticket_by_empty_user.eml', :issue => {:project => 'ecookbook'}, :unknown_user => 'accept')
Chris@0 207 assert issue.is_a?(Issue)
Chris@0 208 assert issue.author.anonymous?
Chris@0 209 end
Chris@0 210 end
Chris@441 211
Chris@0 212 def test_add_issue_by_anonymous_user_on_private_project
Chris@0 213 Role.anonymous.add_permission!(:add_issues)
Chris@0 214 assert_no_difference 'User.count' do
Chris@0 215 assert_no_difference 'Issue.count' do
Chris@0 216 assert_equal false, submit_email('ticket_by_unknown_user.eml', :issue => {:project => 'onlinestore'}, :unknown_user => 'accept')
Chris@0 217 end
Chris@0 218 end
Chris@0 219 end
Chris@441 220
Chris@0 221 def test_add_issue_by_anonymous_user_on_private_project_without_permission_check
Chris@0 222 assert_no_difference 'User.count' do
Chris@0 223 assert_difference 'Issue.count' do
Chris@0 224 issue = submit_email('ticket_by_unknown_user.eml', :issue => {:project => 'onlinestore'}, :no_permission_check => '1', :unknown_user => 'accept')
Chris@0 225 assert issue.is_a?(Issue)
Chris@0 226 assert issue.author.anonymous?
Chris@0 227 assert !issue.project.is_public?
Chris@119 228 assert_equal [issue.id, 1, 2], [issue.root_id, issue.lft, issue.rgt]
Chris@0 229 end
Chris@0 230 end
Chris@0 231 end
Chris@441 232
Chris@0 233 def test_add_issue_by_created_user
Chris@0 234 Setting.default_language = 'en'
Chris@0 235 assert_difference 'User.count' do
Chris@0 236 issue = submit_email('ticket_by_unknown_user.eml', :issue => {:project => 'ecookbook'}, :unknown_user => 'create')
Chris@0 237 assert issue.is_a?(Issue)
Chris@0 238 assert issue.author.active?
Chris@0 239 assert_equal 'john.doe@somenet.foo', issue.author.mail
Chris@0 240 assert_equal 'John', issue.author.firstname
Chris@0 241 assert_equal 'Doe', issue.author.lastname
Chris@441 242
Chris@0 243 # account information
Chris@0 244 email = ActionMailer::Base.deliveries.first
Chris@0 245 assert_not_nil email
Chris@0 246 assert email.subject.include?('account activation')
Chris@0 247 login = email.body.match(/\* Login: (.*)$/)[1]
Chris@0 248 password = email.body.match(/\* Password: (.*)$/)[1]
Chris@0 249 assert_equal issue.author, User.try_to_login(login, password)
Chris@0 250 end
Chris@0 251 end
Chris@441 252
Chris@0 253 def test_add_issue_without_from_header
Chris@0 254 Role.anonymous.add_permission!(:add_issues)
Chris@0 255 assert_equal false, submit_email('ticket_without_from_header.eml')
Chris@0 256 end
chris@37 257
chris@37 258 def test_add_issue_with_invalid_attributes
chris@37 259 issue = submit_email('ticket_with_invalid_attributes.eml', :allow_override => 'tracker,category,priority')
chris@37 260 assert issue.is_a?(Issue)
chris@37 261 assert !issue.new_record?
chris@37 262 issue.reload
chris@37 263 assert_nil issue.assigned_to
chris@37 264 assert_nil issue.start_date
chris@37 265 assert_nil issue.due_date
chris@37 266 assert_equal 0, issue.done_ratio
chris@37 267 assert_equal 'Normal', issue.priority.to_s
chris@37 268 assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
chris@37 269 end
chris@37 270
chris@37 271 def test_add_issue_with_localized_attributes
chris@37 272 User.find_by_mail('jsmith@somenet.foo').update_attribute 'language', 'fr'
chris@37 273 issue = submit_email('ticket_with_localized_attributes.eml', :allow_override => 'tracker,category,priority')
chris@37 274 assert issue.is_a?(Issue)
chris@37 275 assert !issue.new_record?
chris@37 276 issue.reload
chris@37 277 assert_equal 'New ticket on a given project', issue.subject
chris@37 278 assert_equal User.find_by_login('jsmith'), issue.author
chris@37 279 assert_equal Project.find(2), issue.project
chris@37 280 assert_equal 'Feature request', issue.tracker.to_s
chris@37 281 assert_equal 'Stock management', issue.category.to_s
chris@37 282 assert_equal 'Urgent', issue.priority.to_s
chris@37 283 assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
chris@37 284 end
Chris@441 285
Chris@0 286 def test_add_issue_with_japanese_keywords
Chris@0 287 tracker = Tracker.create!(:name => '開発')
Chris@0 288 Project.find(1).trackers << tracker
Chris@0 289 issue = submit_email('japanese_keywords_iso_2022_jp.eml', :issue => {:project => 'ecookbook'}, :allow_override => 'tracker')
Chris@0 290 assert_kind_of Issue, issue
Chris@0 291 assert_equal tracker, issue.tracker
Chris@0 292 end
Chris@0 293
Chris@909 294 def test_add_issue_from_apple_mail
Chris@909 295 issue = submit_email('apple_mail_with_attachment.eml', :issue => {:project => 'ecookbook'})
Chris@909 296 assert_kind_of Issue, issue
Chris@909 297 assert_equal 1, issue.attachments.size
Chris@909 298
Chris@909 299 attachment = issue.attachments.first
Chris@909 300 assert_equal 'paella.jpg', attachment.filename
Chris@909 301 assert_equal 10790, attachment.filesize
Chris@909 302 end
Chris@909 303
Chris@0 304 def test_should_ignore_emails_from_emission_address
Chris@0 305 Role.anonymous.add_permission!(:add_issues)
Chris@0 306 assert_no_difference 'User.count' do
Chris@0 307 assert_equal false, submit_email('ticket_from_emission_address.eml', :issue => {:project => 'ecookbook'}, :unknown_user => 'create')
Chris@0 308 end
Chris@0 309 end
Chris@0 310
Chris@0 311 def test_add_issue_should_send_email_notification
chris@37 312 Setting.notified_events = ['issue_added']
Chris@0 313 ActionMailer::Base.deliveries.clear
Chris@0 314 # This email contains: 'Project: onlinestore'
Chris@0 315 issue = submit_email('ticket_on_given_project.eml')
Chris@0 316 assert issue.is_a?(Issue)
Chris@0 317 assert_equal 1, ActionMailer::Base.deliveries.size
Chris@0 318 end
Chris@441 319
Chris@909 320 def test_update_issue
Chris@0 321 journal = submit_email('ticket_reply.eml')
Chris@0 322 assert journal.is_a?(Journal)
Chris@0 323 assert_equal User.find_by_login('jsmith'), journal.user
Chris@0 324 assert_equal Issue.find(2), journal.journalized
Chris@0 325 assert_match /This is reply/, journal.notes
Chris@119 326 assert_equal 'Feature request', journal.issue.tracker.name
Chris@0 327 end
Chris@0 328
Chris@909 329 def test_update_issue_with_attribute_changes
Chris@0 330 # This email contains: 'Status: Resolved'
Chris@0 331 journal = submit_email('ticket_reply_with_status.eml')
Chris@0 332 assert journal.is_a?(Journal)
Chris@0 333 issue = Issue.find(journal.issue.id)
Chris@0 334 assert_equal User.find_by_login('jsmith'), journal.user
Chris@0 335 assert_equal Issue.find(2), journal.journalized
Chris@0 336 assert_match /This is reply/, journal.notes
Chris@119 337 assert_equal 'Feature request', journal.issue.tracker.name
Chris@0 338 assert_equal IssueStatus.find_by_name("Resolved"), issue.status
Chris@0 339 assert_equal '2010-01-01', issue.start_date.to_s
Chris@0 340 assert_equal '2010-12-31', issue.due_date.to_s
Chris@0 341 assert_equal User.find_by_login('jsmith'), issue.assigned_to
Chris@119 342 assert_equal "52.6", issue.custom_value_for(CustomField.find_by_name('Float field')).value
Chris@441 343 # keywords should be removed from the email body
Chris@441 344 assert !journal.notes.match(/^Status:/i)
Chris@441 345 assert !journal.notes.match(/^Start Date:/i)
Chris@0 346 end
Chris@0 347
Chris@909 348 def test_update_issue_with_attachment
Chris@909 349 assert_difference 'Journal.count' do
Chris@909 350 assert_difference 'JournalDetail.count' do
Chris@909 351 assert_difference 'Attachment.count' do
Chris@909 352 assert_no_difference 'Issue.count' do
Chris@909 353 journal = submit_email('ticket_with_attachment.eml') do |raw|
Chris@909 354 raw.gsub! /^Subject: .*$/, 'Subject: Re: [Cookbook - Feature #2] (New) Add ingredients categories'
Chris@909 355 end
Chris@909 356 end
Chris@909 357 end
Chris@909 358 end
Chris@909 359 end
Chris@909 360 journal = Journal.first(:order => 'id DESC')
Chris@909 361 assert_equal Issue.find(2), journal.journalized
Chris@909 362 assert_equal 1, journal.details.size
Chris@909 363
Chris@909 364 detail = journal.details.first
Chris@909 365 assert_equal 'attachment', detail.property
Chris@909 366 assert_equal 'Paella.jpg', detail.value
Chris@909 367 end
Chris@909 368
Chris@909 369 def test_update_issue_should_send_email_notification
Chris@0 370 ActionMailer::Base.deliveries.clear
Chris@0 371 journal = submit_email('ticket_reply.eml')
Chris@0 372 assert journal.is_a?(Journal)
Chris@0 373 assert_equal 1, ActionMailer::Base.deliveries.size
Chris@0 374 end
Chris@441 375
Chris@909 376 def test_update_issue_should_not_set_defaults
Chris@119 377 journal = submit_email('ticket_reply.eml', :issue => {:tracker => 'Support request', :priority => 'High'})
Chris@119 378 assert journal.is_a?(Journal)
Chris@119 379 assert_match /This is reply/, journal.notes
Chris@119 380 assert_equal 'Feature request', journal.issue.tracker.name
Chris@119 381 assert_equal 'Normal', journal.issue.priority.name
Chris@119 382 end
Chris@441 383
Chris@0 384 def test_reply_to_a_message
Chris@0 385 m = submit_email('message_reply.eml')
Chris@0 386 assert m.is_a?(Message)
Chris@0 387 assert !m.new_record?
Chris@0 388 m.reload
Chris@0 389 assert_equal 'Reply via email', m.subject
Chris@0 390 # The email replies to message #2 which is part of the thread of message #1
Chris@0 391 assert_equal Message.find(1), m.parent
Chris@0 392 end
Chris@441 393
Chris@0 394 def test_reply_to_a_message_by_subject
Chris@0 395 m = submit_email('message_reply_by_subject.eml')
Chris@0 396 assert m.is_a?(Message)
Chris@0 397 assert !m.new_record?
Chris@0 398 m.reload
Chris@0 399 assert_equal 'Reply to the first post', m.subject
Chris@0 400 assert_equal Message.find(1), m.parent
Chris@0 401 end
Chris@441 402
Chris@0 403 def test_should_strip_tags_of_html_only_emails
Chris@0 404 issue = submit_email('ticket_html_only.eml', :issue => {:project => 'ecookbook'})
Chris@0 405 assert issue.is_a?(Issue)
Chris@0 406 assert !issue.new_record?
Chris@0 407 issue.reload
Chris@0 408 assert_equal 'HTML email', issue.subject
Chris@0 409 assert_equal 'This is a html-only email.', issue.description
Chris@0 410 end
Chris@0 411
Chris@0 412 context "truncate emails based on the Setting" do
Chris@0 413 context "with no setting" do
Chris@0 414 setup do
Chris@0 415 Setting.mail_handler_body_delimiters = ''
Chris@0 416 end
Chris@0 417
Chris@0 418 should "add the entire email into the issue" do
Chris@0 419 issue = submit_email('ticket_on_given_project.eml')
Chris@0 420 assert_issue_created(issue)
Chris@0 421 assert issue.description.include?('---')
Chris@0 422 assert issue.description.include?('This paragraph is after the delimiter')
Chris@0 423 end
Chris@0 424 end
Chris@0 425
Chris@0 426 context "with a single string" do
Chris@0 427 setup do
Chris@0 428 Setting.mail_handler_body_delimiters = '---'
Chris@0 429 end
Chris@0 430 should "truncate the email at the delimiter for the issue" do
Chris@0 431 issue = submit_email('ticket_on_given_project.eml')
Chris@0 432 assert_issue_created(issue)
Chris@0 433 assert issue.description.include?('This paragraph is before delimiters')
Chris@0 434 assert issue.description.include?('--- This line starts with a delimiter')
Chris@0 435 assert !issue.description.match(/^---$/)
Chris@0 436 assert !issue.description.include?('This paragraph is after the delimiter')
Chris@0 437 end
Chris@0 438 end
Chris@0 439
chris@37 440 context "with a single quoted reply (e.g. reply to a Redmine email notification)" do
chris@37 441 setup do
chris@37 442 Setting.mail_handler_body_delimiters = '--- Reply above. Do not remove this line. ---'
chris@37 443 end
chris@37 444 should "truncate the email at the delimiter with the quoted reply symbols (>)" do
chris@37 445 journal = submit_email('issue_update_with_quoted_reply_above.eml')
chris@37 446 assert journal.is_a?(Journal)
chris@37 447 assert journal.notes.include?('An update to the issue by the sender.')
chris@37 448 assert !journal.notes.match(Regexp.escape("--- Reply above. Do not remove this line. ---"))
chris@37 449 assert !journal.notes.include?('Looks like the JSON api for projects was missed.')
Chris@441 450 end
Chris@441 451 end
chris@37 452
chris@37 453 context "with multiple quoted replies (e.g. reply to a reply of a Redmine email notification)" do
chris@37 454 setup do
chris@37 455 Setting.mail_handler_body_delimiters = '--- Reply above. Do not remove this line. ---'
chris@37 456 end
chris@37 457 should "truncate the email at the delimiter with the quoted reply symbols (>)" do
chris@37 458 journal = submit_email('issue_update_with_multiple_quoted_reply_above.eml')
chris@37 459 assert journal.is_a?(Journal)
chris@37 460 assert journal.notes.include?('An update to the issue by the sender.')
chris@37 461 assert !journal.notes.match(Regexp.escape("--- Reply above. Do not remove this line. ---"))
chris@37 462 assert !journal.notes.include?('Looks like the JSON api for projects was missed.')
chris@37 463 end
chris@37 464 end
chris@37 465
Chris@0 466 context "with multiple strings" do
Chris@0 467 setup do
Chris@0 468 Setting.mail_handler_body_delimiters = "---\nBREAK"
Chris@0 469 end
Chris@0 470 should "truncate the email at the first delimiter found (BREAK)" do
Chris@0 471 issue = submit_email('ticket_on_given_project.eml')
Chris@0 472 assert_issue_created(issue)
Chris@0 473 assert issue.description.include?('This paragraph is before delimiters')
Chris@0 474 assert !issue.description.include?('BREAK')
Chris@0 475 assert !issue.description.include?('This paragraph is between delimiters')
Chris@0 476 assert !issue.description.match(/^---$/)
Chris@0 477 assert !issue.description.include?('This paragraph is after the delimiter')
Chris@0 478 end
Chris@0 479 end
Chris@0 480 end
Chris@441 481
Chris@0 482 def test_email_with_long_subject_line
Chris@0 483 issue = submit_email('ticket_with_long_subject.eml')
Chris@0 484 assert issue.is_a?(Issue)
Chris@0 485 assert_equal issue.subject, 'New ticket on a given project with a very long subject line which exceeds 255 chars and should not be ignored but chopped off. And if the subject line is still not long enough, we just add more text. And more text. Wow, this is really annoying. Especially, if you have nothing to say...'[0,255]
Chris@0 486 end
Chris@0 487
Chris@909 488 def test_new_user_from_attributes_should_return_valid_user
Chris@909 489 to_test = {
Chris@909 490 # [address, name] => [login, firstname, lastname]
Chris@909 491 ['jsmith@example.net', nil] => ['jsmith@example.net', 'jsmith', '-'],
Chris@909 492 ['jsmith@example.net', 'John'] => ['jsmith@example.net', 'John', '-'],
Chris@909 493 ['jsmith@example.net', 'John Smith'] => ['jsmith@example.net', 'John', 'Smith'],
Chris@909 494 ['jsmith@example.net', 'John Paul Smith'] => ['jsmith@example.net', 'John', 'Paul Smith'],
Chris@909 495 ['jsmith@example.net', 'AVeryLongFirstnameThatExceedsTheMaximumLength Smith'] => ['jsmith@example.net', 'AVeryLongFirstnameThatExceedsT', 'Smith'],
Chris@909 496 ['jsmith@example.net', 'John AVeryLongLastnameThatExceedsTheMaximumLength'] => ['jsmith@example.net', 'John', 'AVeryLongLastnameThatExceedsTh'],
Chris@909 497 ['alongemailaddressthatexceedsloginlength@example.net', 'John Smith'] => ['alongemailaddressthatexceedslo', 'John', 'Smith']
Chris@909 498 }
Chris@909 499
Chris@909 500 to_test.each do |attrs, expected|
Chris@909 501 user = MailHandler.new_user_from_attributes(attrs.first, attrs.last)
Chris@909 502
Chris@909 503 assert user.valid?
Chris@909 504 assert_equal attrs.first, user.mail
Chris@909 505 assert_equal expected[0], user.login
Chris@909 506 assert_equal expected[1], user.firstname
Chris@909 507 assert_equal expected[2], user.lastname
Chris@909 508 end
Chris@909 509 end
Chris@909 510
Chris@909 511 def test_new_user_from_attributes_should_respect_minimum_password_length
Chris@909 512 with_settings :password_min_length => 15 do
Chris@909 513 user = MailHandler.new_user_from_attributes('jsmith@example.net')
Chris@909 514 assert user.valid?
Chris@909 515 assert user.password.length >= 15
Chris@909 516 end
Chris@909 517 end
Chris@909 518
Chris@909 519 def test_new_user_from_attributes_should_use_default_login_if_invalid
Chris@909 520 MailHandler.new_user_from_attributes('alongemailaddressthatexceedsloginlength-1@example.net').save!
Chris@909 521
Chris@909 522 # another long address that would result in duplicate login
Chris@909 523 user = MailHandler.new_user_from_attributes('alongemailaddressthatexceedsloginlength-2@example.net')
Chris@909 524 assert user.valid?
Chris@909 525 assert user.login =~ /^user[a-f0-9]+$/
Chris@909 526 end
Chris@909 527
Chris@0 528 private
Chris@441 529
Chris@0 530 def submit_email(filename, options={})
Chris@0 531 raw = IO.read(File.join(FIXTURES_PATH, filename))
Chris@909 532 yield raw if block_given?
Chris@0 533 MailHandler.receive(raw, options)
Chris@0 534 end
Chris@0 535
Chris@0 536 def assert_issue_created(issue)
Chris@0 537 assert issue.is_a?(Issue)
Chris@0 538 assert !issue.new_record?
Chris@0 539 issue.reload
Chris@0 540 end
Chris@0 541 end