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