annotate .svn/pristine/b7/b746a08ee53393dfd229ea75565890e993730d12.svn-base @ 1628:9c5f8e24dadc live tip

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