diff test/unit/lib/redmine/helpers/gantt_test.rb @ 523:0b6c82dead28 luisf

Merge from branch "cannam"
author luisf <luis.figueira@eecs.qmul.ac.uk>
date Mon, 25 Jul 2011 14:23:37 +0100
parents cbce1fd3b1b7
children cbb26bc654de
line wrap: on
line diff
--- a/test/unit/lib/redmine/helpers/gantt_test.rb	Mon Mar 28 18:17:06 2011 +0100
+++ b/test/unit/lib/redmine/helpers/gantt_test.rb	Mon Jul 25 14:23:37 2011 +0100
@@ -1,5 +1,5 @@
-# redMine - project management software
-# Copyright (C) 2006-2008  Jean-Philippe Lang
+# Redmine - project management software
+# Copyright (C) 2006-2011  Jean-Philippe Lang
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -15,7 +15,7 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-require File.dirname(__FILE__) + '/../../../../test_helper'
+require File.expand_path('../../../../../test_helper', __FILE__)
 
 class Redmine::Helpers::GanttTest < ActiveSupport::TestCase
   # Utility methods and classes so assert_select can be used.
@@ -53,14 +53,14 @@
   end
 
   # Creates a Gantt chart for a 4 week span
-  def create_gantt(project=Project.generate!)
+  def create_gantt(project=Project.generate!, options={})
     @project = project
-    @gantt = Redmine::Helpers::Gantt.new
+    @gantt = Redmine::Helpers::Gantt.new(options)
     @gantt.project = @project
     @gantt.query = Query.generate_default!(:project => @project)
     @gantt.view = build_view
-    @gantt.instance_variable_set('@date_from', 2.weeks.ago.to_date)
-    @gantt.instance_variable_set('@date_to', 2.weeks.from_now.to_date)
+    @gantt.instance_variable_set('@date_from', options[:date_from] || 2.weeks.ago.to_date)
+    @gantt.instance_variable_set('@date_to', options[:date_to] || 2.weeks.from_now.to_date)
   end
 
   context "#number_of_rows" do
@@ -73,21 +73,31 @@
       should "return the total number of rows for all the projects, resursively"
     end
 
+    should "not exceed max_rows option" do
+      p = Project.generate!
+      5.times do
+        Issue.generate_for_project!(p)
+      end
+      
+      create_gantt(p)
+      @gantt.render
+      assert_equal 6, @gantt.number_of_rows
+      assert !@gantt.truncated
+
+      create_gantt(p, :max_rows => 3)
+      @gantt.render
+      assert_equal 3, @gantt.number_of_rows
+      assert @gantt.truncated
+    end
   end
 
   context "#number_of_rows_on_project" do
     setup do
       create_gantt
     end
-    
-    should "clear the @query.project so cross-project issues and versions can be counted" do
-      assert @gantt.query.project
-      @gantt.number_of_rows_on_project(@project)
-      assert_nil @gantt.query.project
-    end
 
-    should "count 1 for the project itself" do
-      assert_equal 1, @gantt.number_of_rows_on_project(@project)
+    should "count 0 for an empty the project" do
+      assert_equal 0, @gantt.number_of_rows_on_project(@project)
     end
 
     should "count the number of issues without a version" do
@@ -95,12 +105,6 @@
       assert_equal 2, @gantt.number_of_rows_on_project(@project)
     end
 
-    should "count the number of versions" do
-      @project.versions << Version.generate!
-      @project.versions << Version.generate!
-      assert_equal 3, @gantt.number_of_rows_on_project(@project)
-    end
-
     should "count the number of issues on versions, including cross-project" do
       version = Version.generate!
       @project.versions << version
@@ -108,21 +112,6 @@
       
       assert_equal 3, @gantt.number_of_rows_on_project(@project)
     end
-    
-    should "recursive and count the number of rows on each subproject" do
-      @project.versions << Version.generate! # +1
-
-      @subproject = Project.generate!(:enabled_module_names => ['issue_tracking']) # +1
-      @subproject.set_parent!(@project)
-      @subproject.issues << Issue.generate_for_project!(@subproject) # +1
-      @subproject.issues << Issue.generate_for_project!(@subproject) # +1
-
-      @subsubproject = Project.generate!(:enabled_module_names => ['issue_tracking']) # +1
-      @subsubproject.set_parent!(@subproject)
-      @subsubproject.issues << Issue.generate_for_project!(@subsubproject) # +1
-
-      assert_equal 7, @gantt.number_of_rows_on_project(@project) # +1 for self
-    end
   end
 
   # TODO: more of an integration test
@@ -142,39 +131,100 @@
                                :done_ratio => 30,
                                :start_date => Date.yesterday,
                                :due_date => 1.week.from_now.to_date)
-      @project.issues << @issue
-
-      @response.body = @gantt.subjects
+      @project.issues << @issue      
     end
