annotate .svn/pristine/61/610fc0fcf3553bf4ce4a92445143d0e9e2a8ddd2.svn-base @ 1519:afce8026aaeb redmine-2.4-integration

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