mail_handler_test.rb
205 lines
| 7.8 KiB
| text/x-ruby
|
RubyLexer
|
r521 | # redMine - project management software | ||
# Copyright (C) 2006-2007 Jean-Philippe Lang | ||||
# | ||||
# 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. | ||||
require File.dirname(__FILE__) + '/../test_helper' | ||||
class MailHandlerTest < Test::Unit::TestCase | ||||
|
r1629 | fixtures :users, :projects, | ||
:enabled_modules, | ||||
:roles, | ||||
:members, | ||||
:issues, | ||||
|
r2075 | :issue_statuses, | ||
:workflows, | ||||
|
r1629 | :trackers, | ||
:projects_trackers, | ||||
:enumerations, | ||||
|
r2209 | :issue_categories, | ||
:custom_fields, | ||||
|
r2287 | :custom_fields_trackers, | ||
:boards, | ||||
:messages | ||||
|
r521 | |||
|
r1554 | FIXTURES_PATH = File.dirname(__FILE__) + '/../fixtures/mail_handler' | ||
|
r521 | def setup | ||
|
r1554 | ActionMailer::Base.deliveries.clear | ||
|
r521 | end | ||
|
r1554 | def test_add_issue | ||
# This email contains: 'Project: onlinestore' | ||||
issue = submit_email('ticket_on_given_project.eml') | ||||
assert issue.is_a?(Issue) | ||||
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 | ||||
|
r2365 | assert_equal IssueStatus.find_by_name('Resolved'), issue.status | ||
|
r1554 | assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.') | ||
|
r2365 | # keywords should be removed from the email body | ||
assert !issue.description.match(/^Project:/i) | ||||
assert !issue.description.match(/^Status:/i) | ||||
|
r1554 | end | ||
|
r1750 | |||
def test_add_issue_with_status | ||||
# This email contains: 'Project: onlinestore' and 'Status: Resolved' | ||||
issue = submit_email('ticket_on_given_project.eml') | ||||
assert issue.is_a?(Issue) | ||||
assert !issue.new_record? | ||||
issue.reload | ||||
assert_equal Project.find(2), issue.project | ||||
assert_equal IssueStatus.find_by_name("Resolved"), issue.status | ||||
end | ||||
|
r1554 | |||
|
r1629 | def test_add_issue_with_attributes_override | ||
issue = submit_email('ticket_with_attributes.eml', :allow_override => 'tracker,category,priority') | ||||
assert issue.is_a?(Issue) | ||||
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 | ||||
assert_equal 'Feature request', issue.tracker.to_s | ||||
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 | ||||
def test_add_issue_with_partial_attributes_override | ||||
issue = submit_email('ticket_with_attributes.eml', :issue => {:priority => 'High'}, :allow_override => ['tracker']) | ||||
assert issue.is_a?(Issue) | ||||
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 | ||||
assert_equal 'Feature request', issue.tracker.to_s | ||||
assert_nil issue.category | ||||
assert_equal 'High', issue.priority.to_s | ||||
assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.') | ||||
end | ||||
|
r1554 | def test_add_issue_with_attachment_to_specific_project | ||
|
r1629 | issue = submit_email('ticket_with_attachment.eml', :issue => {:project => 'onlinestore'}) | ||
|
r1554 | assert issue.is_a?(Issue) | ||
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 | ||||
|
r2209 | def test_add_issue_with_custom_fields | ||
issue = submit_email('ticket_with_custom_fields.eml', :issue => {:project => 'onlinestore'}) | ||||
assert issue.is_a?(Issue) | ||||
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 | ||||
|
r2365 | assert !issue.description.match(/^searchable field:/i) | ||
|
r2209 | end | ||
|
r2075 | def test_add_issue_with_cc | ||
issue = submit_email('ticket_with_cc.eml', :issue => {:project => 'ecookbook'}) | ||||
assert issue.is_a?(Issue) | ||||
assert !issue.new_record? | ||||
issue.reload | ||||
assert issue.watched_by?(User.find_by_mail('dlopper@somenet.foo')) | ||||
assert_equal 1, issue.watchers.size | ||||
end | ||||
|
r2485 | def test_add_issue_without_from_header | ||
Role.anonymous.add_permission!(:add_issues) | ||||
assert_equal false, submit_email('ticket_without_from_header.eml') | ||||
end | ||||
|
r2548 | |||
def test_add_issue_should_send_email_notification | ||||
ActionMailer::Base.deliveries.clear | ||||
# This email contains: 'Project: onlinestore' | ||||
issue = submit_email('ticket_on_given_project.eml') | ||||
assert issue.is_a?(Issue) | ||||
assert_equal 1, ActionMailer::Base.deliveries.size | ||||
end | ||||
|
r2485 | |||
|
r1554 | def test_add_issue_note | ||
journal = submit_email('ticket_reply.eml') | ||||
assert journal.is_a?(Journal) | ||||
assert_equal User.find_by_login('jsmith'), journal.user | ||||
assert_equal Issue.find(2), journal.journalized | ||||
|
r1750 | assert_match /This is reply/, journal.notes | ||
end | ||||
def test_add_issue_note_with_status_change | ||||
# This email contains: 'Status: Resolved' | ||||
journal = submit_email('ticket_reply_with_status.eml') | ||||
assert journal.is_a?(Journal) | ||||
issue = Issue.find(journal.issue.id) | ||||
assert_equal User.find_by_login('jsmith'), journal.user | ||||
assert_equal Issue.find(2), journal.journalized | ||||
assert_match /This is reply/, journal.notes | ||||
assert_equal IssueStatus.find_by_name("Resolved"), issue.status | ||||
|
r521 | end | ||
|
r2548 | |||
def test_add_issue_note_should_send_email_notification | ||||
ActionMailer::Base.deliveries.clear | ||||
journal = submit_email('ticket_reply.eml') | ||||
assert journal.is_a?(Journal) | ||||
assert_equal 1, ActionMailer::Base.deliveries.size | ||||
end | ||||
|
r2134 | |||
|
r2287 | def test_reply_to_a_message | ||
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 | ||||
|
r2292 | def test_reply_to_a_message_by_subject | ||
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 | ||||
|
r2134 | def test_should_strip_tags_of_html_only_emails | ||
issue = submit_email('ticket_html_only.eml', :issue => {:project => 'ecookbook'}) | ||||
assert issue.is_a?(Issue) | ||||
assert !issue.new_record? | ||||
issue.reload | ||||
assert_equal 'HTML email', issue.subject | ||||
assert_equal 'This is a html-only email.', issue.description | ||||
end | ||||
|
r521 | |||
private | ||||
|
r1554 | |||
def submit_email(filename, options={}) | ||||
raw = IO.read(File.join(FIXTURES_PATH, filename)) | ||||
MailHandler.receive(raw, options) | ||||
end | ||||
|
r521 | end | ||