-
+  
     context "project" do
       should "be rendered" do
+        @response.body = @gantt.subjects
         assert_select "div.project-name a", /#{@project.name}/
       end
-
+  
       should "have an indent of 4" do
+        @response.body = @gantt.subjects
         assert_select "div.project-name[style*=left:4px]"
       end
     end
-
+  
     context "version" do
       should "be rendered" do
+        @response.body = @gantt.subjects
         assert_select "div.version-name a", /#{@version.name}/
       end
-
+  
       should "be indented 24 (one level)" do
+        @response.body = @gantt.subjects
         assert_select "div.version-name[style*=left:24px]"
       end
+      
+      context "without assigned issues" do
+        setup do
+          @version = Version.generate!(:effective_date => 2.week.from_now.to_date, :sharing => 'none', :name => 'empty_version')
+          @project.versions << @version
+        end
+      
+        should "not be rendered" do
+          @response.body = @gantt.subjects
+          assert_select "div.version-name a", :text => /#{@version.name}/, :count => 0
+        end
+      end
     end
-
+  
     context "issue" do
       should "be rendered" do
+        @response.body = @gantt.subjects
         assert_select "div.issue-subject", /#{@issue.subject}/
       end
-
+  
       should "be indented 44 (two levels)" do
+        @response.body = @gantt.subjects
         assert_select "div.issue-subject[style*=left:44px]"
       end
+      
+      context "assigned to a shared version of another project" do
+        setup do
+          p = Project.generate!
+          p.trackers << @tracker
+          p.enabled_module_names = [:issue_tracking]
+          @shared_version = Version.generate!(:sharing => 'system')
+          p.versions << @shared_version
+          # Reassign the issue to a shared version of another project
+          
+          @issue = Issue.generate!(:fixed_version => @shared_version,
+                                   :subject => "gantt#assigned_to_shared_version",
+                                   :tracker => @tracker,
+                                   :project => @project,
+                                   :done_ratio => 30,
+                                   :start_date => Date.yesterday,
+                                   :due_date => 1.week.from_now.to_date)
+          @project.issues << @issue
+        end
+        
+        should "be rendered" do
+          @response.body = @gantt.subjects
+          assert_select "div.issue-subject", /#{@issue.subject}/
+        end
+      end
+      
+      context "with subtasks" do
+        setup do
+          attrs = {:project => @project, :tracker => @tracker, :fixed_version => @version}
+          @child1 = Issue.generate!(attrs.merge(:subject => 'child1', :parent_issue_id => @issue.id, :start_date => Date.yesterday, :due_date => 2.day.from_now.to_date))
+          @child2 = Issue.generate!(attrs.merge(:subject => 'child2', :parent_issue_id => @issue.id, :start_date => Date.today, :due_date => 1.week.from_now.to_date))
+          @grandchild = Issue.generate!(attrs.merge(:subject => 'grandchild', :parent_issue_id => @child1.id, :start_date => Date.yesterday, :due_date => 2.day.from_now.to_date))
+        end
+        
+        should "indent subtasks" do
+          @response.body = @gantt.subjects
+          # parent task 44px
+          assert_select "div.issue-subject[style*=left:44px]", /#{@issue.subject}/
+          # children 64px
+          assert_select "div.issue-subject[style*=left:64px]", /child1/
+          assert_select "div.issue-subject[style*=left:64px]", /child2/
+          # grandchild 84px
+          assert_select "div.issue-subject[style*=left:84px]", /grandchild/, @response.body
+        end
+      end
     end
   end
 
@@ -200,26 +250,26 @@
 
     context "project" do
       should "be rendered" do
-        assert_select "div.project_todo"
-        assert_select "div.project-line.starting"
-        assert_select "div.project-line.ending"
-        assert_select "div.label.project-name", /#{@project.name}/
+        assert_select "div.project.task_todo"
+        assert_select "div.project.starting"
+        assert_select "div.project.ending"
+        assert_select "div.label.project", /#{@project.name}/
       end
     end
 
     context "version" do
       should "be rendered" do
-        assert_select "div.milestone_todo"
-        assert_select "div.milestone.starting"
-        assert_select "div.milestone.ending"
-        assert_select "div.label.version-name", /#{@version.name}/
+        assert_select "div.version.task_todo"
+        assert_select "div.version.starting"
+        assert_select "div.version.ending"
+        assert_select "div.label.version", /#{@version.name}/
       end
     end
 
     context "issue" do
       should "be rendered" do
         assert_select "div.task_todo"
-        assert_select "div.label.issue-name", /#{@issue.done_ratio}/
+        assert_select "div.task.label", /#{@issue.done_ratio}/
         assert_select "div.tooltip", /#{@issue.subject}/
       end
     end
