annotate .svn/pristine/02/02c68441083bdea630158440f0e7d9d62ff8f790.svn-base @ 1485:c8d3ad483bea redmine-2.4-integration

Fix stray merge markers
author Chris Cannam <chris.cannam@soundsoftware.ac.uk>
date Wed, 15 Jan 2014 13:34:12 +0000
parents 261b3d9a4903
children
rev   line source
Chris@1464 1 # encoding: utf-8
Chris@1464 2 #
Chris@1464 3 # Redmine - project management software
Chris@1464 4 # Copyright (C) 2006-2013 Jean-Philippe Lang
Chris@1464 5 #
Chris@1464 6 # This program is free software; you can redistribute it and/or
Chris@1464 7 # modify it under the terms of the GNU General Public License
Chris@1464 8 # as published by the Free Software Foundation; either version 2
Chris@1464 9 # of the License, or (at your option) any later version.
Chris@1464 10 #
Chris@1464 11 # This program is distributed in the hope that it will be useful,
Chris@1464 12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@1464 13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@1464 14 # GNU General Public License for more details.
Chris@1464 15 #
Chris@1464 16 # You should have received a copy of the GNU General Public License
Chris@1464 17 # along with this program; if not, write to the Free Software
Chris@1464 18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Chris@1464 19
Chris@1464 20 require File.expand_path('../../test_helper', __FILE__)
Chris@1464 21
Chris@1464 22 class MailHandlerTest < ActiveSupport::TestCase
Chris@1464 23 fixtures :users, :projects, :enabled_modules, :roles,
Chris@1464 24 :members, :member_roles, :users,
Chris@1464 25 :issues, :issue_statuses,
Chris@1464 26 :workflows, :trackers, :projects_trackers,
Chris@1464 27 :versions, :enumerations, :issue_categories,
Chris@1464 28 :custom_fields, :custom_fields_trackers, :custom_fields_projects,
Chris@1464 29 :boards, :messages
Chris@1464 30
Chris@1464 31 FIXTURES_PATH = File.dirname(__FILE__) + '/../fixtures/mail_handler'
Chris@1464 32
Chris@1464 33 def setup
Chris@1464 34 ActionMailer::Base.deliveries.clear
Chris@1464 35 Setting.notified_events = Redmine::Notifiable.all.collect(&:name)
Chris@1464 36 end
Chris@1464 37
Chris@1464 38 def teardown
Chris@1464 39 Setting.clear_cache
Chris@1464 40 end
Chris@1464 41
Chris@1464 42 def test_add_issue
Chris@1464 43 ActionMailer::Base.deliveries.clear
Chris@1464 44 # This email contains: 'Project: onlinestore'
Chris@1464 45 issue = submit_email('ticket_on_given_project.eml')
Chris@1464 46 assert issue.is_a?(Issue)
Chris@1464 47 assert !issue.new_record?
Chris@1464 48 issue.reload
Chris@1464 49 assert_equal Project.find(2), issue.project
Chris@1464 50 assert_equal issue.project.trackers.first, issue.tracker
Chris@1464 51 assert_equal 'New ticket on a given project', issue.subject
Chris@1464 52 assert_equal User.find_by_login('jsmith'), issue.author
Chris@1464 53 assert_equal IssueStatus.find_by_name('Resolved'), issue.status
Chris@1464 54 assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
Chris@1464 55 assert_equal '2010-01-01', issue.start_date.to_s
Chris@1464 56 assert_equal '2010-12-31', issue.due_date.to_s
Chris@1464 57 assert_equal User.find_by_login('jsmith'), issue.assigned_to
Chris@1464 58 assert_equal Version.find_by_name('Alpha'), issue.fixed_version
Chris@1464 59 assert_equal 2.5, issue.estimated_hours
Chris@1464 60 assert_equal 30, issue.done_ratio
Chris@1464 61 assert_equal [issue.id, 1, 2], [issue.root_id, issue.lft, issue.rgt]
Chris@1464 62 # keywords should be removed from the email body
Chris@1464 63 assert !issue.description.match(/^Project:/i)
Chris@1464 64 assert !issue.description.match(/^Status:/i)
Chris@1464 65 assert !issue.description.match(/^Start Date:/i)
Chris@1464 66 # Email notification should be sent
Chris@1464 67 mail = ActionMailer::Base.deliveries.last
Chris@1464 68 assert_not_nil mail
Chris@1464 69 assert mail.subject.include?('New ticket on a given project')
Chris@1464 70 end
Chris@1464 71
Chris@1464 72 def test_add_issue_with_default_tracker
Chris@1464 73 # This email contains: 'Project: onlinestore'
Chris@1464 74 issue = submit_email(
Chris@1464 75 'ticket_on_given_project.eml',
Chris@1464 76 :issue => {:tracker => 'Support request'}
Chris@1464 77 )
Chris@1464 78 assert issue.is_a?(Issue)
Chris@1464 79 assert !issue.new_record?
Chris@1464 80 issue.reload
Chris@1464 81 assert_equal 'Support request', issue.tracker.name
Chris@1464 82 end
Chris@1464 83
Chris@1464 84 def test_add_issue_with_status
Chris@1464 85 # This email contains: 'Project: onlinestore' and 'Status: Resolved'
Chris@1464 86 issue = submit_email('ticket_on_given_project.eml')
Chris@1464 87 assert issue.is_a?(Issue)
Chris@1464 88 assert !issue.new_record?
Chris@1464 89 issue.reload
Chris@1464 90 assert_equal Project.find(2), issue.project
Chris@1464 91 assert_equal IssueStatus.find_by_name("Resolved"), issue.status
Chris@1464 92 end
Chris@1464 93
Chris@1464 94 def test_add_issue_with_attributes_override
Chris@1464 95 issue = submit_email(
Chris@1464 96 'ticket_with_attributes.eml',
Chris@1464 97 :allow_override => 'tracker,category,priority'
Chris@1464 98 )
Chris@1464 99 assert issue.is_a?(Issue)
Chris@1464 100 assert !issue.new_record?
Chris@1464 101 issue.reload
Chris@1464 102 assert_equal 'New ticket on a given project', issue.subject
Chris@1464 103 assert_equal User.find_by_login('jsmith'), issue.author
Chris@1464 104 assert_equal Project.find(2), issue.project
Chris@1464 105 assert_equal 'Feature request', issue.tracker.to_s
Chris@1464 106 assert_equal 'Stock management', issue.category.to_s
Chris@1464 107 assert_equal 'Urgent', issue.priority.to_s
Chris@1464 108 assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
Chris@1464 109 end
Chris@1464 110
Chris@1464 111 def test_add_issue_with_group_assignment
Chris@1464 112 with_settings :issue_group_assignment => '1' do
Chris@1464 113 issue = submit_email('ticket_on_given_project.eml') do |email|
Chris@1464 114 email.gsub!('Assigned to: John Smith', 'Assigned to: B Team')
Chris@1464 115 end
Chris@1464 116 assert issue.is_a?(Issue)
Chris@1464 117 assert !issue.new_record?
Chris@1464 118 issue.reload
Chris@1464 119 assert_equal Group.find(11), issue.assigned_to
Chris@1464 120 end
Chris@1464 121 end
Chris@1464 122
Chris@1464 123 def test_add_issue_with_partial_attributes_override
Chris@1464 124 issue = submit_email(
Chris@1464 125 'ticket_with_attributes.eml',
Chris@1464 126 :issue => {:priority => 'High'},
Chris@1464 127 :allow_override => ['tracker']
Chris@1464 128 )
Chris@1464 129 assert issue.is_a?(Issue)
Chris@1464 130 assert !issue.new_record?
Chris@1464 131 issue.reload
Chris@1464 132 assert_equal 'New ticket on a given project', issue.subject
Chris@1464 133 assert_equal User.find_by_login('jsmith'), issue.author
Chris@1464 134 assert_equal Project.find(2), issue.project
Chris@1464 135 assert_equal 'Feature request', issue.tracker.to_s
Chris@1464 136 assert_nil issue.category
Chris@1464 137 assert_equal 'High', issue.priority.to_s
Chris@1464 138 assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
Chris@1464 139 end
Chris@1464 140
Chris@1464 141 def test_add_issue_with_spaces_between_attribute_and_separator
Chris@1464 142 issue = submit_email(
Chris@1464 143 'ticket_with_spaces_between_attribute_and_separator.eml',
Chris@1464 144 :allow_override => 'tracker,category,priority'
Chris@1464 145 )
Chris@1464 146 assert issue.is_a?(Issue)
Chris@1464 147 assert !issue.new_record?
Chris@1464 148 issue.reload
Chris@1464 149 assert_equal 'New ticket on a given project', issue.subject
Chris@1464 150 assert_equal User.find_by_login('jsmith'), issue.author
Chris@1464 151 assert_equal Project.find(2), issue.project
Chris@1464 152 assert_equal 'Feature request', issue.tracker.to_s
Chris@1464 153 assert_equal 'Stock management', issue.category.to_s
Chris@1464 154 assert_equal 'Urgent', issue.priority.to_s
Chris@1464 155 assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
Chris@1464 156 end
Chris@1464 157
Chris@1464 158 def test_add_issue_with_attachment_to_specific_project
Chris@1464 159 issue = submit_email('ticket_with_attachment.eml', :issue => {:project => 'onlinestore'})
Chris@1464 160 assert issue.is_a?(Issue)
Chris@1464 161 assert !issue.new_record?
Chris@1464 162 issue.reload
Chris@1464 163 assert_equal 'Ticket created by email with attachment', issue.subject
Chris@1464 164 assert_equal User.find_by_login('jsmith'), issue.author
Chris@1464 165 assert_equal Project.find(2), issue.project
Chris@1464 166 assert_equal 'This is a new ticket with attachments', issue.description
Chris@1464 167 # Attachment properties
Chris@1464 168 assert_equal 1, issue.attachments.size
Chris@1464 169 assert_equal 'Paella.jpg', issue.attachments.first.filename
Chris@1464 170 assert_equal 'image/jpeg', issue.attachments.first.content_type
Chris@1464 171 assert_equal 10790, issue.attachments.first.filesize
Chris@1464 172 end
Chris@1464 173
Chris@1464 174 def test_add_issue_with_custom_fields
Chris@1464 175 issue = submit_email('ticket_with_custom_fields.eml', :issue => {:project => 'onlinestore'})
Chris@1464 176 assert issue.is_a?(Issue)
Chris@1464 177 assert !issue.new_record?
Chris@1464 178 issue.reload
Chris@1464 179 assert_equal 'New ticket with custom field values', issue.subject
Chris@1464 180 assert_equal 'PostgreSQL', issue.custom_field_value(1)
Chris@1464 181 assert_equal 'Value for a custom field', issue.custom_field_value(2)
Chris@1464 182 assert !issue.description.match(/^searchable field:/i)
Chris@1464 183 end
Chris@1464 184
Chris@1464 185 def test_add_issue_with_version_custom_fields
Chris@1464 186 field = IssueCustomField.create!(:name => 'Affected version', :field_format => 'version', :is_for_all => true, :tracker_ids => [1,2,3])
Chris@1464 187
Chris@1464 188 issue = submit_email('ticket_with_custom_fields.eml', :issue => {:project => 'ecookbook'}) do |email|
Chris@1464 189 email << "Affected version: 1.0\n"
Chris@1464 190 end
Chris@1464 191 assert issue.is_a?(Issue)
Chris@1464 192 assert !issue.new_record?
Chris@1464 193 issue.reload
Chris@1464 194 assert_equal '2', issue.custom_field_value(field)
Chris@1464 195 end
Chris@1464 196
Chris@1464 197 def test_add_issue_should_match_assignee_on_display_name
Chris@1464 198 user = User.generate!(:firstname => 'Foo Bar', :lastname => 'Foo Baz')
Chris@1464 199 User.add_to_project(user, Project.find(2))
Chris@1464 200 issue = submit_email('ticket_on_given_project.eml') do |email|
Chris@1464 201 email.sub!(/^Assigned to.*$/, 'Assigned to: Foo Bar Foo baz')
Chris@1464 202 end
Chris@1464 203 assert issue.is_a?(Issue)
Chris@1464 204 assert_equal user, issue.assigned_to
Chris@1464 205 end
Chris@1464 206
Chris@1464 207 def test_add_issue_with_cc
Chris@1464 208 issue = submit_email('ticket_with_cc.eml', :issue => {:project => 'ecookbook'})
Chris@1464 209 assert issue.is_a?(Issue)
Chris@1464 210 assert !issue.new_record?
Chris@1464 211 issue.reload
Chris@1464 212 assert issue.watched_by?(User.find_by_mail('dlopper@somenet.foo'))
Chris@1464 213 assert_equal 1, issue.watcher_user_ids.size
Chris@1464 214 end
Chris@1464 215
Chris@1464 216 def test_add_issue_by_unknown_user
Chris@1464 217 assert_no_difference 'User.count' do
Chris@1464 218 assert_equal false,
Chris@1464 219 submit_email(
Chris@1464 220 'ticket_by_unknown_user.eml',
Chris@1464 221 :issue => {:project => 'ecookbook'}
Chris@1464 222 )
Chris@1464 223 end
Chris@1464 224 end
Chris@1464 225
Chris@1464 226 def test_add_issue_by_anonymous_user
Chris@1464 227 Role.anonymous.add_permission!(:add_issues)
Chris@1464 228 assert_no_difference 'User.count' do
Chris@1464 229 issue = submit_email(
Chris@1464 230 'ticket_by_unknown_user.eml',
Chris@1464 231 :issue => {:project => 'ecookbook'},
Chris@1464 232 :unknown_user => 'accept'
Chris@1464 233 )
Chris@1464 234 assert issue.is_a?(Issue)
Chris@1464 235 assert issue.author.anonymous?
Chris@1464 236 end
Chris@1464 237 end
Chris@1464 238
Chris@1464 239 def test_add_issue_by_anonymous_user_with_no_from_address
Chris@1464 240 Role.anonymous.add_permission!(:add_issues)
Chris@1464 241 assert_no_difference 'User.count' do
Chris@1464 242 issue = submit_email(
Chris@1464 243 'ticket_by_empty_user.eml',
Chris@1464 244 :issue => {:project => 'ecookbook'},
Chris@1464 245 :unknown_user => 'accept'
Chris@1464 246 )
Chris@1464 247 assert issue.is_a?(Issue)
Chris@1464 248 assert issue.author.anonymous?
Chris@1464 249 end
Chris@1464 250 end
Chris@1464 251
Chris@1464 252 def test_add_issue_by_anonymous_user_on_private_project
Chris@1464 253 Role.anonymous.add_permission!(:add_issues)
Chris@1464 254 assert_no_difference 'User.count' do
Chris@1464 255 assert_no_difference 'Issue.count' do
Chris@1464 256 assert_equal false,
Chris@1464 257 submit_email(
Chris@1464 258 'ticket_by_unknown_user.eml',
Chris@1464 259 :issue => {:project => 'onlinestore'},
Chris@1464 260 :unknown_user => 'accept'
Chris@1464 261 )
Chris@1464 262 end
Chris@1464 263 end
Chris@1464 264 end
Chris@1464 265
Chris@1464 266 def test_add_issue_by_anonymous_user_on_private_project_without_permission_check
Chris@1464 267 assert_no_difference 'User.count' do
Chris@1464 268 assert_difference 'Issue.count' do
Chris@1464 269 issue = submit_email(
Chris@1464 270 'ticket_by_unknown_user.eml',
Chris@1464 271 :issue => {:project => 'onlinestore'},
Chris@1464 272 :no_permission_check => '1',
Chris@1464 273 :unknown_user => 'accept'
Chris@1464 274 )
Chris@1464 275 assert issue.is_a?(Issue)
Chris@1464 276 assert issue.author.anonymous?
Chris@1464 277 assert !issue.project.is_public?
Chris@1464 278 assert_equal [issue.id, 1, 2], [issue.root_id, issue.lft, issue.rgt]
Chris@1464 279 end
Chris@1464 280 end
Chris@1464 281 end
Chris@1464 282
Chris@1464 283 def test_add_issue_by_created_user
Chris@1464 284 Setting.default_language = 'en'
Chris@1464 285 assert_difference 'User.count' do
Chris@1464 286 issue = submit_email(
Chris@1464 287 'ticket_by_unknown_user.eml',
Chris@1464 288 :issue => {:project => 'ecookbook'},
Chris@1464 289 :unknown_user => 'create'
Chris@1464 290 )
Chris@1464 291 assert issue.is_a?(Issue)
Chris@1464 292 assert issue.author.active?
Chris@1464 293 assert_equal 'john.doe@somenet.foo', issue.author.mail
Chris@1464 294 assert_equal 'John', issue.author.firstname
Chris@1464 295 assert_equal 'Doe', issue.author.lastname
Chris@1464 296
Chris@1464 297 # account information
Chris@1464 298 email = ActionMailer::Base.deliveries.first
Chris@1464 299 assert_not_nil email
Chris@1464 300 assert email.subject.include?('account activation')
Chris@1464 301 login = mail_body(email).match(/\* Login: (.*)$/)[1].strip
Chris@1464 302 password = mail_body(email).match(/\* Password: (.*)$/)[1].strip
Chris@1464 303 assert_equal issue.author, User.try_to_login(login, password)
Chris@1464 304 end
Chris@1464 305 end
Chris@1464 306
Chris@1464 307 def test_created_user_should_be_added_to_groups
Chris@1464 308 group1 = Group.generate!
Chris@1464 309 group2 = Group.generate!
Chris@1464 310
Chris@1464 311 assert_difference 'User.count' do
Chris@1464 312 submit_email(
Chris@1464 313 'ticket_by_unknown_user.eml',
Chris@1464 314 :issue => {:project => 'ecookbook'},
Chris@1464 315 :unknown_user => 'create',
Chris@1464 316 :default_group => "#{group1.name},#{group2.name}"
Chris@1464 317 )
Chris@1464 318 end
Chris@1464 319 user = User.order('id DESC').first
Chris@1464 320 assert_same_elements [group1, group2], user.groups
Chris@1464 321 end
Chris@1464 322
Chris@1464 323 def test_created_user_should_not_receive_account_information_with_no_account_info_option
Chris@1464 324 assert_difference 'User.count' do
Chris@1464 325 submit_email(
Chris@1464 326 'ticket_by_unknown_user.eml',
Chris@1464 327 :issue => {:project => 'ecookbook'},
Chris@1464 328 :unknown_user => 'create',
Chris@1464 329 :no_account_notice => '1'
Chris@1464 330 )
Chris@1464 331 end
Chris@1464 332
Chris@1464 333 # only 1 email for the new issue notification
Chris@1464 334 assert_equal 1, ActionMailer::Base.deliveries.size
Chris@1464 335 email = ActionMailer::Base.deliveries.first
Chris@1464 336 assert_include 'Ticket by unknown user', email.subject
Chris@1464 337 end
Chris@1464 338
Chris@1464 339 def test_created_user_should_have_mail_notification_to_none_with_no_notification_option
Chris@1464 340 assert_difference 'User.count' do
Chris@1464 341 submit_email(
Chris@1464 342 'ticket_by_unknown_user.eml',
Chris@1464 343 :issue => {:project => 'ecookbook'},
Chris@1464 344 :unknown_user => 'create',
Chris@1464 345 :no_notification => '1'
Chris@1464 346 )
Chris@1464 347 end
Chris@1464 348 user = User.order('id DESC').first
Chris@1464 349 assert_equal 'none', user.mail_notification
Chris@1464 350 end
Chris@1464 351
Chris@1464 352 def test_add_issue_without_from_header
Chris@1464 353 Role.anonymous.add_permission!(:add_issues)
Chris@1464 354 assert_equal false, submit_email('ticket_without_from_header.eml')
Chris@1464 355 end
Chris@1464 356
Chris@1464 357 def test_add_issue_with_invalid_attributes
Chris@1464 358 issue = submit_email(
Chris@1464 359 'ticket_with_invalid_attributes.eml',
Chris@1464 360 :allow_override => 'tracker,category,priority'
Chris@1464 361 )
Chris@1464 362 assert issue.is_a?(Issue)
Chris@1464 363 assert !issue.new_record?
Chris@1464 364 issue.reload
Chris@1464 365 assert_nil issue.assigned_to
Chris@1464 366 assert_nil issue.start_date
Chris@1464 367 assert_nil issue.due_date
Chris@1464 368 assert_equal 0, issue.done_ratio
Chris@1464 369 assert_equal 'Normal', issue.priority.to_s
Chris@1464 370 assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
Chris@1464 371 end
Chris@1464 372
Chris@1464 373 def test_add_issue_with_localized_attributes
Chris@1464 374 User.find_by_mail('jsmith@somenet.foo').update_attribute 'language', 'fr'
Chris@1464 375 issue = submit_email(
Chris@1464 376 'ticket_with_localized_attributes.eml',
Chris@1464 377 :allow_override => 'tracker,category,priority'
Chris@1464 378 )
Chris@1464 379 assert issue.is_a?(Issue)
Chris@1464 380 assert !issue.new_record?
Chris@1464 381 issue.reload
Chris@1464 382 assert_equal 'New ticket on a given project', issue.subject
Chris@1464 383 assert_equal User.find_by_login('jsmith'), issue.author
Chris@1464 384 assert_equal Project.find(2), issue.project
Chris@1464 385 assert_equal 'Feature request', issue.tracker.to_s
Chris@1464 386 assert_equal 'Stock management', issue.category.to_s
Chris@1464 387 assert_equal 'Urgent', issue.priority.to_s
Chris@1464 388 assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
Chris@1464 389 end
Chris@1464 390
Chris@1464 391 def test_add_issue_with_japanese_keywords
Chris@1464 392 ja_dev = "\xe9\x96\x8b\xe7\x99\xba"
Chris@1464 393 ja_dev.force_encoding('UTF-8') if ja_dev.respond_to?(:force_encoding)
Chris@1464 394 tracker = Tracker.create!(:name => ja_dev)
Chris@1464 395 Project.find(1).trackers << tracker
Chris@1464 396 issue = submit_email(
Chris@1464 397 'japanese_keywords_iso_2022_jp.eml',
Chris@1464 398 :issue => {:project => 'ecookbook'},
Chris@1464 399 :allow_override => 'tracker'
Chris@1464 400 )
Chris@1464 401 assert_kind_of Issue, issue
Chris@1464 402 assert_equal tracker, issue.tracker
Chris@1464 403 end
Chris@1464 404
Chris@1464 405 def test_add_issue_from_apple_mail
Chris@1464 406 issue = submit_email(
Chris@1464 407 'apple_mail_with_attachment.eml',
Chris@1464 408 :issue => {:project => 'ecookbook'}
Chris@1464 409 )
Chris@1464 410 assert_kind_of Issue, issue
Chris@1464 411 assert_equal 1, issue.attachments.size
Chris@1464 412
Chris@1464 413 attachment = issue.attachments.first
Chris@1464 414 assert_equal 'paella.jpg', attachment.filename
Chris@1464 415 assert_equal 10790, attachment.filesize
Chris@1464 416 assert File.exist?(attachment.diskfile)
Chris@1464 417 assert_equal 10790, File.size(attachment.diskfile)
Chris@1464 418 assert_equal 'caaf384198bcbc9563ab5c058acd73cd', attachment.digest
Chris@1464 419 end
Chris@1464 420
Chris@1464 421 def test_thunderbird_with_attachment_ja
Chris@1464 422 issue = submit_email(
Chris@1464 423 'thunderbird_with_attachment_ja.eml',
Chris@1464 424 :issue => {:project => 'ecookbook'}
Chris@1464 425 )
Chris@1464 426 assert_kind_of Issue, issue
Chris@1464 427 assert_equal 1, issue.attachments.size
Chris@1464 428 ja = "\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88.txt"
Chris@1464 429 ja.force_encoding('UTF-8') if ja.respond_to?(:force_encoding)
Chris@1464 430 attachment = issue.attachments.first
Chris@1464 431 assert_equal ja, attachment.filename
Chris@1464 432 assert_equal 5, attachment.filesize
Chris@1464 433 assert File.exist?(attachment.diskfile)
Chris@1464 434 assert_equal 5, File.size(attachment.diskfile)
Chris@1464 435 assert_equal 'd8e8fca2dc0f896fd7cb4cb0031ba249', attachment.digest
Chris@1464 436 end
Chris@1464 437
Chris@1464 438 def test_gmail_with_attachment_ja
Chris@1464 439 issue = submit_email(
Chris@1464 440 'gmail_with_attachment_ja.eml',
Chris@1464 441 :issue => {:project => 'ecookbook'}
Chris@1464 442 )
Chris@1464 443 assert_kind_of Issue, issue
Chris@1464 444 assert_equal 1, issue.attachments.size
Chris@1464 445 ja = "\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88.txt"
Chris@1464 446 ja.force_encoding('UTF-8') if ja.respond_to?(:force_encoding)
Chris@1464 447 attachment = issue.attachments.first
Chris@1464 448 assert_equal ja, attachment.filename
Chris@1464 449 assert_equal 5, attachment.filesize
Chris@1464 450 assert File.exist?(attachment.diskfile)
Chris@1464 451 assert_equal 5, File.size(attachment.diskfile)
Chris@1464 452 assert_equal 'd8e8fca2dc0f896fd7cb4cb0031ba249', attachment.digest
Chris@1464 453 end
Chris@1464 454
Chris@1464 455 def test_thunderbird_with_attachment_latin1
Chris@1464 456 issue = submit_email(
Chris@1464 457 'thunderbird_with_attachment_iso-8859-1.eml',
Chris@1464 458 :issue => {:project => 'ecookbook'}
Chris@1464 459 )
Chris@1464 460 assert_kind_of Issue, issue
Chris@1464 461 assert_equal 1, issue.attachments.size
Chris@1464 462 u = ""
Chris@1464 463 u.force_encoding('UTF-8') if u.respond_to?(:force_encoding)
Chris@1464 464 u1 = "\xc3\x84\xc3\xa4\xc3\x96\xc3\xb6\xc3\x9c\xc3\xbc"
Chris@1464 465 u1.force_encoding('UTF-8') if u1.respond_to?(:force_encoding)
Chris@1464 466 11.times { u << u1 }
Chris@1464 467 attachment = issue.attachments.first
Chris@1464 468 assert_equal "#{u}.png", attachment.filename
Chris@1464 469 assert_equal 130, attachment.filesize
Chris@1464 470 assert File.exist?(attachment.diskfile)
Chris@1464 471 assert_equal 130, File.size(attachment.diskfile)
Chris@1464 472 assert_equal '4d80e667ac37dddfe05502530f152abb', attachment.digest
Chris@1464 473 end
Chris@1464 474
Chris@1464 475 def test_gmail_with_attachment_latin1
Chris@1464 476 issue = submit_email(
Chris@1464 477 'gmail_with_attachment_iso-8859-1.eml',
Chris@1464 478 :issue => {:project => 'ecookbook'}
Chris@1464 479 )
Chris@1464 480 assert_kind_of Issue, issue
Chris@1464 481 assert_equal 1, issue.attachments.size
Chris@1464 482 u = ""
Chris@1464 483 u.force_encoding('UTF-8') if u.respond_to?(:force_encoding)
Chris@1464 484 u1 = "\xc3\x84\xc3\xa4\xc3\x96\xc3\xb6\xc3\x9c\xc3\xbc"
Chris@1464 485 u1.force_encoding('UTF-8') if u1.respond_to?(:force_encoding)
Chris@1464 486 11.times { u << u1 }
Chris@1464 487 attachment = issue.attachments.first
Chris@1464 488 assert_equal "#{u}.txt", attachment.filename
Chris@1464 489 assert_equal 5, attachment.filesize
Chris@1464 490 assert File.exist?(attachment.diskfile)
Chris@1464 491 assert_equal 5, File.size(attachment.diskfile)
Chris@1464 492 assert_equal 'd8e8fca2dc0f896fd7cb4cb0031ba249', attachment.digest
Chris@1464 493 end
Chris@1464 494
Chris@1464 495 def test_add_issue_with_iso_8859_1_subject
Chris@1464 496 issue = submit_email(
Chris@1464 497 'subject_as_iso-8859-1.eml',
Chris@1464 498 :issue => {:project => 'ecookbook'}
Chris@1464 499 )
Chris@1464 500 str = "Testmail from Webmail: \xc3\xa4 \xc3\xb6 \xc3\xbc..."
Chris@1464 501 str.force_encoding('UTF-8') if str.respond_to?(:force_encoding)
Chris@1464 502 assert_kind_of Issue, issue
Chris@1464 503 assert_equal str, issue.subject
Chris@1464 504 end
Chris@1464 505
Chris@1464 506 def test_add_issue_with_japanese_subject
Chris@1464 507 issue = submit_email(
Chris@1464 508 'subject_japanese_1.eml',
Chris@1464 509 :issue => {:project => 'ecookbook'}
Chris@1464 510 )
Chris@1464 511 assert_kind_of Issue, issue
Chris@1464 512 ja = "\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88"
Chris@1464 513 ja.force_encoding('UTF-8') if ja.respond_to?(:force_encoding)
Chris@1464 514 assert_equal ja, issue.subject
Chris@1464 515 end
Chris@1464 516
Chris@1464 517 def test_add_issue_with_no_subject_header
Chris@1464 518 issue = submit_email(
Chris@1464 519 'no_subject_header.eml',
Chris@1464 520 :issue => {:project => 'ecookbook'}
Chris@1464 521 )
Chris@1464 522 assert_kind_of Issue, issue
Chris@1464 523 assert_equal '(no subject)', issue.subject
Chris@1464 524 end
Chris@1464 525
Chris@1464 526 def test_add_issue_with_mixed_japanese_subject
Chris@1464 527 issue = submit_email(
Chris@1464 528 'subject_japanese_2.eml',
Chris@1464 529 :issue => {:project => 'ecookbook'}
Chris@1464 530 )
Chris@1464 531 assert_kind_of Issue, issue
Chris@1464 532 ja = "Re: \xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88"
Chris@1464 533 ja.force_encoding('UTF-8') if ja.respond_to?(:force_encoding)
Chris@1464 534 assert_equal ja, issue.subject
Chris@1464 535 end
Chris@1464 536
Chris@1464 537 def test_should_ignore_emails_from_locked_users
Chris@1464 538 User.find(2).lock!
Chris@1464 539
Chris@1464 540 MailHandler.any_instance.expects(:dispatch).never
Chris@1464 541 assert_no_difference 'Issue.count' do
Chris@1464 542 assert_equal false, submit_email('ticket_on_given_project.eml')
Chris@1464 543 end
Chris@1464 544 end
Chris@1464 545
Chris@1464 546 def test_should_ignore_emails_from_emission_address
Chris@1464 547 Role.anonymous.add_permission!(:add_issues)
Chris@1464 548 assert_no_difference 'User.count' do
Chris@1464 549 assert_equal false,
Chris@1464 550 submit_email(
Chris@1464 551 'ticket_from_emission_address.eml',
Chris@1464 552 :issue => {:project => 'ecookbook'},
Chris@1464 553 :unknown_user => 'create'
Chris@1464 554 )
Chris@1464 555 end
Chris@1464 556 end
Chris@1464 557
Chris@1464 558 def test_should_ignore_auto_replied_emails
Chris@1464 559 MailHandler.any_instance.expects(:dispatch).never
Chris@1464 560 [
Chris@1464 561 "X-Auto-Response-Suppress: OOF",
Chris@1464 562 "Auto-Submitted: auto-replied",
Chris@1464 563 "Auto-Submitted: Auto-Replied",
Chris@1464 564 "Auto-Submitted: auto-generated"
Chris@1464 565 ].each do |header|
Chris@1464 566 raw = IO.read(File.join(FIXTURES_PATH, 'ticket_on_given_project.eml'))
Chris@1464 567 raw = header + "\n" + raw
Chris@1464 568
Chris@1464 569 assert_no_difference 'Issue.count' do
Chris@1464 570 assert_equal false, MailHandler.receive(raw), "email with #{header} header was not ignored"
Chris@1464 571 end
Chris@1464 572 end
Chris@1464 573 end
Chris@1464 574
Chris@1464 575 def test_add_issue_should_send_email_notification
Chris@1464 576 Setting.notified_events = ['issue_added']
Chris@1464 577 ActionMailer::Base.deliveries.clear
Chris@1464 578 # This email contains: 'Project: onlinestore'
Chris@1464 579 issue = submit_email('ticket_on_given_project.eml')
Chris@1464 580 assert issue.is_a?(Issue)
Chris@1464 581 assert_equal 1, ActionMailer::Base.deliveries.size
Chris@1464 582 end
Chris@1464 583
Chris@1464 584 def test_update_issue
Chris@1464 585 journal = submit_email('ticket_reply.eml')
Chris@1464 586 assert journal.is_a?(Journal)
Chris@1464 587 assert_equal User.find_by_login('jsmith'), journal.user
Chris@1464 588 assert_equal Issue.find(2), journal.journalized
Chris@1464 589 assert_match /This is reply/, journal.notes
Chris@1464 590 assert_equal false, journal.private_notes
Chris@1464 591 assert_equal 'Feature request', journal.issue.tracker.name
Chris@1464 592 end
Chris@1464 593
Chris@1464 594 def test_update_issue_with_attribute_changes
Chris@1464 595 # This email contains: 'Status: Resolved'
Chris@1464 596 journal = submit_email('ticket_reply_with_status.eml')
Chris@1464 597 assert journal.is_a?(Journal)
Chris@1464 598 issue = Issue.find(journal.issue.id)
Chris@1464 599 assert_equal User.find_by_login('jsmith'), journal.user
Chris@1464 600 assert_equal Issue.find(2), journal.journalized
Chris@1464 601 assert_match /This is reply/, journal.notes
Chris@1464 602 assert_equal 'Feature request', journal.issue.tracker.name
Chris@1464 603 assert_equal IssueStatus.find_by_name("Resolved"), issue.status
Chris@1464 604 assert_equal '2010-01-01', issue.start_date.to_s
Chris@1464 605 assert_equal '2010-12-31', issue.due_date.to_s
Chris@1464 606 assert_equal User.find_by_login('jsmith'), issue.assigned_to
Chris@1464 607 assert_equal "52.6", issue.custom_value_for(CustomField.find_by_name('Float field')).value
Chris@1464 608 # keywords should be removed from the email body
Chris@1464 609 assert !journal.notes.match(/^Status:/i)
Chris@1464 610 assert !journal.notes.match(/^Start Date:/i)
Chris@1464 611 end
Chris@1464 612
Chris@1464 613 def test_update_issue_with_attachment
Chris@1464 614 assert_difference 'Journal.count' do
Chris@1464 615 assert_difference 'JournalDetail.count' do
Chris@1464 616 assert_difference 'Attachment.count' do
Chris@1464 617 assert_no_difference 'Issue.count' do
Chris@1464 618 journal = submit_email('ticket_with_attachment.eml') do |raw|
Chris@1464 619 raw.gsub! /^Subject: .*$/, 'Subject: Re: [Cookbook - Feature #2] (New) Add ingredients categories'
Chris@1464 620 end
Chris@1464 621 end
Chris@1464 622 end
Chris@1464 623 end
Chris@1464 624 end
Chris@1464 625 journal = Journal.first(:order => 'id DESC')
Chris@1464 626 assert_equal Issue.find(2), journal.journalized
Chris@1464 627 assert_equal 1, journal.details.size
Chris@1464 628
Chris@1464 629 detail = journal.details.first
Chris@1464 630 assert_equal 'attachment', detail.property
Chris@1464 631 assert_equal 'Paella.jpg', detail.value
Chris@1464 632 end
Chris@1464 633
Chris@1464 634 def test_update_issue_should_send_email_notification
Chris@1464 635 ActionMailer::Base.deliveries.clear
Chris@1464 636 journal = submit_email('ticket_reply.eml')
Chris@1464 637 assert journal.is_a?(Journal)
Chris@1464 638 assert_equal 1, ActionMailer::Base.deliveries.size
Chris@1464 639 end
Chris@1464 640
Chris@1464 641 def test_update_issue_should_not_set_defaults
Chris@1464 642 journal = submit_email(
Chris@1464 643 'ticket_reply.eml',
Chris@1464 644 :issue => {:tracker => 'Support request', :priority => 'High'}
Chris@1464 645 )
Chris@1464 646 assert journal.is_a?(Journal)
Chris@1464 647 assert_match /This is reply/, journal.notes
Chris@1464 648 assert_equal 'Feature request', journal.issue.tracker.name
Chris@1464 649 assert_equal 'Normal', journal.issue.priority.name
Chris@1464 650 end
Chris@1464 651
Chris@1464 652 def test_replying_to_a_private_note_should_add_reply_as_private
Chris@1464 653 private_journal = Journal.create!(:notes => 'Private notes', :journalized => Issue.find(1), :private_notes => true, :user_id => 2)
Chris@1464 654
Chris@1464 655 assert_difference 'Journal.count' do
Chris@1464 656 journal = submit_email('ticket_reply.eml') do |email|
Chris@1464 657 email.sub! %r{^In-Reply-To:.*$}, "In-Reply-To: <redmine.journal-#{private_journal.id}.20060719210421@osiris>"
Chris@1464 658 end
Chris@1464 659
Chris@1464 660 assert_kind_of Journal, journal
Chris@1464 661 assert_match /This is reply/, journal.notes
Chris@1464 662 assert_equal true, journal.private_notes
Chris@1464 663 end
Chris@1464 664 end
Chris@1464 665
Chris@1464 666 def test_reply_to_a_message
Chris@1464 667 m = submit_email('message_reply.eml')
Chris@1464 668 assert m.is_a?(Message)
Chris@1464 669 assert !m.new_record?
Chris@1464 670 m.reload
Chris@1464 671 assert_equal 'Reply via email', m.subject
Chris@1464 672 # The email replies to message #2 which is part of the thread of message #1
Chris@1464 673 assert_equal Message.find(1), m.parent
Chris@1464 674 end
Chris@1464 675
Chris@1464 676 def test_reply_to_a_message_by_subject
Chris@1464 677 m = submit_email('message_reply_by_subject.eml')
Chris@1464 678 assert m.is_a?(Message)
Chris@1464 679 assert !m.new_record?
Chris@1464 680 m.reload
Chris@1464 681 assert_equal 'Reply to the first post', m.subject
Chris@1464 682 assert_equal Message.find(1), m.parent
Chris@1464 683 end
Chris@1464 684
Chris@1464 685 def test_should_strip_tags_of_html_only_emails
Chris@1464 686 issue = submit_email('ticket_html_only.eml', :issue => {:project => 'ecookbook'})
Chris@1464 687 assert issue.is_a?(Issue)
Chris@1464 688 assert !issue.new_record?
Chris@1464 689 issue.reload
Chris@1464 690 assert_equal 'HTML email', issue.subject
Chris@1464 691 assert_equal 'This is a html-only email.', issue.description
Chris@1464 692 end
Chris@1464 693
Chris@1464 694 test "truncate emails with no setting should add the entire email into the issue" do
Chris@1464 695 with_settings :mail_handler_body_delimiters => '' do
Chris@1464 696 issue = submit_email('ticket_on_given_project.eml')
Chris@1464 697 assert_issue_created(issue)
Chris@1464 698 assert issue.description.include?('---')
Chris@1464 699 assert issue.description.include?('This paragraph is after the delimiter')
Chris@1464 700 end
Chris@1464 701 end
Chris@1464 702
Chris@1464 703 test "truncate emails with a single string should truncate the email at the delimiter for the issue" do
Chris@1464 704 with_settings :mail_handler_body_delimiters => '---' do
Chris@1464 705 issue = submit_email('ticket_on_given_project.eml')
Chris@1464 706 assert_issue_created(issue)
Chris@1464 707 assert issue.description.include?('This paragraph is before delimiters')
Chris@1464 708 assert issue.description.include?('--- This line starts with a delimiter')
Chris@1464 709 assert !issue.description.match(/^---$/)
Chris@1464 710 assert !issue.description.include?('This paragraph is after the delimiter')
Chris@1464 711 end
Chris@1464 712 end
Chris@1464 713
Chris@1464 714 test "truncate emails with a single quoted reply should truncate the email at the delimiter with the quoted reply symbols (>)" do
Chris@1464 715 with_settings :mail_handler_body_delimiters => '--- Reply above. Do not remove this line. ---' do
Chris@1464 716 journal = submit_email('issue_update_with_quoted_reply_above.eml')
Chris@1464 717 assert journal.is_a?(Journal)
Chris@1464 718 assert journal.notes.include?('An update to the issue by the sender.')
Chris@1464 719 assert !journal.notes.match(Regexp.escape("--- Reply above. Do not remove this line. ---"))
Chris@1464 720 assert !journal.notes.include?('Looks like the JSON api for projects was missed.')
Chris@1464 721 end
Chris@1464 722 end
Chris@1464 723
Chris@1464 724 test "truncate emails with multiple quoted replies should truncate the email at the delimiter with the quoted reply symbols (>)" do
Chris@1464 725 with_settings :mail_handler_body_delimiters => '--- Reply above. Do not remove this line. ---' do
Chris@1464 726 journal = submit_email('issue_update_with_multiple_quoted_reply_above.eml')
Chris@1464 727 assert journal.is_a?(Journal)
Chris@1464 728 assert journal.notes.include?('An update to the issue by the sender.')
Chris@1464 729 assert !journal.notes.match(Regexp.escape("--- Reply above. Do not remove this line. ---"))
Chris@1464 730 assert !journal.notes.include?('Looks like the JSON api for projects was missed.')
Chris@1464 731 end
Chris@1464 732 end
Chris@1464 733
Chris@1464 734 test "truncate emails with multiple strings should truncate the email at the first delimiter found (BREAK)" do
Chris@1464 735 with_settings :mail_handler_body_delimiters => "---\nBREAK" do
Chris@1464 736 issue = submit_email('ticket_on_given_project.eml')
Chris@1464 737 assert_issue_created(issue)
Chris@1464 738 assert issue.description.include?('This paragraph is before delimiters')
Chris@1464 739 assert !issue.description.include?('BREAK')
Chris@1464 740 assert !issue.description.include?('This paragraph is between delimiters')
Chris@1464 741 assert !issue.description.match(/^---$/)
Chris@1464 742 assert !issue.description.include?('This paragraph is after the delimiter')
Chris@1464 743 end
Chris@1464 744 end
Chris@1464 745
Chris@1464 746 def test_email_with_long_subject_line
Chris@1464 747 issue = submit_email('ticket_with_long_subject.eml')
Chris@1464 748 assert issue.is_a?(Issue)
Chris@1464 749 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@1464 750 end
Chris@1464 751
Chris@1464 752 def test_new_user_from_attributes_should_return_valid_user
Chris@1464 753 to_test = {
Chris@1464 754 # [address, name] => [login, firstname, lastname]
Chris@1464 755 ['jsmith@example.net', nil] => ['jsmith@example.net', 'jsmith', '-'],
Chris@1464 756 ['jsmith@example.net', 'John'] => ['jsmith@example.net', 'John', '-'],
Chris@1464 757 ['jsmith@example.net', 'John Smith'] => ['jsmith@example.net', 'John', 'Smith'],
Chris@1464 758 ['jsmith@example.net', 'John Paul Smith'] => ['jsmith@example.net', 'John', 'Paul Smith'],
Chris@1464 759 ['jsmith@example.net', 'AVeryLongFirstnameThatExceedsTheMaximumLength Smith'] => ['jsmith@example.net', 'AVeryLongFirstnameThatExceedsT', 'Smith'],
Chris@1464 760 ['jsmith@example.net', 'John AVeryLongLastnameThatExceedsTheMaximumLength'] => ['jsmith@example.net', 'John', 'AVeryLongLastnameThatExceedsTh']
Chris@1464 761 }
Chris@1464 762
Chris@1464 763 to_test.each do |attrs, expected|
Chris@1464 764 user = MailHandler.new_user_from_attributes(attrs.first, attrs.last)
Chris@1464 765
Chris@1464 766 assert user.valid?, user.errors.full_messages.to_s
Chris@1464 767 assert_equal attrs.first, user.mail
Chris@1464 768 assert_equal expected[0], user.login
Chris@1464 769 assert_equal expected[1], user.firstname
Chris@1464 770 assert_equal expected[2], user.lastname
Chris@1464 771 assert_equal 'only_my_events', user.mail_notification
Chris@1464 772 end
Chris@1464 773 end
Chris@1464 774
Chris@1464 775 def test_new_user_from_attributes_should_respect_minimum_password_length
Chris@1464 776 with_settings :password_min_length => 15 do
Chris@1464 777 user = MailHandler.new_user_from_attributes('jsmith@example.net')
Chris@1464 778 assert user.valid?
Chris@1464 779 assert user.password.length >= 15
Chris@1464 780 end
Chris@1464 781 end
Chris@1464 782
Chris@1464 783 def test_new_user_from_attributes_should_use_default_login_if_invalid
Chris@1464 784 user = MailHandler.new_user_from_attributes('foo+bar@example.net')
Chris@1464 785 assert user.valid?
Chris@1464 786 assert user.login =~ /^user[a-f0-9]+$/
Chris@1464 787 assert_equal 'foo+bar@example.net', user.mail
Chris@1464 788 end
Chris@1464 789
Chris@1464 790 def test_new_user_with_utf8_encoded_fullname_should_be_decoded
Chris@1464 791 assert_difference 'User.count' do
Chris@1464 792 issue = submit_email(
Chris@1464 793 'fullname_of_sender_as_utf8_encoded.eml',
Chris@1464 794 :issue => {:project => 'ecookbook'},
Chris@1464 795 :unknown_user => 'create'
Chris@1464 796 )
Chris@1464 797 end
Chris@1464 798
Chris@1464 799 user = User.first(:order => 'id DESC')
Chris@1464 800 assert_equal "foo@example.org", user.mail
Chris@1464 801 str1 = "\xc3\x84\xc3\xa4"
Chris@1464 802 str2 = "\xc3\x96\xc3\xb6"
Chris@1464 803 str1.force_encoding('UTF-8') if str1.respond_to?(:force_encoding)
Chris@1464 804 str2.force_encoding('UTF-8') if str2.respond_to?(:force_encoding)
Chris@1464 805 assert_equal str1, user.firstname
Chris@1464 806 assert_equal str2, user.lastname
Chris@1464 807 end
Chris@1464 808
Chris@1464 809 private
Chris@1464 810
Chris@1464 811 def submit_email(filename, options={})
Chris@1464 812 raw = IO.read(File.join(FIXTURES_PATH, filename))
Chris@1464 813 yield raw if block_given?
Chris@1464 814 MailHandler.receive(raw, options)
Chris@1464 815 end
Chris@1464 816
Chris@1464 817 def assert_issue_created(issue)
Chris@1464 818 assert issue.is_a?(Issue)
Chris@1464 819 assert !issue.new_record?
Chris@1464 820 issue.reload
Chris@1464 821 end
Chris@1464 822 end