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