@@ -294,7 +344,7 @@
                                          :tracker => @tracker,
                                          :project => @project,
                                          :done_ratio => 30,
-                                         :start_date => Date.yesterday,
+                                         :start_date => 1.week.ago.to_date,
                                          :due_date => 1.week.from_now.to_date)
     end
 
@@ -302,37 +352,37 @@
       context "todo line" do
         should "start from the starting point on the left" do
           @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
-          assert_select "div.project_todo[style*=left:52px]"
+          assert_select "div.project.task_todo[style*=left:28px]", true, @response.body
         end
 
         should "be the total width of the project" do
           @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
-          assert_select "div.project_todo[style*=width:31px]"
+          assert_select "div.project.task_todo[style*=width:58px]", true, @response.body
         end
 
       end
 
       context "late line" do
-        should "start from the starting point on the left" do
+        should_eventually "start from the starting point on the left" do
           @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
-          assert_select "div.project_late[style*=left:52px]"
+          assert_select "div.project.task_late[style*=left:28px]", true, @response.body
         end
 
-        should "be the total delayed width of the project" do
+        should_eventually "be the total delayed width of the project" do
           @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
-          assert_select "div.project_late[style*=width:6px]"
+          assert_select "div.project.task_late[style*=width:30px]", true, @response.body
         end
       end
 
       context "done line" do
-        should "start from the starting point on the left" do
+        should_eventually "start from the starting point on the left" do
           @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
-          assert_select "div.project_done[style*=left:52px]"
+          assert_select "div.project.task_done[style*=left:28px]", true, @response.body
         end
 
-        should "Be the total done width of the project"  do
+        should_eventually "Be the total done width of the project"  do
           @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
-          assert_select "div.project_done[style*=left:52px]"
+          assert_select "div.project.task_done[style*=width:18px]", true, @response.body
         end
       end
 
@@ -342,12 +392,12 @@
           @gantt.instance_variable_set('@date_from', Date.today)
 
           @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
-          assert_select "div.project-line.starting", false
+          assert_select "div.project.starting", false, @response.body
         end
 
         should "appear at the starting point" do
           @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
-          assert_select "div.project-line.starting[style*=left:52px]"
+          assert_select "div.project.starting[style*=left:28px]", true, @response.body
         end
       end
 
@@ -357,13 +407,13 @@
           @gantt.instance_variable_set('@date_to', 2.weeks.ago.to_date)
 
           @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
-          assert_select "div.project-line.ending", false
+          assert_select "div.project.ending", false, @response.body
 
         end
 
         should "appear at the end of the date range" do
           @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
-          assert_select "div.project-line.ending[style*=left:84px]"
+          assert_select "div.project.ending[style*=left:88px]", true, @response.body
         end
       end
       
@@ -372,17 +422,17 @@
           @gantt.instance_variable_set('@date_to', 2.weeks.ago.to_date)
 
           @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
-          assert_select "div.project-name", /#{@project.name}/
+          assert_select "div.project.label", /#{@project.name}/
         end
 
         should "show the project name" do
           @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
-          assert_select "div.project-name", /#{@project.name}/
+          assert_select "div.project.label", /#{@project.name}/
         end
 
-        should "show the percent complete" do
+        should_eventually "show the percent complete" do
           @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
-          assert_select "div.project-name", /0%/
+          assert_select "div.project.label", /0%/
         end
       end
     end
@@ -461,7 +511,7 @@
                                          :tracker => @tracker,
                                          :project => @project,
                                          :done_ratio => 30,
-                                         :start_date => Date.yesterday,
+                                         :start_date => 1.week.ago.to_date,
                                          :due_date => 1.week.from_now.to_date)
     end
 
@@ -469,12 +519,12 @@
       context "todo line" do
         should "start from the starting point on the left" do
           @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
-          assert_select "div.milestone_todo[style*=left:52px]"
+          assert_select "div.version.task_todo[style*=left:28px]", true, @response.body
         end
 
         should "be the total width of the version" do
           @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
-          assert_select "div.milestone_todo[style*=width:31px]"
+          assert_select "div.version.task_todo[style*=width:58px]", true, @response.body
         end
 
       end
@@ -482,24 +532,24 @@
       context "late line" do
         should "start from the starting point on the left" do
           @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
-          assert_select "div.milestone_late[style*=left:52px]"
+          assert_select "div.version.task_late[style*=left:28px]", true, @response.body
         end
 
         should "be the total delayed width of the version" do
           @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
-          assert_select "div.milestone_late[style*=width:6px]"
+          assert_select "div.version.task_late[style*=width:30px]", true, @response.body
         end
       end
 
       context "done line" do
         should "start from the starting point on the left" do
           @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
-          assert_select "div.milestone_done[style*=left:52px]"
+          assert_select "div.version.task_done[style*=left:28px]", true, @response.body
         end
 
