Chris@245
|
1 # Redmine - project management software
|
Chris@1115
|
2 # Copyright (C) 2006-2012 Jean-Philippe Lang
|
Chris@0
|
3 #
|
Chris@0
|
4 # This program is free software; you can redistribute it and/or
|
Chris@0
|
5 # modify it under the terms of the GNU General Public License
|
Chris@0
|
6 # as published by the Free Software Foundation; either version 2
|
Chris@0
|
7 # of the License, or (at your option) any later version.
|
Chris@441
|
8 #
|
Chris@0
|
9 # This program is distributed in the hope that it will be useful,
|
Chris@0
|
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
|
Chris@0
|
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
Chris@0
|
12 # GNU General Public License for more details.
|
Chris@441
|
13 #
|
Chris@0
|
14 # You should have received a copy of the GNU General Public License
|
Chris@0
|
15 # along with this program; if not, write to the Free Software
|
Chris@0
|
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
Chris@0
|
17
|
Chris@119
|
18 require File.expand_path('../../test_helper', __FILE__)
|
Chris@0
|
19
|
Chris@0
|
20 class IssueTest < ActiveSupport::TestCase
|
Chris@0
|
21 fixtures :projects, :users, :members, :member_roles, :roles,
|
Chris@1115
|
22 :groups_users,
|
Chris@0
|
23 :trackers, :projects_trackers,
|
Chris@0
|
24 :enabled_modules,
|
Chris@0
|
25 :versions,
|
Chris@441
|
26 :issue_statuses, :issue_categories, :issue_relations, :workflows,
|
Chris@0
|
27 :enumerations,
|
Chris@1115
|
28 :issues, :journals, :journal_details,
|
Chris@0
|
29 :custom_fields, :custom_fields_projects, :custom_fields_trackers, :custom_values,
|
Chris@0
|
30 :time_entries
|
Chris@0
|
31
|
Chris@1115
|
32 include Redmine::I18n
|
Chris@1115
|
33
|
Chris@1115
|
34 def teardown
|
Chris@1115
|
35 User.current = nil
|
Chris@1115
|
36 end
|
Chris@1115
|
37
|
Chris@0
|
38 def test_create
|
Chris@909
|
39 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 3,
|
Chris@909
|
40 :status_id => 1, :priority => IssuePriority.all.first,
|
Chris@909
|
41 :subject => 'test_create',
|
Chris@909
|
42 :description => 'IssueTest#test_create', :estimated_hours => '1:30')
|
Chris@0
|
43 assert issue.save
|
Chris@0
|
44 issue.reload
|
Chris@0
|
45 assert_equal 1.5, issue.estimated_hours
|
Chris@0
|
46 end
|
Chris@441
|
47
|
Chris@0
|
48 def test_create_minimal
|
Chris@909
|
49 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 3,
|
Chris@909
|
50 :status_id => 1, :priority => IssuePriority.all.first,
|
Chris@909
|
51 :subject => 'test_create')
|
Chris@0
|
52 assert issue.save
|
Chris@0
|
53 assert issue.description.nil?
|
Chris@1115
|
54 assert_nil issue.estimated_hours
|
Chris@1115
|
55 end
|
Chris@1115
|
56
|
Chris@1115
|
57 def test_start_date_format_should_be_validated
|
Chris@1115
|
58 set_language_if_valid 'en'
|
Chris@1115
|
59 ['2012', 'ABC', '2012-15-20'].each do |invalid_date|
|
Chris@1115
|
60 issue = Issue.new(:start_date => invalid_date)
|
Chris@1115
|
61 assert !issue.valid?
|
Chris@1115
|
62 assert_include 'Start date is not a valid date', issue.errors.full_messages, "No error found for invalid date #{invalid_date}"
|
Chris@1115
|
63 end
|
Chris@1115
|
64 end
|
Chris@1115
|
65
|
Chris@1115
|
66 def test_due_date_format_should_be_validated
|
Chris@1115
|
67 set_language_if_valid 'en'
|
Chris@1115
|
68 ['2012', 'ABC', '2012-15-20'].each do |invalid_date|
|
Chris@1115
|
69 issue = Issue.new(:due_date => invalid_date)
|
Chris@1115
|
70 assert !issue.valid?
|
Chris@1115
|
71 assert_include 'Due date is not a valid date', issue.errors.full_messages, "No error found for invalid date #{invalid_date}"
|
Chris@1115
|
72 end
|
Chris@1115
|
73 end
|
Chris@1115
|
74
|
Chris@1115
|
75 def test_due_date_lesser_than_start_date_should_not_validate
|
Chris@1115
|
76 set_language_if_valid 'en'
|
Chris@1115
|
77 issue = Issue.new(:start_date => '2012-10-06', :due_date => '2012-10-02')
|
Chris@1115
|
78 assert !issue.valid?
|
Chris@1115
|
79 assert_include 'Due date must be greater than start date', issue.errors.full_messages
|
Chris@0
|
80 end
|
Chris@441
|
81
|
Chris@0
|
82 def test_create_with_required_custom_field
|
Chris@1115
|
83 set_language_if_valid 'en'
|
Chris@0
|
84 field = IssueCustomField.find_by_name('Database')
|
Chris@0
|
85 field.update_attribute(:is_required, true)
|
Chris@441
|
86
|
Chris@909
|
87 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1,
|
Chris@909
|
88 :status_id => 1, :subject => 'test_create',
|
Chris@909
|
89 :description => 'IssueTest#test_create_with_required_custom_field')
|
Chris@0
|
90 assert issue.available_custom_fields.include?(field)
|
Chris@0
|
91 # No value for the custom field
|
Chris@0
|
92 assert !issue.save
|
Chris@1115
|
93 assert_equal ["Database can't be blank"], issue.errors.full_messages
|
Chris@0
|
94 # Blank value
|
Chris@0
|
95 issue.custom_field_values = { field.id => '' }
|
Chris@0
|
96 assert !issue.save
|
Chris@1115
|
97 assert_equal ["Database can't be blank"], issue.errors.full_messages
|
Chris@0
|
98 # Invalid value
|
Chris@0
|
99 issue.custom_field_values = { field.id => 'SQLServer' }
|
Chris@0
|
100 assert !issue.save
|
Chris@1115
|
101 assert_equal ["Database is not included in the list"], issue.errors.full_messages
|
Chris@0
|
102 # Valid value
|
Chris@0
|
103 issue.custom_field_values = { field.id => 'PostgreSQL' }
|
Chris@0
|
104 assert issue.save
|
Chris@0
|
105 issue.reload
|
Chris@0
|
106 assert_equal 'PostgreSQL', issue.custom_value_for(field).value
|
Chris@0
|
107 end
|
Chris@441
|
108
|
Chris@909
|
109 def test_create_with_group_assignment
|
Chris@909
|
110 with_settings :issue_group_assignment => '1' do
|
Chris@909
|
111 assert Issue.new(:project_id => 2, :tracker_id => 1, :author_id => 1,
|
Chris@909
|
112 :subject => 'Group assignment',
|
Chris@909
|
113 :assigned_to_id => 11).save
|
Chris@909
|
114 issue = Issue.first(:order => 'id DESC')
|
Chris@909
|
115 assert_kind_of Group, issue.assigned_to
|
Chris@909
|
116 assert_equal Group.find(11), issue.assigned_to
|
Chris@909
|
117 end
|
Chris@909
|
118 end
|
Chris@909
|
119
|
Chris@1115
|
120 def test_create_with_parent_issue_id
|
Chris@1115
|
121 issue = Issue.new(:project_id => 1, :tracker_id => 1,
|
Chris@1115
|
122 :author_id => 1, :subject => 'Group assignment',
|
Chris@1115
|
123 :parent_issue_id => 1)
|
Chris@1115
|
124 assert_save issue
|
Chris@1115
|
125 assert_equal 1, issue.parent_issue_id
|
Chris@1115
|
126 assert_equal Issue.find(1), issue.parent
|
Chris@1115
|
127 end
|
Chris@1115
|
128
|
Chris@1115
|
129 def test_create_with_sharp_parent_issue_id
|
Chris@1115
|
130 issue = Issue.new(:project_id => 1, :tracker_id => 1,
|
Chris@1115
|
131 :author_id => 1, :subject => 'Group assignment',
|
Chris@1115
|
132 :parent_issue_id => "#1")
|
Chris@1115
|
133 assert_save issue
|
Chris@1115
|
134 assert_equal 1, issue.parent_issue_id
|
Chris@1115
|
135 assert_equal Issue.find(1), issue.parent
|
Chris@1115
|
136 end
|
Chris@1115
|
137
|
Chris@1115
|
138 def test_create_with_invalid_parent_issue_id
|
Chris@1115
|
139 set_language_if_valid 'en'
|
Chris@1115
|
140 issue = Issue.new(:project_id => 1, :tracker_id => 1,
|
Chris@1115
|
141 :author_id => 1, :subject => 'Group assignment',
|
Chris@1115
|
142 :parent_issue_id => '01ABC')
|
Chris@1115
|
143 assert !issue.save
|
Chris@1115
|
144 assert_equal '01ABC', issue.parent_issue_id
|
Chris@1115
|
145 assert_include 'Parent task is invalid', issue.errors.full_messages
|
Chris@1115
|
146 end
|
Chris@1115
|
147
|
Chris@1115
|
148 def test_create_with_invalid_sharp_parent_issue_id
|
Chris@1115
|
149 set_language_if_valid 'en'
|
Chris@1115
|
150 issue = Issue.new(:project_id => 1, :tracker_id => 1,
|
Chris@1115
|
151 :author_id => 1, :subject => 'Group assignment',
|
Chris@1115
|
152 :parent_issue_id => '#01ABC')
|
Chris@1115
|
153 assert !issue.save
|
Chris@1115
|
154 assert_equal '#01ABC', issue.parent_issue_id
|
Chris@1115
|
155 assert_include 'Parent task is invalid', issue.errors.full_messages
|
Chris@1115
|
156 end
|
Chris@1115
|
157
|
Chris@441
|
158 def assert_visibility_match(user, issues)
|
Chris@441
|
159 assert_equal issues.collect(&:id).sort, Issue.all.select {|issue| issue.visible?(user)}.collect(&:id).sort
|
Chris@441
|
160 end
|
Chris@441
|
161
|
Chris@0
|
162 def test_visible_scope_for_anonymous
|
Chris@0
|
163 # Anonymous user should see issues of public projects only
|
Chris@0
|
164 issues = Issue.visible(User.anonymous).all
|
Chris@0
|
165 assert issues.any?
|
Chris@0
|
166 assert_nil issues.detect {|issue| !issue.project.is_public?}
|
Chris@441
|
167 assert_nil issues.detect {|issue| issue.is_private?}
|
Chris@441
|
168 assert_visibility_match User.anonymous, issues
|
Chris@441
|
169 end
|
Chris@441
|
170
|
Chris@441
|
171 def test_visible_scope_for_anonymous_without_view_issues_permissions
|
Chris@0
|
172 # Anonymous user should not see issues without permission
|
Chris@0
|
173 Role.anonymous.remove_permission!(:view_issues)
|
Chris@0
|
174 issues = Issue.visible(User.anonymous).all
|
Chris@0
|
175 assert issues.empty?
|
Chris@441
|
176 assert_visibility_match User.anonymous, issues
|
Chris@0
|
177 end
|
Chris@441
|
178
|
Chris@1115
|
179 def test_anonymous_should_not_see_private_issues_with_issues_visibility_set_to_default
|
Chris@1115
|
180 assert Role.anonymous.update_attribute(:issues_visibility, 'default')
|
Chris@1115
|
181 issue = Issue.generate!(:author => User.anonymous, :assigned_to => User.anonymous, :is_private => true)
|
Chris@1115
|
182 assert_nil Issue.where(:id => issue.id).visible(User.anonymous).first
|
Chris@1115
|
183 assert !issue.visible?(User.anonymous)
|
Chris@1115
|
184 end
|
Chris@1115
|
185
|
Chris@1115
|
186 def test_anonymous_should_not_see_private_issues_with_issues_visibility_set_to_own
|
Chris@1115
|
187 assert Role.anonymous.update_attribute(:issues_visibility, 'own')
|
Chris@1115
|
188 issue = Issue.generate!(:author => User.anonymous, :assigned_to => User.anonymous, :is_private => true)
|
Chris@1115
|
189 assert_nil Issue.where(:id => issue.id).visible(User.anonymous).first
|
Chris@1115
|
190 assert !issue.visible?(User.anonymous)
|
Chris@1115
|
191 end
|
Chris@1115
|
192
|
Chris@441
|
193 def test_visible_scope_for_non_member
|
Chris@0
|
194 user = User.find(9)
|
Chris@0
|
195 assert user.projects.empty?
|
Chris@0
|
196 # Non member user should see issues of public projects only
|
Chris@0
|
197 issues = Issue.visible(user).all
|
Chris@0
|
198 assert issues.any?
|
Chris@0
|
199 assert_nil issues.detect {|issue| !issue.project.is_public?}
|
Chris@441
|
200 assert_nil issues.detect {|issue| issue.is_private?}
|
Chris@441
|
201 assert_visibility_match user, issues
|
Chris@441
|
202 end
|
Chris@441
|
203
|
Chris@441
|
204 def test_visible_scope_for_non_member_with_own_issues_visibility
|
Chris@441
|
205 Role.non_member.update_attribute :issues_visibility, 'own'
|
Chris@441
|
206 Issue.create!(:project_id => 1, :tracker_id => 1, :author_id => 9, :subject => 'Issue by non member')
|
Chris@441
|
207 user = User.find(9)
|
Chris@441
|
208
|
Chris@441
|
209 issues = Issue.visible(user).all
|
Chris@441
|
210 assert issues.any?
|
Chris@441
|
211 assert_nil issues.detect {|issue| issue.author != user}
|
Chris@441
|
212 assert_visibility_match user, issues
|
Chris@441
|
213 end
|
Chris@441
|
214
|
Chris@441
|
215 def test_visible_scope_for_non_member_without_view_issues_permissions
|
Chris@0
|
216 # Non member user should not see issues without permission
|
Chris@0
|
217 Role.non_member.remove_permission!(:view_issues)
|
Chris@441
|
218 user = User.find(9)
|
Chris@441
|
219 assert user.projects.empty?
|
Chris@0
|
220 issues = Issue.visible(user).all
|
Chris@0
|
221 assert issues.empty?
|
Chris@441
|
222 assert_visibility_match user, issues
|
Chris@441
|
223 end
|
Chris@441
|
224
|
Chris@441
|
225 def test_visible_scope_for_member
|
Chris@441
|
226 user = User.find(9)
|
Chris@0
|
227 # User should see issues of projects for which he has view_issues permissions only
|
Chris@441
|
228 Role.non_member.remove_permission!(:view_issues)
|
Chris@441
|
229 Member.create!(:principal => user, :project_id => 3, :role_ids => [2])
|
Chris@0
|
230 issues = Issue.visible(user).all
|
Chris@0
|
231 assert issues.any?
|
Chris@441
|
232 assert_nil issues.detect {|issue| issue.project_id != 3}
|
Chris@441
|
233 assert_nil issues.detect {|issue| issue.is_private?}
|
Chris@441
|
234 assert_visibility_match user, issues
|
Chris@0
|
235 end
|
Chris@441
|
236
|
Chris@909
|
237 def test_visible_scope_for_member_with_groups_should_return_assigned_issues
|
Chris@909
|
238 user = User.find(8)
|
Chris@909
|
239 assert user.groups.any?
|
Chris@909
|
240 Member.create!(:principal => user.groups.first, :project_id => 1, :role_ids => [2])
|
Chris@909
|
241 Role.non_member.remove_permission!(:view_issues)
|
Chris@909
|
242
|
Chris@909
|
243 issue = Issue.create(:project_id => 1, :tracker_id => 1, :author_id => 3,
|
Chris@909
|
244 :status_id => 1, :priority => IssuePriority.all.first,
|
Chris@909
|
245 :subject => 'Assignment test',
|
Chris@909
|
246 :assigned_to => user.groups.first,
|
Chris@909
|
247 :is_private => true)
|
Chris@909
|
248
|
Chris@909
|
249 Role.find(2).update_attribute :issues_visibility, 'default'
|
Chris@909
|
250 issues = Issue.visible(User.find(8)).all
|
Chris@909
|
251 assert issues.any?
|
Chris@909
|
252 assert issues.include?(issue)
|
Chris@909
|
253
|
Chris@909
|
254 Role.find(2).update_attribute :issues_visibility, 'own'
|
Chris@909
|
255 issues = Issue.visible(User.find(8)).all
|
Chris@909
|
256 assert issues.any?
|
Chris@909
|
257 assert issues.include?(issue)
|
Chris@909
|
258 end
|
Chris@909
|
259
|
Chris@0
|
260 def test_visible_scope_for_admin
|
Chris@0
|
261 user = User.find(1)
|
Chris@0
|
262 user.members.each(&:destroy)
|
Chris@0
|
263 assert user.projects.empty?
|
Chris@0
|
264 issues = Issue.visible(user).all
|
Chris@0
|
265 assert issues.any?
|
Chris@0
|
266 # Admin should see issues on private projects that he does not belong to
|
Chris@0
|
267 assert issues.detect {|issue| !issue.project.is_public?}
|
Chris@441
|
268 # Admin should see private issues of other users
|
Chris@441
|
269 assert issues.detect {|issue| issue.is_private? && issue.author != user}
|
Chris@441
|
270 assert_visibility_match user, issues
|
Chris@0
|
271 end
|
Chris@441
|
272
|
Chris@441
|
273 def test_visible_scope_with_project
|
Chris@441
|
274 project = Project.find(1)
|
Chris@441
|
275 issues = Issue.visible(User.find(2), :project => project).all
|
Chris@441
|
276 projects = issues.collect(&:project).uniq
|
Chris@441
|
277 assert_equal 1, projects.size
|
Chris@441
|
278 assert_equal project, projects.first
|
Chris@441
|
279 end
|
Chris@441
|
280
|
Chris@441
|
281 def test_visible_scope_with_project_and_subprojects
|
Chris@441
|
282 project = Project.find(1)
|
Chris@441
|
283 issues = Issue.visible(User.find(2), :project => project, :with_subprojects => true).all
|
Chris@441
|
284 projects = issues.collect(&:project).uniq
|
Chris@441
|
285 assert projects.size > 1
|
Chris@441
|
286 assert_equal [], projects.select {|p| !p.is_or_is_descendant_of?(project)}
|
Chris@441
|
287 end
|
Chris@441
|
288
|
Chris@441
|
289 def test_visible_and_nested_set_scopes
|
Chris@441
|
290 assert_equal 0, Issue.find(1).descendants.visible.all.size
|
Chris@441
|
291 end
|
Chris@441
|
292
|
Chris@1115
|
293 def test_open_scope
|
Chris@1115
|
294 issues = Issue.open.all
|
Chris@1115
|
295 assert_nil issues.detect(&:closed?)
|
Chris@1115
|
296 end
|
Chris@1115
|
297
|
Chris@1115
|
298 def test_open_scope_with_arg
|
Chris@1115
|
299 issues = Issue.open(false).all
|
Chris@1115
|
300 assert_equal issues, issues.select(&:closed?)
|
Chris@1115
|
301 end
|
Chris@1115
|
302
|
Chris@0
|
303 def test_errors_full_messages_should_include_custom_fields_errors
|
Chris@0
|
304 field = IssueCustomField.find_by_name('Database')
|
Chris@441
|
305
|
Chris@909
|
306 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1,
|
Chris@909
|
307 :status_id => 1, :subject => 'test_create',
|
Chris@909
|
308 :description => 'IssueTest#test_create_with_required_custom_field')
|
Chris@0
|
309 assert issue.available_custom_fields.include?(field)
|
Chris@0
|
310 # Invalid value
|
Chris@0
|
311 issue.custom_field_values = { field.id => 'SQLServer' }
|
Chris@441
|
312
|
Chris@0
|
313 assert !issue.valid?
|
Chris@0
|
314 assert_equal 1, issue.errors.full_messages.size
|
Chris@909
|
315 assert_equal "Database #{I18n.translate('activerecord.errors.messages.inclusion')}",
|
Chris@909
|
316 issue.errors.full_messages.first
|
Chris@0
|
317 end
|
Chris@441
|
318
|
Chris@0
|
319 def test_update_issue_with_required_custom_field
|
Chris@0
|
320 field = IssueCustomField.find_by_name('Database')
|
Chris@0
|
321 field.update_attribute(:is_required, true)
|
Chris@441
|
322
|
Chris@0
|
323 issue = Issue.find(1)
|
Chris@0
|
324 assert_nil issue.custom_value_for(field)
|
Chris@0
|
325 assert issue.available_custom_fields.include?(field)
|
Chris@0
|
326 # No change to custom values, issue can be saved
|
Chris@0
|
327 assert issue.save
|
Chris@0
|
328 # Blank value
|
Chris@0
|
329 issue.custom_field_values = { field.id => '' }
|
Chris@0
|
330 assert !issue.save
|
Chris@0
|
331 # Valid value
|
Chris@0
|
332 issue.custom_field_values = { field.id => 'PostgreSQL' }
|
Chris@0
|
333 assert issue.save
|
Chris@0
|
334 issue.reload
|
Chris@0
|
335 assert_equal 'PostgreSQL', issue.custom_value_for(field).value
|
Chris@0
|
336 end
|
Chris@441
|
337
|
Chris@0
|
338 def test_should_not_update_attributes_if_custom_fields_validation_fails
|
Chris@0
|
339 issue = Issue.find(1)
|
Chris@0
|
340 field = IssueCustomField.find_by_name('Database')
|
Chris@0
|
341 assert issue.available_custom_fields.include?(field)
|
Chris@441
|
342
|
Chris@0
|
343 issue.custom_field_values = { field.id => 'Invalid' }
|
Chris@0
|
344 issue.subject = 'Should be not be saved'
|
Chris@0
|
345 assert !issue.save
|
Chris@441
|
346
|
Chris@0
|
347 issue.reload
|
Chris@0
|
348 assert_equal "Can't print recipes", issue.subject
|
Chris@0
|
349 end
|
Chris@441
|
350
|
Chris@0
|
351 def test_should_not_recreate_custom_values_objects_on_update
|
Chris@0
|
352 field = IssueCustomField.find_by_name('Database')
|
Chris@441
|
353
|
Chris@0
|
354 issue = Issue.find(1)
|
Chris@0
|
355 issue.custom_field_values = { field.id => 'PostgreSQL' }
|
Chris@0
|
356 assert issue.save
|
Chris@0
|
357 custom_value = issue.custom_value_for(field)
|
Chris@0
|
358 issue.reload
|
Chris@0
|
359 issue.custom_field_values = { field.id => 'MySQL' }
|
Chris@0
|
360 assert issue.save
|
Chris@0
|
361 issue.reload
|
Chris@0
|
362 assert_equal custom_value.id, issue.custom_value_for(field).id
|
Chris@0
|
363 end
|
Chris@441
|
364
|
Chris@909
|
365 def test_should_not_update_custom_fields_on_changing_tracker_with_different_custom_fields
|
Chris@1115
|
366 issue = Issue.create!(:project_id => 1, :tracker_id => 1, :author_id => 1,
|
Chris@1115
|
367 :status_id => 1, :subject => 'Test',
|
Chris@1115
|
368 :custom_field_values => {'2' => 'Test'})
|
Chris@909
|
369 assert !Tracker.find(2).custom_field_ids.include?(2)
|
Chris@909
|
370
|
Chris@909
|
371 issue = Issue.find(issue.id)
|
Chris@909
|
372 issue.attributes = {:tracker_id => 2, :custom_field_values => {'1' => ''}}
|
Chris@909
|
373
|
Chris@909
|
374 issue = Issue.find(issue.id)
|
Chris@909
|
375 custom_value = issue.custom_value_for(2)
|
Chris@909
|
376 assert_not_nil custom_value
|
Chris@909
|
377 assert_equal 'Test', custom_value.value
|
Chris@909
|
378 end
|
Chris@909
|
379
|
Chris@0
|
380 def test_assigning_tracker_id_should_reload_custom_fields_values
|
Chris@0
|
381 issue = Issue.new(:project => Project.find(1))
|
Chris@0
|
382 assert issue.custom_field_values.empty?
|
Chris@0
|
383 issue.tracker_id = 1
|
Chris@0
|
384 assert issue.custom_field_values.any?
|
Chris@0
|
385 end
|
Chris@441
|
386
|
Chris@1115
|
387 def test_assigning_attributes_should_assign_project_and_tracker_first
|
Chris@1115
|
388 seq = sequence('seq')
|
Chris@1115
|
389 issue = Issue.new
|
Chris@1115
|
390 issue.expects(:project_id=).in_sequence(seq)
|
Chris@1115
|
391 issue.expects(:tracker_id=).in_sequence(seq)
|
Chris@1115
|
392 issue.expects(:subject=).in_sequence(seq)
|
Chris@1115
|
393 issue.attributes = {:tracker_id => 2, :project_id => 1, :subject => 'Test'}
|
Chris@1115
|
394 end
|
Chris@1115
|
395
|
Chris@1115
|
396 def test_assigning_tracker_and_custom_fields_should_assign_custom_fields
|
Chris@0
|
397 attributes = ActiveSupport::OrderedHash.new
|
Chris@0
|
398 attributes['custom_field_values'] = { '1' => 'MySQL' }
|
Chris@0
|
399 attributes['tracker_id'] = '1'
|
Chris@0
|
400 issue = Issue.new(:project => Project.find(1))
|
Chris@0
|
401 issue.attributes = attributes
|
Chris@1115
|
402 assert_equal 'MySQL', issue.custom_field_value(1)
|
Chris@0
|
403 end
|
Chris@441
|
404
|
Chris@0
|
405 def test_should_update_issue_with_disabled_tracker
|
Chris@0
|
406 p = Project.find(1)
|
Chris@0
|
407 issue = Issue.find(1)
|
Chris@441
|
408
|
Chris@0
|
409 p.trackers.delete(issue.tracker)
|
Chris@0
|
410 assert !p.trackers.include?(issue.tracker)
|
Chris@441
|
411
|
Chris@0
|
412 issue.reload
|
Chris@0
|
413 issue.subject = 'New subject'
|
Chris@0
|
414 assert issue.save
|
Chris@0
|
415 end
|
Chris@441
|
416
|
Chris@0
|
417 def test_should_not_set_a_disabled_tracker
|
Chris@0
|
418 p = Project.find(1)
|
Chris@0
|
419 p.trackers.delete(Tracker.find(2))
|
Chris@441
|
420
|
Chris@0
|
421 issue = Issue.find(1)
|
Chris@0
|
422 issue.tracker_id = 2
|
Chris@0
|
423 issue.subject = 'New subject'
|
Chris@0
|
424 assert !issue.save
|
Chris@909
|
425 assert_not_nil issue.errors[:tracker_id]
|
Chris@0
|
426 end
|
Chris@441
|
427
|
Chris@0
|
428 def test_category_based_assignment
|
Chris@909
|
429 issue = Issue.create(:project_id => 1, :tracker_id => 1, :author_id => 3,
|
Chris@909
|
430 :status_id => 1, :priority => IssuePriority.all.first,
|
Chris@909
|
431 :subject => 'Assignment test',
|
Chris@909
|
432 :description => 'Assignment test', :category_id => 1)
|
Chris@0
|
433 assert_equal IssueCategory.find(1).assigned_to, issue.assigned_to
|
Chris@0
|
434 end
|
Chris@441
|
435
|
Chris@245
|
436 def test_new_statuses_allowed_to
|
Chris@1115
|
437 WorkflowTransition.delete_all
|
Chris@1115
|
438 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1,
|
Chris@1115
|
439 :old_status_id => 1, :new_status_id => 2,
|
Chris@1115
|
440 :author => false, :assignee => false)
|
Chris@1115
|
441 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1,
|
Chris@1115
|
442 :old_status_id => 1, :new_status_id => 3,
|
Chris@1115
|
443 :author => true, :assignee => false)
|
Chris@1115
|
444 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1,
|
Chris@1115
|
445 :new_status_id => 4, :author => false,
|
Chris@1115
|
446 :assignee => true)
|
Chris@1115
|
447 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1,
|
Chris@1115
|
448 :old_status_id => 1, :new_status_id => 5,
|
Chris@1115
|
449 :author => true, :assignee => true)
|
Chris@245
|
450 status = IssueStatus.find(1)
|
Chris@245
|
451 role = Role.find(1)
|
Chris@245
|
452 tracker = Tracker.find(1)
|
Chris@245
|
453 user = User.find(2)
|
Chris@441
|
454
|
Chris@1115
|
455 issue = Issue.generate!(:tracker => tracker, :status => status,
|
Chris@1115
|
456 :project_id => 1, :author_id => 1)
|
Chris@245
|
457 assert_equal [1, 2], issue.new_statuses_allowed_to(user).map(&:id)
|
Chris@441
|
458
|
Chris@1115
|
459 issue = Issue.generate!(:tracker => tracker, :status => status,
|
Chris@1115
|
460 :project_id => 1, :author => user)
|
Chris@909
|
461 assert_equal [1, 2, 3, 5], issue.new_statuses_allowed_to(user).map(&:id)
|
Chris@441
|
462
|
Chris@1115
|
463 issue = Issue.generate!(:tracker => tracker, :status => status,
|
Chris@1115
|
464 :project_id => 1, :author_id => 1,
|
Chris@1115
|
465 :assigned_to => user)
|
Chris@909
|
466 assert_equal [1, 2, 4, 5], issue.new_statuses_allowed_to(user).map(&:id)
|
Chris@441
|
467
|
Chris@1115
|
468 issue = Issue.generate!(:tracker => tracker, :status => status,
|
Chris@1115
|
469 :project_id => 1, :author => user,
|
Chris@1115
|
470 :assigned_to => user)
|
Chris@245
|
471 assert_equal [1, 2, 3, 4, 5], issue.new_statuses_allowed_to(user).map(&:id)
|
Chris@245
|
472 end
|
Chris@441
|
473
|
Chris@1115
|
474 def test_new_statuses_allowed_to_should_return_all_transitions_for_admin
|
Chris@1115
|
475 admin = User.find(1)
|
Chris@1115
|
476 issue = Issue.find(1)
|
Chris@1115
|
477 assert !admin.member_of?(issue.project)
|
Chris@1115
|
478 expected_statuses = [issue.status] +
|
Chris@1115
|
479 WorkflowTransition.find_all_by_old_status_id(
|
Chris@1115
|
480 issue.status_id).map(&:new_status).uniq.sort
|
Chris@1115
|
481 assert_equal expected_statuses, issue.new_statuses_allowed_to(admin)
|
Chris@1115
|
482 end
|
Chris@1115
|
483
|
Chris@1115
|
484 def test_new_statuses_allowed_to_should_return_default_and_current_status_when_copying
|
Chris@1115
|
485 issue = Issue.find(1).copy
|
Chris@1115
|
486 assert_equal [1], issue.new_statuses_allowed_to(User.find(2)).map(&:id)
|
Chris@1115
|
487
|
Chris@1115
|
488 issue = Issue.find(2).copy
|
Chris@1115
|
489 assert_equal [1, 2], issue.new_statuses_allowed_to(User.find(2)).map(&:id)
|
Chris@1115
|
490 end
|
Chris@1115
|
491
|
Chris@1115
|
492 def test_safe_attributes_names_should_not_include_disabled_field
|
Chris@1115
|
493 tracker = Tracker.new(:core_fields => %w(assigned_to_id fixed_version_id))
|
Chris@1115
|
494
|
Chris@1115
|
495 issue = Issue.new(:tracker => tracker)
|
Chris@1115
|
496 assert_include 'tracker_id', issue.safe_attribute_names
|
Chris@1115
|
497 assert_include 'status_id', issue.safe_attribute_names
|
Chris@1115
|
498 assert_include 'subject', issue.safe_attribute_names
|
Chris@1115
|
499 assert_include 'description', issue.safe_attribute_names
|
Chris@1115
|
500 assert_include 'custom_field_values', issue.safe_attribute_names
|
Chris@1115
|
501 assert_include 'custom_fields', issue.safe_attribute_names
|
Chris@1115
|
502 assert_include 'lock_version', issue.safe_attribute_names
|
Chris@1115
|
503
|
Chris@1115
|
504 tracker.core_fields.each do |field|
|
Chris@1115
|
505 assert_include field, issue.safe_attribute_names
|
Chris@1115
|
506 end
|
Chris@1115
|
507
|
Chris@1115
|
508 tracker.disabled_core_fields.each do |field|
|
Chris@1115
|
509 assert_not_include field, issue.safe_attribute_names
|
Chris@1115
|
510 end
|
Chris@1115
|
511 end
|
Chris@1115
|
512
|
Chris@1115
|
513 def test_safe_attributes_should_ignore_disabled_fields
|
Chris@1115
|
514 tracker = Tracker.find(1)
|
Chris@1115
|
515 tracker.core_fields = %w(assigned_to_id due_date)
|
Chris@1115
|
516 tracker.save!
|
Chris@1115
|
517
|
Chris@1115
|
518 issue = Issue.new(:tracker => tracker)
|
Chris@1115
|
519 issue.safe_attributes = {'start_date' => '2012-07-14', 'due_date' => '2012-07-14'}
|
Chris@1115
|
520 assert_nil issue.start_date
|
Chris@1115
|
521 assert_equal Date.parse('2012-07-14'), issue.due_date
|
Chris@1115
|
522 end
|
Chris@1115
|
523
|
Chris@1115
|
524 def test_safe_attributes_should_accept_target_tracker_enabled_fields
|
Chris@1115
|
525 source = Tracker.find(1)
|
Chris@1115
|
526 source.core_fields = []
|
Chris@1115
|
527 source.save!
|
Chris@1115
|
528 target = Tracker.find(2)
|
Chris@1115
|
529 target.core_fields = %w(assigned_to_id due_date)
|
Chris@1115
|
530 target.save!
|
Chris@1115
|
531
|
Chris@1115
|
532 issue = Issue.new(:tracker => source)
|
Chris@1115
|
533 issue.safe_attributes = {'tracker_id' => 2, 'due_date' => '2012-07-14'}
|
Chris@1115
|
534 assert_equal target, issue.tracker
|
Chris@1115
|
535 assert_equal Date.parse('2012-07-14'), issue.due_date
|
Chris@1115
|
536 end
|
Chris@1115
|
537
|
Chris@1115
|
538 def test_safe_attributes_should_not_include_readonly_fields
|
Chris@1115
|
539 WorkflowPermission.delete_all
|
Chris@1115
|
540 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1,
|
Chris@1115
|
541 :role_id => 1, :field_name => 'due_date',
|
Chris@1115
|
542 :rule => 'readonly')
|
Chris@1115
|
543 user = User.find(2)
|
Chris@1115
|
544
|
Chris@1115
|
545 issue = Issue.new(:project_id => 1, :tracker_id => 1)
|
Chris@1115
|
546 assert_equal %w(due_date), issue.read_only_attribute_names(user)
|
Chris@1115
|
547 assert_not_include 'due_date', issue.safe_attribute_names(user)
|
Chris@1115
|
548
|
Chris@1115
|
549 issue.send :safe_attributes=, {'start_date' => '2012-07-14', 'due_date' => '2012-07-14'}, user
|
Chris@1115
|
550 assert_equal Date.parse('2012-07-14'), issue.start_date
|
Chris@1115
|
551 assert_nil issue.due_date
|
Chris@1115
|
552 end
|
Chris@1115
|
553
|
Chris@1115
|
554 def test_safe_attributes_should_not_include_readonly_custom_fields
|
Chris@1115
|
555 cf1 = IssueCustomField.create!(:name => 'Writable field',
|
Chris@1115
|
556 :field_format => 'string',
|
Chris@1115
|
557 :is_for_all => true, :tracker_ids => [1])
|
Chris@1115
|
558 cf2 = IssueCustomField.create!(:name => 'Readonly field',
|
Chris@1115
|
559 :field_format => 'string',
|
Chris@1115
|
560 :is_for_all => true, :tracker_ids => [1])
|
Chris@1115
|
561 WorkflowPermission.delete_all
|
Chris@1115
|
562 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1,
|
Chris@1115
|
563 :role_id => 1, :field_name => cf2.id.to_s,
|
Chris@1115
|
564 :rule => 'readonly')
|
Chris@1115
|
565 user = User.find(2)
|
Chris@1115
|
566 issue = Issue.new(:project_id => 1, :tracker_id => 1)
|
Chris@1115
|
567 assert_equal [cf2.id.to_s], issue.read_only_attribute_names(user)
|
Chris@1115
|
568 assert_not_include cf2.id.to_s, issue.safe_attribute_names(user)
|
Chris@1115
|
569
|
Chris@1115
|
570 issue.send :safe_attributes=, {'custom_field_values' => {
|
Chris@1115
|
571 cf1.id.to_s => 'value1', cf2.id.to_s => 'value2'
|
Chris@1115
|
572 }}, user
|
Chris@1115
|
573 assert_equal 'value1', issue.custom_field_value(cf1)
|
Chris@1115
|
574 assert_nil issue.custom_field_value(cf2)
|
Chris@1115
|
575
|
Chris@1115
|
576 issue.send :safe_attributes=, {'custom_fields' => [
|
Chris@1115
|
577 {'id' => cf1.id.to_s, 'value' => 'valuea'},
|
Chris@1115
|
578 {'id' => cf2.id.to_s, 'value' => 'valueb'}
|
Chris@1115
|
579 ]}, user
|
Chris@1115
|
580 assert_equal 'valuea', issue.custom_field_value(cf1)
|
Chris@1115
|
581 assert_nil issue.custom_field_value(cf2)
|
Chris@1115
|
582 end
|
Chris@1115
|
583
|
Chris@1115
|
584 def test_editable_custom_field_values_should_return_non_readonly_custom_values
|
Chris@1115
|
585 cf1 = IssueCustomField.create!(:name => 'Writable field', :field_format => 'string',
|
Chris@1115
|
586 :is_for_all => true, :tracker_ids => [1, 2])
|
Chris@1115
|
587 cf2 = IssueCustomField.create!(:name => 'Readonly field', :field_format => 'string',
|
Chris@1115
|
588 :is_for_all => true, :tracker_ids => [1, 2])
|
Chris@1115
|
589 WorkflowPermission.delete_all
|
Chris@1115
|
590 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1, :role_id => 1,
|
Chris@1115
|
591 :field_name => cf2.id.to_s, :rule => 'readonly')
|
Chris@1115
|
592 user = User.find(2)
|
Chris@1115
|
593
|
Chris@1115
|
594 issue = Issue.new(:project_id => 1, :tracker_id => 1)
|
Chris@1115
|
595 values = issue.editable_custom_field_values(user)
|
Chris@1115
|
596 assert values.detect {|value| value.custom_field == cf1}
|
Chris@1115
|
597 assert_nil values.detect {|value| value.custom_field == cf2}
|
Chris@1115
|
598
|
Chris@1115
|
599 issue.tracker_id = 2
|
Chris@1115
|
600 values = issue.editable_custom_field_values(user)
|
Chris@1115
|
601 assert values.detect {|value| value.custom_field == cf1}
|
Chris@1115
|
602 assert values.detect {|value| value.custom_field == cf2}
|
Chris@1115
|
603 end
|
Chris@1115
|
604
|
Chris@1115
|
605 def test_safe_attributes_should_accept_target_tracker_writable_fields
|
Chris@1115
|
606 WorkflowPermission.delete_all
|
Chris@1115
|
607 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1,
|
Chris@1115
|
608 :role_id => 1, :field_name => 'due_date',
|
Chris@1115
|
609 :rule => 'readonly')
|
Chris@1115
|
610 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 2,
|
Chris@1115
|
611 :role_id => 1, :field_name => 'start_date',
|
Chris@1115
|
612 :rule => 'readonly')
|
Chris@1115
|
613 user = User.find(2)
|
Chris@1115
|
614
|
Chris@1115
|
615 issue = Issue.new(:project_id => 1, :tracker_id => 1, :status_id => 1)
|
Chris@1115
|
616
|
Chris@1115
|
617 issue.send :safe_attributes=, {'start_date' => '2012-07-12',
|
Chris@1115
|
618 'due_date' => '2012-07-14'}, user
|
Chris@1115
|
619 assert_equal Date.parse('2012-07-12'), issue.start_date
|
Chris@1115
|
620 assert_nil issue.due_date
|
Chris@1115
|
621
|
Chris@1115
|
622 issue.send :safe_attributes=, {'start_date' => '2012-07-15',
|
Chris@1115
|
623 'due_date' => '2012-07-16',
|
Chris@1115
|
624 'tracker_id' => 2}, user
|
Chris@1115
|
625 assert_equal Date.parse('2012-07-12'), issue.start_date
|
Chris@1115
|
626 assert_equal Date.parse('2012-07-16'), issue.due_date
|
Chris@1115
|
627 end
|
Chris@1115
|
628
|
Chris@1115
|
629 def test_safe_attributes_should_accept_target_status_writable_fields
|
Chris@1115
|
630 WorkflowPermission.delete_all
|
Chris@1115
|
631 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1,
|
Chris@1115
|
632 :role_id => 1, :field_name => 'due_date',
|
Chris@1115
|
633 :rule => 'readonly')
|
Chris@1115
|
634 WorkflowPermission.create!(:old_status_id => 2, :tracker_id => 1,
|
Chris@1115
|
635 :role_id => 1, :field_name => 'start_date',
|
Chris@1115
|
636 :rule => 'readonly')
|
Chris@1115
|
637 user = User.find(2)
|
Chris@1115
|
638
|
Chris@1115
|
639 issue = Issue.new(:project_id => 1, :tracker_id => 1, :status_id => 1)
|
Chris@1115
|
640
|
Chris@1115
|
641 issue.send :safe_attributes=, {'start_date' => '2012-07-12',
|
Chris@1115
|
642 'due_date' => '2012-07-14'},
|
Chris@1115
|
643 user
|
Chris@1115
|
644 assert_equal Date.parse('2012-07-12'), issue.start_date
|
Chris@1115
|
645 assert_nil issue.due_date
|
Chris@1115
|
646
|
Chris@1115
|
647 issue.send :safe_attributes=, {'start_date' => '2012-07-15',
|
Chris@1115
|
648 'due_date' => '2012-07-16',
|
Chris@1115
|
649 'status_id' => 2},
|
Chris@1115
|
650 user
|
Chris@1115
|
651 assert_equal Date.parse('2012-07-12'), issue.start_date
|
Chris@1115
|
652 assert_equal Date.parse('2012-07-16'), issue.due_date
|
Chris@1115
|
653 end
|
Chris@1115
|
654
|
Chris@1115
|
655 def test_required_attributes_should_be_validated
|
Chris@1115
|
656 cf = IssueCustomField.create!(:name => 'Foo', :field_format => 'string',
|
Chris@1115
|
657 :is_for_all => true, :tracker_ids => [1, 2])
|
Chris@1115
|
658
|
Chris@1115
|
659 WorkflowPermission.delete_all
|
Chris@1115
|
660 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1,
|
Chris@1115
|
661 :role_id => 1, :field_name => 'due_date',
|
Chris@1115
|
662 :rule => 'required')
|
Chris@1115
|
663 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1,
|
Chris@1115
|
664 :role_id => 1, :field_name => 'category_id',
|
Chris@1115
|
665 :rule => 'required')
|
Chris@1115
|
666 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1,
|
Chris@1115
|
667 :role_id => 1, :field_name => cf.id.to_s,
|
Chris@1115
|
668 :rule => 'required')
|
Chris@1115
|
669
|
Chris@1115
|
670 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 2,
|
Chris@1115
|
671 :role_id => 1, :field_name => 'start_date',
|
Chris@1115
|
672 :rule => 'required')
|
Chris@1115
|
673 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 2,
|
Chris@1115
|
674 :role_id => 1, :field_name => cf.id.to_s,
|
Chris@1115
|
675 :rule => 'required')
|
Chris@1115
|
676 user = User.find(2)
|
Chris@1115
|
677
|
Chris@1115
|
678 issue = Issue.new(:project_id => 1, :tracker_id => 1,
|
Chris@1115
|
679 :status_id => 1, :subject => 'Required fields',
|
Chris@1115
|
680 :author => user)
|
Chris@1115
|
681 assert_equal [cf.id.to_s, "category_id", "due_date"],
|
Chris@1115
|
682 issue.required_attribute_names(user).sort
|
Chris@1115
|
683 assert !issue.save, "Issue was saved"
|
Chris@1115
|
684 assert_equal ["Category can't be blank", "Due date can't be blank", "Foo can't be blank"],
|
Chris@1115
|
685 issue.errors.full_messages.sort
|
Chris@1115
|
686
|
Chris@1115
|
687 issue.tracker_id = 2
|
Chris@1115
|
688 assert_equal [cf.id.to_s, "start_date"], issue.required_attribute_names(user).sort
|
Chris@1115
|
689 assert !issue.save, "Issue was saved"
|
Chris@1115
|
690 assert_equal ["Foo can't be blank", "Start date can't be blank"],
|
Chris@1115
|
691 issue.errors.full_messages.sort
|
Chris@1115
|
692
|
Chris@1115
|
693 issue.start_date = Date.today
|
Chris@1115
|
694 issue.custom_field_values = {cf.id.to_s => 'bar'}
|
Chris@1115
|
695 assert issue.save
|
Chris@1115
|
696 end
|
Chris@1115
|
697
|
Chris@1115
|
698 def test_required_attribute_names_for_multiple_roles_should_intersect_rules
|
Chris@1115
|
699 WorkflowPermission.delete_all
|
Chris@1115
|
700 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1,
|
Chris@1115
|
701 :role_id => 1, :field_name => 'due_date',
|
Chris@1115
|
702 :rule => 'required')
|
Chris@1115
|
703 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1,
|
Chris@1115
|
704 :role_id => 1, :field_name => 'start_date',
|
Chris@1115
|
705 :rule => 'required')
|
Chris@1115
|
706 user = User.find(2)
|
Chris@1115
|
707 member = Member.find(1)
|
Chris@1115
|
708 issue = Issue.new(:project_id => 1, :tracker_id => 1, :status_id => 1)
|
Chris@1115
|
709
|
Chris@1115
|
710 assert_equal %w(due_date start_date), issue.required_attribute_names(user).sort
|
Chris@1115
|
711
|
Chris@1115
|
712 member.role_ids = [1, 2]
|
Chris@1115
|
713 member.save!
|
Chris@1115
|
714 assert_equal [], issue.required_attribute_names(user.reload)
|
Chris@1115
|
715
|
Chris@1115
|
716 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1,
|
Chris@1115
|
717 :role_id => 2, :field_name => 'due_date',
|
Chris@1115
|
718 :rule => 'required')
|
Chris@1115
|
719 assert_equal %w(due_date), issue.required_attribute_names(user)
|
Chris@1115
|
720
|
Chris@1115
|
721 member.role_ids = [1, 2, 3]
|
Chris@1115
|
722 member.save!
|
Chris@1115
|
723 assert_equal [], issue.required_attribute_names(user.reload)
|
Chris@1115
|
724
|
Chris@1115
|
725 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1,
|
Chris@1115
|
726 :role_id => 2, :field_name => 'due_date',
|
Chris@1115
|
727 :rule => 'readonly')
|
Chris@1115
|
728 # required + readonly => required
|
Chris@1115
|
729 assert_equal %w(due_date), issue.required_attribute_names(user)
|
Chris@1115
|
730 end
|
Chris@1115
|
731
|
Chris@1115
|
732 def test_read_only_attribute_names_for_multiple_roles_should_intersect_rules
|
Chris@1115
|
733 WorkflowPermission.delete_all
|
Chris@1115
|
734 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1,
|
Chris@1115
|
735 :role_id => 1, :field_name => 'due_date',
|
Chris@1115
|
736 :rule => 'readonly')
|
Chris@1115
|
737 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1,
|
Chris@1115
|
738 :role_id => 1, :field_name => 'start_date',
|
Chris@1115
|
739 :rule => 'readonly')
|
Chris@1115
|
740 user = User.find(2)
|
Chris@1115
|
741 member = Member.find(1)
|
Chris@1115
|
742 issue = Issue.new(:project_id => 1, :tracker_id => 1, :status_id => 1)
|
Chris@1115
|
743
|
Chris@1115
|
744 assert_equal %w(due_date start_date), issue.read_only_attribute_names(user).sort
|
Chris@1115
|
745
|
Chris@1115
|
746 member.role_ids = [1, 2]
|
Chris@1115
|
747 member.save!
|
Chris@1115
|
748 assert_equal [], issue.read_only_attribute_names(user.reload)
|
Chris@1115
|
749
|
Chris@1115
|
750 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1,
|
Chris@1115
|
751 :role_id => 2, :field_name => 'due_date',
|
Chris@1115
|
752 :rule => 'readonly')
|
Chris@1115
|
753 assert_equal %w(due_date), issue.read_only_attribute_names(user)
|
Chris@1115
|
754 end
|
Chris@1115
|
755
|
Chris@0
|
756 def test_copy
|
Chris@0
|
757 issue = Issue.new.copy_from(1)
|
Chris@1115
|
758 assert issue.copy?
|
Chris@0
|
759 assert issue.save
|
Chris@0
|
760 issue.reload
|
Chris@0
|
761 orig = Issue.find(1)
|
Chris@0
|
762 assert_equal orig.subject, issue.subject
|
Chris@0
|
763 assert_equal orig.tracker, issue.tracker
|
Chris@0
|
764 assert_equal "125", issue.custom_value_for(2).value
|
Chris@0
|
765 end
|
Chris@0
|
766
|
Chris@0
|
767 def test_copy_should_copy_status
|
Chris@0
|
768 orig = Issue.find(8)
|
Chris@0
|
769 assert orig.status != IssueStatus.default
|
Chris@441
|
770
|
Chris@0
|
771 issue = Issue.new.copy_from(orig)
|
Chris@0
|
772 assert issue.save
|
Chris@0
|
773 issue.reload
|
Chris@0
|
774 assert_equal orig.status, issue.status
|
Chris@0
|
775 end
|
Chris@441
|
776
|
Chris@1115
|
777 def test_copy_should_add_relation_with_copied_issue
|
Chris@1115
|
778 copied = Issue.find(1)
|
Chris@1115
|
779 issue = Issue.new.copy_from(copied)
|
Chris@1115
|
780 assert issue.save
|
Chris@1115
|
781 issue.reload
|
Chris@1115
|
782
|
Chris@1115
|
783 assert_equal 1, issue.relations.size
|
Chris@1115
|
784 relation = issue.relations.first
|
Chris@1115
|
785 assert_equal 'copied_to', relation.relation_type
|
Chris@1115
|
786 assert_equal copied, relation.issue_from
|
Chris@1115
|
787 assert_equal issue, relation.issue_to
|
Chris@1115
|
788 end
|
Chris@1115
|
789
|
Chris@1115
|
790 def test_copy_should_copy_subtasks
|
Chris@1115
|
791 issue = Issue.generate_with_descendants!
|
Chris@1115
|
792
|
Chris@1115
|
793 copy = issue.reload.copy
|
Chris@1115
|
794 copy.author = User.find(7)
|
Chris@1115
|
795 assert_difference 'Issue.count', 1+issue.descendants.count do
|
Chris@1115
|
796 assert copy.save
|
Chris@1115
|
797 end
|
Chris@1115
|
798 copy.reload
|
Chris@1115
|
799 assert_equal %w(Child1 Child2), copy.children.map(&:subject).sort
|
Chris@1115
|
800 child_copy = copy.children.detect {|c| c.subject == 'Child1'}
|
Chris@1115
|
801 assert_equal %w(Child11), child_copy.children.map(&:subject).sort
|
Chris@1115
|
802 assert_equal copy.author, child_copy.author
|
Chris@1115
|
803 end
|
Chris@1115
|
804
|
Chris@1115
|
805 def test_copy_should_copy_subtasks_to_target_project
|
Chris@1115
|
806 issue = Issue.generate_with_descendants!
|
Chris@1115
|
807
|
Chris@1115
|
808 copy = issue.copy(:project_id => 3)
|
Chris@1115
|
809 assert_difference 'Issue.count', 1+issue.descendants.count do
|
Chris@1115
|
810 assert copy.save
|
Chris@1115
|
811 end
|
Chris@1115
|
812 assert_equal [3], copy.reload.descendants.map(&:project_id).uniq
|
Chris@1115
|
813 end
|
Chris@1115
|
814
|
Chris@1115
|
815 def test_copy_should_not_copy_subtasks_twice_when_saving_twice
|
Chris@1115
|
816 issue = Issue.generate_with_descendants!
|
Chris@1115
|
817
|
Chris@1115
|
818 copy = issue.reload.copy
|
Chris@1115
|
819 assert_difference 'Issue.count', 1+issue.descendants.count do
|
Chris@1115
|
820 assert copy.save
|
Chris@1115
|
821 assert copy.save
|
Chris@1115
|
822 end
|
Chris@1115
|
823 end
|
Chris@1115
|
824
|
Chris@1115
|
825 def test_should_not_call_after_project_change_on_creation
|
Chris@1115
|
826 issue = Issue.new(:project_id => 1, :tracker_id => 1, :status_id => 1,
|
Chris@1115
|
827 :subject => 'Test', :author_id => 1)
|
Chris@1115
|
828 issue.expects(:after_project_change).never
|
Chris@1115
|
829 issue.save!
|
Chris@1115
|
830 end
|
Chris@1115
|
831
|
Chris@1115
|
832 def test_should_not_call_after_project_change_on_update
|
Chris@1115
|
833 issue = Issue.find(1)
|
Chris@1115
|
834 issue.project = Project.find(1)
|
Chris@1115
|
835 issue.subject = 'No project change'
|
Chris@1115
|
836 issue.expects(:after_project_change).never
|
Chris@1115
|
837 issue.save!
|
Chris@1115
|
838 end
|
Chris@1115
|
839
|
Chris@1115
|
840 def test_should_call_after_project_change_on_project_change
|
Chris@1115
|
841 issue = Issue.find(1)
|
Chris@1115
|
842 issue.project = Project.find(2)
|
Chris@1115
|
843 issue.expects(:after_project_change).once
|
Chris@1115
|
844 issue.save!
|
Chris@1115
|
845 end
|
Chris@1115
|
846
|
Chris@1115
|
847 def test_adding_journal_should_update_timestamp
|
Chris@1115
|
848 issue = Issue.find(1)
|
Chris@1115
|
849 updated_on_was = issue.updated_on
|
Chris@1115
|
850
|
Chris@1115
|
851 issue.init_journal(User.first, "Adding notes")
|
Chris@1115
|
852 assert_difference 'Journal.count' do
|
Chris@1115
|
853 assert issue.save
|
Chris@1115
|
854 end
|
Chris@1115
|
855 issue.reload
|
Chris@1115
|
856
|
Chris@1115
|
857 assert_not_equal updated_on_was, issue.updated_on
|
Chris@1115
|
858 end
|
Chris@1115
|
859
|
Chris@0
|
860 def test_should_close_duplicates
|
Chris@0
|
861 # Create 3 issues
|
Chris@1115
|
862 issue1 = Issue.generate!
|
Chris@1115
|
863 issue2 = Issue.generate!
|
Chris@1115
|
864 issue3 = Issue.generate!
|
Chris@441
|
865
|
Chris@0
|
866 # 2 is a dupe of 1
|
Chris@1115
|
867 IssueRelation.create!(:issue_from => issue2, :issue_to => issue1,
|
Chris@1115
|
868 :relation_type => IssueRelation::TYPE_DUPLICATES)
|
Chris@0
|
869 # And 3 is a dupe of 2
|
Chris@1115
|
870 IssueRelation.create!(:issue_from => issue3, :issue_to => issue2,
|
Chris@1115
|
871 :relation_type => IssueRelation::TYPE_DUPLICATES)
|
Chris@0
|
872 # And 3 is a dupe of 1 (circular duplicates)
|
Chris@1115
|
873 IssueRelation.create!(:issue_from => issue3, :issue_to => issue1,
|
Chris@1115
|
874 :relation_type => IssueRelation::TYPE_DUPLICATES)
|
Chris@441
|
875
|
Chris@0
|
876 assert issue1.reload.duplicates.include?(issue2)
|
Chris@441
|
877
|
Chris@0
|
878 # Closing issue 1
|
Chris@0
|
879 issue1.init_journal(User.find(:first), "Closing issue1")
|
Chris@0
|
880 issue1.status = IssueStatus.find :first, :conditions => {:is_closed => true}
|
Chris@0
|
881 assert issue1.save
|
Chris@0
|
882 # 2 and 3 should be also closed
|
Chris@0
|
883 assert issue2.reload.closed?
|
Chris@441
|
884 assert issue3.reload.closed?
|
Chris@0
|
885 end
|
Chris@441
|
886
|
Chris@0
|
887 def test_should_not_close_duplicated_issue
|
Chris@1115
|
888 issue1 = Issue.generate!
|
Chris@1115
|
889 issue2 = Issue.generate!
|
Chris@441
|
890
|
Chris@0
|
891 # 2 is a dupe of 1
|
Chris@1115
|
892 IssueRelation.create(:issue_from => issue2, :issue_to => issue1,
|
Chris@1115
|
893 :relation_type => IssueRelation::TYPE_DUPLICATES)
|
Chris@0
|
894 # 2 is a dup of 1 but 1 is not a duplicate of 2
|
Chris@0
|
895 assert !issue2.reload.duplicates.include?(issue1)
|
Chris@441
|
896
|
Chris@0
|
897 # Closing issue 2
|
Chris@0
|
898 issue2.init_journal(User.find(:first), "Closing issue2")
|
Chris@0
|
899 issue2.status = IssueStatus.find :first, :conditions => {:is_closed => true}
|
Chris@0
|
900 assert issue2.save
|
Chris@0
|
901 # 1 should not be also closed
|
Chris@0
|
902 assert !issue1.reload.closed?
|
Chris@0
|
903 end
|
Chris@441
|
904
|
Chris@0
|
905 def test_assignable_versions
|
Chris@1115
|
906 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1,
|
Chris@1115
|
907 :status_id => 1, :fixed_version_id => 1,
|
Chris@1115
|
908 :subject => 'New issue')
|
Chris@0
|
909 assert_equal ['open'], issue.assignable_versions.collect(&:status).uniq
|
Chris@0
|
910 end
|
Chris@441
|
911
|
Chris@0
|
912 def test_should_not_be_able_to_assign_a_new_issue_to_a_closed_version
|
Chris@1115
|
913 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1,
|
Chris@1115
|
914 :status_id => 1, :fixed_version_id => 1,
|
Chris@1115
|
915 :subject => 'New issue')
|
Chris@0
|
916 assert !issue.save
|
Chris@909
|
917 assert_not_nil issue.errors[:fixed_version_id]
|
Chris@0
|
918 end
|
Chris@441
|
919
|
Chris@0
|
920 def test_should_not_be_able_to_assign_a_new_issue_to_a_locked_version
|
Chris@1115
|
921 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1,
|
Chris@1115
|
922 :status_id => 1, :fixed_version_id => 2,
|
Chris@1115
|
923 :subject => 'New issue')
|
Chris@0
|
924 assert !issue.save
|
Chris@909
|
925 assert_not_nil issue.errors[:fixed_version_id]
|
Chris@0
|
926 end
|
Chris@441
|
927
|
Chris@0
|
928 def test_should_be_able_to_assign_a_new_issue_to_an_open_version
|
Chris@1115
|
929 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1,
|
Chris@1115
|
930 :status_id => 1, :fixed_version_id => 3,
|
Chris@1115
|
931 :subject => 'New issue')
|
Chris@0
|
932 assert issue.save
|
Chris@0
|
933 end
|
Chris@441
|
934
|
Chris@0
|
935 def test_should_be_able_to_update_an_issue_assigned_to_a_closed_version
|
Chris@0
|
936 issue = Issue.find(11)
|
Chris@0
|
937 assert_equal 'closed', issue.fixed_version.status
|
Chris@0
|
938 issue.subject = 'Subject changed'
|
Chris@0
|
939 assert issue.save
|
Chris@0
|
940 end
|
Chris@441
|
941
|
Chris@0
|
942 def test_should_not_be_able_to_reopen_an_issue_assigned_to_a_closed_version
|
Chris@0
|
943 issue = Issue.find(11)
|
Chris@0
|
944 issue.status_id = 1
|
Chris@0
|
945 assert !issue.save
|
Chris@909
|
946 assert_not_nil issue.errors[:base]
|
Chris@0
|
947 end
|
Chris@441
|
948
|
Chris@0
|
949 def test_should_be_able_to_reopen_and_reassign_an_issue_assigned_to_a_closed_version
|
Chris@0
|
950 issue = Issue.find(11)
|
Chris@0
|
951 issue.status_id = 1
|
Chris@0
|
952 issue.fixed_version_id = 3
|
Chris@0
|
953 assert issue.save
|
Chris@0
|
954 end
|
Chris@441
|
955
|
Chris@0
|
956 def test_should_be_able_to_reopen_an_issue_assigned_to_a_locked_version
|
Chris@0
|
957 issue = Issue.find(12)
|
Chris@0
|
958 assert_equal 'locked', issue.fixed_version.status
|
Chris@0
|
959 issue.status_id = 1
|
Chris@0
|
960 assert issue.save
|
Chris@0
|
961 end
|
Chris@441
|
962
|
Chris@1115
|
963 def test_should_not_be_able_to_keep_unshared_version_when_changing_project
|
Chris@1115
|
964 issue = Issue.find(2)
|
Chris@1115
|
965 assert_equal 2, issue.fixed_version_id
|
Chris@1115
|
966 issue.project_id = 3
|
Chris@1115
|
967 assert_nil issue.fixed_version_id
|
Chris@1115
|
968 issue.fixed_version_id = 2
|
Chris@1115
|
969 assert !issue.save
|
Chris@1115
|
970 assert_include 'Target version is not included in the list', issue.errors.full_messages
|
Chris@1115
|
971 end
|
Chris@1115
|
972
|
Chris@1115
|
973 def test_should_keep_shared_version_when_changing_project
|
Chris@1115
|
974 Version.find(2).update_attribute :sharing, 'tree'
|
Chris@1115
|
975
|
Chris@1115
|
976 issue = Issue.find(2)
|
Chris@1115
|
977 assert_equal 2, issue.fixed_version_id
|
Chris@1115
|
978 issue.project_id = 3
|
Chris@1115
|
979 assert_equal 2, issue.fixed_version_id
|
Chris@1115
|
980 assert issue.save
|
Chris@1115
|
981 end
|
Chris@1115
|
982
|
Chris@1115
|
983 def test_allowed_target_projects_on_move_should_include_projects_with_issue_tracking_enabled
|
Chris@1115
|
984 assert_include Project.find(2), Issue.allowed_target_projects_on_move(User.find(2))
|
Chris@1115
|
985 end
|
Chris@1115
|
986
|
Chris@1115
|
987 def test_allowed_target_projects_on_move_should_not_include_projects_with_issue_tracking_disabled
|
Chris@1115
|
988 Project.find(2).disable_module! :issue_tracking
|
Chris@1115
|
989 assert_not_include Project.find(2), Issue.allowed_target_projects_on_move(User.find(2))
|
Chris@1115
|
990 end
|
Chris@1115
|
991
|
Chris@0
|
992 def test_move_to_another_project_with_same_category
|
Chris@0
|
993 issue = Issue.find(1)
|
Chris@1115
|
994 issue.project = Project.find(2)
|
Chris@1115
|
995 assert issue.save
|
Chris@0
|
996 issue.reload
|
Chris@0
|
997 assert_equal 2, issue.project_id
|
Chris@0
|
998 # Category changes
|
Chris@0
|
999 assert_equal 4, issue.category_id
|
Chris@0
|
1000 # Make sure time entries were move to the target project
|
Chris@0
|
1001 assert_equal 2, issue.time_entries.first.project_id
|
Chris@0
|
1002 end
|
Chris@441
|
1003
|
Chris@0
|
1004 def test_move_to_another_project_without_same_category
|
Chris@0
|
1005 issue = Issue.find(2)
|
Chris@1115
|
1006 issue.project = Project.find(2)
|
Chris@1115
|
1007 assert issue.save
|
Chris@0
|
1008 issue.reload
|
Chris@0
|
1009 assert_equal 2, issue.project_id
|
Chris@0
|
1010 # Category cleared
|
Chris@0
|
1011 assert_nil issue.category_id
|
Chris@0
|
1012 end
|
Chris@441
|
1013
|
Chris@0
|
1014 def test_move_to_another_project_should_clear_fixed_version_when_not_shared
|
Chris@0
|
1015 issue = Issue.find(1)
|
Chris@0
|
1016 issue.update_attribute(:fixed_version_id, 1)
|
Chris@1115
|
1017 issue.project = Project.find(2)
|
Chris@1115
|
1018 assert issue.save
|
Chris@0
|
1019 issue.reload
|
Chris@0
|
1020 assert_equal 2, issue.project_id
|
Chris@0
|
1021 # Cleared fixed_version
|
Chris@0
|
1022 assert_equal nil, issue.fixed_version
|
Chris@0
|
1023 end
|
Chris@441
|
1024
|
Chris@0
|
1025 def test_move_to_another_project_should_keep_fixed_version_when_shared_with_the_target_project
|
Chris@0
|
1026 issue = Issue.find(1)
|
Chris@0
|
1027 issue.update_attribute(:fixed_version_id, 4)
|
Chris@1115
|
1028 issue.project = Project.find(5)
|
Chris@1115
|
1029 assert issue.save
|
Chris@0
|
1030 issue.reload
|
Chris@0
|
1031 assert_equal 5, issue.project_id
|
Chris@0
|
1032 # Keep fixed_version
|
Chris@0
|
1033 assert_equal 4, issue.fixed_version_id
|
Chris@0
|
1034 end
|
Chris@441
|
1035
|
Chris@0
|
1036 def test_move_to_another_project_should_clear_fixed_version_when_not_shared_with_the_target_project
|
Chris@0
|
1037 issue = Issue.find(1)
|
Chris@0
|
1038 issue.update_attribute(:fixed_version_id, 1)
|
Chris@1115
|
1039 issue.project = Project.find(5)
|
Chris@1115
|
1040 assert issue.save
|
Chris@0
|
1041 issue.reload
|
Chris@0
|
1042 assert_equal 5, issue.project_id
|
Chris@0
|
1043 # Cleared fixed_version
|
Chris@0
|
1044 assert_equal nil, issue.fixed_version
|
Chris@0
|
1045 end
|
Chris@441
|
1046
|
Chris@0
|
1047 def test_move_to_another_project_should_keep_fixed_version_when_shared_systemwide
|
Chris@0
|
1048 issue = Issue.find(1)
|
Chris@0
|
1049 issue.update_attribute(:fixed_version_id, 7)
|
Chris@1115
|
1050 issue.project = Project.find(2)
|
Chris@1115
|
1051 assert issue.save
|
Chris@0
|
1052 issue.reload
|
Chris@0
|
1053 assert_equal 2, issue.project_id
|
Chris@0
|
1054 # Keep fixed_version
|
Chris@0
|
1055 assert_equal 7, issue.fixed_version_id
|
Chris@0
|
1056 end
|
Chris@441
|
1057
|
Chris@1115
|
1058 def test_move_to_another_project_should_keep_parent_if_valid
|
Chris@1115
|
1059 issue = Issue.find(1)
|
Chris@1115
|
1060 issue.update_attribute(:parent_issue_id, 2)
|
Chris@1115
|
1061 issue.project = Project.find(3)
|
Chris@1115
|
1062 assert issue.save
|
Chris@1115
|
1063 issue.reload
|
Chris@1115
|
1064 assert_equal 2, issue.parent_id
|
Chris@1115
|
1065 end
|
Chris@1115
|
1066
|
Chris@1115
|
1067 def test_move_to_another_project_should_clear_parent_if_not_valid
|
Chris@1115
|
1068 issue = Issue.find(1)
|
Chris@1115
|
1069 issue.update_attribute(:parent_issue_id, 2)
|
Chris@1115
|
1070 issue.project = Project.find(2)
|
Chris@1115
|
1071 assert issue.save
|
Chris@1115
|
1072 issue.reload
|
Chris@1115
|
1073 assert_nil issue.parent_id
|
Chris@1115
|
1074 end
|
Chris@1115
|
1075
|
Chris@0
|
1076 def test_move_to_another_project_with_disabled_tracker
|
Chris@0
|
1077 issue = Issue.find(1)
|
Chris@0
|
1078 target = Project.find(2)
|
Chris@0
|
1079 target.tracker_ids = [3]
|
Chris@0
|
1080 target.save
|
Chris@1115
|
1081 issue.project = target
|
Chris@1115
|
1082 assert issue.save
|
Chris@0
|
1083 issue.reload
|
Chris@1115
|
1084 assert_equal 2, issue.project_id
|
Chris@1115
|
1085 assert_equal 3, issue.tracker_id
|
Chris@0
|
1086 end
|
Chris@441
|
1087
|
Chris@0
|
1088 def test_copy_to_the_same_project
|
Chris@0
|
1089 issue = Issue.find(1)
|
Chris@1115
|
1090 copy = issue.copy
|
Chris@0
|
1091 assert_difference 'Issue.count' do
|
Chris@1115
|
1092 copy.save!
|
Chris@0
|
1093 end
|
Chris@0
|
1094 assert_kind_of Issue, copy
|
Chris@0
|
1095 assert_equal issue.project, copy.project
|
Chris@0
|
1096 assert_equal "125", copy.custom_value_for(2).value
|
Chris@0
|
1097 end
|
Chris@441
|
1098
|
Chris@0
|
1099 def test_copy_to_another_project_and_tracker
|
Chris@0
|
1100 issue = Issue.find(1)
|
Chris@1115
|
1101 copy = issue.copy(:project_id => 3, :tracker_id => 2)
|
Chris@0
|
1102 assert_difference 'Issue.count' do
|
Chris@1115
|
1103 copy.save!
|
Chris@0
|
1104 end
|
Chris@0
|
1105 copy.reload
|
Chris@0
|
1106 assert_kind_of Issue, copy
|
Chris@0
|
1107 assert_equal Project.find(3), copy.project
|
Chris@0
|
1108 assert_equal Tracker.find(2), copy.tracker
|
Chris@0
|
1109 # Custom field #2 is not associated with target tracker
|
Chris@0
|
1110 assert_nil copy.custom_value_for(2)
|
Chris@0
|
1111 end
|
Chris@0
|
1112
|
Chris@1115
|
1113 context "#copy" do
|
Chris@1115
|
1114 setup do
|
Chris@1115
|
1115 @issue = Issue.find(1)
|
Chris@1115
|
1116 end
|
Chris@0
|
1117
|
Chris@1115
|
1118 should "not create a journal" do
|
Chris@1115
|
1119 copy = @issue.copy(:project_id => 3, :tracker_id => 2, :assigned_to_id => 3)
|
Chris@1115
|
1120 copy.save!
|
Chris@1115
|
1121 assert_equal 0, copy.reload.journals.size
|
Chris@1115
|
1122 end
|
Chris@441
|
1123
|
Chris@1115
|
1124 should "allow assigned_to changes" do
|
Chris@1115
|
1125 copy = @issue.copy(:project_id => 3, :tracker_id => 2, :assigned_to_id => 3)
|
Chris@1115
|
1126 assert_equal 3, copy.assigned_to_id
|
Chris@1115
|
1127 end
|
Chris@0
|
1128
|
Chris@1115
|
1129 should "allow status changes" do
|
Chris@1115
|
1130 copy = @issue.copy(:project_id => 3, :tracker_id => 2, :status_id => 2)
|
Chris@1115
|
1131 assert_equal 2, copy.status_id
|
Chris@1115
|
1132 end
|
Chris@0
|
1133
|
Chris@1115
|
1134 should "allow start date changes" do
|
Chris@1115
|
1135 date = Date.today
|
Chris@1115
|
1136 copy = @issue.copy(:project_id => 3, :tracker_id => 2, :start_date => date)
|
Chris@1115
|
1137 assert_equal date, copy.start_date
|
Chris@1115
|
1138 end
|
Chris@0
|
1139
|
Chris@1115
|
1140 should "allow due date changes" do
|
Chris@1115
|
1141 date = Date.today
|
Chris@1115
|
1142 copy = @issue.copy(:project_id => 3, :tracker_id => 2, :due_date => date)
|
Chris@1115
|
1143 assert_equal date, copy.due_date
|
Chris@1115
|
1144 end
|
Chris@0
|
1145
|
Chris@1115
|
1146 should "set current user as author" do
|
Chris@1115
|
1147 User.current = User.find(9)
|
Chris@1115
|
1148 copy = @issue.copy(:project_id => 3, :tracker_id => 2)
|
Chris@1115
|
1149 assert_equal User.current, copy.author
|
Chris@1115
|
1150 end
|
Chris@441
|
1151
|
Chris@1115
|
1152 should "create a journal with notes" do
|
Chris@1115
|
1153 date = Date.today
|
Chris@1115
|
1154 notes = "Notes added when copying"
|
Chris@1115
|
1155 copy = @issue.copy(:project_id => 3, :tracker_id => 2, :start_date => date)
|
Chris@1115
|
1156 copy.init_journal(User.current, notes)
|
Chris@1115
|
1157 copy.save!
|
Chris@441
|
1158
|
Chris@1115
|
1159 assert_equal 1, copy.journals.size
|
Chris@1115
|
1160 journal = copy.journals.first
|
Chris@1115
|
1161 assert_equal 0, journal.details.size
|
Chris@1115
|
1162 assert_equal notes, journal.notes
|
Chris@1115
|
1163 end
|
Chris@1115
|
1164 end
|
Chris@441
|
1165
|
Chris@1115
|
1166 def test_valid_parent_project
|
Chris@1115
|
1167 issue = Issue.find(1)
|
Chris@1115
|
1168 issue_in_same_project = Issue.find(2)
|
Chris@1115
|
1169 issue_in_child_project = Issue.find(5)
|
Chris@1115
|
1170 issue_in_grandchild_project = Issue.generate!(:project_id => 6, :tracker_id => 1)
|
Chris@1115
|
1171 issue_in_other_child_project = Issue.find(6)
|
Chris@1115
|
1172 issue_in_different_tree = Issue.find(4)
|
Chris@441
|
1173
|
Chris@1115
|
1174 with_settings :cross_project_subtasks => '' do
|
Chris@1115
|
1175 assert_equal true, issue.valid_parent_project?(issue_in_same_project)
|
Chris@1115
|
1176 assert_equal false, issue.valid_parent_project?(issue_in_child_project)
|
Chris@1115
|
1177 assert_equal false, issue.valid_parent_project?(issue_in_grandchild_project)
|
Chris@1115
|
1178 assert_equal false, issue.valid_parent_project?(issue_in_different_tree)
|
Chris@0
|
1179 end
|
Chris@1115
|
1180
|
Chris@1115
|
1181 with_settings :cross_project_subtasks => 'system' do
|
Chris@1115
|
1182 assert_equal true, issue.valid_parent_project?(issue_in_same_project)
|
Chris@1115
|
1183 assert_equal true, issue.valid_parent_project?(issue_in_child_project)
|
Chris@1115
|
1184 assert_equal true, issue.valid_parent_project?(issue_in_different_tree)
|
Chris@1115
|
1185 end
|
Chris@1115
|
1186
|
Chris@1115
|
1187 with_settings :cross_project_subtasks => 'tree' do
|
Chris@1115
|
1188 assert_equal true, issue.valid_parent_project?(issue_in_same_project)
|
Chris@1115
|
1189 assert_equal true, issue.valid_parent_project?(issue_in_child_project)
|
Chris@1115
|
1190 assert_equal true, issue.valid_parent_project?(issue_in_grandchild_project)
|
Chris@1115
|
1191 assert_equal false, issue.valid_parent_project?(issue_in_different_tree)
|
Chris@1115
|
1192
|
Chris@1115
|
1193 assert_equal true, issue_in_child_project.valid_parent_project?(issue_in_same_project)
|
Chris@1115
|
1194 assert_equal true, issue_in_child_project.valid_parent_project?(issue_in_other_child_project)
|
Chris@1115
|
1195 end
|
Chris@1115
|
1196
|
Chris@1115
|
1197 with_settings :cross_project_subtasks => 'descendants' do
|
Chris@1115
|
1198 assert_equal true, issue.valid_parent_project?(issue_in_same_project)
|
Chris@1115
|
1199 assert_equal false, issue.valid_parent_project?(issue_in_child_project)
|
Chris@1115
|
1200 assert_equal false, issue.valid_parent_project?(issue_in_grandchild_project)
|
Chris@1115
|
1201 assert_equal false, issue.valid_parent_project?(issue_in_different_tree)
|
Chris@1115
|
1202
|
Chris@1115
|
1203 assert_equal true, issue_in_child_project.valid_parent_project?(issue)
|
Chris@1115
|
1204 assert_equal false, issue_in_child_project.valid_parent_project?(issue_in_other_child_project)
|
Chris@1115
|
1205 end
|
Chris@1115
|
1206 end
|
Chris@1115
|
1207
|
Chris@1115
|
1208 def test_recipients_should_include_previous_assignee
|
Chris@1115
|
1209 user = User.find(3)
|
Chris@1115
|
1210 user.members.update_all ["mail_notification = ?", false]
|
Chris@1115
|
1211 user.update_attribute :mail_notification, 'only_assigned'
|
Chris@1115
|
1212
|
Chris@1115
|
1213 issue = Issue.find(2)
|
Chris@1115
|
1214 issue.assigned_to = nil
|
Chris@1115
|
1215 assert_include user.mail, issue.recipients
|
Chris@1115
|
1216 issue.save!
|
Chris@1115
|
1217 assert !issue.recipients.include?(user.mail)
|
Chris@0
|
1218 end
|
Chris@441
|
1219
|
Chris@0
|
1220 def test_recipients_should_not_include_users_that_cannot_view_the_issue
|
Chris@0
|
1221 issue = Issue.find(12)
|
Chris@0
|
1222 assert issue.recipients.include?(issue.author.mail)
|
Chris@1115
|
1223 # copy the issue to a private project
|
Chris@1115
|
1224 copy = issue.copy(:project_id => 5, :tracker_id => 2)
|
Chris@0
|
1225 # author is not a member of project anymore
|
Chris@0
|
1226 assert !copy.recipients.include?(copy.author.mail)
|
Chris@0
|
1227 end
|
Chris@0
|
1228
|
Chris@909
|
1229 def test_recipients_should_include_the_assigned_group_members
|
Chris@1115
|
1230 group_member = User.generate!
|
Chris@909
|
1231 group = Group.generate!
|
Chris@909
|
1232 group.users << group_member
|
Chris@909
|
1233
|
Chris@909
|
1234 issue = Issue.find(12)
|
Chris@909
|
1235 issue.assigned_to = group
|
Chris@909
|
1236 assert issue.recipients.include?(group_member.mail)
|
Chris@909
|
1237 end
|
Chris@909
|
1238
|
Chris@0
|
1239 def test_watcher_recipients_should_not_include_users_that_cannot_view_the_issue
|
Chris@0
|
1240 user = User.find(3)
|
Chris@0
|
1241 issue = Issue.find(9)
|
Chris@0
|
1242 Watcher.create!(:user => user, :watchable => issue)
|
Chris@0
|
1243 assert issue.watched_by?(user)
|
Chris@0
|
1244 assert !issue.watcher_recipients.include?(user.mail)
|
Chris@0
|
1245 end
|
Chris@441
|
1246
|
Chris@0
|
1247 def test_issue_destroy
|
Chris@0
|
1248 Issue.find(1).destroy
|
Chris@0
|
1249 assert_nil Issue.find_by_id(1)
|
Chris@0
|
1250 assert_nil TimeEntry.find_by_issue_id(1)
|
Chris@0
|
1251 end
|
Chris@441
|
1252
|
Chris@1115
|
1253 def test_destroying_a_deleted_issue_should_not_raise_an_error
|
Chris@1115
|
1254 issue = Issue.find(1)
|
Chris@1115
|
1255 Issue.find(1).destroy
|
Chris@1115
|
1256
|
Chris@1115
|
1257 assert_nothing_raised do
|
Chris@1115
|
1258 assert_no_difference 'Issue.count' do
|
Chris@1115
|
1259 issue.destroy
|
Chris@1115
|
1260 end
|
Chris@1115
|
1261 assert issue.destroyed?
|
Chris@1115
|
1262 end
|
Chris@1115
|
1263 end
|
Chris@1115
|
1264
|
Chris@1115
|
1265 def test_destroying_a_stale_issue_should_not_raise_an_error
|
Chris@1115
|
1266 issue = Issue.find(1)
|
Chris@1115
|
1267 Issue.find(1).update_attribute :subject, "Updated"
|
Chris@1115
|
1268
|
Chris@1115
|
1269 assert_nothing_raised do
|
Chris@1115
|
1270 assert_difference 'Issue.count', -1 do
|
Chris@1115
|
1271 issue.destroy
|
Chris@1115
|
1272 end
|
Chris@1115
|
1273 assert issue.destroyed?
|
Chris@1115
|
1274 end
|
Chris@1115
|
1275 end
|
Chris@1115
|
1276
|
Chris@0
|
1277 def test_blocked
|
Chris@0
|
1278 blocked_issue = Issue.find(9)
|
Chris@0
|
1279 blocking_issue = Issue.find(10)
|
Chris@441
|
1280
|
Chris@0
|
1281 assert blocked_issue.blocked?
|
Chris@0
|
1282 assert !blocking_issue.blocked?
|
Chris@0
|
1283 end
|
Chris@441
|
1284
|
Chris@0
|
1285 def test_blocked_issues_dont_allow_closed_statuses
|
Chris@0
|
1286 blocked_issue = Issue.find(9)
|
Chris@441
|
1287
|
Chris@0
|
1288 allowed_statuses = blocked_issue.new_statuses_allowed_to(users(:users_002))
|
Chris@0
|
1289 assert !allowed_statuses.empty?
|
Chris@0
|
1290 closed_statuses = allowed_statuses.select {|st| st.is_closed?}
|
Chris@0
|
1291 assert closed_statuses.empty?
|
Chris@0
|
1292 end
|
Chris@441
|
1293
|
Chris@0
|
1294 def test_unblocked_issues_allow_closed_statuses
|
Chris@0
|
1295 blocking_issue = Issue.find(10)
|
Chris@441
|
1296
|
Chris@0
|
1297 allowed_statuses = blocking_issue.new_statuses_allowed_to(users(:users_002))
|
Chris@0
|
1298 assert !allowed_statuses.empty?
|
Chris@0
|
1299 closed_statuses = allowed_statuses.select {|st| st.is_closed?}
|
Chris@0
|
1300 assert !closed_statuses.empty?
|
Chris@0
|
1301 end
|
Chris@441
|
1302
|
Chris@1115
|
1303 def test_reschedule_an_issue_without_dates
|
Chris@1115
|
1304 with_settings :non_working_week_days => [] do
|
Chris@1115
|
1305 issue = Issue.new(:start_date => nil, :due_date => nil)
|
Chris@1115
|
1306 issue.reschedule_on '2012-10-09'.to_date
|
Chris@1115
|
1307 assert_equal '2012-10-09'.to_date, issue.start_date
|
Chris@1115
|
1308 assert_equal '2012-10-09'.to_date, issue.due_date
|
Chris@1115
|
1309 end
|
Chris@441
|
1310
|
Chris@1115
|
1311 with_settings :non_working_week_days => %w(6 7) do
|
Chris@1115
|
1312 issue = Issue.new(:start_date => nil, :due_date => nil)
|
Chris@1115
|
1313 issue.reschedule_on '2012-10-09'.to_date
|
Chris@1115
|
1314 assert_equal '2012-10-09'.to_date, issue.start_date
|
Chris@1115
|
1315 assert_equal '2012-10-09'.to_date, issue.due_date
|
Chris@1115
|
1316
|
Chris@1115
|
1317 issue = Issue.new(:start_date => nil, :due_date => nil)
|
Chris@1115
|
1318 issue.reschedule_on '2012-10-13'.to_date
|
Chris@1115
|
1319 assert_equal '2012-10-15'.to_date, issue.start_date
|
Chris@1115
|
1320 assert_equal '2012-10-15'.to_date, issue.due_date
|
Chris@1115
|
1321 end
|
Chris@1115
|
1322 end
|
Chris@1115
|
1323
|
Chris@1115
|
1324 def test_reschedule_an_issue_with_start_date
|
Chris@1115
|
1325 with_settings :non_working_week_days => [] do
|
Chris@1115
|
1326 issue = Issue.new(:start_date => '2012-10-09', :due_date => nil)
|
Chris@1115
|
1327 issue.reschedule_on '2012-10-13'.to_date
|
Chris@1115
|
1328 assert_equal '2012-10-13'.to_date, issue.start_date
|
Chris@1115
|
1329 assert_equal '2012-10-13'.to_date, issue.due_date
|
Chris@1115
|
1330 end
|
Chris@1115
|
1331
|
Chris@1115
|
1332 with_settings :non_working_week_days => %w(6 7) do
|
Chris@1115
|
1333 issue = Issue.new(:start_date => '2012-10-09', :due_date => nil)
|
Chris@1115
|
1334 issue.reschedule_on '2012-10-11'.to_date
|
Chris@1115
|
1335 assert_equal '2012-10-11'.to_date, issue.start_date
|
Chris@1115
|
1336 assert_equal '2012-10-11'.to_date, issue.due_date
|
Chris@1115
|
1337
|
Chris@1115
|
1338 issue = Issue.new(:start_date => '2012-10-09', :due_date => nil)
|
Chris@1115
|
1339 issue.reschedule_on '2012-10-13'.to_date
|
Chris@1115
|
1340 assert_equal '2012-10-15'.to_date, issue.start_date
|
Chris@1115
|
1341 assert_equal '2012-10-15'.to_date, issue.due_date
|
Chris@1115
|
1342 end
|
Chris@1115
|
1343 end
|
Chris@1115
|
1344
|
Chris@1115
|
1345 def test_reschedule_an_issue_with_start_and_due_dates
|
Chris@1115
|
1346 with_settings :non_working_week_days => [] do
|
Chris@1115
|
1347 issue = Issue.new(:start_date => '2012-10-09', :due_date => '2012-10-15')
|
Chris@1115
|
1348 issue.reschedule_on '2012-10-13'.to_date
|
Chris@1115
|
1349 assert_equal '2012-10-13'.to_date, issue.start_date
|
Chris@1115
|
1350 assert_equal '2012-10-19'.to_date, issue.due_date
|
Chris@1115
|
1351 end
|
Chris@1115
|
1352
|
Chris@1115
|
1353 with_settings :non_working_week_days => %w(6 7) do
|
Chris@1115
|
1354 issue = Issue.new(:start_date => '2012-10-09', :due_date => '2012-10-19') # 8 working days
|
Chris@1115
|
1355 issue.reschedule_on '2012-10-11'.to_date
|
Chris@1115
|
1356 assert_equal '2012-10-11'.to_date, issue.start_date
|
Chris@1115
|
1357 assert_equal '2012-10-23'.to_date, issue.due_date
|
Chris@1115
|
1358
|
Chris@1115
|
1359 issue = Issue.new(:start_date => '2012-10-09', :due_date => '2012-10-19')
|
Chris@1115
|
1360 issue.reschedule_on '2012-10-13'.to_date
|
Chris@1115
|
1361 assert_equal '2012-10-15'.to_date, issue.start_date
|
Chris@1115
|
1362 assert_equal '2012-10-25'.to_date, issue.due_date
|
Chris@1115
|
1363 end
|
Chris@1115
|
1364 end
|
Chris@1115
|
1365
|
Chris@1115
|
1366 def test_rescheduling_an_issue_to_a_later_due_date_should_reschedule_following_issue
|
Chris@1115
|
1367 issue1 = Issue.generate!(:start_date => '2012-10-15', :due_date => '2012-10-17')
|
Chris@1115
|
1368 issue2 = Issue.generate!(:start_date => '2012-10-15', :due_date => '2012-10-17')
|
Chris@1115
|
1369 IssueRelation.create!(:issue_from => issue1, :issue_to => issue2,
|
Chris@1115
|
1370 :relation_type => IssueRelation::TYPE_PRECEDES)
|
Chris@1115
|
1371 assert_equal Date.parse('2012-10-18'), issue2.reload.start_date
|
Chris@1115
|
1372
|
Chris@1115
|
1373 issue1.due_date = '2012-10-23'
|
chris@37
|
1374 issue1.save!
|
Chris@1115
|
1375 issue2.reload
|
Chris@1115
|
1376 assert_equal Date.parse('2012-10-24'), issue2.start_date
|
Chris@1115
|
1377 assert_equal Date.parse('2012-10-26'), issue2.due_date
|
Chris@1115
|
1378 end
|
Chris@1115
|
1379
|
Chris@1115
|
1380 def test_rescheduling_an_issue_to_an_earlier_due_date_should_reschedule_following_issue
|
Chris@1115
|
1381 issue1 = Issue.generate!(:start_date => '2012-10-15', :due_date => '2012-10-17')
|
Chris@1115
|
1382 issue2 = Issue.generate!(:start_date => '2012-10-15', :due_date => '2012-10-17')
|
Chris@1115
|
1383 IssueRelation.create!(:issue_from => issue1, :issue_to => issue2,
|
Chris@1115
|
1384 :relation_type => IssueRelation::TYPE_PRECEDES)
|
Chris@1115
|
1385 assert_equal Date.parse('2012-10-18'), issue2.reload.start_date
|
Chris@1115
|
1386
|
Chris@1115
|
1387 issue1.start_date = '2012-09-17'
|
Chris@1115
|
1388 issue1.due_date = '2012-09-18'
|
Chris@1115
|
1389 issue1.save!
|
Chris@1115
|
1390 issue2.reload
|
Chris@1115
|
1391 assert_equal Date.parse('2012-09-19'), issue2.start_date
|
Chris@1115
|
1392 assert_equal Date.parse('2012-09-21'), issue2.due_date
|
Chris@1115
|
1393 end
|
Chris@1115
|
1394
|
Chris@1115
|
1395 def test_rescheduling_reschedule_following_issue_earlier_should_consider_other_preceding_issues
|
Chris@1115
|
1396 issue1 = Issue.generate!(:start_date => '2012-10-15', :due_date => '2012-10-17')
|
Chris@1115
|
1397 issue2 = Issue.generate!(:start_date => '2012-10-15', :due_date => '2012-10-17')
|
Chris@1115
|
1398 issue3 = Issue.generate!(:start_date => '2012-10-01', :due_date => '2012-10-02')
|
Chris@1115
|
1399 IssueRelation.create!(:issue_from => issue1, :issue_to => issue2,
|
Chris@1115
|
1400 :relation_type => IssueRelation::TYPE_PRECEDES)
|
Chris@1115
|
1401 IssueRelation.create!(:issue_from => issue3, :issue_to => issue2,
|
Chris@1115
|
1402 :relation_type => IssueRelation::TYPE_PRECEDES)
|
Chris@1115
|
1403 assert_equal Date.parse('2012-10-18'), issue2.reload.start_date
|
Chris@1115
|
1404
|
Chris@1115
|
1405 issue1.start_date = '2012-09-17'
|
Chris@1115
|
1406 issue1.due_date = '2012-09-18'
|
Chris@1115
|
1407 issue1.save!
|
Chris@1115
|
1408 issue2.reload
|
Chris@1115
|
1409 # Issue 2 must start after Issue 3
|
Chris@1115
|
1410 assert_equal Date.parse('2012-10-03'), issue2.start_date
|
Chris@1115
|
1411 assert_equal Date.parse('2012-10-05'), issue2.due_date
|
Chris@1115
|
1412 end
|
Chris@1115
|
1413
|
Chris@1115
|
1414 def test_rescheduling_a_stale_issue_should_not_raise_an_error
|
Chris@1115
|
1415 with_settings :non_working_week_days => [] do
|
Chris@1115
|
1416 stale = Issue.find(1)
|
Chris@1115
|
1417 issue = Issue.find(1)
|
Chris@1115
|
1418 issue.subject = "Updated"
|
Chris@1115
|
1419 issue.save!
|
Chris@1115
|
1420 date = 10.days.from_now.to_date
|
Chris@1115
|
1421 assert_nothing_raised do
|
Chris@1115
|
1422 stale.reschedule_on!(date)
|
Chris@1115
|
1423 end
|
Chris@1115
|
1424 assert_equal date, stale.reload.start_date
|
Chris@1115
|
1425 end
|
chris@37
|
1426 end
|
Chris@441
|
1427
|
Chris@0
|
1428 def test_overdue
|
Chris@0
|
1429 assert Issue.new(:due_date => 1.day.ago.to_date).overdue?
|
Chris@0
|
1430 assert !Issue.new(:due_date => Date.today).overdue?
|
Chris@0
|
1431 assert !Issue.new(:due_date => 1.day.from_now.to_date).overdue?
|
Chris@0
|
1432 assert !Issue.new(:due_date => nil).overdue?
|
Chris@1115
|
1433 assert !Issue.new(:due_date => 1.day.ago.to_date,
|
Chris@1115
|
1434 :status => IssueStatus.find(:first,
|
Chris@1115
|
1435 :conditions => {:is_closed => true})
|
Chris@1115
|
1436 ).overdue?
|
Chris@0
|
1437 end
|
chris@22
|
1438
|
chris@22
|
1439 context "#behind_schedule?" do
|
chris@22
|
1440 should "be false if the issue has no start_date" do
|
Chris@1115
|
1441 assert !Issue.new(:start_date => nil,
|
Chris@1115
|
1442 :due_date => 1.day.from_now.to_date,
|
Chris@1115
|
1443 :done_ratio => 0).behind_schedule?
|
chris@22
|
1444 end
|
chris@22
|
1445
|
chris@22
|
1446 should "be false if the issue has no end_date" do
|
Chris@1115
|
1447 assert !Issue.new(:start_date => 1.day.from_now.to_date,
|
Chris@1115
|
1448 :due_date => nil,
|
Chris@1115
|
1449 :done_ratio => 0).behind_schedule?
|
chris@22
|
1450 end
|
chris@22
|
1451
|
chris@22
|
1452 should "be false if the issue has more done than it's calendar time" do
|
Chris@1115
|
1453 assert !Issue.new(:start_date => 50.days.ago.to_date,
|
Chris@1115
|
1454 :due_date => 50.days.from_now.to_date,
|
Chris@1115
|
1455 :done_ratio => 90).behind_schedule?
|
chris@22
|
1456 end
|
chris@22
|
1457
|
chris@22
|
1458 should "be true if the issue hasn't been started at all" do
|
Chris@1115
|
1459 assert Issue.new(:start_date => 1.day.ago.to_date,
|
Chris@1115
|
1460 :due_date => 1.day.from_now.to_date,
|
Chris@1115
|
1461 :done_ratio => 0).behind_schedule?
|
chris@22
|
1462 end
|
chris@22
|
1463
|
chris@22
|
1464 should "be true if the issue has used more calendar time than it's done ratio" do
|
Chris@1115
|
1465 assert Issue.new(:start_date => 100.days.ago.to_date,
|
Chris@1115
|
1466 :due_date => Date.today,
|
Chris@1115
|
1467 :done_ratio => 90).behind_schedule?
|
chris@22
|
1468 end
|
chris@22
|
1469 end
|
chris@37
|
1470
|
chris@37
|
1471 context "#assignable_users" do
|
chris@37
|
1472 should "be Users" do
|
chris@37
|
1473 assert_kind_of User, Issue.find(1).assignable_users.first
|
chris@37
|
1474 end
|
chris@37
|
1475
|
chris@37
|
1476 should "include the issue author" do
|
chris@37
|
1477 non_project_member = User.generate!
|
Chris@1115
|
1478 issue = Issue.generate!(:author => non_project_member)
|
chris@37
|
1479
|
chris@37
|
1480 assert issue.assignable_users.include?(non_project_member)
|
chris@37
|
1481 end
|
chris@37
|
1482
|
Chris@909
|
1483 should "include the current assignee" do
|
Chris@909
|
1484 user = User.generate!
|
Chris@1115
|
1485 issue = Issue.generate!(:assigned_to => user)
|
Chris@909
|
1486 user.lock!
|
Chris@909
|
1487
|
Chris@909
|
1488 assert Issue.find(issue.id).assignable_users.include?(user)
|
Chris@909
|
1489 end
|
Chris@909
|
1490
|
chris@37
|
1491 should "not show the issue author twice" do
|
chris@37
|
1492 assignable_user_ids = Issue.find(1).assignable_users.collect(&:id)
|
chris@37
|
1493 assert_equal 2, assignable_user_ids.length
|
Chris@441
|
1494
|
chris@37
|
1495 assignable_user_ids.each do |user_id|
|
Chris@1115
|
1496 assert_equal 1, assignable_user_ids.select {|i| i == user_id}.length,
|
Chris@1115
|
1497 "User #{user_id} appears more or less than once"
|
chris@37
|
1498 end
|
chris@37
|
1499 end
|
Chris@909
|
1500
|
Chris@909
|
1501 context "with issue_group_assignment" do
|
Chris@909
|
1502 should "include groups" do
|
Chris@909
|
1503 issue = Issue.new(:project => Project.find(2))
|
Chris@909
|
1504
|
Chris@909
|
1505 with_settings :issue_group_assignment => '1' do
|
Chris@909
|
1506 assert_equal %w(Group User), issue.assignable_users.map {|a| a.class.name}.uniq.sort
|
Chris@909
|
1507 assert issue.assignable_users.include?(Group.find(11))
|
Chris@909
|
1508 end
|
Chris@909
|
1509 end
|
Chris@909
|
1510 end
|
Chris@909
|
1511
|
Chris@909
|
1512 context "without issue_group_assignment" do
|
Chris@909
|
1513 should "not include groups" do
|
Chris@909
|
1514 issue = Issue.new(:project => Project.find(2))
|
Chris@909
|
1515
|
Chris@909
|
1516 with_settings :issue_group_assignment => '0' do
|
Chris@909
|
1517 assert_equal %w(User), issue.assignable_users.map {|a| a.class.name}.uniq.sort
|
Chris@909
|
1518 assert !issue.assignable_users.include?(Group.find(11))
|
Chris@909
|
1519 end
|
Chris@909
|
1520 end
|
Chris@909
|
1521 end
|
Chris@0
|
1522 end
|
Chris@441
|
1523
|
Chris@0
|
1524 def test_create_should_send_email_notification
|
Chris@0
|
1525 ActionMailer::Base.deliveries.clear
|
Chris@909
|
1526 issue = Issue.new(:project_id => 1, :tracker_id => 1,
|
Chris@909
|
1527 :author_id => 3, :status_id => 1,
|
Chris@909
|
1528 :priority => IssuePriority.all.first,
|
Chris@909
|
1529 :subject => 'test_create', :estimated_hours => '1:30')
|
Chris@0
|
1530
|
Chris@0
|
1531 assert issue.save
|
Chris@0
|
1532 assert_equal 1, ActionMailer::Base.deliveries.size
|
Chris@0
|
1533 end
|
chris@37
|
1534
|
Chris@0
|
1535 def test_stale_issue_should_not_send_email_notification
|
Chris@0
|
1536 ActionMailer::Base.deliveries.clear
|
Chris@0
|
1537 issue = Issue.find(1)
|
Chris@0
|
1538 stale = Issue.find(1)
|
Chris@441
|
1539
|
Chris@0
|
1540 issue.init_journal(User.find(1))
|
Chris@0
|
1541 issue.subject = 'Subjet update'
|
Chris@0
|
1542 assert issue.save
|
Chris@0
|
1543 assert_equal 1, ActionMailer::Base.deliveries.size
|
Chris@0
|
1544 ActionMailer::Base.deliveries.clear
|
Chris@441
|
1545
|
Chris@0
|
1546 stale.init_journal(User.find(1))
|
Chris@0
|
1547 stale.subject = 'Another subjet update'
|
Chris@0
|
1548 assert_raise ActiveRecord::StaleObjectError do
|
Chris@0
|
1549 stale.save
|
Chris@0
|
1550 end
|
Chris@0
|
1551 assert ActionMailer::Base.deliveries.empty?
|
Chris@0
|
1552 end
|
Chris@441
|
1553
|
Chris@245
|
1554 def test_journalized_description
|
Chris@245
|
1555 IssueCustomField.delete_all
|
Chris@441
|
1556
|
Chris@245
|
1557 i = Issue.first
|
Chris@245
|
1558 old_description = i.description
|
Chris@245
|
1559 new_description = "This is the new description"
|
Chris@441
|
1560
|
Chris@245
|
1561 i.init_journal(User.find(2))
|
Chris@245
|
1562 i.description = new_description
|
Chris@245
|
1563 assert_difference 'Journal.count', 1 do
|
Chris@245
|
1564 assert_difference 'JournalDetail.count', 1 do
|
Chris@245
|
1565 i.save!
|
Chris@245
|
1566 end
|
Chris@245
|
1567 end
|
Chris@441
|
1568
|
Chris@245
|
1569 detail = JournalDetail.first(:order => 'id DESC')
|
Chris@245
|
1570 assert_equal i, detail.journal.journalized
|
Chris@245
|
1571 assert_equal 'attr', detail.property
|
Chris@245
|
1572 assert_equal 'description', detail.prop_key
|
Chris@245
|
1573 assert_equal old_description, detail.old_value
|
Chris@245
|
1574 assert_equal new_description, detail.value
|
Chris@245
|
1575 end
|
Chris@909
|
1576
|
Chris@507
|
1577 def test_blank_descriptions_should_not_be_journalized
|
Chris@507
|
1578 IssueCustomField.delete_all
|
Chris@507
|
1579 Issue.update_all("description = NULL", "id=1")
|
Chris@909
|
1580
|
Chris@507
|
1581 i = Issue.find(1)
|
Chris@507
|
1582 i.init_journal(User.find(2))
|
Chris@507
|
1583 i.subject = "blank description"
|
Chris@507
|
1584 i.description = "\r\n"
|
Chris@909
|
1585
|
Chris@507
|
1586 assert_difference 'Journal.count', 1 do
|
Chris@507
|
1587 assert_difference 'JournalDetail.count', 1 do
|
Chris@507
|
1588 i.save!
|
Chris@507
|
1589 end
|
Chris@507
|
1590 end
|
Chris@507
|
1591 end
|
Chris@909
|
1592
|
Chris@1115
|
1593 def test_journalized_multi_custom_field
|
Chris@1115
|
1594 field = IssueCustomField.create!(:name => 'filter', :field_format => 'list',
|
Chris@1115
|
1595 :is_filter => true, :is_for_all => true,
|
Chris@1115
|
1596 :tracker_ids => [1],
|
Chris@1115
|
1597 :possible_values => ['value1', 'value2', 'value3'],
|
Chris@1115
|
1598 :multiple => true)
|
Chris@1115
|
1599
|
Chris@1115
|
1600 issue = Issue.create!(:project_id => 1, :tracker_id => 1,
|
Chris@1115
|
1601 :subject => 'Test', :author_id => 1)
|
Chris@1115
|
1602
|
Chris@1115
|
1603 assert_difference 'Journal.count' do
|
Chris@1115
|
1604 assert_difference 'JournalDetail.count' do
|
Chris@1115
|
1605 issue.init_journal(User.first)
|
Chris@1115
|
1606 issue.custom_field_values = {field.id => ['value1']}
|
Chris@1115
|
1607 issue.save!
|
Chris@1115
|
1608 end
|
Chris@1115
|
1609 assert_difference 'JournalDetail.count' do
|
Chris@1115
|
1610 issue.init_journal(User.first)
|
Chris@1115
|
1611 issue.custom_field_values = {field.id => ['value1', 'value2']}
|
Chris@1115
|
1612 issue.save!
|
Chris@1115
|
1613 end
|
Chris@1115
|
1614 assert_difference 'JournalDetail.count', 2 do
|
Chris@1115
|
1615 issue.init_journal(User.first)
|
Chris@1115
|
1616 issue.custom_field_values = {field.id => ['value3', 'value2']}
|
Chris@1115
|
1617 issue.save!
|
Chris@1115
|
1618 end
|
Chris@1115
|
1619 assert_difference 'JournalDetail.count', 2 do
|
Chris@1115
|
1620 issue.init_journal(User.first)
|
Chris@1115
|
1621 issue.custom_field_values = {field.id => nil}
|
Chris@1115
|
1622 issue.save!
|
Chris@1115
|
1623 end
|
Chris@1115
|
1624 end
|
Chris@1115
|
1625 end
|
Chris@1115
|
1626
|
Chris@507
|
1627 def test_description_eol_should_be_normalized
|
Chris@507
|
1628 i = Issue.new(:description => "CR \r LF \n CRLF \r\n")
|
Chris@507
|
1629 assert_equal "CR \r\n LF \r\n CRLF \r\n", i.description
|
Chris@507
|
1630 end
|
Chris@441
|
1631
|
Chris@0
|
1632 def test_saving_twice_should_not_duplicate_journal_details
|
Chris@0
|
1633 i = Issue.find(:first)
|
Chris@0
|
1634 i.init_journal(User.find(2), 'Some notes')
|
Chris@0
|
1635 # initial changes
|
Chris@0
|
1636 i.subject = 'New subject'
|
Chris@0
|
1637 i.done_ratio = i.done_ratio + 10
|
Chris@0
|
1638 assert_difference 'Journal.count' do
|
Chris@0
|
1639 assert i.save
|
Chris@0
|
1640 end
|
Chris@0
|
1641 # 1 more change
|
Chris@0
|
1642 i.priority = IssuePriority.find(:first, :conditions => ["id <> ?", i.priority_id])
|
Chris@0
|
1643 assert_no_difference 'Journal.count' do
|
Chris@0
|
1644 assert_difference 'JournalDetail.count', 1 do
|
Chris@0
|
1645 i.save
|
Chris@0
|
1646 end
|
Chris@0
|
1647 end
|
Chris@0
|
1648 # no more change
|
Chris@0
|
1649 assert_no_difference 'Journal.count' do
|
Chris@0
|
1650 assert_no_difference 'JournalDetail.count' do
|
Chris@0
|
1651 i.save
|
Chris@0
|
1652 end
|
Chris@0
|
1653 end
|
Chris@0
|
1654 end
|
Chris@0
|
1655
|
Chris@128
|
1656 def test_all_dependent_issues
|
Chris@128
|
1657 IssueRelation.delete_all
|
Chris@909
|
1658 assert IssueRelation.create!(:issue_from => Issue.find(1),
|
Chris@909
|
1659 :issue_to => Issue.find(2),
|
Chris@909
|
1660 :relation_type => IssueRelation::TYPE_PRECEDES)
|
Chris@909
|
1661 assert IssueRelation.create!(:issue_from => Issue.find(2),
|
Chris@909
|
1662 :issue_to => Issue.find(3),
|
Chris@909
|
1663 :relation_type => IssueRelation::TYPE_PRECEDES)
|
Chris@909
|
1664 assert IssueRelation.create!(:issue_from => Issue.find(3),
|
Chris@909
|
1665 :issue_to => Issue.find(8),
|
Chris@909
|
1666 :relation_type => IssueRelation::TYPE_PRECEDES)
|
Chris@441
|
1667
|
Chris@128
|
1668 assert_equal [2, 3, 8], Issue.find(1).all_dependent_issues.collect(&:id).sort
|
Chris@128
|
1669 end
|
Chris@128
|
1670
|
Chris@128
|
1671 def test_all_dependent_issues_with_persistent_circular_dependency
|
Chris@128
|
1672 IssueRelation.delete_all
|
Chris@909
|
1673 assert IssueRelation.create!(:issue_from => Issue.find(1),
|
Chris@909
|
1674 :issue_to => Issue.find(2),
|
Chris@909
|
1675 :relation_type => IssueRelation::TYPE_PRECEDES)
|
Chris@909
|
1676 assert IssueRelation.create!(:issue_from => Issue.find(2),
|
Chris@909
|
1677 :issue_to => Issue.find(3),
|
Chris@909
|
1678 :relation_type => IssueRelation::TYPE_PRECEDES)
|
Chris@441
|
1679
|
Chris@1115
|
1680 r = IssueRelation.create!(:issue_from => Issue.find(3),
|
Chris@1115
|
1681 :issue_to => Issue.find(7),
|
Chris@1115
|
1682 :relation_type => IssueRelation::TYPE_PRECEDES)
|
Chris@1115
|
1683 IssueRelation.update_all("issue_to_id = 1", ["id = ?", r.id])
|
Chris@1115
|
1684
|
Chris@128
|
1685 assert_equal [2, 3], Issue.find(1).all_dependent_issues.collect(&:id).sort
|
Chris@128
|
1686 end
|
Chris@441
|
1687
|
Chris@441
|
1688 def test_all_dependent_issues_with_persistent_multiple_circular_dependencies
|
Chris@441
|
1689 IssueRelation.delete_all
|
Chris@909
|
1690 assert IssueRelation.create!(:issue_from => Issue.find(1),
|
Chris@909
|
1691 :issue_to => Issue.find(2),
|
Chris@909
|
1692 :relation_type => IssueRelation::TYPE_RELATES)
|
Chris@909
|
1693 assert IssueRelation.create!(:issue_from => Issue.find(2),
|
Chris@909
|
1694 :issue_to => Issue.find(3),
|
Chris@909
|
1695 :relation_type => IssueRelation::TYPE_RELATES)
|
Chris@909
|
1696 assert IssueRelation.create!(:issue_from => Issue.find(3),
|
Chris@909
|
1697 :issue_to => Issue.find(8),
|
Chris@909
|
1698 :relation_type => IssueRelation::TYPE_RELATES)
|
Chris@1115
|
1699
|
Chris@1115
|
1700 r = IssueRelation.create!(:issue_from => Issue.find(8),
|
Chris@1115
|
1701 :issue_to => Issue.find(7),
|
Chris@1115
|
1702 :relation_type => IssueRelation::TYPE_RELATES)
|
Chris@1115
|
1703 IssueRelation.update_all("issue_to_id = 2", ["id = ?", r.id])
|
Chris@1115
|
1704
|
Chris@1115
|
1705 r = IssueRelation.create!(:issue_from => Issue.find(3),
|
Chris@1115
|
1706 :issue_to => Issue.find(7),
|
Chris@1115
|
1707 :relation_type => IssueRelation::TYPE_RELATES)
|
Chris@1115
|
1708 IssueRelation.update_all("issue_to_id = 1", ["id = ?", r.id])
|
Chris@441
|
1709
|
Chris@441
|
1710 assert_equal [2, 3, 8], Issue.find(1).all_dependent_issues.collect(&:id).sort
|
Chris@441
|
1711 end
|
Chris@441
|
1712
|
Chris@0
|
1713 context "#done_ratio" do
|
Chris@0
|
1714 setup do
|
Chris@0
|
1715 @issue = Issue.find(1)
|
Chris@0
|
1716 @issue_status = IssueStatus.find(1)
|
Chris@0
|
1717 @issue_status.update_attribute(:default_done_ratio, 50)
|
chris@37
|
1718 @issue2 = Issue.find(2)
|
chris@37
|
1719 @issue_status2 = IssueStatus.find(2)
|
chris@37
|
1720 @issue_status2.update_attribute(:default_done_ratio, 0)
|
Chris@0
|
1721 end
|
Chris@441
|
1722
|
Chris@1115
|
1723 teardown do
|
Chris@1115
|
1724 Setting.issue_done_ratio = 'issue_field'
|
Chris@1115
|
1725 end
|
Chris@1115
|
1726
|
Chris@0
|
1727 context "with Setting.issue_done_ratio using the issue_field" do
|
Chris@0
|
1728 setup do
|
Chris@0
|
1729 Setting.issue_done_ratio = 'issue_field'
|
Chris@0
|
1730 end
|
Chris@441
|
1731
|
Chris@0
|
1732 should "read the issue's field" do
|
Chris@0
|
1733 assert_equal 0, @issue.done_ratio
|
chris@37
|
1734 assert_equal 30, @issue2.done_ratio
|
Chris@0
|
1735 end
|
Chris@0
|
1736 end
|
Chris@0
|
1737
|
Chris@0
|
1738 context "with Setting.issue_done_ratio using the issue_status" do
|
Chris@0
|
1739 setup do
|
Chris@0
|
1740 Setting.issue_done_ratio = 'issue_status'
|
Chris@0
|
1741 end
|
Chris@441
|
1742
|
Chris@0
|
1743 should "read the Issue Status's default done ratio" do
|
Chris@0
|
1744 assert_equal 50, @issue.done_ratio
|
chris@37
|
1745 assert_equal 0, @issue2.done_ratio
|
Chris@0
|
1746 end
|
Chris@0
|
1747 end
|
Chris@0
|
1748 end
|
Chris@0
|
1749
|
Chris@0
|
1750 context "#update_done_ratio_from_issue_status" do
|
Chris@0
|
1751 setup do
|
Chris@0
|
1752 @issue = Issue.find(1)
|
Chris@0
|
1753 @issue_status = IssueStatus.find(1)
|
Chris@0
|
1754 @issue_status.update_attribute(:default_done_ratio, 50)
|
chris@37
|
1755 @issue2 = Issue.find(2)
|
chris@37
|
1756 @issue_status2 = IssueStatus.find(2)
|
chris@37
|
1757 @issue_status2.update_attribute(:default_done_ratio, 0)
|
Chris@0
|
1758 end
|
Chris@441
|
1759
|
Chris@0
|
1760 context "with Setting.issue_done_ratio using the issue_field" do
|
Chris@0
|
1761 setup do
|
Chris@0
|
1762 Setting.issue_done_ratio = 'issue_field'
|
Chris@0
|
1763 end
|
Chris@441
|
1764
|
Chris@0
|
1765 should "not change the issue" do
|
Chris@0
|
1766 @issue.update_done_ratio_from_issue_status
|
chris@37
|
1767 @issue2.update_done_ratio_from_issue_status
|
Chris@0
|
1768
|
chris@37
|
1769 assert_equal 0, @issue.read_attribute(:done_ratio)
|
chris@37
|
1770 assert_equal 30, @issue2.read_attribute(:done_ratio)
|
Chris@0
|
1771 end
|
Chris@0
|
1772 end
|
Chris@0
|
1773
|
Chris@0
|
1774 context "with Setting.issue_done_ratio using the issue_status" do
|
Chris@0
|
1775 setup do
|
Chris@0
|
1776 Setting.issue_done_ratio = 'issue_status'
|
Chris@0
|
1777 end
|
Chris@441
|
1778
|
chris@37
|
1779 should "change the issue's done ratio" do
|
Chris@0
|
1780 @issue.update_done_ratio_from_issue_status
|
chris@37
|
1781 @issue2.update_done_ratio_from_issue_status
|
Chris@0
|
1782
|
chris@37
|
1783 assert_equal 50, @issue.read_attribute(:done_ratio)
|
chris@37
|
1784 assert_equal 0, @issue2.read_attribute(:done_ratio)
|
Chris@0
|
1785 end
|
Chris@0
|
1786 end
|
Chris@0
|
1787 end
|
Chris@0
|
1788
|
Chris@0
|
1789 test "#by_tracker" do
|
Chris@441
|
1790 User.current = User.anonymous
|
Chris@0
|
1791 groups = Issue.by_tracker(Project.find(1))
|
Chris@0
|
1792 assert_equal 3, groups.size
|
Chris@0
|
1793 assert_equal 7, groups.inject(0) {|sum, group| sum + group['total'].to_i}
|
Chris@0
|
1794 end
|
Chris@0
|
1795
|
Chris@0
|
1796 test "#by_version" do
|
Chris@441
|
1797 User.current = User.anonymous
|
Chris@0
|
1798 groups = Issue.by_version(Project.find(1))
|
Chris@0
|
1799 assert_equal 3, groups.size
|
Chris@0
|
1800 assert_equal 3, groups.inject(0) {|sum, group| sum + group['total'].to_i}
|
Chris@0
|
1801 end
|
Chris@0
|
1802
|
Chris@0
|
1803 test "#by_priority" do
|
Chris@441
|
1804 User.current = User.anonymous
|
Chris@0
|
1805 groups = Issue.by_priority(Project.find(1))
|
Chris@0
|
1806 assert_equal 4, groups.size
|
Chris@0
|
1807 assert_equal 7, groups.inject(0) {|sum, group| sum + group['total'].to_i}
|
Chris@0
|
1808 end
|
Chris@0
|
1809
|
Chris@0
|
1810 test "#by_category" do
|
Chris@441
|
1811 User.current = User.anonymous
|
Chris@0
|
1812 groups = Issue.by_category(Project.find(1))
|
Chris@0
|
1813 assert_equal 2, groups.size
|
Chris@0
|
1814 assert_equal 3, groups.inject(0) {|sum, group| sum + group['total'].to_i}
|
Chris@0
|
1815 end
|
Chris@0
|
1816
|
Chris@0
|
1817 test "#by_assigned_to" do
|
Chris@441
|
1818 User.current = User.anonymous
|
Chris@0
|
1819 groups = Issue.by_assigned_to(Project.find(1))
|
Chris@0
|
1820 assert_equal 2, groups.size
|
Chris@0
|
1821 assert_equal 2, groups.inject(0) {|sum, group| sum + group['total'].to_i}
|
Chris@0
|
1822 end
|
Chris@0
|
1823
|
Chris@0
|
1824 test "#by_author" do
|
Chris@441
|
1825 User.current = User.anonymous
|
Chris@0
|
1826 groups = Issue.by_author(Project.find(1))
|
Chris@0
|
1827 assert_equal 4, groups.size
|
Chris@0
|
1828 assert_equal 7, groups.inject(0) {|sum, group| sum + group['total'].to_i}
|
Chris@0
|
1829 end
|
Chris@0
|
1830
|
Chris@0
|
1831 test "#by_subproject" do
|
Chris@441
|
1832 User.current = User.anonymous
|
Chris@0
|
1833 groups = Issue.by_subproject(Project.find(1))
|
Chris@441
|
1834 # Private descendant not visible
|
Chris@441
|
1835 assert_equal 1, groups.size
|
Chris@441
|
1836 assert_equal 2, groups.inject(0) {|sum, group| sum + group['total'].to_i}
|
Chris@0
|
1837 end
|
Chris@441
|
1838
|
Chris@1115
|
1839 def test_recently_updated_scope
|
Chris@0
|
1840 #should return the last updated issue
|
Chris@1115
|
1841 assert_equal Issue.reorder("updated_on DESC").first, Issue.recently_updated.limit(1).first
|
Chris@0
|
1842 end
|
Chris@0
|
1843
|
Chris@0
|
1844 def test_on_active_projects_scope
|
Chris@0
|
1845 assert Project.find(2).archive
|
Chris@441
|
1846
|
Chris@0
|
1847 before = Issue.on_active_project.length
|
Chris@0
|
1848 # test inclusion to results
|
Chris@1115
|
1849 issue = Issue.generate!(:tracker => Project.find(2).trackers.first)
|
Chris@0
|
1850 assert_equal before + 1, Issue.on_active_project.length
|
Chris@0
|
1851
|
Chris@0
|
1852 # Move to an archived project
|
Chris@0
|
1853 issue.project = Project.find(2)
|
Chris@0
|
1854 assert issue.save
|
Chris@0
|
1855 assert_equal before, Issue.on_active_project.length
|
Chris@0
|
1856 end
|
chris@37
|
1857
|
chris@37
|
1858 context "Issue#recipients" do
|
chris@37
|
1859 setup do
|
chris@37
|
1860 @project = Project.find(1)
|
Chris@1115
|
1861 @author = User.generate!
|
Chris@1115
|
1862 @assignee = User.generate!
|
Chris@1115
|
1863 @issue = Issue.generate!(:project => @project, :assigned_to => @assignee, :author => @author)
|
chris@37
|
1864 end
|
Chris@441
|
1865
|
chris@37
|
1866 should "include project recipients" do
|
chris@37
|
1867 assert @project.recipients.present?
|
chris@37
|
1868 @project.recipients.each do |project_recipient|
|
chris@37
|
1869 assert @issue.recipients.include?(project_recipient)
|
chris@37
|
1870 end
|
chris@37
|
1871 end
|
chris@37
|
1872
|
chris@37
|
1873 should "include the author if the author is active" do
|
chris@37
|
1874 assert @issue.author, "No author set for Issue"
|
chris@37
|
1875 assert @issue.recipients.include?(@issue.author.mail)
|
chris@37
|
1876 end
|
Chris@441
|
1877
|
chris@37
|
1878 should "include the assigned to user if the assigned to user is active" do
|
chris@37
|
1879 assert @issue.assigned_to, "No assigned_to set for Issue"
|
chris@37
|
1880 assert @issue.recipients.include?(@issue.assigned_to.mail)
|
chris@37
|
1881 end
|
chris@37
|
1882
|
chris@37
|
1883 should "not include users who opt out of all email" do
|
chris@37
|
1884 @author.update_attribute(:mail_notification, :none)
|
chris@37
|
1885
|
chris@37
|
1886 assert !@issue.recipients.include?(@issue.author.mail)
|
chris@37
|
1887 end
|
chris@37
|
1888
|
chris@37
|
1889 should "not include the issue author if they are only notified of assigned issues" do
|
chris@37
|
1890 @author.update_attribute(:mail_notification, :only_assigned)
|
chris@37
|
1891
|
chris@37
|
1892 assert !@issue.recipients.include?(@issue.author.mail)
|
chris@37
|
1893 end
|
chris@37
|
1894
|
chris@37
|
1895 should "not include the assigned user if they are only notified of owned issues" do
|
chris@37
|
1896 @assignee.update_attribute(:mail_notification, :only_owner)
|
chris@37
|
1897
|
chris@37
|
1898 assert !@issue.recipients.include?(@issue.assigned_to.mail)
|
chris@37
|
1899 end
|
Chris@1115
|
1900 end
|
chris@37
|
1901
|
Chris@1115
|
1902 def test_last_journal_id_with_journals_should_return_the_journal_id
|
Chris@1115
|
1903 assert_equal 2, Issue.find(1).last_journal_id
|
Chris@1115
|
1904 end
|
Chris@1115
|
1905
|
Chris@1115
|
1906 def test_last_journal_id_without_journals_should_return_nil
|
Chris@1115
|
1907 assert_nil Issue.find(3).last_journal_id
|
Chris@1115
|
1908 end
|
Chris@1115
|
1909
|
Chris@1115
|
1910 def test_journals_after_should_return_journals_with_greater_id
|
Chris@1115
|
1911 assert_equal [Journal.find(2)], Issue.find(1).journals_after('1')
|
Chris@1115
|
1912 assert_equal [], Issue.find(1).journals_after('2')
|
Chris@1115
|
1913 end
|
Chris@1115
|
1914
|
Chris@1115
|
1915 def test_journals_after_with_blank_arg_should_return_all_journals
|
Chris@1115
|
1916 assert_equal [Journal.find(1), Journal.find(2)], Issue.find(1).journals_after('')
|
Chris@1115
|
1917 end
|
Chris@1115
|
1918
|
Chris@1115
|
1919 def test_css_classes_should_include_priority
|
Chris@1115
|
1920 issue = Issue.new(:priority => IssuePriority.find(8))
|
Chris@1115
|
1921 classes = issue.css_classes.split(' ')
|
Chris@1115
|
1922 assert_include 'priority-8', classes
|
Chris@1115
|
1923 assert_include 'priority-highest', classes
|
Chris@1115
|
1924 end
|
Chris@1115
|
1925
|
Chris@1115
|
1926 def test_save_attachments_with_hash_should_save_attachments_in_keys_order
|
Chris@1115
|
1927 set_tmp_attachments_directory
|
Chris@1115
|
1928 issue = Issue.generate!
|
Chris@1115
|
1929 issue.save_attachments({
|
Chris@1115
|
1930 'p0' => {'file' => mock_file_with_options(:original_filename => 'upload')},
|
Chris@1115
|
1931 '3' => {'file' => mock_file_with_options(:original_filename => 'bar')},
|
Chris@1115
|
1932 '1' => {'file' => mock_file_with_options(:original_filename => 'foo')}
|
Chris@1115
|
1933 })
|
Chris@1115
|
1934 issue.attach_saved_attachments
|
Chris@1115
|
1935
|
Chris@1115
|
1936 assert_equal 3, issue.reload.attachments.count
|
Chris@1115
|
1937 assert_equal %w(upload foo bar), issue.attachments.map(&:filename)
|
chris@37
|
1938 end
|
Chris@0
|
1939 end
|