annotate test/functional/timelog_controller_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 cbb26bc654de
children 433d4f72a19b
rev   line source
Chris@0 1 # -*- coding: utf-8 -*-
Chris@909 2 # Redmine - project management software
Chris@909 3 # Copyright (C) 2006-2011 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@909 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@909 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@119 19 require File.expand_path('../../test_helper', __FILE__)
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@909 26 fixtures :projects, :enabled_modules, :roles, :members,
Chris@909 27 :member_roles, :issues, :time_entries, :users,
Chris@909 28 :trackers, :enumerations, :issue_statuses,
Chris@909 29 :custom_fields, :custom_values
Chris@909 30
Chris@909 31 include Redmine::I18n
Chris@0 32
Chris@0 33 def setup
Chris@0 34 @controller = TimelogController.new
Chris@0 35 @request = ActionController::TestRequest.new
Chris@0 36 @response = ActionController::TestResponse.new
Chris@0 37 end
Chris@909 38
chris@37 39 def test_get_new
Chris@0 40 @request.session[:user_id] = 3
chris@37 41 get :new, :project_id => 1
Chris@0 42 assert_response :success
Chris@0 43 assert_template 'edit'
Chris@0 44 # Default activity selected
Chris@0 45 assert_tag :tag => 'option', :attributes => { :selected => 'selected' },
Chris@0 46 :content => 'Development'
Chris@0 47 end
Chris@909 48
chris@37 49 def test_get_new_should_only_show_active_time_entry_activities
chris@37 50 @request.session[:user_id] = 3
chris@37 51 get :new, :project_id => 1
chris@37 52 assert_response :success
chris@37 53 assert_template 'edit'
chris@37 54 assert_no_tag :tag => 'option', :content => 'Inactive Activity'
chris@37 55 end
chris@37 56
Chris@0 57 def test_get_edit_existing_time
Chris@0 58 @request.session[:user_id] = 2
Chris@0 59 get :edit, :id => 2, :project_id => nil
Chris@0 60 assert_response :success
Chris@0 61 assert_template 'edit'
Chris@0 62 # Default activity selected
chris@37 63 assert_tag :tag => 'form', :attributes => { :action => '/projects/ecookbook/time_entries/2' }
Chris@0 64 end
Chris@909 65
Chris@0 66 def test_get_edit_with_an_existing_time_entry_with_inactive_activity
Chris@0 67 te = TimeEntry.find(1)
Chris@0 68 te.activity = TimeEntryActivity.find_by_name("Inactive Activity")
Chris@0 69 te.save!
Chris@0 70
Chris@0 71 @request.session[:user_id] = 1
Chris@0 72 get :edit, :project_id => 1, :id => 1
Chris@0 73 assert_response :success
Chris@0 74 assert_template 'edit'
Chris@0 75 # Blank option since nothing is pre-selected
Chris@0 76 assert_tag :tag => 'option', :content => '--- Please select ---'
Chris@0 77 end
Chris@909 78
chris@37 79 def test_post_create
Chris@0 80 # TODO: should POST to issues’ time log instead of project. change form
Chris@0 81 # and routing
Chris@0 82 @request.session[:user_id] = 3
chris@37 83 post :create, :project_id => 1,
Chris@0 84 :time_entry => {:comments => 'Some work on TimelogControllerTest',
Chris@0 85 # Not the default activity
Chris@0 86 :activity_id => '11',
Chris@0 87 :spent_on => '2008-03-14',
Chris@0 88 :issue_id => '1',
Chris@0 89 :hours => '7.3'}
chris@37 90 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
Chris@909 91
Chris@0 92 i = Issue.find(1)
Chris@0 93 t = TimeEntry.find_by_comments('Some work on TimelogControllerTest')
Chris@0 94 assert_not_nil t
Chris@0 95 assert_equal 11, t.activity_id
Chris@0 96 assert_equal 7.3, t.hours
Chris@0 97 assert_equal 3, t.user_id
Chris@0 98 assert_equal i, t.issue
Chris@0 99 assert_equal i.project, t.project
Chris@0 100 end
Chris@119 101
Chris@119 102 def test_post_create_with_blank_issue
Chris@119 103 # TODO: should POST to issues’ time log instead of project. change form
Chris@119 104 # and routing
Chris@119 105 @request.session[:user_id] = 3
Chris@119 106 post :create, :project_id => 1,
Chris@119 107 :time_entry => {:comments => 'Some work on TimelogControllerTest',
Chris@119 108 # Not the default activity
Chris@119 109 :activity_id => '11',
Chris@119 110 :issue_id => '',
Chris@119 111 :spent_on => '2008-03-14',
Chris@119 112 :hours => '7.3'}
Chris@119 113 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
Chris@909 114
Chris@119 115 t = TimeEntry.find_by_comments('Some work on TimelogControllerTest')
Chris@119 116 assert_not_nil t
Chris@119 117 assert_equal 11, t.activity_id
Chris@119 118 assert_equal 7.3, t.hours
Chris@119 119 assert_equal 3, t.user_id
Chris@119 120 end
Chris@909 121
Chris@909 122 def test_create_without_log_time_permission_should_be_denied
Chris@909 123 @request.session[:user_id] = 2
Chris@909 124 Role.find_by_name('Manager').remove_permission! :log_time
Chris@909 125 post :create, :project_id => 1,
Chris@909 126 :time_entry => {:activity_id => '11',
Chris@909 127 :issue_id => '',
Chris@909 128 :spent_on => '2008-03-14',
Chris@909 129 :hours => '7.3'}
Chris@909 130
Chris@909 131 assert_response 403
Chris@909 132 end
Chris@909 133
Chris@0 134 def test_update
Chris@0 135 entry = TimeEntry.find(1)
Chris@0 136 assert_equal 1, entry.issue_id
Chris@0 137 assert_equal 2, entry.user_id
Chris@909 138
Chris@0 139 @request.session[:user_id] = 1
chris@37 140 put :update, :id => 1,
Chris@0 141 :time_entry => {:issue_id => '2',
Chris@0 142 :hours => '8'}
chris@37 143 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
Chris@0 144 entry.reload
Chris@909 145
Chris@0 146 assert_equal 8, entry.hours
Chris@0 147 assert_equal 2, entry.issue_id
Chris@0 148 assert_equal 2, entry.user_id
Chris@0 149 end
Chris@441 150
Chris@441 151 def test_get_bulk_edit
Chris@441 152 @request.session[:user_id] = 2
Chris@441 153 get :bulk_edit, :ids => [1, 2]
Chris@441 154 assert_response :success
Chris@441 155 assert_template 'bulk_edit'
Chris@909 156
Chris@441 157 # System wide custom field
Chris@441 158 assert_tag :select, :attributes => {:name => 'time_entry[custom_field_values][10]'}
Chris@441 159 end
Chris@441 160
Chris@441 161 def test_get_bulk_edit_on_different_projects
Chris@441 162 @request.session[:user_id] = 2
Chris@441 163 get :bulk_edit, :ids => [1, 2, 6]
Chris@441 164 assert_response :success
Chris@441 165 assert_template 'bulk_edit'
Chris@441 166 end
Chris@441 167
Chris@441 168 def test_bulk_update
Chris@441 169 @request.session[:user_id] = 2
Chris@441 170 # update time entry activity
Chris@441 171 post :bulk_update, :ids => [1, 2], :time_entry => { :activity_id => 9}
Chris@909 172
Chris@441 173 assert_response 302
Chris@441 174 # check that the issues were updated
Chris@441 175 assert_equal [9, 9], TimeEntry.find_all_by_id([1, 2]).collect {|i| i.activity_id}
Chris@441 176 end
Chris@441 177
Chris@441 178 def test_bulk_update_on_different_projects
Chris@441 179 @request.session[:user_id] = 2
Chris@909 180 # makes user a manager on the other project
Chris@909 181 Member.create!(:user_id => 2, :project_id => 3, :role_ids => [1])
Chris@909 182
Chris@441 183 # update time entry activity
Chris@441 184 post :bulk_update, :ids => [1, 2, 4], :time_entry => { :activity_id => 9 }
Chris@909 185
Chris@441 186 assert_response 302
Chris@441 187 # check that the issues were updated
Chris@441 188 assert_equal [9, 9, 9], TimeEntry.find_all_by_id([1, 2, 4]).collect {|i| i.activity_id}
Chris@441 189 end
Chris@441 190
Chris@441 191 def test_bulk_update_on_different_projects_without_rights
Chris@441 192 @request.session[:user_id] = 3
Chris@441 193 user = User.find(3)
Chris@441 194 action = { :controller => "timelog", :action => "bulk_update" }
Chris@441 195 assert user.allowed_to?(action, TimeEntry.find(1).project)
Chris@441 196 assert ! user.allowed_to?(action, TimeEntry.find(5).project)
Chris@441 197 post :bulk_update, :ids => [1, 5], :time_entry => { :activity_id => 9 }
Chris@441 198 assert_response 403
Chris@441 199 end
Chris@441 200
Chris@441 201 def test_bulk_update_custom_field
Chris@441 202 @request.session[:user_id] = 2
Chris@441 203 post :bulk_update, :ids => [1, 2], :time_entry => { :custom_field_values => {'10' => '0'} }
Chris@909 204
Chris@441 205 assert_response 302
Chris@441 206 assert_equal ["0", "0"], TimeEntry.find_all_by_id([1, 2]).collect {|i| i.custom_value_for(10).value}
Chris@441 207 end
Chris@441 208
Chris@441 209 def test_post_bulk_update_should_redirect_back_using_the_back_url_parameter
Chris@441 210 @request.session[:user_id] = 2
Chris@441 211 post :bulk_update, :ids => [1,2], :back_url => '/time_entries'
Chris@441 212
Chris@441 213 assert_response :redirect
Chris@441 214 assert_redirected_to '/time_entries'
Chris@441 215 end
Chris@441 216
Chris@441 217 def test_post_bulk_update_should_not_redirect_back_using_the_back_url_parameter_off_the_host
Chris@441 218 @request.session[:user_id] = 2
Chris@441 219 post :bulk_update, :ids => [1,2], :back_url => 'http://google.com'
Chris@441 220
Chris@441 221 assert_response :redirect
Chris@441 222 assert_redirected_to :controller => 'timelog', :action => 'index', :project_id => Project.find(1).identifier
Chris@441 223 end
Chris@909 224
Chris@909 225 def test_post_bulk_update_without_edit_permission_should_be_denied
Chris@909 226 @request.session[:user_id] = 2
Chris@909 227 Role.find_by_name('Manager').remove_permission! :edit_time_entries
Chris@909 228 post :bulk_update, :ids => [1,2]
Chris@909 229
Chris@909 230 assert_response 403
Chris@909 231 end
Chris@909 232
Chris@0 233 def test_destroy
Chris@0 234 @request.session[:user_id] = 2
chris@37 235 delete :destroy, :id => 1
chris@37 236 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
Chris@0 237 assert_equal I18n.t(:notice_successful_delete), flash[:notice]
Chris@0 238 assert_nil TimeEntry.find_by_id(1)
Chris@0 239 end
Chris@909 240
Chris@0 241 def test_destroy_should_fail
Chris@0 242 # simulate that this fails (e.g. due to a plugin), see #5700
Chris@441 243 TimeEntry.any_instance.expects(:destroy).returns(false)
Chris@0 244
Chris@0 245 @request.session[:user_id] = 2
chris@37 246 delete :destroy, :id => 1
chris@37 247 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
Chris@0 248 assert_equal I18n.t(:notice_unable_delete_time_entry), flash[:error]
Chris@0 249 assert_not_nil TimeEntry.find_by_id(1)
Chris@0 250 end
Chris@909 251
chris@37 252 def test_index_all_projects
chris@37 253 get :index
Chris@0 254 assert_response :success
chris@37 255 assert_template 'index'
Chris@0 256 assert_not_nil assigns(:total_hours)
Chris@0 257 assert_equal "162.90", "%.2f" % assigns(:total_hours)
Chris@441 258 assert_tag :form,
Chris@441 259 :attributes => {:action => "/time_entries", :id => 'query_form'}
Chris@0 260 end
Chris@909 261
chris@37 262 def test_index_at_project_level
Chris@441 263 get :index, :project_id => 'ecookbook'
Chris@0 264 assert_response :success
chris@37 265 assert_template 'index'
Chris@0 266 assert_not_nil assigns(:entries)
Chris@0 267 assert_equal 4, assigns(:entries).size
Chris@0 268 # project and subproject
Chris@0 269 assert_equal [1, 3], assigns(:entries).collect(&:project_id).uniq.sort
Chris@0 270 assert_not_nil assigns(:total_hours)
Chris@0 271 assert_equal "162.90", "%.2f" % assigns(:total_hours)
Chris@0 272 # display all time by default
chris@22 273 assert_equal '2007-03-12'.to_date, assigns(:from)
Chris@0 274 assert_equal '2007-04-22'.to_date, assigns(:to)
Chris@441 275 assert_tag :form,
Chris@441 276 :attributes => {:action => "/projects/ecookbook/time_entries", :id => 'query_form'}
Chris@0 277 end
Chris@909 278
chris@37 279 def test_index_at_project_level_with_date_range
Chris@441 280 get :index, :project_id => 'ecookbook', :from => '2007-03-20', :to => '2007-04-30'
Chris@0 281 assert_response :success
chris@37 282 assert_template 'index'
Chris@0 283 assert_not_nil assigns(:entries)
Chris@0 284 assert_equal 3, assigns(:entries).size
Chris@0 285 assert_not_nil assigns(:total_hours)
Chris@0 286 assert_equal "12.90", "%.2f" % assigns(:total_hours)
Chris@0 287 assert_equal '2007-03-20'.to_date, assigns(:from)
Chris@0 288 assert_equal '2007-04-30'.to_date, assigns(:to)
Chris@441 289 assert_tag :form,
Chris@441 290 :attributes => {:action => "/projects/ecookbook/time_entries", :id => 'query_form'}
Chris@0 291 end
Chris@0 292
chris@37 293 def test_index_at_project_level_with_period
Chris@441 294 get :index, :project_id => 'ecookbook', :period => '7_days'
Chris@0 295 assert_response :success
chris@37 296 assert_template 'index'
Chris@0 297 assert_not_nil assigns(:entries)
Chris@0 298 assert_not_nil assigns(:total_hours)
Chris@0 299 assert_equal Date.today - 7, assigns(:from)
Chris@0 300 assert_equal Date.today, assigns(:to)
Chris@441 301 assert_tag :form,
Chris@441 302 :attributes => {:action => "/projects/ecookbook/time_entries", :id => 'query_form'}
Chris@0 303 end
Chris@0 304
chris@37 305 def test_index_one_day
Chris@441 306 get :index, :project_id => 'ecookbook', :from => "2007-03-23", :to => "2007-03-23"
Chris@0 307 assert_response :success
chris@37 308 assert_template 'index'
Chris@0 309 assert_not_nil assigns(:total_hours)
Chris@0 310 assert_equal "4.25", "%.2f" % assigns(:total_hours)
Chris@441 311 assert_tag :form,
Chris@441 312 :attributes => {:action => "/projects/ecookbook/time_entries", :id => 'query_form'}
Chris@0 313 end
Chris@909 314
chris@37 315 def test_index_at_issue_level
chris@37 316 get :index, :issue_id => 1
Chris@0 317 assert_response :success
chris@37 318 assert_template 'index'
Chris@0 319 assert_not_nil assigns(:entries)
Chris@0 320 assert_equal 2, assigns(:entries).size
Chris@0 321 assert_not_nil assigns(:total_hours)
Chris@0 322 assert_equal 154.25, assigns(:total_hours)
chris@22 323 # display all time based on what's been logged
chris@22 324 assert_equal '2007-03-12'.to_date, assigns(:from)
Chris@0 325 assert_equal '2007-04-22'.to_date, assigns(:to)
Chris@441 326 # TODO: remove /projects/:project_id/issues/:issue_id/time_entries routes
Chris@441 327 # to use /issues/:issue_id/time_entries
Chris@441 328 assert_tag :form,
Chris@441 329 :attributes => {:action => "/projects/ecookbook/issues/1/time_entries", :id => 'query_form'}
Chris@0 330 end
Chris@909 331
chris@37 332 def test_index_atom_feed
chris@37 333 get :index, :project_id => 1, :format => 'atom'
Chris@0 334 assert_response :success
Chris@0 335 assert_equal 'application/atom+xml', @response.content_type
Chris@0 336 assert_not_nil assigns(:items)
Chris@0 337 assert assigns(:items).first.is_a?(TimeEntry)
Chris@0 338 end
Chris@909 339
chris@37 340 def test_index_all_projects_csv_export
Chris@0 341 Setting.date_format = '%m/%d/%Y'
chris@37 342 get :index, :format => 'csv'
Chris@0 343 assert_response :success
Chris@0 344 assert_equal 'text/csv', @response.content_type
Chris@441 345 assert @response.body.include?("Date,User,Activity,Project,Issue,Tracker,Subject,Hours,Comment,Overtime\n")
Chris@441 346 assert @response.body.include?("\n04/21/2007,redMine Admin,Design,eCookbook,3,Bug,Error 281 when updating a recipe,1.0,\"\",\"\"\n")
Chris@0 347 end
Chris@909 348
chris@37 349 def test_index_csv_export
Chris@0 350 Setting.date_format = '%m/%d/%Y'
chris@37 351 get :index, :project_id => 1, :format => 'csv'
Chris@0 352 assert_response :success
Chris@0 353 assert_equal 'text/csv', @response.content_type
Chris@441 354 assert @response.body.include?("Date,User,Activity,Project,Issue,Tracker,Subject,Hours,Comment,Overtime\n")
Chris@441 355 assert @response.body.include?("\n04/21/2007,redMine Admin,Design,eCookbook,3,Bug,Error 281 when updating a recipe,1.0,\"\",\"\"\n")
Chris@0 356 end
Chris@909 357
Chris@909 358 def test_csv_big_5
Chris@909 359 user = User.find_by_id(3)
Chris@909 360 user.language = "zh-TW"
Chris@909 361 assert user.save
Chris@909 362 str_utf8 = "\xe4\xb8\x80\xe6\x9c\x88"
Chris@909 363 str_big5 = "\xa4@\xa4\xeb"
Chris@909 364 if str_utf8.respond_to?(:force_encoding)
Chris@909 365 str_utf8.force_encoding('UTF-8')
Chris@909 366 str_big5.force_encoding('Big5')
Chris@909 367 end
Chris@909 368 @request.session[:user_id] = 3
Chris@909 369 post :create, :project_id => 1,
Chris@909 370 :time_entry => {:comments => str_utf8,
Chris@909 371 # Not the default activity
Chris@909 372 :activity_id => '11',
Chris@909 373 :issue_id => '',
Chris@909 374 :spent_on => '2011-11-10',
Chris@909 375 :hours => '7.3'}
Chris@909 376 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
Chris@909 377
Chris@909 378 t = TimeEntry.find_by_comments(str_utf8)
Chris@909 379 assert_not_nil t
Chris@909 380 assert_equal 11, t.activity_id
Chris@909 381 assert_equal 7.3, t.hours
Chris@909 382 assert_equal 3, t.user_id
Chris@909 383
Chris@909 384 get :index, :project_id => 1, :format => 'csv',
Chris@909 385 :from => '2011-11-10', :to => '2011-11-10'
Chris@909 386 assert_response :success
Chris@909 387 assert_equal 'text/csv', @response.content_type
Chris@909 388 ar = @response.body.chomp.split("\n")
Chris@909 389 s1 = "\xa4\xe9\xb4\xc1"
Chris@909 390 if str_utf8.respond_to?(:force_encoding)
Chris@909 391 s1.force_encoding('Big5')
Chris@909 392 end
Chris@909 393 assert ar[0].include?(s1)
Chris@909 394 assert ar[1].include?(str_big5)
Chris@909 395 end
Chris@909 396
Chris@909 397 def test_csv_cannot_convert_should_be_replaced_big_5
Chris@909 398 user = User.find_by_id(3)
Chris@909 399 user.language = "zh-TW"
Chris@909 400 assert user.save
Chris@909 401 str_utf8 = "\xe4\xbb\xa5\xe5\x86\x85"
Chris@909 402 if str_utf8.respond_to?(:force_encoding)
Chris@909 403 str_utf8.force_encoding('UTF-8')
Chris@909 404 end
Chris@909 405 @request.session[:user_id] = 3
Chris@909 406 post :create, :project_id => 1,
Chris@909 407 :time_entry => {:comments => str_utf8,
Chris@909 408 # Not the default activity
Chris@909 409 :activity_id => '11',
Chris@909 410 :issue_id => '',
Chris@909 411 :spent_on => '2011-11-10',
Chris@909 412 :hours => '7.3'}
Chris@909 413 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
Chris@909 414
Chris@909 415 t = TimeEntry.find_by_comments(str_utf8)
Chris@909 416 assert_not_nil t
Chris@909 417 assert_equal 11, t.activity_id
Chris@909 418 assert_equal 7.3, t.hours
Chris@909 419 assert_equal 3, t.user_id
Chris@909 420
Chris@909 421 get :index, :project_id => 1, :format => 'csv',
Chris@909 422 :from => '2011-11-10', :to => '2011-11-10'
Chris@909 423 assert_response :success
Chris@909 424 assert_equal 'text/csv', @response.content_type
Chris@909 425 ar = @response.body.chomp.split("\n")
Chris@909 426 s1 = "\xa4\xe9\xb4\xc1"
Chris@909 427 if str_utf8.respond_to?(:force_encoding)
Chris@909 428 s1.force_encoding('Big5')
Chris@909 429 end
Chris@909 430 assert ar[0].include?(s1)
Chris@909 431 s2 = ar[1].split(",")[8]
Chris@909 432 if s2.respond_to?(:force_encoding)
Chris@909 433 s3 = "\xa5H?"
Chris@909 434 s3.force_encoding('Big5')
Chris@909 435 assert_equal s3, s2
Chris@909 436 elsif RUBY_PLATFORM == 'java'
Chris@909 437 assert_equal "??", s2
Chris@909 438 else
Chris@909 439 assert_equal "\xa5H???", s2
Chris@909 440 end
Chris@909 441 end
Chris@909 442
Chris@909 443 def test_csv_tw
Chris@909 444 with_settings :default_language => "zh-TW" do
Chris@909 445 str1 = "test_csv_tw"
Chris@909 446 user = User.find_by_id(3)
Chris@909 447 te1 = TimeEntry.create(:spent_on => '2011-11-10',
Chris@909 448 :hours => 999.9,
Chris@909 449 :project => Project.find(1),
Chris@909 450 :user => user,
Chris@909 451 :activity => TimeEntryActivity.find_by_name('Design'),
Chris@909 452 :comments => str1)
Chris@909 453 te2 = TimeEntry.find_by_comments(str1)
Chris@909 454 assert_not_nil te2
Chris@909 455 assert_equal 999.9, te2.hours
Chris@909 456 assert_equal 3, te2.user_id
Chris@909 457
Chris@909 458 get :index, :project_id => 1, :format => 'csv',
Chris@909 459 :from => '2011-11-10', :to => '2011-11-10'
Chris@909 460 assert_response :success
Chris@909 461 assert_equal 'text/csv', @response.content_type
Chris@909 462
Chris@909 463 ar = @response.body.chomp.split("\n")
Chris@909 464 s2 = ar[1].split(",")[7]
Chris@909 465 assert_equal '999.9', s2
Chris@909 466
Chris@909 467 str_tw = "Traditional Chinese (\xe7\xb9\x81\xe9\xab\x94\xe4\xb8\xad\xe6\x96\x87)"
Chris@909 468 if str_tw.respond_to?(:force_encoding)
Chris@909 469 str_tw.force_encoding('UTF-8')
Chris@909 470 end
Chris@909 471 assert_equal str_tw, l(:general_lang_name)
Chris@909 472 assert_equal ',', l(:general_csv_separator)
Chris@909 473 assert_equal '.', l(:general_csv_decimal_separator)
Chris@909 474 end
Chris@909 475 end
Chris@909 476
Chris@909 477 def test_csv_fr
Chris@909 478 with_settings :default_language => "fr" do
Chris@909 479 str1 = "test_csv_fr"
Chris@909 480 user = User.find_by_id(3)
Chris@909 481 te1 = TimeEntry.create(:spent_on => '2011-11-10',
Chris@909 482 :hours => 999.9,
Chris@909 483 :project => Project.find(1),
Chris@909 484 :user => user,
Chris@909 485 :activity => TimeEntryActivity.find_by_name('Design'),
Chris@909 486 :comments => str1)
Chris@909 487 te2 = TimeEntry.find_by_comments(str1)
Chris@909 488 assert_not_nil te2
Chris@909 489 assert_equal 999.9, te2.hours
Chris@909 490 assert_equal 3, te2.user_id
Chris@909 491
Chris@909 492 get :index, :project_id => 1, :format => 'csv',
Chris@909 493 :from => '2011-11-10', :to => '2011-11-10'
Chris@909 494 assert_response :success
Chris@909 495 assert_equal 'text/csv', @response.content_type
Chris@909 496
Chris@909 497 ar = @response.body.chomp.split("\n")
Chris@909 498 s2 = ar[1].split(";")[7]
Chris@909 499 assert_equal '999,9', s2
Chris@909 500
Chris@909 501 str_fr = "Fran\xc3\xa7ais"
Chris@909 502 if str_fr.respond_to?(:force_encoding)
Chris@909 503 str_fr.force_encoding('UTF-8')
Chris@909 504 end
Chris@909 505 assert_equal str_fr, l(:general_lang_name)
Chris@909 506 assert_equal ';', l(:general_csv_separator)
Chris@909 507 assert_equal ',', l(:general_csv_decimal_separator)
Chris@909 508 end
Chris@909 509 end
Chris@0 510 end