-        should "Be the total done width of the version"  do
+        should "be the total done width of the version"  do
           @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
-          assert_select "div.milestone_done[style*=left:52px]"
+          assert_select "div.version.task_done[style*=width:16px]", true, @response.body
         end
       end
 
@@ -509,12 +559,12 @@
           @gantt.instance_variable_set('@date_from', Date.today)
 
           @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
-          assert_select "div.milestone.starting", false
+          assert_select "div.version.starting", false
         end
 
         should "appear at the starting point" do
           @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
-          assert_select "div.milestone.starting[style*=left:52px]"
+          assert_select "div.version.starting[style*=left:28px]", true, @response.body
         end
       end
 
@@ -524,13 +574,13 @@
           @gantt.instance_variable_set('@date_to', 2.weeks.ago.to_date)
 
           @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
-          assert_select "div.milestone.ending", false
+          assert_select "div.version.ending", false
 
         end
 
         should "appear at the end of the date range" do
           @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
-          assert_select "div.milestone.ending[style*=left:84px]"
+          assert_select "div.version.ending[style*=left:88px]", true, @response.body
         end
       end
       
@@ -539,17 +589,17 @@
           @gantt.instance_variable_set('@date_to', 2.weeks.ago.to_date)
 
           @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
-          assert_select "div.version-name", /#{@version.name}/
+          assert_select "div.version.label", /#{@version.name}/
         end
 
         should "show the version name" do
           @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
-          assert_select "div.version-name", /#{@version.name}/
+          assert_select "div.version.label", /#{@version.name}/
         end
 
         should "show the percent complete" do
           @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
-          assert_select "div.version-name", /30%/
+          assert_select "div.version.label", /30%/
         end
       end
     end
@@ -620,7 +670,7 @@
                                :tracker => @tracker,
                                :project => @project,
                                :done_ratio => 30,
-                               :start_date => Date.yesterday,
+                               :start_date => 1.week.ago.to_date,
                                :due_date => 1.week.from_now.to_date)
       @project.issues << @issue
     end
@@ -629,12 +679,12 @@
       context "todo line" do
         should "start from the starting point on the left" do
           @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
-          assert_select "div.task_todo[style*=left:52px]"
+          assert_select "div.task_todo[style*=left:28px]", true, @response.body
         end
 
         should "be the total width of the issue" do
           @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
-          assert_select "div.task_todo[style*=width:34px]"
+          assert_select "div.task_todo[style*=width:58px]", true, @response.body
         end
 
       end
@@ -642,24 +692,50 @@
       context "late line" do
         should "start from the starting point on the left" do
           @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
-          assert_select "div.task_late[style*=left:52px]"
+          assert_select "div.task_late[style*=left:28px]", true, @response.body
         end
 
         should "be the total delayed width of the issue" do
           @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
-          assert_select "div.task_late[style*=width:6px]"
+          assert_select "div.task_late[style*=width:30px]", true, @response.body
         end
       end
 
       context "done line" do
         should "start from the starting point on the left" do
           @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
-          assert_select "div.task_done[style*=left:52px]"
+          assert_select "div.task_done[style*=left:28px]", true, @response.body
         end
 
-        should "Be the total done width of the issue"  do
+        should "be the total done width of the issue"  do
           @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
-          assert_select "div.task_done[style*=left:52px]"
+          # 15 days * 4 px * 30% - 2 px for borders = 16 px
+          assert_select "div.task_done[style*=width:16px]", true, @response.body
+        end
+
+        should "not be the total done width if the chart starts after issue start date"  do
+          create_gantt(@project, :date_from => 5.days.ago.to_date)
+          
+          @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
+          assert_select "div.task_done[style*=left:0px]", true, @response.body
+          assert_select "div.task_done[style*=width:8px]", true, @response.body
+        end
+        
+        context "for completed issue" do
+          setup do
+            @issue.done_ratio = 100
+          end
+
+          should "be the total width of the issue"  do
+            @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
+            assert_select "div.task_done[style*=width:58px]", true, @response.body
+          end
+  
+          should "be the total width of the issue with due_date=start_date"  do
+            @issue.due_date = @issue.start_date
+            @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
+            assert_select "div.task_done[style*=width:2px]", true, @response.body
+          end
         end
       end
 
@@ -668,17 +744,17 @@
           @gantt.instance_variable_set('@date_to', 2.weeks.ago.to_date)
 
           @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
-          assert_select "div.issue-name"
+          assert_select "div.task.label", true, @response.body
         end
 
         should "show the issue status" do
           @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
-          assert_select "div.issue-name", /#{@issue.status.name}/
+          assert_select "div.task.label", /#{@issue.status.name}/
         end
 
         should "show the percent complete" do
           @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
-          assert_select "div.issue-name", /30%/
+          assert_select "div.task.label", /30%/
         end
       end
     end