annotate test/functional/timelog_controller_test.rb @ 8:0c83d98252d9 yuya

* Add custom repo prefix and proper auth realm, remove auth cache (seems like an unwise feature), pass DB handle around, various other bits of tidying
author Chris Cannam
date Thu, 12 Aug 2010 15:31:37 +0100
parents 513646585e45
children 40f7cfd4df19
rev   line source
Chris@0 1 # -*- coding: utf-8 -*-
Chris@0 2 # redMine - project management software
Chris@0 3 # Copyright (C) 2006-2007 Jean-Philippe Lang
Chris@0 4 #
Chris@0 5 # This program is free software; you can redistribute it and/or
Chris@0 6 # modify it under the terms of the GNU General Public License
Chris@0 7 # as published by the Free Software Foundation; either version 2
Chris@0 8 # of the License, or (at your option) any later version.
Chris@0 9 #
Chris@0 10 # This program is distributed in the hope that it will be useful,
Chris@0 11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@0 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0 13 # GNU General Public License for more details.
Chris@0 14 #
Chris@0 15 # You should have received a copy of the GNU General Public License
Chris@0 16 # along with this program; if not, write to the Free Software
Chris@0 17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Chris@0 18
Chris@0 19 require File.dirname(__FILE__) + '/../test_helper'
Chris@0 20 require 'timelog_controller'
Chris@0 21
Chris@0 22 # Re-raise errors caught by the controller.
Chris@0 23 class TimelogController; def rescue_action(e) raise e end; end
Chris@0 24
Chris@0 25 class TimelogControllerTest < ActionController::TestCase
Chris@0 26 fixtures :projects, :enabled_modules, :roles, :members, :member_roles, :issues, :time_entries, :users, :trackers, :enumerations, :issue_statuses, :custom_fields, :custom_values
Chris@0 27
Chris@0 28 def setup
Chris@0 29 @controller = TimelogController.new
Chris@0 30 @request = ActionController::TestRequest.new
Chris@0 31 @response = ActionController::TestResponse.new
Chris@0 32 end
Chris@0 33
Chris@0 34 def test_get_edit
Chris@0 35 @request.session[:user_id] = 3
Chris@0 36 get :edit, :project_id => 1
Chris@0 37 assert_response :success
Chris@0 38 assert_template 'edit'
Chris@0 39 # Default activity selected
Chris@0 40 assert_tag :tag => 'option', :attributes => { :selected => 'selected' },
Chris@0 41 :content => 'Development'
Chris@0 42 end
Chris@0 43
Chris@0 44 def test_get_edit_existing_time
Chris@0 45 @request.session[:user_id] = 2
Chris@0 46 get :edit, :id => 2, :project_id => nil
Chris@0 47 assert_response :success
Chris@0 48 assert_template 'edit'
Chris@0 49 # Default activity selected
Chris@0 50 assert_tag :tag => 'form', :attributes => { :action => '/projects/ecookbook/timelog/edit/2' }
Chris@0 51 end
Chris@0 52
Chris@0 53 def test_get_edit_should_only_show_active_time_entry_activities
Chris@0 54 @request.session[:user_id] = 3
Chris@0 55 get :edit, :project_id => 1
Chris@0 56 assert_response :success
Chris@0 57 assert_template 'edit'
Chris@0 58 assert_no_tag :tag => 'option', :content => 'Inactive Activity'
Chris@0 59
Chris@0 60 end
Chris@0 61
Chris@0 62 def test_get_edit_with_an_existing_time_entry_with_inactive_activity
Chris@0 63 te = TimeEntry.find(1)
Chris@0 64 te.activity = TimeEntryActivity.find_by_name("Inactive Activity")
Chris@0 65 te.save!
Chris@0 66
Chris@0 67 @request.session[:user_id] = 1
Chris@0 68 get :edit, :project_id => 1, :id => 1
Chris@0 69 assert_response :success
Chris@0 70 assert_template 'edit'
Chris@0 71 # Blank option since nothing is pre-selected
Chris@0 72 assert_tag :tag => 'option', :content => '--- Please select ---'
Chris@0 73 end
Chris@0 74
Chris@0 75 def test_post_edit
Chris@0 76 # TODO: should POST to issues’ time log instead of project. change form
Chris@0 77 # and routing
Chris@0 78 @request.session[:user_id] = 3
Chris@0 79 post :edit, :project_id => 1,
Chris@0 80 :time_entry => {:comments => 'Some work on TimelogControllerTest',
Chris@0 81 # Not the default activity
Chris@0 82 :activity_id => '11',
Chris@0 83 :spent_on => '2008-03-14',
Chris@0 84 :issue_id => '1',
Chris@0 85 :hours => '7.3'}
Chris@0 86 assert_redirected_to :action => 'details', :project_id => 'ecookbook'
Chris@0 87
Chris@0 88 i = Issue.find(1)
Chris@0 89 t = TimeEntry.find_by_comments('Some work on TimelogControllerTest')
Chris@0 90 assert_not_nil t
Chris@0 91 assert_equal 11, t.activity_id
Chris@0 92 assert_equal 7.3, t.hours
Chris@0 93 assert_equal 3, t.user_id
Chris@0 94 assert_equal i, t.issue
Chris@0 95 assert_equal i.project, t.project
Chris@0 96 end
Chris@0 97
Chris@0 98 def test_update
Chris@0 99 entry = TimeEntry.find(1)
Chris@0 100 assert_equal 1, entry.issue_id
Chris@0 101 assert_equal 2, entry.user_id
Chris@0 102
Chris@0 103 @request.session[:user_id] = 1
Chris@0 104 post :edit, :id => 1,
Chris@0 105 :time_entry => {:issue_id => '2',
Chris@0 106 :hours => '8'}
Chris@0 107 assert_redirected_to :action => 'details', :project_id => 'ecookbook'
Chris@0 108 entry.reload
Chris@0 109
Chris@0 110 assert_equal 8, entry.hours
Chris@0 111 assert_equal 2, entry.issue_id
Chris@0 112 assert_equal 2, entry.user_id
Chris@0 113 end
Chris@0 114
Chris@0 115 def test_destroy
Chris@0 116 @request.session[:user_id] = 2
Chris@0 117 post :destroy, :id => 1
Chris@0 118 assert_redirected_to :action => 'details', :project_id => 'ecookbook'
Chris@0 119 assert_equal I18n.t(:notice_successful_delete), flash[:notice]
Chris@0 120 assert_nil TimeEntry.find_by_id(1)
Chris@0 121 end
Chris@0 122
Chris@0 123 def test_destroy_should_fail
Chris@0 124 # simulate that this fails (e.g. due to a plugin), see #5700
Chris@0 125 TimeEntry.class_eval do
Chris@0 126 before_destroy :stop_callback_chain
Chris@0 127 def stop_callback_chain ; return false ; end
Chris@0 128 end
Chris@0 129
Chris@0 130 @request.session[:user_id] = 2
Chris@0 131 post :destroy, :id => 1
Chris@0 132 assert_redirected_to :action => 'details', :project_id => 'ecookbook'
Chris@0 133 assert_equal I18n.t(:notice_unable_delete_time_entry), flash[:error]
Chris@0 134 assert_not_nil TimeEntry.find_by_id(1)
Chris@0 135
Chris@0 136 # remove the simulation
Chris@0 137 TimeEntry.before_destroy.reject! {|callback| callback.method == :stop_callback_chain }
Chris@0 138 end
Chris@0 139
Chris@0 140 def test_report_no_criteria
Chris@0 141 get :report, :project_id => 1
Chris@0 142 assert_response :success
Chris@0 143 assert_template 'report'
Chris@0 144 end
Chris@0 145
Chris@0 146 def test_report_all_projects
Chris@0 147 get :report
Chris@0 148 assert_response :success
Chris@0 149 assert_template 'report'
Chris@0 150 end
Chris@0 151
Chris@0 152 def test_report_all_projects_denied
Chris@0 153 r = Role.anonymous
Chris@0 154 r.permissions.delete(:view_time_entries)
Chris@0 155 r.permissions_will_change!
Chris@0 156 r.save
Chris@0 157 get :report
Chris@0 158 assert_redirected_to '/login?back_url=http%3A%2F%2Ftest.host%2Ftime_entries%2Freport'
Chris@0 159 end
Chris@0 160
Chris@0 161 def test_report_all_projects_one_criteria
Chris@0 162 get :report, :columns => 'week', :from => "2007-04-01", :to => "2007-04-30", :criterias => ['project']
Chris@0 163 assert_response :success
Chris@0 164 assert_template 'report'
Chris@0 165 assert_not_nil assigns(:total_hours)
Chris@0 166 assert_equal "8.65", "%.2f" % assigns(:total_hours)
Chris@0 167 end
Chris@0 168
Chris@0 169 def test_report_all_time
Chris@0 170 get :report, :project_id => 1, :criterias => ['project', 'issue']
Chris@0 171 assert_response :success
Chris@0 172 assert_template 'report'
Chris@0 173 assert_not_nil assigns(:total_hours)
Chris@0 174 assert_equal "162.90", "%.2f" % assigns(:total_hours)
Chris@0 175 end
Chris@0 176
Chris@0 177 def test_report_all_time_by_day
Chris@0 178 get :report, :project_id => 1, :criterias => ['project', 'issue'], :columns => 'day'
Chris@0 179 assert_response :success
Chris@0 180 assert_template 'report'
Chris@0 181 assert_not_nil assigns(:total_hours)
Chris@0 182 assert_equal "162.90", "%.2f" % assigns(:total_hours)
Chris@0 183 assert_tag :tag => 'th', :content => '2007-03-12'
Chris@0 184 end
Chris@0 185
Chris@0 186 def test_report_one_criteria
Chris@0 187 get :report, :project_id => 1, :columns => 'week', :from => "2007-04-01", :to => "2007-04-30", :criterias => ['project']
Chris@0 188 assert_response :success
Chris@0 189 assert_template 'report'
Chris@0 190 assert_not_nil assigns(:total_hours)
Chris@0 191 assert_equal "8.65", "%.2f" % assigns(:total_hours)
Chris@0 192 end
Chris@0 193
Chris@0 194 def test_report_two_criterias
Chris@0 195 get :report, :project_id => 1, :columns => 'month', :from => "2007-01-01", :to => "2007-12-31", :criterias => ["member", "activity"]
Chris@0 196 assert_response :success
Chris@0 197 assert_template 'report'
Chris@0 198 assert_not_nil assigns(:total_hours)
Chris@0 199 assert_equal "162.90", "%.2f" % assigns(:total_hours)
Chris@0 200 end
Chris@0 201
Chris@0 202 def test_report_one_day
Chris@0 203 get :report, :project_id => 1, :columns => 'day', :from => "2007-03-23", :to => "2007-03-23", :criterias => ["member", "activity"]
Chris@0 204 assert_response :success
Chris@0 205 assert_template 'report'
Chris@0 206 assert_not_nil assigns(:total_hours)
Chris@0 207 assert_equal "4.25", "%.2f" % assigns(:total_hours)
Chris@0 208 end
Chris@0 209
Chris@0 210 def test_report_at_issue_level
Chris@0 211 get :report, :project_id => 1, :issue_id => 1, :columns => 'month', :from => "2007-01-01", :to => "2007-12-31", :criterias => ["member", "activity"]
Chris@0 212 assert_response :success
Chris@0 213 assert_template 'report'
Chris@0 214 assert_not_nil assigns(:total_hours)
Chris@0 215 assert_equal "154.25", "%.2f" % assigns(:total_hours)
Chris@0 216 end
Chris@0 217
Chris@0 218 def test_report_custom_field_criteria
Chris@0 219 get :report, :project_id => 1, :criterias => ['project', 'cf_1', 'cf_7']
Chris@0 220 assert_response :success
Chris@0 221 assert_template 'report'
Chris@0 222 assert_not_nil assigns(:total_hours)
Chris@0 223 assert_not_nil assigns(:criterias)
Chris@0 224 assert_equal 3, assigns(:criterias).size
Chris@0 225 assert_equal "162.90", "%.2f" % assigns(:total_hours)
Chris@0 226 # Custom field column
Chris@0 227 assert_tag :tag => 'th', :content => 'Database'
Chris@0 228 # Custom field row
Chris@0 229 assert_tag :tag => 'td', :content => 'MySQL',
Chris@0 230 :sibling => { :tag => 'td', :attributes => { :class => 'hours' },
Chris@0 231 :child => { :tag => 'span', :attributes => { :class => 'hours hours-int' },
Chris@0 232 :content => '1' }}
Chris@0 233 # Second custom field column
Chris@0 234 assert_tag :tag => 'th', :content => 'Billable'
Chris@0 235 end
Chris@0 236
Chris@0 237 def test_report_one_criteria_no_result
Chris@0 238 get :report, :project_id => 1, :columns => 'week', :from => "1998-04-01", :to => "1998-04-30", :criterias => ['project']
Chris@0 239 assert_response :success
Chris@0 240 assert_template 'report'
Chris@0 241 assert_not_nil assigns(:total_hours)
Chris@0 242 assert_equal "0.00", "%.2f" % assigns(:total_hours)
Chris@0 243 end
Chris@0 244
Chris@0 245 def test_report_all_projects_csv_export
Chris@0 246 get :report, :columns => 'month', :from => "2007-01-01", :to => "2007-06-30", :criterias => ["project", "member", "activity"], :format => "csv"
Chris@0 247 assert_response :success
Chris@0 248 assert_equal 'text/csv', @response.content_type
Chris@0 249 lines = @response.body.chomp.split("\n")
Chris@0 250 # Headers
Chris@0 251 assert_equal 'Project,Member,Activity,2007-1,2007-2,2007-3,2007-4,2007-5,2007-6,Total', lines.first
Chris@0 252 # Total row
Chris@0 253 assert_equal 'Total,"","","","",154.25,8.65,"","",162.90', lines.last
Chris@0 254 end
Chris@0 255
Chris@0 256 def test_report_csv_export
Chris@0 257 get :report, :project_id => 1, :columns => 'month', :from => "2007-01-01", :to => "2007-06-30", :criterias => ["project", "member", "activity"], :format => "csv"
Chris@0 258 assert_response :success
Chris@0 259 assert_equal 'text/csv', @response.content_type
Chris@0 260 lines = @response.body.chomp.split("\n")
Chris@0 261 # Headers
Chris@0 262 assert_equal 'Project,Member,Activity,2007-1,2007-2,2007-3,2007-4,2007-5,2007-6,Total', lines.first
Chris@0 263 # Total row
Chris@0 264 assert_equal 'Total,"","","","",154.25,8.65,"","",162.90', lines.last
Chris@0 265 end
Chris@0 266
Chris@0 267 def test_details_all_projects
Chris@0 268 get :details
Chris@0 269 assert_response :success
Chris@0 270 assert_template 'details'
Chris@0 271 assert_not_nil assigns(:total_hours)
Chris@0 272 assert_equal "162.90", "%.2f" % assigns(:total_hours)
Chris@0 273 end
Chris@0 274
Chris@0 275 def test_details_at_project_level
Chris@0 276 get :details, :project_id => 1
Chris@0 277 assert_response :success
Chris@0 278 assert_template 'details'
Chris@0 279 assert_not_nil assigns(:entries)
Chris@0 280 assert_equal 4, assigns(:entries).size
Chris@0 281 # project and subproject
Chris@0 282 assert_equal [1, 3], assigns(:entries).collect(&:project_id).uniq.sort
Chris@0 283 assert_not_nil assigns(:total_hours)
Chris@0 284 assert_equal "162.90", "%.2f" % assigns(:total_hours)
Chris@0 285 # display all time by default
Chris@0 286 assert_equal '2007-03-11'.to_date, assigns(:from)
Chris@0 287 assert_equal '2007-04-22'.to_date, assigns(:to)
Chris@0 288 end
Chris@0 289
Chris@0 290 def test_details_at_project_level_with_date_range
Chris@0 291 get :details, :project_id => 1, :from => '2007-03-20', :to => '2007-04-30'
Chris@0 292 assert_response :success
Chris@0 293 assert_template 'details'
Chris@0 294 assert_not_nil assigns(:entries)
Chris@0 295 assert_equal 3, assigns(:entries).size
Chris@0 296 assert_not_nil assigns(:total_hours)
Chris@0 297 assert_equal "12.90", "%.2f" % assigns(:total_hours)
Chris@0 298 assert_equal '2007-03-20'.to_date, assigns(:from)
Chris@0 299 assert_equal '2007-04-30'.to_date, assigns(:to)
Chris@0 300 end
Chris@0 301
Chris@0 302 def test_details_at_project_level_with_period
Chris@0 303 get :details, :project_id => 1, :period => '7_days'
Chris@0 304 assert_response :success
Chris@0 305 assert_template 'details'
Chris@0 306 assert_not_nil assigns(:entries)
Chris@0 307 assert_not_nil assigns(:total_hours)
Chris@0 308 assert_equal Date.today - 7, assigns(:from)
Chris@0 309 assert_equal Date.today, assigns(:to)
Chris@0 310 end
Chris@0 311
Chris@0 312 def test_details_one_day
Chris@0 313 get :details, :project_id => 1, :from => "2007-03-23", :to => "2007-03-23"
Chris@0 314 assert_response :success
Chris@0 315 assert_template 'details'
Chris@0 316 assert_not_nil assigns(:total_hours)
Chris@0 317 assert_equal "4.25", "%.2f" % assigns(:total_hours)
Chris@0 318 end
Chris@0 319
Chris@0 320 def test_details_at_issue_level
Chris@0 321 get :details, :issue_id => 1
Chris@0 322 assert_response :success
Chris@0 323 assert_template 'details'
Chris@0 324 assert_not_nil assigns(:entries)
Chris@0 325 assert_equal 2, assigns(:entries).size
Chris@0 326 assert_not_nil assigns(:total_hours)
Chris@0 327 assert_equal 154.25, assigns(:total_hours)
Chris@0 328 # display all time by default
Chris@0 329 assert_equal '2007-03-11'.to_date, assigns(:from)
Chris@0 330 assert_equal '2007-04-22'.to_date, assigns(:to)
Chris@0 331 end
Chris@0 332
Chris@0 333 def test_details_atom_feed
Chris@0 334 get :details, :project_id => 1, :format => 'atom'
Chris@0 335 assert_response :success
Chris@0 336 assert_equal 'application/atom+xml', @response.content_type
Chris@0 337 assert_not_nil assigns(:items)
Chris@0 338 assert assigns(:items).first.is_a?(TimeEntry)
Chris@0 339 end
Chris@0 340
Chris@0 341 def test_details_all_projects_csv_export
Chris@0 342 Setting.date_format = '%m/%d/%Y'
Chris@0 343 get :details, :format => 'csv'
Chris@0 344 assert_response :success
Chris@0 345 assert_equal 'text/csv', @response.content_type
Chris@0 346 assert @response.body.include?("Date,User,Activity,Project,Issue,Tracker,Subject,Hours,Comment\n")
Chris@0 347 assert @response.body.include?("\n04/21/2007,redMine Admin,Design,eCookbook,3,Bug,Error 281 when updating a recipe,1.0,\"\"\n")
Chris@0 348 end
Chris@0 349
Chris@0 350 def test_details_csv_export
Chris@0 351 Setting.date_format = '%m/%d/%Y'
Chris@0 352 get :details, :project_id => 1, :format => 'csv'
Chris@0 353 assert_response :success
Chris@0 354 assert_equal 'text/csv', @response.content_type
Chris@0 355 assert @response.body.include?("Date,User,Activity,Project,Issue,Tracker,Subject,Hours,Comment\n")
Chris@0 356 assert @response.body.include?("\n04/21/2007,redMine Admin,Design,eCookbook,3,Bug,Error 281 when updating a recipe,1.0,\"\"\n")
Chris@0 357 end
Chris@0 358 end