Chris@0
|
1 # encoding: utf-8
|
Chris@0
|
2 #
|
Chris@0
|
3 # Redmine - project management software
|
Chris@441
|
4 # Copyright (C) 2006-2011 Jean-Philippe Lang
|
Chris@0
|
5 #
|
Chris@0
|
6 # This program is free software; you can redistribute it and/or
|
Chris@0
|
7 # modify it under the terms of the GNU General Public License
|
Chris@0
|
8 # as published by the Free Software Foundation; either version 2
|
Chris@0
|
9 # of the License, or (at your option) any later version.
|
Chris@441
|
10 #
|
Chris@0
|
11 # This program is distributed in the hope that it will be useful,
|
Chris@0
|
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
|
Chris@0
|
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
Chris@0
|
14 # GNU General Public License for more details.
|
Chris@441
|
15 #
|
Chris@0
|
16 # You should have received a copy of the GNU General Public License
|
Chris@0
|
17 # along with this program; if not, write to the Free Software
|
Chris@0
|
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
Chris@0
|
19
|
Chris@119
|
20 require File.expand_path('../../test_helper', __FILE__)
|
Chris@0
|
21
|
Chris@0
|
22 class MailHandlerTest < ActiveSupport::TestCase
|
Chris@441
|
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@119
|
39 :custom_fields_projects,
|
Chris@0
|
40 :boards,
|
Chris@0
|
41 :messages
|
Chris@441
|
42
|
Chris@0
|
43 FIXTURES_PATH = File.dirname(__FILE__) + '/../fixtures/mail_handler'
|
Chris@441
|
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@441
|
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@119
|
57 assert_equal Project.find(2), issue.project
|
Chris@119
|
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@119
|
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@441
|
73 assert !issue.description.match(/^Start Date:/i)
|
Chris@0
|
74 # Email notification should be sent
|
Chris@0
|
75 mail = ActionMailer::Base.deliveries.last
|
Chris@0
|
76 assert_not_nil mail
|
Chris@0
|
77 assert mail.subject.include?('New ticket on a given project')
|
Chris@0
|
78 end
|
Chris@441
|
79
|
Chris@119
|
80 def test_add_issue_with_default_tracker
|
Chris@119
|
81 # This email contains: 'Project: onlinestore'
|
Chris@119
|
82 issue = submit_email('ticket_on_given_project.eml', :issue => {:tracker => 'Support request'})
|
Chris@119
|
83 assert issue.is_a?(Issue)
|
Chris@119
|
84 assert !issue.new_record?
|
Chris@119
|
85 issue.reload
|
Chris@119
|
86 assert_equal 'Support request', issue.tracker.name
|
Chris@119
|
87 end
|
Chris@0
|
88
|
Chris@0
|
89 def test_add_issue_with_status
|
Chris@0
|
90 # This email contains: 'Project: onlinestore' and 'Status: Resolved'
|
Chris@0
|
91 issue = submit_email('ticket_on_given_project.eml')
|
Chris@0
|
92 assert issue.is_a?(Issue)
|
Chris@0
|
93 assert !issue.new_record?
|
Chris@0
|
94 issue.reload
|
Chris@0
|
95 assert_equal Project.find(2), issue.project
|
Chris@0
|
96 assert_equal IssueStatus.find_by_name("Resolved"), issue.status
|
Chris@0
|
97 end
|
Chris@441
|
98
|
Chris@0
|
99 def test_add_issue_with_attributes_override
|
Chris@0
|
100 issue = submit_email('ticket_with_attributes.eml', :allow_override => 'tracker,category,priority')
|
Chris@0
|
101 assert issue.is_a?(Issue)
|
Chris@0
|
102 assert !issue.new_record?
|
Chris@0
|
103 issue.reload
|
Chris@0
|
104 assert_equal 'New ticket on a given project', issue.subject
|
Chris@0
|
105 assert_equal User.find_by_login('jsmith'), issue.author
|
Chris@0
|
106 assert_equal Project.find(2), issue.project
|
Chris@0
|
107 assert_equal 'Feature request', issue.tracker.to_s
|
Chris@0
|
108 assert_equal 'Stock management', issue.category.to_s
|
Chris@0
|
109 assert_equal 'Urgent', issue.priority.to_s
|
Chris@0
|
110 assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
|
Chris@0
|
111 end
|
Chris@441
|
112
|
Chris@0
|
113 def test_add_issue_with_partial_attributes_override
|
Chris@0
|
114 issue = submit_email('ticket_with_attributes.eml', :issue => {:priority => 'High'}, :allow_override => ['tracker'])
|
Chris@0
|
115 assert issue.is_a?(Issue)
|
Chris@0
|
116 assert !issue.new_record?
|
Chris@0
|
117 issue.reload
|
Chris@0
|
118 assert_equal 'New ticket on a given project', issue.subject
|
Chris@0
|
119 assert_equal User.find_by_login('jsmith'), issue.author
|
Chris@0
|
120 assert_equal Project.find(2), issue.project
|
Chris@0
|
121 assert_equal 'Feature request', issue.tracker.to_s
|
Chris@0
|
122 assert_nil issue.category
|
Chris@0
|
123 assert_equal 'High', issue.priority.to_s
|
Chris@0
|
124 assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
|
Chris@0
|
125 end
|
Chris@441
|
126
|
Chris@0
|
127 def test_add_issue_with_spaces_between_attribute_and_separator
|
Chris@0
|
128 issue = submit_email('ticket_with_spaces_between_attribute_and_separator.eml', :allow_override => 'tracker,category,priority')
|
Chris@0
|
129 assert issue.is_a?(Issue)
|
Chris@0
|
130 assert !issue.new_record?
|
Chris@0
|
131 issue.reload
|
Chris@0
|
132 assert_equal 'New ticket on a given project', issue.subject
|
Chris@0
|
133 assert_equal User.find_by_login('jsmith'), issue.author
|
Chris@0
|
134 assert_equal Project.find(2), issue.project
|
Chris@0
|
135 assert_equal 'Feature request', issue.tracker.to_s
|
Chris@0
|
136 assert_equal 'Stock management', issue.category.to_s
|
Chris@0
|
137 assert_equal 'Urgent', issue.priority.to_s
|
Chris@0
|
138 assert issue.description.include?('Lorem ipsum dolor sit amet, consectetuer adipiscing elit.')
|
Chris@0
|
139 end
|
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@441
|
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@441
|
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@441
|
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@441
|
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@441
|
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@441
|
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@119
|
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@441
|
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@441
|
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@441
|
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@441
|
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@441
|
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@119
|
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@119
|
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@119
|
320 assert_equal "52.6", issue.custom_value_for(CustomField.find_by_name('Float field')).value
|
Chris@441
|
321 # keywords should be removed from the email body
|
Chris@441
|
322 assert !journal.notes.match(/^Status:/i)
|
Chris@441
|
323 assert !journal.notes.match(/^Start Date:/i)
|
Chris@0
|
324 end
|
Chris@0
|
325
|
Chris@0
|
326 def test_add_issue_note_should_send_email_notification
|
Chris@0
|
327 ActionMailer::Base.deliveries.clear
|
Chris@0
|
328 journal = submit_email('ticket_reply.eml')
|
Chris@0
|
329 assert journal.is_a?(Journal)
|
Chris@0
|
330 assert_equal 1, ActionMailer::Base.deliveries.size
|
Chris@0
|
331 end
|
Chris@441
|
332
|
Chris@119
|
333 def test_add_issue_note_should_not_set_defaults
|
Chris@119
|
334 journal = submit_email('ticket_reply.eml', :issue => {:tracker => 'Support request', :priority => 'High'})
|
Chris@119
|
335 assert journal.is_a?(Journal)
|
Chris@119
|
336 assert_match /This is reply/, journal.notes
|
Chris@119
|
337 assert_equal 'Feature request', journal.issue.tracker.name
|
Chris@119
|
338 assert_equal 'Normal', journal.issue.priority.name
|
Chris@119
|
339 end
|
Chris@441
|
340
|
Chris@0
|
341 def test_reply_to_a_message
|
Chris@0
|
342 m = submit_email('message_reply.eml')
|
Chris@0
|
343 assert m.is_a?(Message)
|
Chris@0
|
344 assert !m.new_record?
|
Chris@0
|
345 m.reload
|
Chris@0
|
346 assert_equal 'Reply via email', m.subject
|
Chris@0
|
347 # The email replies to message #2 which is part of the thread of message #1
|
Chris@0
|
348 assert_equal Message.find(1), m.parent
|
Chris@0
|
349 end
|
Chris@441
|
350
|
Chris@0
|
351 def test_reply_to_a_message_by_subject
|
Chris@0
|
352 m = submit_email('message_reply_by_subject.eml')
|
Chris@0
|
353 assert m.is_a?(Message)
|
Chris@0
|
354 assert !m.new_record?
|
Chris@0
|
355 m.reload
|
Chris@0
|
356 assert_equal 'Reply to the first post', m.subject
|
Chris@0
|
357 assert_equal Message.find(1), m.parent
|
Chris@0
|
358 end
|
Chris@441
|
359
|
Chris@0
|
360 def test_should_strip_tags_of_html_only_emails
|
Chris@0
|
361 issue = submit_email('ticket_html_only.eml', :issue => {:project => 'ecookbook'})
|
Chris@0
|
362 assert issue.is_a?(Issue)
|
Chris@0
|
363 assert !issue.new_record?
|
Chris@0
|
364 issue.reload
|
Chris@0
|
365 assert_equal 'HTML email', issue.subject
|
Chris@0
|
366 assert_equal 'This is a html-only email.', issue.description
|
Chris@0
|
367 end
|
Chris@0
|
368
|
Chris@0
|
369 context "truncate emails based on the Setting" do
|
Chris@0
|
370 context "with no setting" do
|
Chris@0
|
371 setup do
|
Chris@0
|
372 Setting.mail_handler_body_delimiters = ''
|
Chris@0
|
373 end
|
Chris@0
|
374
|
Chris@0
|
375 should "add the entire email into the issue" do
|
Chris@0
|
376 issue = submit_email('ticket_on_given_project.eml')
|
Chris@0
|
377 assert_issue_created(issue)
|
Chris@0
|
378 assert issue.description.include?('---')
|
Chris@0
|
379 assert issue.description.include?('This paragraph is after the delimiter')
|
Chris@0
|
380 end
|
Chris@0
|
381 end
|
Chris@0
|
382
|
Chris@0
|
383 context "with a single string" do
|
Chris@0
|
384 setup do
|
Chris@0
|
385 Setting.mail_handler_body_delimiters = '---'
|
Chris@0
|
386 end
|
Chris@0
|
387 should "truncate the email at the delimiter for the issue" do
|
Chris@0
|
388 issue = submit_email('ticket_on_given_project.eml')
|
Chris@0
|
389 assert_issue_created(issue)
|
Chris@0
|
390 assert issue.description.include?('This paragraph is before delimiters')
|
Chris@0
|
391 assert issue.description.include?('--- This line starts with a delimiter')
|
Chris@0
|
392 assert !issue.description.match(/^---$/)
|
Chris@0
|
393 assert !issue.description.include?('This paragraph is after the delimiter')
|
Chris@0
|
394 end
|
Chris@0
|
395 end
|
Chris@0
|
396
|
chris@37
|
397 context "with a single quoted reply (e.g. reply to a Redmine email notification)" do
|
chris@37
|
398 setup do
|
chris@37
|
399 Setting.mail_handler_body_delimiters = '--- Reply above. Do not remove this line. ---'
|
chris@37
|
400 end
|
chris@37
|
401 should "truncate the email at the delimiter with the quoted reply symbols (>)" do
|
chris@37
|
402 journal = submit_email('issue_update_with_quoted_reply_above.eml')
|
chris@37
|
403 assert journal.is_a?(Journal)
|
chris@37
|
404 assert journal.notes.include?('An update to the issue by the sender.')
|
chris@37
|
405 assert !journal.notes.match(Regexp.escape("--- Reply above. Do not remove this line. ---"))
|
chris@37
|
406 assert !journal.notes.include?('Looks like the JSON api for projects was missed.')
|
Chris@441
|
407 end
|
Chris@441
|
408 end
|
chris@37
|
409
|
chris@37
|
410 context "with multiple quoted replies (e.g. reply to a reply of a Redmine email notification)" do
|
chris@37
|
411 setup do
|
chris@37
|
412 Setting.mail_handler_body_delimiters = '--- Reply above. Do not remove this line. ---'
|
chris@37
|
413 end
|
chris@37
|
414 should "truncate the email at the delimiter with the quoted reply symbols (>)" do
|
chris@37
|
415 journal = submit_email('issue_update_with_multiple_quoted_reply_above.eml')
|
chris@37
|
416 assert journal.is_a?(Journal)
|
chris@37
|
417 assert journal.notes.include?('An update to the issue by the sender.')
|
chris@37
|
418 assert !journal.notes.match(Regexp.escape("--- Reply above. Do not remove this line. ---"))
|
chris@37
|
419 assert !journal.notes.include?('Looks like the JSON api for projects was missed.')
|
chris@37
|
420 end
|
chris@37
|
421 end
|
chris@37
|
422
|
Chris@0
|
423 context "with multiple strings" do
|
Chris@0
|
424 setup do
|
Chris@0
|
425 Setting.mail_handler_body_delimiters = "---\nBREAK"
|
Chris@0
|
426 end
|
Chris@0
|
427 should "truncate the email at the first delimiter found (BREAK)" do
|
Chris@0
|
428 issue = submit_email('ticket_on_given_project.eml')
|
Chris@0
|
429 assert_issue_created(issue)
|
Chris@0
|
430 assert issue.description.include?('This paragraph is before delimiters')
|
Chris@0
|
431 assert !issue.description.include?('BREAK')
|
Chris@0
|
432 assert !issue.description.include?('This paragraph is between delimiters')
|
Chris@0
|
433 assert !issue.description.match(/^---$/)
|
Chris@0
|
434 assert !issue.description.include?('This paragraph is after the delimiter')
|
Chris@0
|
435 end
|
Chris@0
|
436 end
|
Chris@0
|
437 end
|
Chris@441
|
438
|
Chris@0
|
439 def test_email_with_long_subject_line
|
Chris@0
|
440 issue = submit_email('ticket_with_long_subject.eml')
|
Chris@0
|
441 assert issue.is_a?(Issue)
|
Chris@0
|
442 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
|
443 end
|
Chris@0
|
444
|
Chris@0
|
445 private
|
Chris@441
|
446
|
Chris@0
|
447 def submit_email(filename, options={})
|
Chris@0
|
448 raw = IO.read(File.join(FIXTURES_PATH, filename))
|
Chris@0
|
449 MailHandler.receive(raw, options)
|
Chris@0
|
450 end
|
Chris@0
|
451
|
Chris@0
|
452 def assert_issue_created(issue)
|
Chris@0
|
453 assert issue.is_a?(Issue)
|
Chris@0
|
454 assert !issue.new_record?
|
Chris@0
|
455 issue.reload
|
Chris@0
|
456 end
|
Chris@0
|
457 end
|