Mercurial > hg > soundsoftware-site
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 |