diff test/unit/project_test.rb @ 22:40f7cfd4df19

* Update to SVN trunk rev 4173
author Chris Cannam <chris.cannam@soundsoftware.ac.uk>
date Fri, 24 Sep 2010 14:06:04 +0100
parents 513646585e45
children 94944d00e43c
line wrap: on
line diff
--- a/test/unit/project_test.rb	Wed Aug 25 16:30:24 2010 +0100
+++ b/test/unit/project_test.rb	Fri Sep 24 14:06:04 2010 +0100
@@ -842,4 +842,122 @@
     
   end
 
+  context "#start_date" do
+    setup do
+      ProjectCustomField.destroy_all # Custom values are a mess to isolate in tests
+      @project = Project.generate!(:identifier => 'test0')
+      @project.trackers << Tracker.generate!
+    end
+    
+    should "be nil if there are no issues on the project" do
+      assert_nil @project.start_date
+    end
+
+    should "be nil if issue tracking is disabled" do
+      Issue.generate_for_project!(@project, :start_date => Date.today)
+      @project.enabled_modules.find_all_by_name('issue_tracking').each {|m| m.destroy}
+      @project.reload
+      
+      assert_nil @project.start_date
+    end
+
+    should "be the earliest start date of it's issues" do
+      early = 7.days.ago.to_date
+      Issue.generate_for_project!(@project, :start_date => Date.today)
+      Issue.generate_for_project!(@project, :start_date => early)
+
+      assert_equal early, @project.start_date
+    end
+
+  end
+
+  context "#due_date" do
+    setup do
+      ProjectCustomField.destroy_all # Custom values are a mess to isolate in tests
+      @project = Project.generate!(:identifier => 'test0')
+      @project.trackers << Tracker.generate!
+    end
+    
+    should "be nil if there are no issues on the project" do
+      assert_nil @project.due_date
+    end
+
+    should "be nil if issue tracking is disabled" do
+      Issue.generate_for_project!(@project, :due_date => Date.today)
+      @project.enabled_modules.find_all_by_name('issue_tracking').each {|m| m.destroy}
+      @project.reload
+      
+      assert_nil @project.due_date
+    end
+
+    should "be the latest due date of it's issues" do
+      future = 7.days.from_now.to_date
+      Issue.generate_for_project!(@project, :due_date => future)
+      Issue.generate_for_project!(@project, :due_date => Date.today)
+
+      assert_equal future, @project.due_date
+    end
+
+    should "be the latest due date of it's versions" do
+      future = 7.days.from_now.to_date
+      @project.versions << Version.generate!(:effective_date => future)
+      @project.versions << Version.generate!(:effective_date => Date.today)
+      
+
+      assert_equal future, @project.due_date
+
+    end
+
+    should "pick the latest date from it's issues and versions" do
+      future = 7.days.from_now.to_date
+      far_future = 14.days.from_now.to_date
+      Issue.generate_for_project!(@project, :due_date => far_future)
+      @project.versions << Version.generate!(:effective_date => future)
+      
+      assert_equal far_future, @project.due_date
+    end
+
+  end
+
+  context "Project#completed_percent" do
+    setup do
+      ProjectCustomField.destroy_all # Custom values are a mess to isolate in tests
+      @project = Project.generate!(:identifier => 'test0')
+      @project.trackers << Tracker.generate!
+    end
+
+    context "no versions" do
+      should "be 100" do
+        assert_equal 100, @project.completed_percent
+      end
+    end
+
+    context "with versions" do
+      should "return 0 if the versions have no issues" do
+        Version.generate!(:project => @project)
+        Version.generate!(:project => @project)
+
+        assert_equal 0, @project.completed_percent
+      end
+
+      should "return 100 if the version has only closed issues" do
+        v1 = Version.generate!(:project => @project)
+        Issue.generate_for_project!(@project, :status => IssueStatus.find_by_name('Closed'), :fixed_version => v1)
+        v2 = Version.generate!(:project => @project)
+        Issue.generate_for_project!(@project, :status => IssueStatus.find_by_name('Closed'), :fixed_version => v2)
+
+        assert_equal 100, @project.completed_percent
+      end
+
+      should "return the averaged completed percent of the versions (not weighted)" do
+        v1 = Version.generate!(:project => @project)
+        Issue.generate_for_project!(@project, :status => IssueStatus.find_by_name('New'), :estimated_hours => 10, :done_ratio => 50, :fixed_version => v1)
+        v2 = Version.generate!(:project => @project)
+        Issue.generate_for_project!(@project, :status => IssueStatus.find_by_name('New'), :estimated_hours => 10, :done_ratio => 50, :fixed_version => v2)
+
+        assert_equal 50, @project.completed_percent
+      end
+
+    end
+  end
 end