OSDN Git Service

Actually block issues from closing when a blocking issue isn't closed (#1740).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 4 Jul 2009 12:07:03 +0000 (12:07 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 4 Jul 2009 12:07:03 +0000 (12:07 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2800 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/issue.rb
test/fixtures/issue_relations.yml [new file with mode: 0644]
test/fixtures/issues.yml
test/unit/issue_test.rb

index 861d898..578f01e 100644 (file)
@@ -203,11 +203,17 @@ class Issue < ActiveRecord::Base
     project.assignable_users
   end
   
+  # Returns true if this issue is blocked by another issue that is still open
+  def blocked?
+    !relations_to.detect {|ir| ir.relation_type == 'blocks' && !ir.issue_from.closed?}.nil?
+  end
+  
   # Returns an array of status that user is able to apply
   def new_statuses_allowed_to(user)
     statuses = status.find_new_statuses_allowed_to(user.roles_for_project(project), tracker)
     statuses << status unless statuses.empty?
-    statuses.uniq.sort
+    statuses = statuses.uniq.sort
+    blocked? ? statuses.reject {|s| s.is_closed?} : statuses
   end
   
   # Returns the mail adresses of users that should be notified for the issue
diff --git a/test/fixtures/issue_relations.yml b/test/fixtures/issue_relations.yml
new file mode 100644 (file)
index 0000000..fb4de48
--- /dev/null
@@ -0,0 +1,7 @@
+issue_relation_001:
+  id: 1
+  issue_from_id: 10
+  issue_to_id: 9
+  relation_type: blocks
+  delay:
+  
index b66f2eb..8c8cfbd 100644 (file)
@@ -125,4 +125,35 @@ issues_008:
   start_date: \r
   due_date: \r
   lock_version: 0\r
-
+issues_009: \r
+  created_on: <%= 1.minute.ago.to_date.to_s(:db) %>\r
+  project_id: 5\r
+  updated_on: <%= 1.minute.ago.to_date.to_s(:db) %>\r
+  priority_id: 5\r
+  subject: Blocked Issue\r
+  id: 9\r
+  fixed_version_id: \r
+  category_id: \r
+  description: This is an issue that is blocked by issue #10\r
+  tracker_id: 1\r
+  assigned_to_id: \r
+  author_id: 2\r
+  status_id: 1\r
+  start_date: <%= Date.today.to_s(:db) %>\r
+  due_date: <%= 1.days.from_now.to_date.to_s(:db) %>\r
+issues_010: \r
+  created_on: <%= 1.minute.ago.to_date.to_s(:db) %>\r
+  project_id: 5\r
+  updated_on: <%= 1.minute.ago.to_date.to_s(:db) %>\r
+  priority_id: 5\r
+  subject: Issue Doing the Blocking\r
+  id: 10\r
+  fixed_version_id: \r
+  category_id: \r
+  description: This is an issue that blocks issue #9\r
+  tracker_id: 1\r
+  assigned_to_id: \r
+  author_id: 2\r
+  status_id: 1\r
+  start_date: <%= Date.today.to_s(:db) %>\r
+  due_date: <%= 1.days.from_now.to_date.to_s(:db) %>\r
index b2eee22..a6710ed 100644 (file)
@@ -20,7 +20,7 @@ require File.dirname(__FILE__) + '/../test_helper'
 class IssueTest < Test::Unit::TestCase
   fixtures :projects, :users, :members, :member_roles,
            :trackers, :projects_trackers,
-           :issue_statuses, :issue_categories,
+           :issue_statuses, :issue_categories, :issue_relations, :workflows, 
            :enumerations,
            :issues,
            :custom_fields, :custom_fields_projects, :custom_fields_trackers, :custom_values,
@@ -234,6 +234,32 @@ class IssueTest < Test::Unit::TestCase
     assert_nil TimeEntry.find_by_issue_id(1)
   end
   
+  def test_blocked
+    blocked_issue = Issue.find(9)
+    blocking_issue = Issue.find(10)
+     
+    assert blocked_issue.blocked?
+    assert !blocking_issue.blocked?
+  end
+  
+  def test_blocked_issues_dont_allow_closed_statuses
+    blocked_issue = Issue.find(9)
+  
+    allowed_statuses = blocked_issue.new_statuses_allowed_to(users(:users_002))
+    assert !allowed_statuses.empty?
+    closed_statuses = allowed_statuses.select {|st| st.is_closed?}
+    assert closed_statuses.empty?
+  end
+  
+  def test_unblocked_issues_allow_closed_statuses
+    blocking_issue = Issue.find(10)
+  
+    allowed_statuses = blocking_issue.new_statuses_allowed_to(users(:users_002))
+    assert !allowed_statuses.empty?
+    closed_statuses = allowed_statuses.select {|st| st.is_closed?}
+    assert !closed_statuses.empty?
+  end
+  
   def test_overdue
     assert Issue.new(:due_date => 1.day.ago.to_date).overdue?
     assert !Issue.new(:due_date => Date.today).overdue?