comparison test/unit/issue_test.rb @ 909:cbb26bc654de redmine-1.3

Update to Redmine 1.3-stable branch (Redmine SVN rev 8964)
author Chris Cannam
date Fri, 24 Feb 2012 19:09:32 +0000
parents 0c939c159af4
children 433d4f72a19b
comparison
equal deleted inserted replaced
908:c6c2cbd0afee 909:cbb26bc654de
27 :issues, 27 :issues,
28 :custom_fields, :custom_fields_projects, :custom_fields_trackers, :custom_values, 28 :custom_fields, :custom_fields_projects, :custom_fields_trackers, :custom_values,
29 :time_entries 29 :time_entries
30 30
31 def test_create 31 def test_create
32 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 3, :status_id => 1, :priority => IssuePriority.all.first, :subject => 'test_create', :description => 'IssueTest#test_create', :estimated_hours => '1:30') 32 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 3,
33 :status_id => 1, :priority => IssuePriority.all.first,
34 :subject => 'test_create',
35 :description => 'IssueTest#test_create', :estimated_hours => '1:30')
33 assert issue.save 36 assert issue.save
34 issue.reload 37 issue.reload
35 assert_equal 1.5, issue.estimated_hours 38 assert_equal 1.5, issue.estimated_hours
36 end 39 end
37 40
38 def test_create_minimal 41 def test_create_minimal
39 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 3, :status_id => 1, :priority => IssuePriority.all.first, :subject => 'test_create') 42 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 3,
43 :status_id => 1, :priority => IssuePriority.all.first,
44 :subject => 'test_create')
40 assert issue.save 45 assert issue.save
41 assert issue.description.nil? 46 assert issue.description.nil?
42 end 47 end
43 48
44 def test_create_with_required_custom_field 49 def test_create_with_required_custom_field
45 field = IssueCustomField.find_by_name('Database') 50 field = IssueCustomField.find_by_name('Database')
46 field.update_attribute(:is_required, true) 51 field.update_attribute(:is_required, true)
47 52
48 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1, :status_id => 1, :subject => 'test_create', :description => 'IssueTest#test_create_with_required_custom_field') 53 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1,
54 :status_id => 1, :subject => 'test_create',
55 :description => 'IssueTest#test_create_with_required_custom_field')
49 assert issue.available_custom_fields.include?(field) 56 assert issue.available_custom_fields.include?(field)
50 # No value for the custom field 57 # No value for the custom field
51 assert !issue.save 58 assert !issue.save
52 assert_equal I18n.translate('activerecord.errors.messages.invalid'), issue.errors.on(:custom_values) 59 assert_equal I18n.translate('activerecord.errors.messages.invalid'), issue.errors.on(:custom_values)
53 # Blank value 60 # Blank value
63 assert issue.save 70 assert issue.save
64 issue.reload 71 issue.reload
65 assert_equal 'PostgreSQL', issue.custom_value_for(field).value 72 assert_equal 'PostgreSQL', issue.custom_value_for(field).value
66 end 73 end
67 74
75 def test_create_with_group_assignment
76 with_settings :issue_group_assignment => '1' do
77 assert Issue.new(:project_id => 2, :tracker_id => 1, :author_id => 1,
78 :subject => 'Group assignment',
79 :assigned_to_id => 11).save
80 issue = Issue.first(:order => 'id DESC')
81 assert_kind_of Group, issue.assigned_to
82 assert_equal Group.find(11), issue.assigned_to
83 end
84 end
85
68 def assert_visibility_match(user, issues) 86 def assert_visibility_match(user, issues)
69 assert_equal issues.collect(&:id).sort, Issue.all.select {|issue| issue.visible?(user)}.collect(&:id).sort 87 assert_equal issues.collect(&:id).sort, Issue.all.select {|issue| issue.visible?(user)}.collect(&:id).sort
70 end 88 end
71 89
72 def test_visible_scope_for_anonymous 90 def test_visible_scope_for_anonymous
78 assert_visibility_match User.anonymous, issues 96 assert_visibility_match User.anonymous, issues
79 end 97 end
80 98
81 def test_visible_scope_for_anonymous_with_own_issues_visibility 99 def test_visible_scope_for_anonymous_with_own_issues_visibility
82 Role.anonymous.update_attribute :issues_visibility, 'own' 100 Role.anonymous.update_attribute :issues_visibility, 'own'
83 Issue.create!(:project_id => 1, :tracker_id => 1, :author_id => User.anonymous.id, :subject => 'Issue by anonymous') 101 Issue.create!(:project_id => 1, :tracker_id => 1,
102 :author_id => User.anonymous.id,
103 :subject => 'Issue by anonymous')
84 104
85 issues = Issue.visible(User.anonymous).all 105 issues = Issue.visible(User.anonymous).all
86 assert issues.any? 106 assert issues.any?
87 assert_nil issues.detect {|issue| issue.author != User.anonymous} 107 assert_nil issues.detect {|issue| issue.author != User.anonymous}
88 assert_visibility_match User.anonymous, issues 108 assert_visibility_match User.anonymous, issues
136 issues = Issue.visible(user).all 156 issues = Issue.visible(user).all
137 assert issues.any? 157 assert issues.any?
138 assert_nil issues.detect {|issue| issue.project_id != 3} 158 assert_nil issues.detect {|issue| issue.project_id != 3}
139 assert_nil issues.detect {|issue| issue.is_private?} 159 assert_nil issues.detect {|issue| issue.is_private?}
140 assert_visibility_match user, issues 160 assert_visibility_match user, issues
161 end
162
163 def test_visible_scope_for_member_with_groups_should_return_assigned_issues
164 user = User.find(8)
165 assert user.groups.any?
166 Member.create!(:principal => user.groups.first, :project_id => 1, :role_ids => [2])
167 Role.non_member.remove_permission!(:view_issues)
168
169 issue = Issue.create(:project_id => 1, :tracker_id => 1, :author_id => 3,
170 :status_id => 1, :priority => IssuePriority.all.first,
171 :subject => 'Assignment test',
172 :assigned_to => user.groups.first,
173 :is_private => true)
174
175 Role.find(2).update_attribute :issues_visibility, 'default'
176 issues = Issue.visible(User.find(8)).all
177 assert issues.any?
178 assert issues.include?(issue)
179
180 Role.find(2).update_attribute :issues_visibility, 'own'
181 issues = Issue.visible(User.find(8)).all
182 assert issues.any?
183 assert issues.include?(issue)
141 end 184 end
142 185
143 def test_visible_scope_for_admin 186 def test_visible_scope_for_admin
144 user = User.find(1) 187 user = User.find(1)
145 user.members.each(&:destroy) 188 user.members.each(&:destroy)
174 end 217 end
175 218
176 def test_errors_full_messages_should_include_custom_fields_errors 219 def test_errors_full_messages_should_include_custom_fields_errors
177 field = IssueCustomField.find_by_name('Database') 220 field = IssueCustomField.find_by_name('Database')
178 221
179 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1, :status_id => 1, :subject => 'test_create', :description => 'IssueTest#test_create_with_required_custom_field') 222 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1,
223 :status_id => 1, :subject => 'test_create',
224 :description => 'IssueTest#test_create_with_required_custom_field')
180 assert issue.available_custom_fields.include?(field) 225 assert issue.available_custom_fields.include?(field)
181 # Invalid value 226 # Invalid value
182 issue.custom_field_values = { field.id => 'SQLServer' } 227 issue.custom_field_values = { field.id => 'SQLServer' }
183 228
184 assert !issue.valid? 229 assert !issue.valid?
185 assert_equal 1, issue.errors.full_messages.size 230 assert_equal 1, issue.errors.full_messages.size
186 assert_equal "Database #{I18n.translate('activerecord.errors.messages.inclusion')}", issue.errors.full_messages.first 231 assert_equal "Database #{I18n.translate('activerecord.errors.messages.inclusion')}",
232 issue.errors.full_messages.first
187 end 233 end
188 234
189 def test_update_issue_with_required_custom_field 235 def test_update_issue_with_required_custom_field
190 field = IssueCustomField.find_by_name('Database') 236 field = IssueCustomField.find_by_name('Database')
191 field.update_attribute(:is_required, true) 237 field.update_attribute(:is_required, true)
228 issue.reload 274 issue.reload
229 issue.custom_field_values = { field.id => 'MySQL' } 275 issue.custom_field_values = { field.id => 'MySQL' }
230 assert issue.save 276 assert issue.save
231 issue.reload 277 issue.reload
232 assert_equal custom_value.id, issue.custom_value_for(field).id 278 assert_equal custom_value.id, issue.custom_value_for(field).id
279 end
280
281 def test_should_not_update_custom_fields_on_changing_tracker_with_different_custom_fields
282 issue = Issue.new(:project_id => 1)
283 issue.attributes = {:tracker_id => 1, :author_id => 1, :status_id => 1, :subject => 'Test', :custom_field_values => {'2' => 'Test'}}
284 issue.save!
285
286 assert !Tracker.find(2).custom_field_ids.include?(2)
287
288 issue = Issue.find(issue.id)
289 issue.attributes = {:tracker_id => 2, :custom_field_values => {'1' => ''}}
290
291 issue = Issue.find(issue.id)
292 custom_value = issue.custom_value_for(2)
293 assert_not_nil custom_value
294 assert_equal 'Test', custom_value.value
233 end 295 end
234 296
235 def test_assigning_tracker_id_should_reload_custom_fields_values 297 def test_assigning_tracker_id_should_reload_custom_fields_values
236 issue = Issue.new(:project => Project.find(1)) 298 issue = Issue.new(:project => Project.find(1))
237 assert issue.custom_field_values.empty? 299 assert issue.custom_field_values.empty?
267 329
268 issue = Issue.find(1) 330 issue = Issue.find(1)
269 issue.tracker_id = 2 331 issue.tracker_id = 2
270 issue.subject = 'New subject' 332 issue.subject = 'New subject'
271 assert !issue.save 333 assert !issue.save
272 assert_not_nil issue.errors.on(:tracker_id) 334 assert_not_nil issue.errors[:tracker_id]
273 end 335 end
274 336
275 def test_category_based_assignment 337 def test_category_based_assignment
276 issue = Issue.create(:project_id => 1, :tracker_id => 1, :author_id => 3, :status_id => 1, :priority => IssuePriority.all.first, :subject => 'Assignment test', :description => 'Assignment test', :category_id => 1) 338 issue = Issue.create(:project_id => 1, :tracker_id => 1, :author_id => 3,
339 :status_id => 1, :priority => IssuePriority.all.first,
340 :subject => 'Assignment test',
341 :description => 'Assignment test', :category_id => 1)
277 assert_equal IssueCategory.find(1).assigned_to, issue.assigned_to 342 assert_equal IssueCategory.find(1).assigned_to, issue.assigned_to
278 end 343 end
279 344
280 def test_new_statuses_allowed_to 345 def test_new_statuses_allowed_to
281 Workflow.delete_all 346 Workflow.delete_all
291 356
292 issue = Issue.generate!(:tracker => tracker, :status => status, :project_id => 1) 357 issue = Issue.generate!(:tracker => tracker, :status => status, :project_id => 1)
293 assert_equal [1, 2], issue.new_statuses_allowed_to(user).map(&:id) 358 assert_equal [1, 2], issue.new_statuses_allowed_to(user).map(&:id)
294 359
295 issue = Issue.generate!(:tracker => tracker, :status => status, :project_id => 1, :author => user) 360 issue = Issue.generate!(:tracker => tracker, :status => status, :project_id => 1, :author => user)
296 assert_equal [1, 2, 3], issue.new_statuses_allowed_to(user).map(&:id) 361 assert_equal [1, 2, 3, 5], issue.new_statuses_allowed_to(user).map(&:id)
297 362
298 issue = Issue.generate!(:tracker => tracker, :status => status, :project_id => 1, :assigned_to => user) 363 issue = Issue.generate!(:tracker => tracker, :status => status, :project_id => 1, :assigned_to => user)
299 assert_equal [1, 2, 4], issue.new_statuses_allowed_to(user).map(&:id) 364 assert_equal [1, 2, 4, 5], issue.new_statuses_allowed_to(user).map(&:id)
300 365
301 issue = Issue.generate!(:tracker => tracker, :status => status, :project_id => 1, :author => user, :assigned_to => user) 366 issue = Issue.generate!(:tracker => tracker, :status => status, :project_id => 1, :author => user, :assigned_to => user)
302 assert_equal [1, 2, 3, 4, 5], issue.new_statuses_allowed_to(user).map(&:id) 367 assert_equal [1, 2, 3, 4, 5], issue.new_statuses_allowed_to(user).map(&:id)
303 end 368 end
304 369
322 assert_equal orig.status, issue.status 387 assert_equal orig.status, issue.status
323 end 388 end
324 389
325 def test_should_close_duplicates 390 def test_should_close_duplicates
326 # Create 3 issues 391 # Create 3 issues
327 issue1 = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1, :status_id => 1, :priority => IssuePriority.all.first, :subject => 'Duplicates test', :description => 'Duplicates test') 392 issue1 = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1,
393 :status_id => 1, :priority => IssuePriority.all.first,
394 :subject => 'Duplicates test', :description => 'Duplicates test')
328 assert issue1.save 395 assert issue1.save
329 issue2 = issue1.clone 396 issue2 = issue1.clone
330 assert issue2.save 397 assert issue2.save
331 issue3 = issue1.clone 398 issue3 = issue1.clone
332 assert issue3.save 399 assert issue3.save
349 assert issue3.reload.closed? 416 assert issue3.reload.closed?
350 end 417 end
351 418
352 def test_should_not_close_duplicated_issue 419 def test_should_not_close_duplicated_issue
353 # Create 3 issues 420 # Create 3 issues
354 issue1 = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1, :status_id => 1, :priority => IssuePriority.all.first, :subject => 'Duplicates test', :description => 'Duplicates test') 421 issue1 = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1,
422 :status_id => 1, :priority => IssuePriority.all.first,
423 :subject => 'Duplicates test', :description => 'Duplicates test')
355 assert issue1.save 424 assert issue1.save
356 issue2 = issue1.clone 425 issue2 = issue1.clone
357 assert issue2.save 426 assert issue2.save
358 427
359 # 2 is a dupe of 1 428 # 2 is a dupe of 1
375 end 444 end
376 445
377 def test_should_not_be_able_to_assign_a_new_issue_to_a_closed_version 446 def test_should_not_be_able_to_assign_a_new_issue_to_a_closed_version
378 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1, :status_id => 1, :fixed_version_id => 1, :subject => 'New issue') 447 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1, :status_id => 1, :fixed_version_id => 1, :subject => 'New issue')
379 assert !issue.save 448 assert !issue.save
380 assert_not_nil issue.errors.on(:fixed_version_id) 449 assert_not_nil issue.errors[:fixed_version_id]
381 end 450 end
382 451
383 def test_should_not_be_able_to_assign_a_new_issue_to_a_locked_version 452 def test_should_not_be_able_to_assign_a_new_issue_to_a_locked_version
384 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1, :status_id => 1, :fixed_version_id => 2, :subject => 'New issue') 453 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1, :status_id => 1, :fixed_version_id => 2, :subject => 'New issue')
385 assert !issue.save 454 assert !issue.save
386 assert_not_nil issue.errors.on(:fixed_version_id) 455 assert_not_nil issue.errors[:fixed_version_id]
387 end 456 end
388 457
389 def test_should_be_able_to_assign_a_new_issue_to_an_open_version 458 def test_should_be_able_to_assign_a_new_issue_to_an_open_version
390 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1, :status_id => 1, :fixed_version_id => 3, :subject => 'New issue') 459 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1, :status_id => 1, :fixed_version_id => 3, :subject => 'New issue')
391 assert issue.save 460 assert issue.save
400 469
401 def test_should_not_be_able_to_reopen_an_issue_assigned_to_a_closed_version 470 def test_should_not_be_able_to_reopen_an_issue_assigned_to_a_closed_version
402 issue = Issue.find(11) 471 issue = Issue.find(11)
403 issue.status_id = 1 472 issue.status_id = 1
404 assert !issue.save 473 assert !issue.save
405 assert_not_nil issue.errors.on_base 474 assert_not_nil issue.errors[:base]
406 end 475 end
407 476
408 def test_should_be_able_to_reopen_and_reassign_an_issue_assigned_to_a_closed_version 477 def test_should_be_able_to_reopen_and_reassign_an_issue_assigned_to_a_closed_version
409 issue = Issue.find(11) 478 issue = Issue.find(11)
410 issue.status_id = 1 479 issue.status_id = 1
578 copy = issue.move_to_project(Project.find(5), Tracker.find(2), :copy => true) 647 copy = issue.move_to_project(Project.find(5), Tracker.find(2), :copy => true)
579 # author is not a member of project anymore 648 # author is not a member of project anymore
580 assert !copy.recipients.include?(copy.author.mail) 649 assert !copy.recipients.include?(copy.author.mail)
581 end 650 end
582 651
652 def test_recipients_should_include_the_assigned_group_members
653 group_member = User.generate_with_protected!
654 group = Group.generate!
655 group.users << group_member
656
657 issue = Issue.find(12)
658 issue.assigned_to = group
659 assert issue.recipients.include?(group_member.mail)
660 end
661
583 def test_watcher_recipients_should_not_include_users_that_cannot_view_the_issue 662 def test_watcher_recipients_should_not_include_users_that_cannot_view_the_issue
584 user = User.find(3) 663 user = User.find(3)
585 issue = Issue.find(9) 664 issue = Issue.find(9)
586 Watcher.create!(:user => user, :watchable => issue) 665 Watcher.create!(:user => user, :watchable => issue)
587 assert issue.watched_by?(user) 666 assert issue.watched_by?(user)
672 issue = Issue.generate_for_project!(project, :author => non_project_member) 751 issue = Issue.generate_for_project!(project, :author => non_project_member)
673 752
674 assert issue.assignable_users.include?(non_project_member) 753 assert issue.assignable_users.include?(non_project_member)
675 end 754 end
676 755
756 should "include the current assignee" do
757 project = Project.find(1)
758 user = User.generate!
759 issue = Issue.generate_for_project!(project, :assigned_to => user)
760 user.lock!
761
762 assert Issue.find(issue.id).assignable_users.include?(user)
763 end
764
677 should "not show the issue author twice" do 765 should "not show the issue author twice" do
678 assignable_user_ids = Issue.find(1).assignable_users.collect(&:id) 766 assignable_user_ids = Issue.find(1).assignable_users.collect(&:id)
679 assert_equal 2, assignable_user_ids.length 767 assert_equal 2, assignable_user_ids.length
680 768
681 assignable_user_ids.each do |user_id| 769 assignable_user_ids.each do |user_id|
682 assert_equal 1, assignable_user_ids.select {|i| i == user_id}.length, "User #{user_id} appears more or less than once" 770 assert_equal 1, assignable_user_ids.select {|i| i == user_id}.length, "User #{user_id} appears more or less than once"
683 end 771 end
684 end 772 end
773
774 context "with issue_group_assignment" do
775 should "include groups" do
776 issue = Issue.new(:project => Project.find(2))
777
778 with_settings :issue_group_assignment => '1' do
779 assert_equal %w(Group User), issue.assignable_users.map {|a| a.class.name}.uniq.sort
780 assert issue.assignable_users.include?(Group.find(11))
781 end
782 end
783 end
784
785 context "without issue_group_assignment" do
786 should "not include groups" do
787 issue = Issue.new(:project => Project.find(2))
788
789 with_settings :issue_group_assignment => '0' do
790 assert_equal %w(User), issue.assignable_users.map {|a| a.class.name}.uniq.sort
791 assert !issue.assignable_users.include?(Group.find(11))
792 end
793 end
794 end
685 end 795 end
686 796
687 def test_create_should_send_email_notification 797 def test_create_should_send_email_notification
688 ActionMailer::Base.deliveries.clear 798 ActionMailer::Base.deliveries.clear
689 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 3, :status_id => 1, :priority => IssuePriority.all.first, :subject => 'test_create', :estimated_hours => '1:30') 799 issue = Issue.new(:project_id => 1, :tracker_id => 1,
800 :author_id => 3, :status_id => 1,
801 :priority => IssuePriority.all.first,
802 :subject => 'test_create', :estimated_hours => '1:30')
690 803
691 assert issue.save 804 assert issue.save
692 assert_equal 1, ActionMailer::Base.deliveries.size 805 assert_equal 1, ActionMailer::Base.deliveries.size
693 end 806 end
694 807
731 assert_equal 'attr', detail.property 844 assert_equal 'attr', detail.property
732 assert_equal 'description', detail.prop_key 845 assert_equal 'description', detail.prop_key
733 assert_equal old_description, detail.old_value 846 assert_equal old_description, detail.old_value
734 assert_equal new_description, detail.value 847 assert_equal new_description, detail.value
735 end 848 end
736 849
737 def test_blank_descriptions_should_not_be_journalized 850 def test_blank_descriptions_should_not_be_journalized
738 IssueCustomField.delete_all 851 IssueCustomField.delete_all
739 Issue.update_all("description = NULL", "id=1") 852 Issue.update_all("description = NULL", "id=1")
740 853
741 i = Issue.find(1) 854 i = Issue.find(1)
742 i.init_journal(User.find(2)) 855 i.init_journal(User.find(2))
743 i.subject = "blank description" 856 i.subject = "blank description"
744 i.description = "\r\n" 857 i.description = "\r\n"
745 858
746 assert_difference 'Journal.count', 1 do 859 assert_difference 'Journal.count', 1 do
747 assert_difference 'JournalDetail.count', 1 do 860 assert_difference 'JournalDetail.count', 1 do
748 i.save! 861 i.save!
749 end 862 end
750 end 863 end
751 end 864 end
752 865
753 def test_description_eol_should_be_normalized 866 def test_description_eol_should_be_normalized
754 i = Issue.new(:description => "CR \r LF \n CRLF \r\n") 867 i = Issue.new(:description => "CR \r LF \n CRLF \r\n")
755 assert_equal "CR \r\n LF \r\n CRLF \r\n", i.description 868 assert_equal "CR \r\n LF \r\n CRLF \r\n", i.description
756 end 869 end
757 870
779 end 892 end
780 end 893 end
781 894
782 def test_all_dependent_issues 895 def test_all_dependent_issues
783 IssueRelation.delete_all 896 IssueRelation.delete_all
784 assert IssueRelation.create!(:issue_from => Issue.find(1), :issue_to => Issue.find(2), :relation_type => IssueRelation::TYPE_PRECEDES) 897 assert IssueRelation.create!(:issue_from => Issue.find(1),
785 assert IssueRelation.create!(:issue_from => Issue.find(2), :issue_to => Issue.find(3), :relation_type => IssueRelation::TYPE_PRECEDES) 898 :issue_to => Issue.find(2),
786 assert IssueRelation.create!(:issue_from => Issue.find(3), :issue_to => Issue.find(8), :relation_type => IssueRelation::TYPE_PRECEDES) 899 :relation_type => IssueRelation::TYPE_PRECEDES)
900 assert IssueRelation.create!(:issue_from => Issue.find(2),
901 :issue_to => Issue.find(3),
902 :relation_type => IssueRelation::TYPE_PRECEDES)
903 assert IssueRelation.create!(:issue_from => Issue.find(3),
904 :issue_to => Issue.find(8),
905 :relation_type => IssueRelation::TYPE_PRECEDES)
787 906
788 assert_equal [2, 3, 8], Issue.find(1).all_dependent_issues.collect(&:id).sort 907 assert_equal [2, 3, 8], Issue.find(1).all_dependent_issues.collect(&:id).sort
789 end 908 end
790 909
791 def test_all_dependent_issues_with_persistent_circular_dependency 910 def test_all_dependent_issues_with_persistent_circular_dependency
792 IssueRelation.delete_all 911 IssueRelation.delete_all
793 assert IssueRelation.create!(:issue_from => Issue.find(1), :issue_to => Issue.find(2), :relation_type => IssueRelation::TYPE_PRECEDES) 912 assert IssueRelation.create!(:issue_from => Issue.find(1),
794 assert IssueRelation.create!(:issue_from => Issue.find(2), :issue_to => Issue.find(3), :relation_type => IssueRelation::TYPE_PRECEDES) 913 :issue_to => Issue.find(2),
914 :relation_type => IssueRelation::TYPE_PRECEDES)
915 assert IssueRelation.create!(:issue_from => Issue.find(2),
916 :issue_to => Issue.find(3),
917 :relation_type => IssueRelation::TYPE_PRECEDES)
795 # Validation skipping 918 # Validation skipping
796 assert IssueRelation.new(:issue_from => Issue.find(3), :issue_to => Issue.find(1), :relation_type => IssueRelation::TYPE_PRECEDES).save(false) 919 assert IssueRelation.new(:issue_from => Issue.find(3),
920 :issue_to => Issue.find(1),
921 :relation_type => IssueRelation::TYPE_PRECEDES).save(false)
797 922
798 assert_equal [2, 3], Issue.find(1).all_dependent_issues.collect(&:id).sort 923 assert_equal [2, 3], Issue.find(1).all_dependent_issues.collect(&:id).sort
799 end 924 end
800 925
801 def test_all_dependent_issues_with_persistent_multiple_circular_dependencies 926 def test_all_dependent_issues_with_persistent_multiple_circular_dependencies
802 IssueRelation.delete_all 927 IssueRelation.delete_all
803 assert IssueRelation.create!(:issue_from => Issue.find(1), :issue_to => Issue.find(2), :relation_type => IssueRelation::TYPE_RELATES) 928 assert IssueRelation.create!(:issue_from => Issue.find(1),
804 assert IssueRelation.create!(:issue_from => Issue.find(2), :issue_to => Issue.find(3), :relation_type => IssueRelation::TYPE_RELATES) 929 :issue_to => Issue.find(2),
805 assert IssueRelation.create!(:issue_from => Issue.find(3), :issue_to => Issue.find(8), :relation_type => IssueRelation::TYPE_RELATES) 930 :relation_type => IssueRelation::TYPE_RELATES)
931 assert IssueRelation.create!(:issue_from => Issue.find(2),
932 :issue_to => Issue.find(3),
933 :relation_type => IssueRelation::TYPE_RELATES)
934 assert IssueRelation.create!(:issue_from => Issue.find(3),
935 :issue_to => Issue.find(8),
936 :relation_type => IssueRelation::TYPE_RELATES)
806 # Validation skipping 937 # Validation skipping
807 assert IssueRelation.new(:issue_from => Issue.find(8), :issue_to => Issue.find(2), :relation_type => IssueRelation::TYPE_RELATES).save(false) 938 assert IssueRelation.new(:issue_from => Issue.find(8),
808 assert IssueRelation.new(:issue_from => Issue.find(3), :issue_to => Issue.find(1), :relation_type => IssueRelation::TYPE_RELATES).save(false) 939 :issue_to => Issue.find(2),
940 :relation_type => IssueRelation::TYPE_RELATES).save(false)
941 assert IssueRelation.new(:issue_from => Issue.find(3),
942 :issue_to => Issue.find(1),
943 :relation_type => IssueRelation::TYPE_RELATES).save(false)
809 944
810 assert_equal [2, 3, 8], Issue.find(1).all_dependent_issues.collect(&:id).sort 945 assert_equal [2, 3, 8], Issue.find(1).all_dependent_issues.collect(&:id).sort
811 end 946 end
812 947
813 context "#done_ratio" do 948 context "#done_ratio" do