kanbanworkflowstimelinescrumrubyroadmapproject-planningproject-managementopenprojectangularissue-trackerifcgantt-chartganttbug-trackerboardsbcf
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
584 lines
24 KiB
584 lines
24 KiB
13 years ago
|
#-- encoding: UTF-8
|
||
14 years ago
|
#-- copyright
|
||
12 years ago
|
# OpenProject is a project management system.
|
||
10 years ago
|
# Copyright (C) 2012-2015 the OpenProject Foundation (OPF)
|
||
14 years ago
|
#
|
||
18 years ago
|
# This program is free software; you can redistribute it and/or
|
||
12 years ago
|
# modify it under the terms of the GNU General Public License version 3.
|
||
14 years ago
|
#
|
||
11 years ago
|
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
|
||
|
# Copyright (C) 2006-2013 Jean-Philippe Lang
|
||
|
# Copyright (C) 2010-2013 the ChiliProject Team
|
||
|
#
|
||
|
# This program is free software; you can redistribute it and/or
|
||
|
# modify it under the terms of the GNU General Public License
|
||
|
# as published by the Free Software Foundation; either version 2
|
||
|
# of the License, or (at your option) any later version.
|
||
|
#
|
||
|
# This program is distributed in the hope that it will be useful,
|
||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
# GNU General Public License for more details.
|
||
|
#
|
||
|
# You should have received a copy of the GNU General Public License
|
||
|
# along with this program; if not, write to the Free Software
|
||
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||
|
#
|
||
14 years ago
|
# See doc/COPYRIGHT.rdoc for more details.
|
||
|
#++
|
||
10 years ago
|
require 'legacy_spec_helper'
|
||
18 years ago
|
|
||
11 years ago
|
describe MailHandler, type: :model do
|
||
12 years ago
|
fixtures :all
|
||
14 years ago
|
|
||
10 years ago
|
FIXTURES_PATH = File.dirname(__FILE__) + '/../../fixtures/mail_handler'
|
||
14 years ago
|
|
||
11 years ago
|
before do
|
||
17 years ago
|
ActionMailer::Base.deliveries.clear
|
||
10 years ago
|
Setting.notified_events = Redmine::Notifiable.all.map(&:name)
|
||
18 years ago
|
end
|
||
14 years ago
|
|
||
11 years ago
|
it 'should add work package' do
|
||
15 years ago
|
ActionMailer::Base.deliveries.clear
|
||
17 years ago
|
# This email contains: 'Project: onlinestore'
|
||
10 years ago
|
issue = submit_email('ticket_on_given_project.eml', allow_override: 'fixed_version')
|
||
11 years ago
|
assert issue.is_a?(WorkPackage)
|
||
17 years ago
|
assert !issue.new_record?
|
||
|
issue.reload
|
||
14 years ago
|
assert_equal Project.find(2), issue.project
|
||
11 years ago
|
assert_equal issue.project.types.first, issue.type
|
||
17 years ago
|
assert_equal 'New ticket on a given project', issue.subject
|
||
|
assert_equal User.find_by_login('jsmith'), issue.author
|
||
11 years ago
|
assert_equal Status.find_by_name('Resolved'), issue.status
|
||
17 years ago
|
assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
|
||
15 years ago
|
assert_equal '2010-01-01', issue.start_date.to_s
|
||
|
assert_equal '2010-12-31', issue.due_date.to_s
|
||
15 years ago
|
assert_equal User.find_by_login('jsmith'), issue.assigned_to
|
||
14 years ago
|
assert_equal Version.find_by_name('alpha'), issue.fixed_version
|
||
|
assert_equal 2.5, issue.estimated_hours
|
||
|
assert_equal 30, issue.done_ratio
|
||
14 years ago
|
assert_equal issue.id, issue.root_id
|
||
|
assert issue.leaf?
|
||
16 years ago
|
# keywords should be removed from the email body
|
||
|
assert !issue.description.match(/^Project:/i)
|
||
|
assert !issue.description.match(/^Status:/i)
|
||
14 years ago
|
assert !issue.description.match(/^Start Date:/i)
|
||
15 years ago
|
# Email notification should be sent
|
||
|
mail = ActionMailer::Base.deliveries.last
|
||
|
assert_not_nil mail
|
||
|
assert mail.subject.include?('New ticket on a given project')
|
||
17 years ago
|
end
|
||
14 years ago
|
|
||
11 years ago
|
it 'should add work package with default type' do
|
||
14 years ago
|
# This email contains: 'Project: onlinestore'
|
||
10 years ago
|
issue = submit_email('ticket_on_given_project.eml', issue: { type: 'Support request' })
|
||
11 years ago
|
assert issue.is_a?(WorkPackage)
|
||
14 years ago
|
assert !issue.new_record?
|
||
|
issue.reload
|
||
11 years ago
|
assert_equal 'Support request', issue.type.name
|
||
14 years ago
|
end
|
||
16 years ago
|
|
||
11 years ago
|
it 'should add work package with status' do
|
||
16 years ago
|
# This email contains: 'Project: onlinestore' and 'Status: Resolved'
|
||
|
issue = submit_email('ticket_on_given_project.eml')
|
||
11 years ago
|
assert issue.is_a?(WorkPackage)
|
||
16 years ago
|
assert !issue.new_record?
|
||
|
issue.reload
|
||
|
assert_equal Project.find(2), issue.project
|
||
10 years ago
|
assert_equal Status.find_by_name('Resolved'), issue.status
|
||
16 years ago
|
end
|
||
14 years ago
|
|
||
11 years ago
|
it 'should add work package with attributes override' do
|
||
10 years ago
|
issue = submit_email('ticket_with_attributes.eml', allow_override: 'type,category,priority')
|
||
11 years ago
|
assert issue.is_a?(WorkPackage)
|
||
17 years ago
|
assert !issue.new_record?
|
||
|
issue.reload
|
||
|
assert_equal 'New ticket on a given project', issue.subject
|
||
|
assert_equal User.find_by_login('jsmith'), issue.author
|
||
|
assert_equal Project.find(2), issue.project
|
||
11 years ago
|
assert_equal 'Feature request', issue.type.to_s
|
||
17 years ago
|
assert_equal 'Stock management', issue.category.to_s
|
||
|
assert_equal 'Urgent', issue.priority.to_s
|
||
|
assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
|
||
|
end
|
||
14 years ago
|
|
||
11 years ago
|
it 'should add work package with group assignment' do
|
||
10 years ago
|
with_settings work_package_group_assignment: '1' do
|
||
11 years ago
|
work_package = submit_email('ticket_on_given_project.eml') do |email|
|
||
11 years ago
|
email.gsub!('Assigned to: John Smith', 'Assigned to: B Team')
|
||
|
end
|
||
11 years ago
|
assert work_package.is_a?(WorkPackage)
|
||
11 years ago
|
assert !work_package.new_record?
|
||
|
work_package.reload
|
||
|
assert_equal Group.find(11), work_package.assigned_to
|
||
11 years ago
|
end
|
||
|
end
|
||
|
|
||
11 years ago
|
it 'should add work package with partial attributes override' do
|
||
10 years ago
|
issue = submit_email('ticket_with_attributes.eml', issue: { priority: 'High' }, allow_override: ['type'])
|
||
11 years ago
|
assert issue.is_a?(WorkPackage)
|
||
17 years ago
|
assert !issue.new_record?
|
||
|
issue.reload
|
||
|
assert_equal 'New ticket on a given project', issue.subject
|
||
|
assert_equal User.find_by_login('jsmith'), issue.author
|
||
|
assert_equal Project.find(2), issue.project
|
||
11 years ago
|
assert_equal 'Feature request', issue.type.to_s
|
||
17 years ago
|
assert_nil issue.category
|
||
|
assert_equal 'High', issue.priority.to_s
|
||
|
assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
|
||
|
end
|
||
14 years ago
|
|
||
11 years ago
|
it 'should add work package with spaces between attribute and separator' do
|
||
10 years ago
|
issue = submit_email('ticket_with_spaces_between_attribute_and_separator.eml', allow_override: 'type,category,priority')
|
||
11 years ago
|
assert issue.is_a?(WorkPackage)
|
||
15 years ago
|
assert !issue.new_record?
|
||
|
issue.reload
|
||
|
assert_equal 'New ticket on a given project', issue.subject
|
||
|
assert_equal User.find_by_login('jsmith'), issue.author
|
||
|
assert_equal Project.find(2), issue.project
|
||
11 years ago
|
assert_equal 'Feature request', issue.type.to_s
|
||
15 years ago
|
assert_equal 'Stock management', issue.category.to_s
|
||
|
assert_equal 'Urgent', issue.priority.to_s
|
||
|
assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
|
||
|
end
|
||
|
|
||
11 years ago
|
it 'should add work package with attachment to specific project' do
|
||
10 years ago
|
issue = submit_email('ticket_with_attachment.eml', issue: { project: 'onlinestore' })
|
||
11 years ago
|
assert issue.is_a?(WorkPackage)
|
||
17 years ago
|
assert !issue.new_record?
|
||
|
issue.reload
|
||
|
assert_equal 'Ticket created by email with attachment', issue.subject
|
||
|
assert_equal User.find_by_login('jsmith'), issue.author
|
||
|
assert_equal Project.find(2), issue.project
|
||
|
assert_equal 'This is a new ticket with attachments', issue.description
|
||
|
# Attachment properties
|
||
|
assert_equal 1, issue.attachments.size
|
||
|
assert_equal 'Paella.jpg', issue.attachments.first.filename
|
||
|
assert_equal 'image/jpeg', issue.attachments.first.content_type
|
||
|
assert_equal 10790, issue.attachments.first.filesize
|
||
|
end
|
||
14 years ago
|
|
||
11 years ago
|
it 'should add work package with custom fields' do
|
||
10 years ago
|
issue = submit_email('ticket_with_custom_fields.eml', issue: { project: 'onlinestore' })
|
||
11 years ago
|
assert issue.is_a?(WorkPackage)
|
||
16 years ago
|
assert !issue.new_record?
|
||
|
issue.reload
|
||
|
assert_equal 'New ticket with custom field values', issue.subject
|
||
|
assert_equal 'Value for a custom field', issue.custom_value_for(CustomField.find_by_name('Searchable field')).value
|
||
16 years ago
|
assert !issue.description.match(/^searchable field:/i)
|
||
16 years ago
|
end
|
||
14 years ago
|
|
||
11 years ago
|
it 'should add work package should match assignee on display name' do # added from redmine - not sure if it is ok here
|
||
10 years ago
|
user = User.generate!(firstname: 'Foo', lastname: 'Bar')
|
||
|
User.add_to_project(user, Project.find(2), Role.generate!(name: 'Superhero'))
|
||
12 years ago
|
issue = submit_email('ticket_on_given_project.eml') do |email|
|
||
11 years ago
|
email.sub!(/^Assigned to.*$/, 'Assigned to: Foo Bar')
|
||
12 years ago
|
end
|
||
11 years ago
|
assert issue.is_a?(WorkPackage)
|
||
12 years ago
|
assert_equal user, issue.assigned_to
|
||
|
end
|
||
|
|
||
11 years ago
|
it 'should add work package with cc' do
|
||
10 years ago
|
issue = submit_email('ticket_with_cc.eml', issue: { project: 'ecookbook' })
|
||
11 years ago
|
assert issue.is_a?(WorkPackage)
|
||
16 years ago
|
assert !issue.new_record?
|
||
|
issue.reload
|
||
|
assert issue.watched_by?(User.find_by_mail('dlopper@somenet.foo'))
|
||
14 years ago
|
assert_equal 1, issue.watcher_user_ids.size
|
||
16 years ago
|
end
|
||
14 years ago
|
|
||
11 years ago
|
it 'should add work package by unknown user' do
|
||
16 years ago
|
assert_no_difference 'User.count' do
|
||
10 years ago
|
assert_equal false, submit_email('ticket_by_unknown_user.eml', issue: { project: 'ecookbook' })
|
||
16 years ago
|
end
|
||
|
end
|
||
14 years ago
|
|
||
11 years ago
|
it 'should add work package by anonymous user' do
|
||
11 years ago
|
Role.anonymous.add_permission!(:add_work_packages)
|
||
16 years ago
|
assert_no_difference 'User.count' do
|
||
10 years ago
|
issue = submit_email('ticket_by_unknown_user.eml', issue: { project: 'ecookbook' }, unknown_user: 'accept')
|
||
11 years ago
|
assert issue.is_a?(WorkPackage)
|
||
16 years ago
|
assert issue.author.anonymous?
|
||
|
end
|
||
|
end
|
||
15 years ago
|
|
||
11 years ago
|
it 'should add work package by anonymous user with no from address' do
|
||
11 years ago
|
Role.anonymous.add_permission!(:add_work_packages)
|
||
15 years ago
|
assert_no_difference 'User.count' do
|
||
10 years ago
|
issue = submit_email('ticket_by_empty_user.eml', issue: { project: 'ecookbook' }, unknown_user: 'accept')
|
||
11 years ago
|
assert issue.is_a?(WorkPackage)
|
||
15 years ago
|
assert issue.author.anonymous?
|
||
|
end
|
||
|
end
|
||
14 years ago
|
|
||
11 years ago
|
it 'should add work package by anonymous user on private project' do
|
||
11 years ago
|
Role.anonymous.add_permission!(:add_work_packages)
|
||
15 years ago
|
assert_no_difference 'User.count' do
|
||
11 years ago
|
assert_no_difference 'WorkPackage.count' do
|
||
10 years ago
|
assert_equal false, submit_email('ticket_by_unknown_user.eml', issue: { project: 'onlinestore' }, unknown_user: 'accept')
|
||
15 years ago
|
end
|
||
|
end
|
||
|
end
|
||
14 years ago
|
|
||
11 years ago
|
it 'should add work package by anonymous user on private project without permission check' do
|
||
15 years ago
|
assert_no_difference 'User.count' do
|
||
11 years ago
|
assert_difference 'WorkPackage.count' do
|
||
10 years ago
|
issue = submit_email('ticket_by_unknown_user.eml', issue: { project: 'onlinestore' }, no_permission_check: '1', unknown_user: 'accept')
|
||
11 years ago
|
assert issue.is_a?(WorkPackage)
|
||
15 years ago
|
assert issue.author.anonymous?
|
||
|
assert !issue.project.is_public?
|
||
14 years ago
|
assert_equal issue.id, issue.root_id
|
||
|
assert issue.leaf?
|
||
15 years ago
|
end
|
||
|
end
|
||
|
end
|
||
14 years ago
|
|
||
11 years ago
|
it 'should add work package without from header' do
|
||
11 years ago
|
Role.anonymous.add_permission!(:add_work_packages)
|
||
16 years ago
|
assert_equal false, submit_email('ticket_without_from_header.eml')
|
||
|
end
|
||
14 years ago
|
|
||
11 years ago
|
it 'should add work package with invalid attributes' do
|
||
10 years ago
|
issue = submit_email('ticket_with_invalid_attributes.eml', allow_override: 'type,category,priority')
|
||
11 years ago
|
assert issue.is_a?(WorkPackage)
|
||
14 years ago
|
assert !issue.new_record?
|
||
|
issue.reload
|
||
14 years ago
|
assert_nil issue.assigned_to
|
||
14 years ago
|
assert_nil issue.start_date
|
||
|
assert_nil issue.due_date
|
||
|
assert_equal 0, issue.done_ratio
|
||
|
assert_equal 'Normal', issue.priority.to_s
|
||
|
assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
|
||
|
end
|
||
|
|
||
11 years ago
|
it 'should add work package with localized attributes' do
|
||
12 years ago
|
User.find_by_mail('jsmith@somenet.foo').update_attribute 'language', 'de'
|
||
10 years ago
|
issue = submit_email('ticket_with_localized_attributes.eml', allow_override: 'type,category,priority')
|
||
11 years ago
|
assert issue.is_a?(WorkPackage)
|
||
14 years ago
|
assert !issue.new_record?
|
||
|
issue.reload
|
||
|
assert_equal 'New ticket on a given project', issue.subject
|
||
|
assert_equal User.find_by_login('jsmith'), issue.author
|
||
|
assert_equal Project.find(2), issue.project
|
||
11 years ago
|
assert_equal 'Feature request', issue.type.to_s
|
||
14 years ago
|
assert_equal 'Stock management', issue.category.to_s
|
||
|
assert_equal 'Urgent', issue.priority.to_s
|
||
|
assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
|
||
|
end
|
||
14 years ago
|
|
||
11 years ago
|
it 'should add work package with japanese keywords' do
|
||
10 years ago
|
type = Type.create!(name: '開発')
|
||
11 years ago
|
Project.find(1).types << type
|
||
10 years ago
|
issue = submit_email('japanese_keywords_iso_2022_jp.eml', issue: { project: 'ecookbook' }, allow_override: 'type')
|
||
11 years ago
|
assert_kind_of WorkPackage, issue
|
||
11 years ago
|
assert_equal type, issue.type
|
||
15 years ago
|
end
|
||
16 years ago
|
|
||
11 years ago
|
it 'should add from apple mail' do
|
||
12 years ago
|
issue = submit_email(
|
||
11 years ago
|
'apple_mail_with_attachment.eml',
|
||
|
issue: { project: 'ecookbook' }
|
||
12 years ago
|
)
|
||
11 years ago
|
assert_kind_of WorkPackage, issue
|
||
12 years ago
|
assert_equal 1, issue.attachments.size
|
||
|
|
||
|
attachment = issue.attachments.first
|
||
|
assert_equal 'paella.jpg', attachment.filename
|
||
|
assert_equal 10790, attachment.filesize
|
||
|
assert File.exist?(attachment.diskfile)
|
||
|
assert_equal 10790, File.size(attachment.diskfile)
|
||
|
assert_equal 'caaf384198bcbc9563ab5c058acd73cd', attachment.digest
|
||
|
end
|
||
|
|
||
11 years ago
|
it 'should add work package with iso 8859 1 subject' do
|
||
12 years ago
|
issue = submit_email(
|
||
11 years ago
|
'subject_as_iso-8859-1.eml',
|
||
|
issue: { project: 'ecookbook' }
|
||
12 years ago
|
)
|
||
11 years ago
|
assert_kind_of WorkPackage, issue
|
||
12 years ago
|
assert_equal 'Testmail from Webmail: ä ö ü...', issue.subject
|
||
|
end
|
||
|
|
||
11 years ago
|
it 'should ignore emails from locked users' do
|
||
12 years ago
|
User.find(2).lock!
|
||
|
|
||
10 years ago
|
expect_any_instance_of(MailHandler).to receive(:dispatch).never
|
||
11 years ago
|
assert_no_difference 'WorkPackage.count' do
|
||
12 years ago
|
assert_equal false, submit_email('ticket_on_given_project.eml')
|
||
|
end
|
||
|
end
|
||
|
|
||
11 years ago
|
it 'should ignore emails from emission address' do
|
||
11 years ago
|
Role.anonymous.add_permission!(:add_work_packages)
|
||
15 years ago
|
assert_no_difference 'User.count' do
|
||
10 years ago
|
assert !submit_email('ticket_from_emission_address.eml', issue: { project: 'ecookbook' }, unknown_user: 'create')
|
||
15 years ago
|
end
|
||
|
end
|
||
|
|
||
11 years ago
|
it 'should ignore auto replied emails' do
|
||
10 years ago
|
expect_any_instance_of(MailHandler).to receive(:dispatch).never
|
||
12 years ago
|
[
|
||
10 years ago
|
'X-Auto-Response-Suppress: OOF',
|
||
|
'Auto-Submitted: auto-replied',
|
||
|
'Auto-Submitted: Auto-Replied',
|
||
|
'Auto-Submitted: auto-generated'
|
||
12 years ago
|
].each do |header|
|
||
|
raw = IO.read(File.join(FIXTURES_PATH, 'ticket_on_given_project.eml'))
|
||
|
raw = header + "\n" + raw
|
||
|
|
||
11 years ago
|
assert_no_difference 'WorkPackage.count' do
|
||
12 years ago
|
assert_equal false, MailHandler.receive(raw), "email with #{header} header was not ignored"
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
11 years ago
|
it 'should add work package should send email notification' do
|
||
11 years ago
|
Setting.notified_events = ['work_package_added']
|
||
16 years ago
|
ActionMailer::Base.deliveries.clear
|
||
|
# This email contains: 'Project: onlinestore'
|
||
|
issue = submit_email('ticket_on_given_project.eml')
|
||
11 years ago
|
assert issue.is_a?(WorkPackage)
|
||
16 years ago
|
assert_equal 1, ActionMailer::Base.deliveries.size
|
||
|
end
|
||
14 years ago
|
|
||
11 years ago
|
it 'should add work package note' do
|
||
17 years ago
|
journal = submit_email('ticket_reply.eml')
|
||
|
assert journal.is_a?(Journal)
|
||
|
assert_equal User.find_by_login('jsmith'), journal.user
|
||
11 years ago
|
assert_equal WorkPackage.find(2), journal.journable
|
||
16 years ago
|
assert_match /This is reply/, journal.notes
|
||
11 years ago
|
assert_equal 'Feature request', journal.journable.type.name
|
||
16 years ago
|
end
|
||
|
|
||
11 years ago
|
specify 'reply to issue update (Journal) by message_id' do
|
||
11 years ago
|
Journal.delete_all
|
||
|
issue = WorkPackage.find(2)
|
||
|
j = FactoryGirl.create :work_package_journal,
|
||
|
id: 3,
|
||
11 years ago
|
journable_id: issue.id
|
||
14 years ago
|
journal = submit_email('ticket_reply_by_message_id.eml')
|
||
11 years ago
|
assert journal.data.is_a?(Journal::WorkPackageJournal), "Email was a #{journal.data.class}"
|
||
14 years ago
|
assert_equal User.find_by_login('jsmith'), journal.user
|
||
11 years ago
|
assert_equal WorkPackage.find(2), journal.journable
|
||
14 years ago
|
assert_match /This is reply/, journal.notes
|
||
11 years ago
|
assert_equal 'Feature request', journal.journable.type.name
|
||
14 years ago
|
end
|
||
|
|
||
11 years ago
|
it 'should add work package note with attribute changes' do
|
||
11 years ago
|
WorkPackage.find(2).recreate_initial_journal!
|
||
16 years ago
|
# This email contains: 'Status: Resolved'
|
||
|
journal = submit_email('ticket_reply_with_status.eml')
|
||
11 years ago
|
assert journal.data.is_a?(Journal::WorkPackageJournal)
|
||
11 years ago
|
issue = WorkPackage.find(journal.journable.id)
|
||
16 years ago
|
assert_equal User.find_by_login('jsmith'), journal.user
|
||
11 years ago
|
assert_equal WorkPackage.find(2), journal.journable
|
||
16 years ago
|
assert_match /This is reply/, journal.notes
|
||
11 years ago
|
assert_equal 'Feature request', journal.journable.type.name
|
||
10 years ago
|
assert_equal Status.find_by_name('Resolved'), issue.status
|
||
15 years ago
|
assert_equal '2010-01-01', issue.start_date.to_s
|
||
|
assert_equal '2010-12-31', issue.due_date.to_s
|
||
15 years ago
|
assert_equal User.find_by_login('jsmith'), issue.assigned_to
|
||
10 years ago
|
assert_equal '52.6', issue.custom_value_for(CustomField.find_by_name('Float field')).value
|
||
14 years ago
|
# keywords should be removed from the email body
|
||
|
assert !journal.notes.match(/^Status:/i)
|
||
|
assert !journal.notes.match(/^Start Date:/i)
|
||
18 years ago
|
end
|
||
16 years ago
|
|
||
11 years ago
|
it 'should add work package note should send email notification' do
|
||
11 years ago
|
WorkPackage.find(2).recreate_initial_journal!
|
||
16 years ago
|
ActionMailer::Base.deliveries.clear
|
||
|
journal = submit_email('ticket_reply.eml')
|
||
|
assert journal.is_a?(Journal)
|
||
14 years ago
|
assert_equal 3, ActionMailer::Base.deliveries.size
|
||
16 years ago
|
end
|
||
14 years ago
|
|
||
11 years ago
|
it 'should add work package note should not set defaults' do
|
||
10 years ago
|
journal = submit_email('ticket_reply.eml', issue: { type: 'Support request', priority: 'High' })
|
||
14 years ago
|
assert journal.is_a?(Journal)
|
||
|
assert_match /This is reply/, journal.notes
|
||
11 years ago
|
assert_equal 'Feature request', journal.journable.type.name
|
||
|
assert_equal 'Normal', journal.journable.priority.name
|
||
14 years ago
|
end
|
||
14 years ago
|
|
||
11 years ago
|
it 'should reply to a message' do
|
||
16 years ago
|
m = submit_email('message_reply.eml')
|
||
|
assert m.is_a?(Message)
|
||
|
assert !m.new_record?
|
||
|
m.reload
|
||
|
assert_equal 'Reply via email', m.subject
|
||
|
# The email replies to message #2 which is part of the thread of message #1
|
||
|
assert_equal Message.find(1), m.parent
|
||
|
end
|
||
14 years ago
|
|
||
11 years ago
|
it 'should reply to a message by subject' do
|
||
16 years ago
|
m = submit_email('message_reply_by_subject.eml')
|
||
|
assert m.is_a?(Message)
|
||
|
assert !m.new_record?
|
||
|
m.reload
|
||
|
assert_equal 'Reply to the first post', m.subject
|
||
|
assert_equal Message.find(1), m.parent
|
||
|
end
|
||
14 years ago
|
|
||
11 years ago
|
it 'should strip tags of html only emails' do
|
||
10 years ago
|
issue = submit_email('ticket_html_only.eml', issue: { project: 'ecookbook' })
|
||
11 years ago
|
assert issue.is_a?(WorkPackage)
|
||
16 years ago
|
assert !issue.new_record?
|
||
|
issue.reload
|
||
|
assert_equal 'HTML email', issue.subject
|
||
|
assert_equal 'This is a html-only email.', issue.description
|
||
|
end
|
||
18 years ago
|
|
||
10 years ago
|
context 'truncate emails based on the Setting' do
|
||
|
context 'with no setting' do
|
||
11 years ago
|
before do
|
||
15 years ago
|
Setting.mail_handler_body_delimiters = ''
|
||
|
end
|
||
|
|
||
11 years ago
|
it 'should add the entire email into the issue' do
|
||
15 years ago
|
issue = submit_email('ticket_on_given_project.eml')
|
||
|
assert_issue_created(issue)
|
||
|
assert issue.description.include?('---')
|
||
|
assert issue.description.include?('This paragraph is after the delimiter')
|
||
|
end
|
||
|
end
|
||
|
|
||
10 years ago
|
context 'with a single string' do
|
||
11 years ago
|
before do
|
||
15 years ago
|
Setting.mail_handler_body_delimiters = '---'
|
||
|
end
|
||
|
|
||
11 years ago
|
it 'should truncate the email at the delimiter for the issue' do
|
||
15 years ago
|
issue = submit_email('ticket_on_given_project.eml')
|
||
|
assert_issue_created(issue)
|
||
|
assert issue.description.include?('This paragraph is before delimiters')
|
||
|
assert issue.description.include?('--- This line starts with a delimiter')
|
||
|
assert !issue.description.match(/^---$/)
|
||
|
assert !issue.description.include?('This paragraph is after the delimiter')
|
||
|
end
|
||
|
end
|
||
|
|
||
10 years ago
|
context 'with a single quoted reply (e.g. reply to a Redmine email notification)' do
|
||
11 years ago
|
before do
|
||
14 years ago
|
Setting.mail_handler_body_delimiters = '--- Reply above. Do not remove this line. ---'
|
||
|
end
|
||
|
|
||
11 years ago
|
it 'should truncate the email at the delimiter with the quoted reply symbols (>)' do
|
||
14 years ago
|
journal = submit_email('issue_update_with_quoted_reply_above.eml')
|
||
|
assert journal.is_a?(Journal)
|
||
|
assert journal.notes.include?('An update to the issue by the sender.')
|
||
10 years ago
|
assert !journal.notes.match(Regexp.escape('--- Reply above. Do not remove this line. ---'))
|
||
14 years ago
|
assert !journal.notes.include?('Looks like the JSON api for projects was missed.')
|
||
|
end
|
||
|
end
|
||
14 years ago
|
|
||
10 years ago
|
context 'with multiple quoted replies (e.g. reply to a reply of a Redmine email notification)' do
|
||
11 years ago
|
before do
|
||
14 years ago
|
Setting.mail_handler_body_delimiters = '--- Reply above. Do not remove this line. ---'
|
||
|
end
|
||
|
|
||
11 years ago
|
it 'should truncate the email at the delimiter with the quoted reply symbols (>)' do
|
||
14 years ago
|
journal = submit_email('issue_update_with_multiple_quoted_reply_above.eml')
|
||
|
assert journal.is_a?(Journal)
|
||
|
assert journal.notes.include?('An update to the issue by the sender.')
|
||
10 years ago
|
assert !journal.notes.match(Regexp.escape('--- Reply above. Do not remove this line. ---'))
|
||
14 years ago
|
assert !journal.notes.include?('Looks like the JSON api for projects was missed.')
|
||
|
end
|
||
|
end
|
||
|
|
||
10 years ago
|
context 'with multiple strings' do
|
||
11 years ago
|
before do
|
||
15 years ago
|
Setting.mail_handler_body_delimiters = "---\nBREAK"
|
||
|
end
|
||
|
|
||
11 years ago
|
it 'should truncate the email at the first delimiter found (BREAK)' do
|
||
15 years ago
|
issue = submit_email('ticket_on_given_project.eml')
|
||
|
assert_issue_created(issue)
|
||
|
assert issue.description.include?('This paragraph is before delimiters')
|
||
|
assert !issue.description.include?('BREAK')
|
||
|
assert !issue.description.include?('This paragraph is between delimiters')
|
||
|
assert !issue.description.match(/^---$/)
|
||
|
assert !issue.description.include?('This paragraph is after the delimiter')
|
||
|
end
|
||
|
end
|
||
|
end
|
||
14 years ago
|
|
||
11 years ago
|
it 'should email with long subject line' do
|
||
15 years ago
|
issue = submit_email('ticket_with_long_subject.eml')
|
||
11 years ago
|
assert issue.is_a?(WorkPackage)
|
||
10 years ago
|
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]
|
||
15 years ago
|
end
|
||
15 years ago
|
|
||
11 years ago
|
it 'should new user from attributes should return valid user' do
|
||
12 years ago
|
to_test = {
|
||
|
# [address, name] => [login, firstname, lastname]
|
||
|
['jsmith@example.net', nil] => ['jsmith@example.net', 'jsmith', '-'],
|
||
|
['jsmith@example.net', 'John'] => ['jsmith@example.net', 'John', '-'],
|
||
|
['jsmith@example.net', 'John Smith'] => ['jsmith@example.net', 'John', 'Smith'],
|
||
|
['jsmith@example.net', 'John Paul Smith'] => ['jsmith@example.net', 'John', 'Paul Smith'],
|
||
12 years ago
|
# TODO: implement https://github.com/redmine/redmine/commit/a00f04886fac78e489bb030d20414ebdf10841e3
|
||
|
# ['jsmith@example.net', 'AVeryLongFirstnameThatExceedsTheMaximumLength Smith'] => ['jsmith@example.net', 'AVeryLongFirstnameThatExceedsT', 'Smith'],
|
||
|
# ['jsmith@example.net', 'John AVeryLongLastnameThatExceedsTheMaximumLength'] => ['jsmith@example.net', 'John', 'AVeryLongLastnameThatExceedsTh']
|
||
|
['jsmith@example.net', 'AVeryLongFirstnameThatExceedsTheMaximumLength Smith'] => ['jsmith@example.net', '-', 'Smith'],
|
||
|
['jsmith@example.net', 'John AVeryLongLastnameThatExceedsTheMaximumLength'] => ['jsmith@example.net', 'John', '-']
|
||
12 years ago
|
}
|
||
|
|
||
|
to_test.each do |attrs, expected|
|
||
|
user = MailHandler.new_user_from_attributes(attrs.first, attrs.last)
|
||
|
|
||
|
assert user.valid?, user.errors.full_messages.to_s
|
||
|
assert_equal attrs.first, user.mail
|
||
|
assert_equal expected[0], user.login
|
||
|
assert_equal expected[1], user.firstname
|
||
|
assert_equal expected[2], user.lastname
|
||
|
end
|
||
|
end
|
||
|
|
||
11 years ago
|
it 'should new user from attributes should respect minimum password length' do
|
||
10 years ago
|
with_settings password_min_length: 15 do
|
||
12 years ago
|
user = MailHandler.new_user_from_attributes('jsmith@example.net')
|
||
|
assert user.valid?
|
||
|
assert user.password.length >= 15
|
||
|
end
|
||
|
end
|
||
|
|
||
11 years ago
|
it 'should new user from attributes should use default login if invalid' do
|
||
10 years ago
|
user = MailHandler.new_user_from_attributes('foo&bar@example.net')
|
||
12 years ago
|
assert user.valid?
|
||
|
assert user.login =~ /^user[a-f0-9]+$/
|
||
10 years ago
|
assert_equal 'foo&bar@example.net', user.mail
|
||
12 years ago
|
end
|
||
|
|
||
11 years ago
|
it 'should new user with utf8 encoded fullname should be decoded' do
|
||
12 years ago
|
assert_difference 'User.count' do
|
||
|
issue = submit_email(
|
||
11 years ago
|
'fullname_of_sender_as_utf8_encoded.eml',
|
||
|
issue: { project: 'ecookbook' },
|
||
|
unknown_user: 'create'
|
||
12 years ago
|
)
|
||
|
end
|
||
|
|
||
10 years ago
|
user = User.first(order: 'id DESC')
|
||
10 years ago
|
assert_equal 'foo@example.org', user.mail
|
||
12 years ago
|
str1 = "\xc3\x84\xc3\xa4"
|
||
|
str2 = "\xc3\x96\xc3\xb6"
|
||
|
str1.force_encoding('UTF-8') if str1.respond_to?(:force_encoding)
|
||
|
str2.force_encoding('UTF-8') if str2.respond_to?(:force_encoding)
|
||
|
assert_equal str1, user.firstname
|
||
|
assert_equal str2, user.lastname
|
||
|
end
|
||
|
|
||
18 years ago
|
private
|
||
14 years ago
|
|
||
10 years ago
|
def submit_email(filename, options = {})
|
||
17 years ago
|
raw = IO.read(File.join(FIXTURES_PATH, filename))
|
||
12 years ago
|
yield raw if block_given?
|
||
17 years ago
|
MailHandler.receive(raw, options)
|
||
|
end
|
||
15 years ago
|
|
||
|
def assert_issue_created(issue)
|
||
11 years ago
|
assert issue.is_a?(WorkPackage)
|
||
15 years ago
|
assert !issue.new_record?
|
||
|
issue.reload
|
||
|
end
|
||
18 years ago
|
end
|