Chris@0
|
1 # encoding: utf-8
|
Chris@0
|
2 #
|
Chris@0
|
3 # Redmine - project management software
|
Chris@0
|
4 # Copyright (C) 2006-2009 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@0
|
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@0
|
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@117
|
20 require File.expand_path('../../test_helper', __FILE__)
|
Chris@0
|
21
|
Chris@0
|
22 class MailHandlerTest < ActiveSupport::TestCase
|
Chris@0
|
23 fixtures :users, :projects,
|
Chris@0
|
24 :enabled_modules,
|
Chris@0
|
25 :roles,
|
Chris@0
|
26 :members,
|
Chris@0
|
27 :member_roles,
|
chris@37
|
28 :users,
|
Chris@0
|
29 :issues,
|
Chris@0
|
30 :issue_statuses,
|
Chris@0
|
31 :workflows,
|
Chris@0
|
32 :trackers,
|
Chris@0
|
33 :projects_trackers,
|
chris@37
|
34 :versions,
|
Chris@0
|
35 :enumerations,
|
Chris@0
|
36 :issue_categories,
|
Chris@0
|
37 :custom_fields,
|
Chris@0
|
38 :custom_fields_trackers,
|
Chris@117
|
39 :custom_fields_projects,
|
Chris@0
|
40 :boards,
|
Chris@0
|
41 :messages
|
Chris@0
|
42
|
Chris@0
|
43 FIXTURES_PATH = File.dirname(__FILE__) + '/../fixtures/mail_handler'
|
Chris@0
|
44
|
Chris@0
|
45 def setup
|
Chris@0
|
46 ActionMailer::Base.deliveries.clear
|
chris@37
|
47 Setting.notified_events = Redmine::Notifiable.all.collect(&:name)
|
Chris@0
|
48 end
|
Chris@0
|
49
|
Chris@0
|
50 def test_add_issue
|
Chris@0
|
51 ActionMailer::Base.deliveries.clear
|
Chris@0
|
52 # This email contains: 'Project: onlinestore'
|
Chris@0
|
53 issue = submit_email('ticket_on_given_project.eml')
|
Chris@0
|
54 assert issue.is_a?(Issue)
|
Chris@0
|
55 assert !issue.new_record?
|
Chris@0
|
56 issue.reload
|
Chris@117
|
57 assert_equal Project.find(2), issue.project
|
Chris@117
|
58 assert_equal issue.project.trackers.first, issue.tracker
|
Chris@0
|
59 assert_equal 'New ticket on a given project', issue.subject
|
Chris@0
|
60 assert_equal User.find_by_login('jsmith'), issue.author
|
Chris@0
|
61 assert_equal IssueStatus.find_by_name('Resolved'), issue.status
|
Chris@0
|
62 assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
|
Chris@0
|
63 assert_equal '2010-01-01', issue.start_date.to_s
|
Chris@0
|
64 assert_equal '2010-12-31', issue.due_date.to_s
|
Chris@0
|
65 assert_equal User.find_by_login('jsmith'), issue.assigned_to
|
chris@37
|
66 assert_equal Version.find_by_name('alpha'), issue.fixed_version
|
chris@37
|
67 assert_equal 2.5, issue.estimated_hours
|
chris@37
|
68 assert_equal 30, issue.done_ratio
|
Chris@117
|
69 assert_equal [issue.id, 1, 2], [issue.root_id, issue.lft, issue.rgt]
|
Chris@0
|
70 # keywords should be removed from the email body
|
Chris@0
|
71 assert !issue.description.match(/^Project:/i)
|
Chris@0
|
72 assert !issue.description.match(/^Status:/i)
|
Chris@0
|
73 # Email notification should be sent
|
Chris@0
|
74 mail = ActionMailer::Base.deliveries.last
|
Chris@0
|
75 assert_not_nil mail
|
Chris@0
|
76 assert mail.subject.include?('New ticket on a given project')
|
Chris@0
|
77 end
|
Chris@117
|
78
|
Chris@117
|
79 def test_add_issue_with_default_tracker
|
Chris@117
|
80 # This email contains: 'Project: onlinestore'
|
Chris@117
|
81 issue = submit_email('ticket_on_given_project.eml', :issue => {:tracker => 'Support request'})
|
Chris@117
|
82 assert issue.is_a?(Issue)
|
Chris@117
|
83 assert !issue.new_record?
|
Chris@117
|
84 issue.reload
|
Chris@117
|
85 assert_equal 'Support request', issue.tracker.name
|
Chris@117
|
86 end
|
Chris@0
|
87
|
Chris@0
|
88 def test_add_issue_with_status
|
Chris@0
|
89 # This email contains: 'Project: onlinestore' and 'Status: Resolved'
|
Chris@0
|
90 issue = submit_email('ticket_on_given_project.eml')
|
Chris@0
|
91 assert issue.is_a?(Issue)
|
Chris@0
|
92 assert !issue.new_record?
|
Chris@0
|
93 issue.reload
|
Chris@0
|
94 assert_equal Project.find(2), issue.project
|
Chris@0
|
95 assert_equal IssueStatus.find_by_name("Resolved"), issue.status
|
Chris@0
|
96 end
|
Chris@0
|
97
|
Chris@0
|
98 def test_add_issue_with_attributes_override
|
Chris@0
|
99 issue = submit_email('ticket_with_attributes.eml', :allow_override => 'tracker,category,priority')
|
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@0
|
111
|
Chris@0
|
112 def test_add_issue_with_partial_attributes_override
|
Chris@0
|
113 issue = submit_email('ticket_with_attributes.eml', :issue => {:priority => 'High'}, :allow_override => ['tracker'])
|
Chris@0
|
114 assert issue.is_a?(Issue)
|
Chris@0
|
115 assert !issue.new_record?
|
Chris@0
|
116 issue.reload
|
Chris@0
|
117 assert_equal 'New ticket on a given project', issue.subject
|
Chris@0
|
118 assert_equal User.find_by_login('jsmith'), issue.author
|
Chris@0
|
119 assert_equal Project.find(2), issue.project
|
Chris@0
|
120 assert_equal 'Feature request', issue.tracker.to_s
|
Chris@0
|
121 assert_nil issue.category
|
Chris@0
|
122 assert_equal 'High', issue.priority.to_s
|
Chris@0
|
123 assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
|
Chris@0
|
124 end
|
Chris@0
|
125
|
Chris@0
|
126 def test_add_issue_with_spaces_between_attribute_and_separator
|
Chris@0
|
127 issue = submit_email('ticket_with_spaces_between_attribute_and_separator.eml', :allow_override => 'tracker,category,priority')
|
Chris@0
|
128 assert issue.is_a?(Issue)
|
Chris@0
|
129 assert !issue.new_record?
|
Chris@0
|
130 issue.reload
|
Chris@0
|
131 assert_equal 'New ticket on a given project', issue.subject
|
Chris@0
|
132 assert_equal User.find_by_login('jsmith'), issue.author
|
Chris@0
|
133 assert_equal Project.find(2), issue.project
|
Chris@0
|
134 assert_equal 'Feature request', issue.tracker.to_s
|
Chris@0
|
135 assert_equal 'Stock management', issue.category.to_s
|
Chris@0
|
136 assert_equal 'Urgent', issue.priority.to_s
|
Chris@0
|
137 assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
|
Chris@0
|
138 end
|
Chris@0
|
139
|
Chris@0
|
140
|
Chris@0
|
141 def test_add_issue_with_attachment_to_specific_project
|
Chris@0
|
142 issue = submit_email('ticket_with_attachment.eml', :issue => {:project => 'onlinestore'})
|
Chris@0
|
143 assert issue.is_a?(Issue)
|
Chris@0
|
144 assert !issue.new_record?
|
Chris@0
|
145 issue.reload
|
Chris@0
|
146 assert_equal 'Ticket created by email with attachment', issue.subject
|
Chris@0
|
147 assert_equal User.find_by_login('jsmith'), issue.author
|
Chris@0
|
148 assert_equal Project.find(2), issue.project
|
Chris@0
|
149 assert_equal 'This is a new ticket with attachments', issue.description
|
Chris@0
|
150 # Attachment properties
|
Chris@0
|
151 assert_equal 1, issue.attachments.size
|
Chris@0
|
152 assert_equal 'Paella.jpg', issue.attachments.first.filename
|
Chris@0
|
153 assert_equal 'image/jpeg', issue.attachments.first.content_type
|
Chris@0
|
154 assert_equal 10790, issue.attachments.first.filesize
|
Chris@0
|
155 end
|
Chris@0
|
156
|
Chris@0
|
157 def test_add_issue_with_custom_fields
|
Chris@0
|
158 issue = submit_email('ticket_with_custom_fields.eml', :issue => {:project => 'onlinestore'})
|
Chris@0
|
159 assert issue.is_a?(Issue)
|
Chris@0
|
160 assert !issue.new_record?
|
Chris@0
|
161 issue.reload
|
Chris@0
|
162 assert_equal 'New ticket with custom field values', issue.subject
|
Chris@0
|
163 assert_equal 'Value for a custom field', issue.custom_value_for(CustomField.find_by_name('Searchable field')).value
|
Chris@0
|
164 assert !issue.description.match(/^searchable field:/i)
|
Chris@0
|
165 end
|
Chris@0
|
166
|
Chris@0
|
167 def test_add_issue_with_cc
|
Chris@0
|
168 issue = submit_email('ticket_with_cc.eml', :issue => {:project => 'ecookbook'})
|
Chris@0
|
169 assert issue.is_a?(Issue)
|
Chris@0
|
170 assert !issue.new_record?
|
Chris@0
|
171 issue.reload
|
Chris@0
|
172 assert issue.watched_by?(User.find_by_mail('dlopper@somenet.foo'))
|
chris@37
|
173 assert_equal 1, issue.watcher_user_ids.size
|
Chris@0
|
174 end
|
Chris@0
|
175
|
Chris@0
|
176 def test_add_issue_by_unknown_user
|
Chris@0
|
177 assert_no_difference 'User.count' do
|
Chris@0
|
178 assert_equal false, submit_email('ticket_by_unknown_user.eml', :issue => {:project => 'ecookbook'})
|
Chris@0
|
179 end
|
Chris@0
|
180 end
|
Chris@0
|
181
|
Chris@0
|
182 def test_add_issue_by_anonymous_user
|
Chris@0
|
183 Role.anonymous.add_permission!(:add_issues)
|
Chris@0
|
184 assert_no_difference 'User.count' do
|
Chris@0
|
185 issue = submit_email('ticket_by_unknown_user.eml', :issue => {:project => 'ecookbook'}, :unknown_user => 'accept')
|
Chris@0
|
186 assert issue.is_a?(Issue)
|
Chris@0
|
187 assert issue.author.anonymous?
|
Chris@0
|
188 end
|
Chris@0
|
189 end
|
Chris@0
|
190
|
Chris@0
|
191 def test_add_issue_by_anonymous_user_with_no_from_address
|
Chris@0
|
192 Role.anonymous.add_permission!(:add_issues)
|
Chris@0
|
193 assert_no_difference 'User.count' do
|
Chris@0
|
194 issue = submit_email('ticket_by_empty_user.eml', :issue => {:project => 'ecookbook'}, :unknown_user => 'accept')
|
Chris@0
|
195 assert issue.is_a?(Issue)
|
Chris@0
|
196 assert issue.author.anonymous?
|
Chris@0
|
197 end
|
Chris@0
|
198 end
|
Chris@0
|
199
|
Chris@0
|
200 def test_add_issue_by_anonymous_user_on_private_project
|
Chris@0
|
201 Role.anonymous.add_permission!(:add_issues)
|
Chris@0
|
202 assert_no_difference 'User.count' do
|
Chris@0
|
203 assert_no_difference 'Issue.count' do
|
Chris@0
|
204 assert_equal false, submit_email('ticket_by_unknown_user.eml', :issue => {:project => 'onlinestore'}, :unknown_user => 'accept')
|
Chris@0
|
205 end
|
Chris@0
|
206 end
|
Chris@0
|
207 end
|
Chris@0
|
208
|
Chris@0
|
209 def test_add_issue_by_anonymous_user_on_private_project_without_permission_check
|
Chris@0
|
210 assert_no_difference 'User.count' do
|
Chris@0
|
211 assert_difference 'Issue.count' do
|
Chris@0
|
212 issue = submit_email('ticket_by_unknown_user.eml', :issue => {:project => 'onlinestore'}, :no_permission_check => '1', :unknown_user => 'accept')
|
Chris@0
|
213 assert issue.is_a?(Issue)
|
Chris@0
|
214 assert issue.author.anonymous?
|
Chris@0
|
215 assert !issue.project.is_public?
|
Chris@117
|
216 assert_equal [issue.id, 1, 2], [issue.root_id, issue.lft, issue.rgt]
|
Chris@0
|
217 end
|
Chris@0
|
218 end
|
Chris@0
|
219 end
|
Chris@0
|
220
|
Chris@0
|
221 def test_add_issue_by_created_user
|
Chris@0
|
222 Setting.default_language = 'en'
|
Chris@0
|
223 assert_difference 'User.count' do
|
Chris@0
|
224 issue = submit_email('ticket_by_unknown_user.eml', :issue => {:project => 'ecookbook'}, :unknown_user => 'create')
|
Chris@0
|
225 assert issue.is_a?(Issue)
|
Chris@0
|
226 assert issue.author.active?
|
Chris@0
|
227 assert_equal 'john.doe@somenet.foo', issue.author.mail
|
Chris@0
|
228 assert_equal 'John', issue.author.firstname
|
Chris@0
|
229 assert_equal 'Doe', issue.author.lastname
|
Chris@0
|
230
|
Chris@0
|
231 # account information
|
Chris@0
|
232 email = ActionMailer::Base.deliveries.first
|
Chris@0
|
233 assert_not_nil email
|
Chris@0
|
234 assert email.subject.include?('account activation')
|
Chris@0
|
235 login = email.body.match(/\* Login: (.*)$/)[1]
|
Chris@0
|
236 password = email.body.match(/\* Password: (.*)$/)[1]
|
Chris@0
|
237 assert_equal issue.author, User.try_to_login(login, password)
|
Chris@0
|
238 end
|
Chris@0
|
239 end
|
Chris@0
|
240
|
Chris@0
|
241 def test_add_issue_without_from_header
|
Chris@0
|
242 Role.anonymous.add_permission!(:add_issues)
|
Chris@0
|
243 assert_equal false, submit_email('ticket_without_from_header.eml')
|
Chris@0
|
244 end
|
chris@37
|
245
|
chris@37
|
246 def test_add_issue_with_invalid_attributes
|
chris@37
|
247 issue = submit_email('ticket_with_invalid_attributes.eml', :allow_override => 'tracker,category,priority')
|
chris@37
|
248 assert issue.is_a?(Issue)
|
chris@37
|
249 assert !issue.new_record?
|
chris@37
|
250 issue.reload
|
chris@37
|
251 assert_nil issue.assigned_to
|
chris@37
|
252 assert_nil issue.start_date
|
chris@37
|
253 assert_nil issue.due_date
|
chris@37
|
254 assert_equal 0, issue.done_ratio
|
chris@37
|
255 assert_equal 'Normal', issue.priority.to_s
|
chris@37
|
256 assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
|
chris@37
|
257 end
|
chris@37
|
258
|
chris@37
|
259 def test_add_issue_with_localized_attributes
|
chris@37
|
260 User.find_by_mail('jsmith@somenet.foo').update_attribute 'language', 'fr'
|
chris@37
|
261 issue = submit_email('ticket_with_localized_attributes.eml', :allow_override => 'tracker,category,priority')
|
chris@37
|
262 assert issue.is_a?(Issue)
|
chris@37
|
263 assert !issue.new_record?
|
chris@37
|
264 issue.reload
|
chris@37
|
265 assert_equal 'New ticket on a given project', issue.subject
|
chris@37
|
266 assert_equal User.find_by_login('jsmith'), issue.author
|
chris@37
|
267 assert_equal Project.find(2), issue.project
|
chris@37
|
268 assert_equal 'Feature request', issue.tracker.to_s
|
chris@37
|
269 assert_equal 'Stock management', issue.category.to_s
|
chris@37
|
270 assert_equal 'Urgent', issue.priority.to_s
|
chris@37
|
271 assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
|
chris@37
|
272 end
|
Chris@0
|
273
|
Chris@0
|
274 def test_add_issue_with_japanese_keywords
|
Chris@0
|
275 tracker = Tracker.create!(:name => '開発')
|
Chris@0
|
276 Project.find(1).trackers << tracker
|
Chris@0
|
277 issue = submit_email('japanese_keywords_iso_2022_jp.eml', :issue => {:project => 'ecookbook'}, :allow_override => 'tracker')
|
Chris@0
|
278 assert_kind_of Issue, issue
|
Chris@0
|
279 assert_equal tracker, issue.tracker
|
Chris@0
|
280 end
|
Chris@0
|
281
|
Chris@0
|
282 def test_should_ignore_emails_from_emission_address
|
Chris@0
|
283 Role.anonymous.add_permission!(:add_issues)
|
Chris@0
|
284 assert_no_difference 'User.count' do
|
Chris@0
|
285 assert_equal false, submit_email('ticket_from_emission_address.eml', :issue => {:project => 'ecookbook'}, :unknown_user => 'create')
|
Chris@0
|
286 end
|
Chris@0
|
287 end
|
Chris@0
|
288
|
Chris@0
|
289 def test_add_issue_should_send_email_notification
|
chris@37
|
290 Setting.notified_events = ['issue_added']
|
Chris@0
|
291 ActionMailer::Base.deliveries.clear
|
Chris@0
|
292 # This email contains: 'Project: onlinestore'
|
Chris@0
|
293 issue = submit_email('ticket_on_given_project.eml')
|
Chris@0
|
294 assert issue.is_a?(Issue)
|
Chris@0
|
295 assert_equal 1, ActionMailer::Base.deliveries.size
|
Chris@0
|
296 end
|
Chris@0
|
297
|
Chris@0
|
298 def test_add_issue_note
|
Chris@0
|
299 journal = submit_email('ticket_reply.eml')
|
Chris@0
|
300 assert journal.is_a?(Journal)
|
Chris@0
|
301 assert_equal User.find_by_login('jsmith'), journal.user
|
Chris@0
|
302 assert_equal Issue.find(2), journal.journalized
|
Chris@0
|
303 assert_match /This is reply/, journal.notes
|
Chris@117
|
304 assert_equal 'Feature request', journal.issue.tracker.name
|
Chris@0
|
305 end
|
Chris@0
|
306
|
Chris@0
|
307 def test_add_issue_note_with_attribute_changes
|
Chris@0
|
308 # This email contains: 'Status: Resolved'
|
Chris@0
|
309 journal = submit_email('ticket_reply_with_status.eml')
|
Chris@0
|
310 assert journal.is_a?(Journal)
|
Chris@0
|
311 issue = Issue.find(journal.issue.id)
|
Chris@0
|
312 assert_equal User.find_by_login('jsmith'), journal.user
|
Chris@0
|
313 assert_equal Issue.find(2), journal.journalized
|
Chris@0
|
314 assert_match /This is reply/, journal.notes
|
Chris@117
|
315 assert_equal 'Feature request', journal.issue.tracker.name
|
Chris@0
|
316 assert_equal IssueStatus.find_by_name("Resolved"), issue.status
|
Chris@0
|
317 assert_equal '2010-01-01', issue.start_date.to_s
|
Chris@0
|
318 assert_equal '2010-12-31', issue.due_date.to_s
|
Chris@0
|
319 assert_equal User.find_by_login('jsmith'), issue.assigned_to
|
Chris@117
|
320 assert_equal "52.6", issue.custom_value_for(CustomField.find_by_name('Float field')).value
|
Chris@0
|
321 end
|
Chris@0
|
322
|
Chris@0
|
323 def test_add_issue_note_should_send_email_notification
|
Chris@0
|
324 ActionMailer::Base.deliveries.clear
|
Chris@0
|
325 journal = submit_email('ticket_reply.eml')
|
Chris@0
|
326 assert journal.is_a?(Journal)
|
Chris@0
|
327 assert_equal 1, ActionMailer::Base.deliveries.size
|
Chris@0
|
328 end
|
Chris@0
|
329
|
Chris@117
|
330 def test_add_issue_note_should_not_set_defaults
|
Chris@117
|
331 journal = submit_email('ticket_reply.eml', :issue => {:tracker => 'Support request', :priority => 'High'})
|
Chris@117
|
332 assert journal.is_a?(Journal)
|
Chris@117
|
333 assert_match /This is reply/, journal.notes
|
Chris@117
|
334 assert_equal 'Feature request', journal.issue.tracker.name
|
Chris@117
|
335 assert_equal 'Normal', journal.issue.priority.name
|
Chris@117
|
336 end
|
Chris@117
|
337
|
Chris@0
|
338 def test_reply_to_a_message
|
Chris@0
|
339 m = submit_email('message_reply.eml')
|
Chris@0
|
340 assert m.is_a?(Message)
|
Chris@0
|
341 assert !m.new_record?
|
Chris@0
|
342 m.reload
|
Chris@0
|
343 assert_equal 'Reply via email', m.subject
|
Chris@0
|
344 # The email replies to message #2 which is part of the thread of message #1
|
Chris@0
|
345 assert_equal Message.find(1), m.parent
|
Chris@0
|
346 end
|
Chris@0
|
347
|
Chris@0
|
348 def test_reply_to_a_message_by_subject
|
Chris@0
|
349 m = submit_email('message_reply_by_subject.eml')
|
Chris@0
|
350 assert m.is_a?(Message)
|
Chris@0
|
351 assert !m.new_record?
|
Chris@0
|
352 m.reload
|
Chris@0
|
353 assert_equal 'Reply to the first post', m.subject
|
Chris@0
|
354 assert_equal Message.find(1), m.parent
|
Chris@0
|
355 end
|
Chris@0
|
356
|
Chris@0
|
357 def test_should_strip_tags_of_html_only_emails
|
Chris@0
|
358 issue = submit_email('ticket_html_only.eml', :issue => {:project => 'ecookbook'})
|
Chris@0
|
359 assert issue.is_a?(Issue)
|
Chris@0
|
360 assert !issue.new_record?
|
Chris@0
|
361 issue.reload
|
Chris@0
|
362 assert_equal 'HTML email', issue.subject
|
Chris@0
|
363 assert_equal 'This is a html-only email.', issue.description
|
Chris@0
|
364 end
|
Chris@0
|
365
|
Chris@0
|
366 context "truncate emails based on the Setting" do
|
Chris@0
|
367 context "with no setting" do
|
Chris@0
|
368 setup do
|
Chris@0
|
369 Setting.mail_handler_body_delimiters = ''
|
Chris@0
|
370 end
|
Chris@0
|
371
|
Chris@0
|
372 should "add the entire email into the issue" do
|
Chris@0
|
373 issue = submit_email('ticket_on_given_project.eml')
|
Chris@0
|
374 assert_issue_created(issue)
|
Chris@0
|
375 assert issue.description.include?('---')
|
Chris@0
|
376 assert issue.description.include?('This paragraph is after the delimiter')
|
Chris@0
|
377 end
|
Chris@0
|
378 end
|
Chris@0
|
379
|
Chris@0
|
380 context "with a single string" do
|
Chris@0
|
381 setup do
|
Chris@0
|
382 Setting.mail_handler_body_delimiters = '---'
|
Chris@0
|
383 end
|
Chris@0
|
384
|
Chris@0
|
385 should "truncate the email at the delimiter for the issue" do
|
Chris@0
|
386 issue = submit_email('ticket_on_given_project.eml')
|
Chris@0
|
387 assert_issue_created(issue)
|
Chris@0
|
388 assert issue.description.include?('This paragraph is before delimiters')
|
Chris@0
|
389 assert issue.description.include?('--- This line starts with a delimiter')
|
Chris@0
|
390 assert !issue.description.match(/^---$/)
|
Chris@0
|
391 assert !issue.description.include?('This paragraph is after the delimiter')
|
Chris@0
|
392 end
|
Chris@0
|
393 end
|
Chris@0
|
394
|
chris@37
|
395 context "with a single quoted reply (e.g. reply to a Redmine email notification)" do
|
chris@37
|
396 setup do
|
chris@37
|
397 Setting.mail_handler_body_delimiters = '--- Reply above. Do not remove this line. ---'
|
chris@37
|
398 end
|
chris@37
|
399
|
chris@37
|
400 should "truncate the email at the delimiter with the quoted reply symbols (>)" do
|
chris@37
|
401 journal = submit_email('issue_update_with_quoted_reply_above.eml')
|
chris@37
|
402 assert journal.is_a?(Journal)
|
chris@37
|
403 assert journal.notes.include?('An update to the issue by the sender.')
|
chris@37
|
404 assert !journal.notes.match(Regexp.escape("--- Reply above. Do not remove this line. ---"))
|
chris@37
|
405 assert !journal.notes.include?('Looks like the JSON api for projects was missed.')
|
chris@37
|
406
|
chris@37
|
407 end
|
chris@37
|
408
|
chris@37
|
409 end
|
chris@37
|
410
|
chris@37
|
411 context "with multiple quoted replies (e.g. reply to a reply of a Redmine email notification)" do
|
chris@37
|
412 setup do
|
chris@37
|
413 Setting.mail_handler_body_delimiters = '--- Reply above. Do not remove this line. ---'
|
chris@37
|
414 end
|
chris@37
|
415
|
chris@37
|
416 should "truncate the email at the delimiter with the quoted reply symbols (>)" do
|
chris@37
|
417 journal = submit_email('issue_update_with_multiple_quoted_reply_above.eml')
|
chris@37
|
418 assert journal.is_a?(Journal)
|
chris@37
|
419 assert journal.notes.include?('An update to the issue by the sender.')
|
chris@37
|
420 assert !journal.notes.match(Regexp.escape("--- Reply above. Do not remove this line. ---"))
|
chris@37
|
421 assert !journal.notes.include?('Looks like the JSON api for projects was missed.')
|
chris@37
|
422
|
chris@37
|
423 end
|
chris@37
|
424
|
chris@37
|
425 end
|
chris@37
|
426
|
Chris@0
|
427 context "with multiple strings" do
|
Chris@0
|
428 setup do
|
Chris@0
|
429 Setting.mail_handler_body_delimiters = "---\nBREAK"
|
Chris@0
|
430 end
|
Chris@0
|
431
|
Chris@0
|
432 should "truncate the email at the first delimiter found (BREAK)" do
|
Chris@0
|
433 issue = submit_email('ticket_on_given_project.eml')
|
Chris@0
|
434 assert_issue_created(issue)
|
Chris@0
|
435 assert issue.description.include?('This paragraph is before delimiters')
|
Chris@0
|
436 assert !issue.description.include?('BREAK')
|
Chris@0
|
437 assert !issue.description.include?('This paragraph is between delimiters')
|
Chris@0
|
438 assert !issue.description.match(/^---$/)
|
Chris@0
|
439 assert !issue.description.include?('This paragraph is after the delimiter')
|
Chris@0
|
440 end
|
Chris@0
|
441 end
|
Chris@0
|
442 end
|
Chris@0
|
443
|
Chris@0
|
444 def test_email_with_long_subject_line
|
Chris@0
|
445 issue = submit_email('ticket_with_long_subject.eml')
|
Chris@0
|
446 assert issue.is_a?(Issue)
|
Chris@0
|
447 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
|
448 end
|
Chris@0
|
449
|
Chris@0
|
450 private
|
Chris@0
|
451
|
Chris@0
|
452 def submit_email(filename, options={})
|
Chris@0
|
453 raw = IO.read(File.join(FIXTURES_PATH, filename))
|
Chris@0
|
454 MailHandler.receive(raw, options)
|
Chris@0
|
455 end
|
Chris@0
|
456
|
Chris@0
|
457 def assert_issue_created(issue)
|
Chris@0
|
458 assert issue.is_a?(Issue)
|
Chris@0
|
459 assert !issue.new_record?
|
Chris@0
|
460 issue.reload
|
Chris@0
|
461 end
|
Chris@0
|
462 end
|