annotate test/unit/version_test.rb @ 1082:997f6d7738f7 bug_531

In repo controller entry action, show the page for the file even if it's binary (so user still has access to history etc links). This makes it possible to use the entry action as the default when a file is clicked on
author Chris Cannam <chris.cannam@soundsoftware.ac.uk>
date Thu, 22 Nov 2012 18:04:17 +0000
parents 5e80956cc792
children bb32da3bea34
rev   line source
Chris@0 1 # Redmine - project management software
Chris@909 2 # Copyright (C) 2006-2011 Jean-Philippe Lang
Chris@0 3 #
Chris@0 4 # This program is free software; you can redistribute it and/or
Chris@0 5 # modify it under the terms of the GNU General Public License
Chris@0 6 # as published by the Free Software Foundation; either version 2
Chris@0 7 # of the License, or (at your option) any later version.
Chris@909 8 #
Chris@0 9 # This program is distributed in the hope that it will be useful,
Chris@0 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@0 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0 12 # GNU General Public License for more details.
Chris@909 13 #
Chris@0 14 # You should have received a copy of the GNU General Public License
Chris@0 15 # along with this program; if not, write to the Free Software
Chris@0 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Chris@0 17
Chris@119 18 require File.expand_path('../../test_helper', __FILE__)
Chris@0 19
Chris@0 20 class VersionTest < ActiveSupport::TestCase
Chris@0 21 fixtures :projects, :users, :issues, :issue_statuses, :trackers, :enumerations, :versions
Chris@0 22
Chris@0 23 def setup
Chris@0 24 end
Chris@909 25
Chris@0 26 def test_create
Chris@0 27 v = Version.new(:project => Project.find(1), :name => '1.1', :effective_date => '2011-03-25')
Chris@0 28 assert v.save
Chris@0 29 assert_equal 'open', v.status
Chris@909 30 assert_equal 'none', v.sharing
Chris@0 31 end
Chris@909 32
Chris@0 33 def test_invalid_effective_date_validation
Chris@0 34 v = Version.new(:project => Project.find(1), :name => '1.1', :effective_date => '99999-01-01')
Chris@0 35 assert !v.save
Chris@0 36 assert_equal I18n.translate('activerecord.errors.messages.not_a_date'), v.errors.on(:effective_date)
Chris@0 37 end
Chris@909 38
Chris@0 39 def test_progress_should_be_0_with_no_assigned_issues
Chris@0 40 project = Project.find(1)
Chris@0 41 v = Version.create!(:project => project, :name => 'Progress')
Chris@0 42 assert_equal 0, v.completed_pourcent
Chris@0 43 assert_equal 0, v.closed_pourcent
Chris@0 44 end
Chris@909 45
Chris@0 46 def test_progress_should_be_0_with_unbegun_assigned_issues
Chris@0 47 project = Project.find(1)
Chris@0 48 v = Version.create!(:project => project, :name => 'Progress')
Chris@0 49 add_issue(v)
Chris@0 50 add_issue(v, :done_ratio => 0)
Chris@0 51 assert_progress_equal 0, v.completed_pourcent
Chris@0 52 assert_progress_equal 0, v.closed_pourcent
Chris@0 53 end
Chris@909 54
Chris@0 55 def test_progress_should_be_100_with_closed_assigned_issues
Chris@0 56 project = Project.find(1)
Chris@0 57 status = IssueStatus.find(:first, :conditions => {:is_closed => true})
Chris@0 58 v = Version.create!(:project => project, :name => 'Progress')
Chris@0 59 add_issue(v, :status => status)
Chris@0 60 add_issue(v, :status => status, :done_ratio => 20)
Chris@0 61 add_issue(v, :status => status, :done_ratio => 70, :estimated_hours => 25)
Chris@0 62 add_issue(v, :status => status, :estimated_hours => 15)
Chris@0 63 assert_progress_equal 100.0, v.completed_pourcent
Chris@0 64 assert_progress_equal 100.0, v.closed_pourcent
Chris@0 65 end
Chris@909 66
Chris@0 67 def test_progress_should_consider_done_ratio_of_open_assigned_issues
Chris@0 68 project = Project.find(1)
Chris@0 69 v = Version.create!(:project => project, :name => 'Progress')
Chris@0 70 add_issue(v)
Chris@0 71 add_issue(v, :done_ratio => 20)
Chris@0 72 add_issue(v, :done_ratio => 70)
Chris@0 73 assert_progress_equal (0.0 + 20.0 + 70.0)/3, v.completed_pourcent
Chris@0 74 assert_progress_equal 0, v.closed_pourcent
Chris@0 75 end
Chris@909 76
Chris@0 77 def test_progress_should_consider_closed_issues_as_completed
Chris@0 78 project = Project.find(1)
Chris@0 79 v = Version.create!(:project => project, :name => 'Progress')
Chris@0 80 add_issue(v)
Chris@0 81 add_issue(v, :done_ratio => 20)
Chris@0 82 add_issue(v, :status => IssueStatus.find(:first, :conditions => {:is_closed => true}))
Chris@0 83 assert_progress_equal (0.0 + 20.0 + 100.0)/3, v.completed_pourcent
Chris@0 84 assert_progress_equal (100.0)/3, v.closed_pourcent
Chris@0 85 end
Chris@909 86
Chris@0 87 def test_progress_should_consider_estimated_hours_to_weigth_issues
Chris@0 88 project = Project.find(1)
Chris@0 89 v = Version.create!(:project => project, :name => 'Progress')
Chris@0 90 add_issue(v, :estimated_hours => 10)
Chris@0 91 add_issue(v, :estimated_hours => 20, :done_ratio => 30)
Chris@0 92 add_issue(v, :estimated_hours => 40, :done_ratio => 10)
Chris@0 93 add_issue(v, :estimated_hours => 25, :status => IssueStatus.find(:first, :conditions => {:is_closed => true}))
Chris@0 94 assert_progress_equal (10.0*0 + 20.0*0.3 + 40*0.1 + 25.0*1)/95.0*100, v.completed_pourcent
Chris@0 95 assert_progress_equal 25.0/95.0*100, v.closed_pourcent
Chris@0 96 end
Chris@909 97
Chris@0 98 def test_progress_should_consider_average_estimated_hours_to_weigth_unestimated_issues
Chris@0 99 project = Project.find(1)
Chris@0 100 v = Version.create!(:project => project, :name => 'Progress')
Chris@0 101 add_issue(v, :done_ratio => 20)
Chris@0 102 add_issue(v, :status => IssueStatus.find(:first, :conditions => {:is_closed => true}))
Chris@0 103 add_issue(v, :estimated_hours => 10, :done_ratio => 30)
Chris@0 104 add_issue(v, :estimated_hours => 40, :done_ratio => 10)
Chris@0 105 assert_progress_equal (25.0*0.2 + 25.0*1 + 10.0*0.3 + 40.0*0.1)/100.0*100, v.completed_pourcent
Chris@0 106 assert_progress_equal 25.0/100.0*100, v.closed_pourcent
Chris@0 107 end
chris@22 108
chris@22 109 context "#behind_schedule?" do
chris@22 110 setup do
chris@22 111 ProjectCustomField.destroy_all # Custom values are a mess to isolate in tests
chris@22 112 @project = Project.generate!(:identifier => 'test0')
chris@22 113 @project.trackers << Tracker.generate!
chris@22 114
chris@22 115 @version = Version.generate!(:project => @project, :effective_date => nil)
chris@22 116 end
Chris@909 117
chris@22 118 should "be false if there are no issues assigned" do
chris@22 119 @version.update_attribute(:effective_date, Date.yesterday)
chris@22 120 assert_equal false, @version.behind_schedule?
chris@22 121 end
chris@22 122
chris@22 123 should "be false if there is no effective_date" do
chris@22 124 assert_equal false, @version.behind_schedule?
chris@22 125 end
chris@22 126
chris@22 127 should "be false if all of the issues are ahead of schedule" do
chris@22 128 @version.update_attribute(:effective_date, 7.days.from_now.to_date)
chris@22 129 @version.fixed_issues = [
chris@22 130 Issue.generate_for_project!(@project, :start_date => 7.days.ago, :done_ratio => 60), # 14 day span, 60% done, 50% time left
chris@22 131 Issue.generate_for_project!(@project, :start_date => 7.days.ago, :done_ratio => 60) # 14 day span, 60% done, 50% time left
chris@22 132 ]
chris@22 133 assert_equal 60, @version.completed_pourcent
chris@22 134 assert_equal false, @version.behind_schedule?
chris@22 135 end
chris@22 136
chris@22 137 should "be true if any of the issues are behind schedule" do
chris@22 138 @version.update_attribute(:effective_date, 7.days.from_now.to_date)
chris@22 139 @version.fixed_issues = [
chris@22 140 Issue.generate_for_project!(@project, :start_date => 7.days.ago, :done_ratio => 60), # 14 day span, 60% done, 50% time left
chris@22 141 Issue.generate_for_project!(@project, :start_date => 7.days.ago, :done_ratio => 20) # 14 day span, 20% done, 50% time left
chris@22 142 ]
chris@22 143 assert_equal 40, @version.completed_pourcent
chris@22 144 assert_equal true, @version.behind_schedule?
chris@22 145 end
chris@22 146
chris@22 147 should "be false if all of the issues are complete" do
chris@22 148 @version.update_attribute(:effective_date, 7.days.from_now.to_date)
chris@22 149 @version.fixed_issues = [
chris@22 150 Issue.generate_for_project!(@project, :start_date => 14.days.ago, :done_ratio => 100, :status => IssueStatus.find(5)), # 7 day span
chris@22 151 Issue.generate_for_project!(@project, :start_date => 14.days.ago, :done_ratio => 100, :status => IssueStatus.find(5)) # 7 day span
chris@22 152 ]
chris@22 153 assert_equal 100, @version.completed_pourcent
chris@22 154 assert_equal false, @version.behind_schedule?
chris@22 155
chris@22 156 end
chris@22 157 end
chris@22 158
Chris@0 159 context "#estimated_hours" do
Chris@0 160 setup do
Chris@0 161 @version = Version.create!(:project_id => 1, :name => '#estimated_hours')
Chris@0 162 end
Chris@909 163
Chris@0 164 should "return 0 with no assigned issues" do
Chris@0 165 assert_equal 0, @version.estimated_hours
Chris@0 166 end
Chris@909 167
Chris@0 168 should "return 0 with no estimated hours" do
Chris@0 169 add_issue(@version)
Chris@0 170 assert_equal 0, @version.estimated_hours
Chris@0 171 end
Chris@909 172
Chris@0 173 should "return the sum of estimated hours" do
Chris@0 174 add_issue(@version, :estimated_hours => 2.5)
Chris@0 175 add_issue(@version, :estimated_hours => 5)
Chris@0 176 assert_equal 7.5, @version.estimated_hours
Chris@0 177 end
Chris@909 178
Chris@0 179 should "return the sum of leaves estimated hours" do
Chris@0 180 parent = add_issue(@version)
Chris@0 181 add_issue(@version, :estimated_hours => 2.5, :parent_issue_id => parent.id)
Chris@0 182 add_issue(@version, :estimated_hours => 5, :parent_issue_id => parent.id)
Chris@0 183 assert_equal 7.5, @version.estimated_hours
Chris@0 184 end
Chris@0 185 end
Chris@0 186
Chris@0 187 test "should update all issue's fixed_version associations in case the hierarchy changed XXX" do
Chris@0 188 User.current = User.find(1) # Need the admin's permissions
Chris@909 189
Chris@0 190 @version = Version.find(7)
Chris@0 191 # Separate hierarchy
Chris@0 192 project_1_issue = Issue.find(1)
Chris@0 193 project_1_issue.fixed_version = @version
Chris@119 194 assert project_1_issue.save, project_1_issue.errors.full_messages.to_s
Chris@909 195
Chris@0 196 project_5_issue = Issue.find(6)
Chris@0 197 project_5_issue.fixed_version = @version
Chris@0 198 assert project_5_issue.save
Chris@909 199
Chris@0 200 # Project
Chris@0 201 project_2_issue = Issue.find(4)
Chris@0 202 project_2_issue.fixed_version = @version
Chris@0 203 assert project_2_issue.save
Chris@0 204
Chris@0 205 # Update the sharing
Chris@0 206 @version.sharing = 'none'
Chris@0 207 assert @version.save
Chris@0 208
Chris@0 209 # Project 1 now out of the shared scope
Chris@0 210 project_1_issue.reload
Chris@0 211 assert_equal nil, project_1_issue.fixed_version, "Fixed version is still set after changing the Version's sharing"
Chris@909 212
Chris@0 213 # Project 5 now out of the shared scope
Chris@0 214 project_5_issue.reload
Chris@0 215 assert_equal nil, project_5_issue.fixed_version, "Fixed version is still set after changing the Version's sharing"
Chris@0 216
Chris@0 217 # Project 2 issue remains
Chris@0 218 project_2_issue.reload
Chris@0 219 assert_equal @version, project_2_issue.fixed_version
Chris@0 220 end
Chris@909 221
Chris@0 222 private
Chris@909 223
Chris@0 224 def add_issue(version, attributes={})
Chris@0 225 Issue.create!({:project => version.project,
Chris@0 226 :fixed_version => version,
Chris@0 227 :subject => 'Test',
Chris@0 228 :author => User.find(:first),
Chris@0 229 :tracker => version.project.trackers.find(:first)}.merge(attributes))
Chris@0 230 end
Chris@909 231
Chris@0 232 def assert_progress_equal(expected_float, actual_float, message="")
Chris@0 233 assert_in_delta(expected_float, actual_float, 0.000001, message="")
Chris@0 234 end
Chris@0 235 end