annotate test/functional/issues_controller_test.rb @ 1471:d65e60e20a50 bug_531

Close obsolete branch bug_531
author Chris Cannam
date Fri, 23 Nov 2012 18:10:33 +0000
parents 5f33065ddc4b
children 433d4f72a19b
rev   line source
Chris@0 1 # Redmine - project management software
Chris@441 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@441 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@441 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 require 'issues_controller'
Chris@0 20
Chris@0 21 class IssuesControllerTest < ActionController::TestCase
Chris@0 22 fixtures :projects,
Chris@0 23 :users,
Chris@0 24 :roles,
Chris@0 25 :members,
Chris@0 26 :member_roles,
Chris@0 27 :issues,
Chris@0 28 :issue_statuses,
Chris@0 29 :versions,
Chris@0 30 :trackers,
Chris@0 31 :projects_trackers,
Chris@0 32 :issue_categories,
Chris@0 33 :enabled_modules,
Chris@0 34 :enumerations,
Chris@0 35 :attachments,
Chris@0 36 :workflows,
Chris@0 37 :custom_fields,
Chris@0 38 :custom_values,
Chris@0 39 :custom_fields_projects,
Chris@0 40 :custom_fields_trackers,
Chris@0 41 :time_entries,
Chris@0 42 :journals,
Chris@0 43 :journal_details,
Chris@0 44 :queries
Chris@441 45
Chris@909 46 include Redmine::I18n
Chris@909 47
Chris@0 48 def setup
Chris@0 49 @controller = IssuesController.new
Chris@0 50 @request = ActionController::TestRequest.new
Chris@0 51 @response = ActionController::TestResponse.new
Chris@0 52 User.current = nil
Chris@0 53 end
Chris@441 54
Chris@0 55 def test_index
Chris@0 56 Setting.default_language = 'en'
Chris@441 57
Chris@0 58 get :index
Chris@0 59 assert_response :success
Chris@909 60 assert_template 'index'
Chris@0 61 assert_not_nil assigns(:issues)
Chris@0 62 assert_nil assigns(:project)
Chris@0 63 assert_tag :tag => 'a', :content => /Can't print recipes/
Chris@0 64 assert_tag :tag => 'a', :content => /Subproject issue/
Chris@0 65 # private projects hidden
Chris@0 66 assert_no_tag :tag => 'a', :content => /Issue of a private subproject/
Chris@0 67 assert_no_tag :tag => 'a', :content => /Issue on project 2/
Chris@0 68 # project column
Chris@0 69 assert_tag :tag => 'th', :content => /Project/
Chris@0 70 end
Chris@441 71
Chris@0 72 def test_index_should_not_list_issues_when_module_disabled
Chris@0 73 EnabledModule.delete_all("name = 'issue_tracking' AND project_id = 1")
Chris@0 74 get :index
Chris@0 75 assert_response :success
Chris@909 76 assert_template 'index'
Chris@0 77 assert_not_nil assigns(:issues)
Chris@0 78 assert_nil assigns(:project)
Chris@0 79 assert_no_tag :tag => 'a', :content => /Can't print recipes/
Chris@0 80 assert_tag :tag => 'a', :content => /Subproject issue/
Chris@0 81 end
Chris@441 82
Chris@441 83 def test_index_should_list_visible_issues_only
Chris@441 84 get :index, :per_page => 100
Chris@441 85 assert_response :success
Chris@441 86 assert_not_nil assigns(:issues)
Chris@441 87 assert_nil assigns(:issues).detect {|issue| !issue.visible?}
Chris@441 88 end
Chris@441 89
Chris@0 90 def test_index_with_project
Chris@0 91 Setting.display_subprojects_issues = 0
Chris@0 92 get :index, :project_id => 1
Chris@0 93 assert_response :success
Chris@909 94 assert_template 'index'
Chris@0 95 assert_not_nil assigns(:issues)
Chris@0 96 assert_tag :tag => 'a', :content => /Can't print recipes/
Chris@0 97 assert_no_tag :tag => 'a', :content => /Subproject issue/
Chris@0 98 end
Chris@441 99
Chris@0 100 def test_index_with_project_and_subprojects
Chris@0 101 Setting.display_subprojects_issues = 1
Chris@0 102 get :index, :project_id => 1
Chris@0 103 assert_response :success
Chris@909 104 assert_template 'index'
Chris@0 105 assert_not_nil assigns(:issues)
Chris@0 106 assert_tag :tag => 'a', :content => /Can't print recipes/
Chris@0 107 assert_tag :tag => 'a', :content => /Subproject issue/
Chris@0 108 assert_no_tag :tag => 'a', :content => /Issue of a private subproject/
Chris@0 109 end
Chris@441 110
Chris@0 111 def test_index_with_project_and_subprojects_should_show_private_subprojects
Chris@0 112 @request.session[:user_id] = 2
Chris@0 113 Setting.display_subprojects_issues = 1
Chris@0 114 get :index, :project_id => 1
Chris@0 115 assert_response :success
Chris@909 116 assert_template 'index'
Chris@0 117 assert_not_nil assigns(:issues)
Chris@0 118 assert_tag :tag => 'a', :content => /Can't print recipes/
Chris@0 119 assert_tag :tag => 'a', :content => /Subproject issue/
Chris@0 120 assert_tag :tag => 'a', :content => /Issue of a private subproject/
Chris@0 121 end
Chris@441 122
chris@37 123 def test_index_with_project_and_default_filter
Chris@0 124 get :index, :project_id => 1, :set_filter => 1
Chris@0 125 assert_response :success
Chris@909 126 assert_template 'index'
Chris@0 127 assert_not_nil assigns(:issues)
Chris@441 128
chris@37 129 query = assigns(:query)
chris@37 130 assert_not_nil query
chris@37 131 # default filter
chris@37 132 assert_equal({'status_id' => {:operator => 'o', :values => ['']}}, query.filters)
chris@37 133 end
Chris@441 134
chris@37 135 def test_index_with_project_and_filter
Chris@441 136 get :index, :project_id => 1, :set_filter => 1,
Chris@441 137 :f => ['tracker_id'],
Chris@441 138 :op => {'tracker_id' => '='},
Chris@441 139 :v => {'tracker_id' => ['1']}
chris@37 140 assert_response :success
Chris@909 141 assert_template 'index'
chris@37 142 assert_not_nil assigns(:issues)
Chris@441 143
chris@37 144 query = assigns(:query)
chris@37 145 assert_not_nil query
chris@37 146 assert_equal({'tracker_id' => {:operator => '=', :values => ['1']}}, query.filters)
chris@37 147 end
Chris@441 148
Chris@909 149 def test_index_with_short_filters
Chris@909 150 to_test = {
Chris@909 151 'status_id' => {
Chris@909 152 'o' => { :op => 'o', :values => [''] },
Chris@909 153 'c' => { :op => 'c', :values => [''] },
Chris@909 154 '7' => { :op => '=', :values => ['7'] },
Chris@909 155 '7|3|4' => { :op => '=', :values => ['7', '3', '4'] },
Chris@909 156 '=7' => { :op => '=', :values => ['7'] },
Chris@909 157 '!3' => { :op => '!', :values => ['3'] },
Chris@909 158 '!7|3|4' => { :op => '!', :values => ['7', '3', '4'] }},
Chris@909 159 'subject' => {
Chris@909 160 'This is a subject' => { :op => '=', :values => ['This is a subject'] },
Chris@909 161 'o' => { :op => '=', :values => ['o'] },
Chris@909 162 '~This is part of a subject' => { :op => '~', :values => ['This is part of a subject'] },
Chris@909 163 '!~This is part of a subject' => { :op => '!~', :values => ['This is part of a subject'] }},
Chris@909 164 'tracker_id' => {
Chris@909 165 '3' => { :op => '=', :values => ['3'] },
Chris@909 166 '=3' => { :op => '=', :values => ['3'] }},
Chris@909 167 'start_date' => {
Chris@909 168 '2011-10-12' => { :op => '=', :values => ['2011-10-12'] },
Chris@909 169 '=2011-10-12' => { :op => '=', :values => ['2011-10-12'] },
Chris@909 170 '>=2011-10-12' => { :op => '>=', :values => ['2011-10-12'] },
Chris@909 171 '<=2011-10-12' => { :op => '<=', :values => ['2011-10-12'] },
Chris@909 172 '><2011-10-01|2011-10-30' => { :op => '><', :values => ['2011-10-01', '2011-10-30'] },
Chris@909 173 '<t+2' => { :op => '<t+', :values => ['2'] },
Chris@909 174 '>t+2' => { :op => '>t+', :values => ['2'] },
Chris@909 175 't+2' => { :op => 't+', :values => ['2'] },
Chris@909 176 't' => { :op => 't', :values => [''] },
Chris@909 177 'w' => { :op => 'w', :values => [''] },
Chris@909 178 '>t-2' => { :op => '>t-', :values => ['2'] },
Chris@909 179 '<t-2' => { :op => '<t-', :values => ['2'] },
Chris@909 180 't-2' => { :op => 't-', :values => ['2'] }},
Chris@909 181 'created_on' => {
Chris@909 182 '>=2011-10-12' => { :op => '>=', :values => ['2011-10-12'] },
Chris@929 183 '<t-2' => { :op => '<t-', :values => ['2'] },
Chris@929 184 '>t-2' => { :op => '>t-', :values => ['2'] },
Chris@929 185 't-2' => { :op => 't-', :values => ['2'] }},
Chris@909 186 'cf_1' => {
Chris@909 187 'c' => { :op => '=', :values => ['c'] },
Chris@909 188 '!c' => { :op => '!', :values => ['c'] },
Chris@909 189 '!*' => { :op => '!*', :values => [''] },
Chris@909 190 '*' => { :op => '*', :values => [''] }},
Chris@909 191 'estimated_hours' => {
Chris@909 192 '=13.4' => { :op => '=', :values => ['13.4'] },
Chris@909 193 '>=45' => { :op => '>=', :values => ['45'] },
Chris@909 194 '<=125' => { :op => '<=', :values => ['125'] },
Chris@909 195 '><10.5|20.5' => { :op => '><', :values => ['10.5', '20.5'] },
Chris@909 196 '!*' => { :op => '!*', :values => [''] },
Chris@909 197 '*' => { :op => '*', :values => [''] }}
Chris@909 198 }
Chris@909 199
Chris@909 200 default_filter = { 'status_id' => {:operator => 'o', :values => [''] }}
Chris@909 201
Chris@909 202 to_test.each do |field, expression_and_expected|
Chris@909 203 expression_and_expected.each do |filter_expression, expected|
Chris@909 204
Chris@909 205 get :index, :set_filter => 1, field => filter_expression
Chris@909 206
Chris@909 207 assert_response :success
Chris@909 208 assert_template 'index'
Chris@909 209 assert_not_nil assigns(:issues)
Chris@909 210
Chris@909 211 query = assigns(:query)
Chris@909 212 assert_not_nil query
Chris@909 213 assert query.has_filter?(field)
Chris@909 214 assert_equal(default_filter.merge({field => {:operator => expected[:op], :values => expected[:values]}}), query.filters)
Chris@909 215 end
Chris@909 216 end
Chris@909 217 end
Chris@909 218
chris@37 219 def test_index_with_project_and_empty_filters
chris@37 220 get :index, :project_id => 1, :set_filter => 1, :fields => ['']
chris@37 221 assert_response :success
Chris@909 222 assert_template 'index'
chris@37 223 assert_not_nil assigns(:issues)
Chris@441 224
chris@37 225 query = assigns(:query)
chris@37 226 assert_not_nil query
chris@37 227 # no filter
chris@37 228 assert_equal({}, query.filters)
Chris@0 229 end
Chris@441 230
Chris@0 231 def test_index_with_query
Chris@0 232 get :index, :project_id => 1, :query_id => 5
Chris@0 233 assert_response :success
Chris@909 234 assert_template 'index'
Chris@0 235 assert_not_nil assigns(:issues)
Chris@0 236 assert_nil assigns(:issue_count_by_group)
Chris@0 237 end
Chris@441 238
Chris@0 239 def test_index_with_query_grouped_by_tracker
Chris@0 240 get :index, :project_id => 1, :query_id => 6
Chris@0 241 assert_response :success
Chris@909 242 assert_template 'index'
Chris@0 243 assert_not_nil assigns(:issues)
Chris@0 244 assert_not_nil assigns(:issue_count_by_group)
Chris@0 245 end
Chris@441 246
Chris@0 247 def test_index_with_query_grouped_by_list_custom_field
Chris@0 248 get :index, :project_id => 1, :query_id => 9
Chris@0 249 assert_response :success
Chris@909 250 assert_template 'index'
Chris@0 251 assert_not_nil assigns(:issues)
Chris@0 252 assert_not_nil assigns(:issue_count_by_group)
Chris@0 253 end
Chris@909 254
Chris@909 255 def test_index_with_query_id_and_project_id_should_set_session_query
Chris@909 256 get :index, :project_id => 1, :query_id => 4
Chris@909 257 assert_response :success
Chris@909 258 assert_kind_of Hash, session[:query]
Chris@909 259 assert_equal 4, session[:query][:id]
Chris@909 260 assert_equal 1, session[:query][:project_id]
Chris@909 261 end
Chris@909 262
Chris@909 263 def test_index_with_cross_project_query_in_session_should_show_project_issues
Chris@909 264 q = Query.create!(:name => "test", :user_id => 2, :is_public => false, :project => nil)
Chris@909 265 @request.session[:query] = {:id => q.id, :project_id => 1}
Chris@909 266
Chris@909 267 with_settings :display_subprojects_issues => '0' do
Chris@909 268 get :index, :project_id => 1
Chris@909 269 end
Chris@909 270 assert_response :success
Chris@909 271 assert_not_nil assigns(:query)
Chris@909 272 assert_equal q.id, assigns(:query).id
Chris@909 273 assert_equal 1, assigns(:query).project_id
Chris@909 274 assert_equal [1], assigns(:issues).map(&:project_id).uniq
Chris@909 275 end
Chris@909 276
Chris@507 277 def test_private_query_should_not_be_available_to_other_users
Chris@507 278 q = Query.create!(:name => "private", :user => User.find(2), :is_public => false, :project => nil)
Chris@507 279 @request.session[:user_id] = 3
Chris@909 280
Chris@507 281 get :index, :query_id => q.id
Chris@507 282 assert_response 403
Chris@507 283 end
Chris@909 284
Chris@507 285 def test_private_query_should_be_available_to_its_user
Chris@507 286 q = Query.create!(:name => "private", :user => User.find(2), :is_public => false, :project => nil)
Chris@507 287 @request.session[:user_id] = 2
Chris@909 288
Chris@507 289 get :index, :query_id => q.id
Chris@507 290 assert_response :success
Chris@507 291 end
Chris@441 292
Chris@909 293 def test_public_query_should_be_available_to_other_users
Chris@909 294 q = Query.create!(:name => "private", :user => User.find(2), :is_public => true, :project => nil)
Chris@909 295 @request.session[:user_id] = 3
Chris@909 296
Chris@909 297 get :index, :query_id => q.id
Chris@909 298 assert_response :success
Chris@0 299 end
Chris@441 300
Chris@909 301 def test_index_csv
Chris@0 302 get :index, :format => 'csv'
Chris@0 303 assert_response :success
Chris@0 304 assert_not_nil assigns(:issues)
Chris@0 305 assert_equal 'text/csv', @response.content_type
Chris@0 306 assert @response.body.starts_with?("#,")
Chris@909 307 lines = @response.body.chomp.split("\n")
Chris@909 308 assert_equal assigns(:query).columns.size + 1, lines[0].split(',').size
Chris@909 309 end
Chris@0 310
Chris@909 311 def test_index_csv_with_project
Chris@0 312 get :index, :project_id => 1, :format => 'csv'
Chris@0 313 assert_response :success
Chris@0 314 assert_not_nil assigns(:issues)
Chris@0 315 assert_equal 'text/csv', @response.content_type
Chris@0 316 end
Chris@441 317
Chris@909 318 def test_index_csv_with_description
Chris@909 319 get :index, :format => 'csv', :description => '1'
Chris@0 320 assert_response :success
Chris@0 321 assert_not_nil assigns(:issues)
Chris@909 322 assert_equal 'text/csv', @response.content_type
Chris@909 323 assert @response.body.starts_with?("#,")
Chris@909 324 lines = @response.body.chomp.split("\n")
Chris@909 325 assert_equal assigns(:query).columns.size + 2, lines[0].split(',').size
Chris@909 326 end
Chris@441 327
Chris@909 328 def test_index_csv_with_all_columns
Chris@909 329 get :index, :format => 'csv', :columns => 'all'
Chris@0 330 assert_response :success
Chris@0 331 assert_not_nil assigns(:issues)
Chris@909 332 assert_equal 'text/csv', @response.content_type
Chris@909 333 assert @response.body.starts_with?("#,")
Chris@909 334 lines = @response.body.chomp.split("\n")
Chris@909 335 assert_equal assigns(:query).available_columns.size + 1, lines[0].split(',').size
Chris@909 336 end
Chris@441 337
Chris@909 338 def test_index_csv_big_5
Chris@909 339 with_settings :default_language => "zh-TW" do
Chris@909 340 str_utf8 = "\xe4\xb8\x80\xe6\x9c\x88"
Chris@909 341 str_big5 = "\xa4@\xa4\xeb"
Chris@909 342 if str_utf8.respond_to?(:force_encoding)
Chris@909 343 str_utf8.force_encoding('UTF-8')
Chris@909 344 str_big5.force_encoding('Big5')
Chris@909 345 end
Chris@909 346 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 3,
Chris@909 347 :status_id => 1, :priority => IssuePriority.all.first,
Chris@909 348 :subject => str_utf8)
Chris@909 349 assert issue.save
Chris@909 350
Chris@909 351 get :index, :project_id => 1,
Chris@909 352 :f => ['subject'],
Chris@909 353 :op => '=', :values => [str_utf8],
Chris@909 354 :format => 'csv'
Chris@909 355 assert_equal 'text/csv', @response.content_type
Chris@909 356 lines = @response.body.chomp.split("\n")
Chris@909 357 s1 = "\xaa\xac\xbaA"
Chris@909 358 if str_utf8.respond_to?(:force_encoding)
Chris@909 359 s1.force_encoding('Big5')
Chris@909 360 end
Chris@909 361 assert lines[0].include?(s1)
Chris@909 362 assert lines[1].include?(str_big5)
Chris@909 363 end
Chris@909 364 end
Chris@909 365
Chris@909 366 def test_index_csv_cannot_convert_should_be_replaced_big_5
Chris@909 367 with_settings :default_language => "zh-TW" do
Chris@909 368 str_utf8 = "\xe4\xbb\xa5\xe5\x86\x85"
Chris@909 369 if str_utf8.respond_to?(:force_encoding)
Chris@909 370 str_utf8.force_encoding('UTF-8')
Chris@909 371 end
Chris@909 372 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 3,
Chris@909 373 :status_id => 1, :priority => IssuePriority.all.first,
Chris@909 374 :subject => str_utf8)
Chris@909 375 assert issue.save
Chris@909 376
Chris@909 377 get :index, :project_id => 1,
Chris@909 378 :f => ['subject'],
Chris@909 379 :op => '=', :values => [str_utf8],
Chris@909 380 :c => ['status', 'subject'],
Chris@909 381 :format => 'csv',
Chris@909 382 :set_filter => 1
Chris@909 383 assert_equal 'text/csv', @response.content_type
Chris@909 384 lines = @response.body.chomp.split("\n")
Chris@909 385 s1 = "\xaa\xac\xbaA" # status
Chris@909 386 if str_utf8.respond_to?(:force_encoding)
Chris@909 387 s1.force_encoding('Big5')
Chris@909 388 end
Chris@909 389 assert lines[0].include?(s1)
Chris@909 390 s2 = lines[1].split(",")[2]
Chris@909 391 if s1.respond_to?(:force_encoding)
Chris@909 392 s3 = "\xa5H?" # subject
Chris@909 393 s3.force_encoding('Big5')
Chris@909 394 assert_equal s3, s2
Chris@909 395 elsif RUBY_PLATFORM == 'java'
Chris@909 396 assert_equal "??", s2
Chris@909 397 else
Chris@909 398 assert_equal "\xa5H???", s2
Chris@909 399 end
Chris@909 400 end
Chris@909 401 end
Chris@909 402
Chris@909 403 def test_index_csv_tw
Chris@909 404 with_settings :default_language => "zh-TW" do
Chris@909 405 str1 = "test_index_csv_tw"
Chris@909 406 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 3,
Chris@909 407 :status_id => 1, :priority => IssuePriority.all.first,
Chris@909 408 :subject => str1, :estimated_hours => '1234.5')
Chris@909 409 assert issue.save
Chris@909 410 assert_equal 1234.5, issue.estimated_hours
Chris@909 411
Chris@909 412 get :index, :project_id => 1,
Chris@909 413 :f => ['subject'],
Chris@909 414 :op => '=', :values => [str1],
Chris@909 415 :c => ['estimated_hours', 'subject'],
Chris@909 416 :format => 'csv',
Chris@909 417 :set_filter => 1
Chris@909 418 assert_equal 'text/csv', @response.content_type
Chris@909 419 lines = @response.body.chomp.split("\n")
Chris@909 420 assert_equal "#{issue.id},1234.5,#{str1}", lines[1]
Chris@909 421
Chris@909 422 str_tw = "Traditional Chinese (\xe7\xb9\x81\xe9\xab\x94\xe4\xb8\xad\xe6\x96\x87)"
Chris@909 423 if str_tw.respond_to?(:force_encoding)
Chris@909 424 str_tw.force_encoding('UTF-8')
Chris@909 425 end
Chris@909 426 assert_equal str_tw, l(:general_lang_name)
Chris@909 427 assert_equal ',', l(:general_csv_separator)
Chris@909 428 assert_equal '.', l(:general_csv_decimal_separator)
Chris@909 429 end
Chris@909 430 end
Chris@909 431
Chris@909 432 def test_index_csv_fr
Chris@909 433 with_settings :default_language => "fr" do
Chris@909 434 str1 = "test_index_csv_fr"
Chris@909 435 issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 3,
Chris@909 436 :status_id => 1, :priority => IssuePriority.all.first,
Chris@909 437 :subject => str1, :estimated_hours => '1234.5')
Chris@909 438 assert issue.save
Chris@909 439 assert_equal 1234.5, issue.estimated_hours
Chris@909 440
Chris@909 441 get :index, :project_id => 1,
Chris@909 442 :f => ['subject'],
Chris@909 443 :op => '=', :values => [str1],
Chris@909 444 :c => ['estimated_hours', 'subject'],
Chris@909 445 :format => 'csv',
Chris@909 446 :set_filter => 1
Chris@909 447 assert_equal 'text/csv', @response.content_type
Chris@909 448 lines = @response.body.chomp.split("\n")
Chris@909 449 assert_equal "#{issue.id};1234,5;#{str1}", lines[1]
Chris@909 450
Chris@909 451 str_fr = "Fran\xc3\xa7ais"
Chris@909 452 if str_fr.respond_to?(:force_encoding)
Chris@909 453 str_fr.force_encoding('UTF-8')
Chris@909 454 end
Chris@909 455 assert_equal str_fr, l(:general_lang_name)
Chris@909 456 assert_equal ';', l(:general_csv_separator)
Chris@909 457 assert_equal ',', l(:general_csv_decimal_separator)
Chris@909 458 end
Chris@909 459 end
Chris@909 460
Chris@909 461 def test_index_pdf
Chris@909 462 ["en", "zh", "zh-TW", "ja", "ko"].each do |lang|
Chris@909 463 with_settings :default_language => lang do
Chris@909 464
Chris@909 465 get :index
Chris@909 466 assert_response :success
Chris@909 467 assert_template 'index'
Chris@909 468
Chris@909 469 if lang == "ja"
Chris@909 470 if RUBY_PLATFORM != 'java'
Chris@909 471 assert_equal "CP932", l(:general_pdf_encoding)
Chris@909 472 end
Chris@909 473 if RUBY_PLATFORM == 'java' && l(:general_pdf_encoding) == "CP932"
Chris@909 474 next
Chris@909 475 end
Chris@909 476 end
Chris@909 477
Chris@909 478 get :index, :format => 'pdf'
Chris@909 479 assert_response :success
Chris@909 480 assert_not_nil assigns(:issues)
Chris@909 481 assert_equal 'application/pdf', @response.content_type
Chris@909 482
Chris@909 483 get :index, :project_id => 1, :format => 'pdf'
Chris@909 484 assert_response :success
Chris@909 485 assert_not_nil assigns(:issues)
Chris@909 486 assert_equal 'application/pdf', @response.content_type
Chris@909 487
Chris@909 488 get :index, :project_id => 1, :query_id => 6, :format => 'pdf'
Chris@909 489 assert_response :success
Chris@909 490 assert_not_nil assigns(:issues)
Chris@909 491 assert_equal 'application/pdf', @response.content_type
Chris@909 492 end
Chris@909 493 end
Chris@0 494 end
Chris@441 495
Chris@0 496 def test_index_pdf_with_query_grouped_by_list_custom_field
Chris@0 497 get :index, :project_id => 1, :query_id => 9, :format => 'pdf'
Chris@0 498 assert_response :success
Chris@0 499 assert_not_nil assigns(:issues)
Chris@0 500 assert_not_nil assigns(:issue_count_by_group)
Chris@0 501 assert_equal 'application/pdf', @response.content_type
Chris@0 502 end
Chris@441 503
Chris@0 504 def test_index_sort
Chris@0 505 get :index, :sort => 'tracker,id:desc'
Chris@0 506 assert_response :success
Chris@441 507
Chris@0 508 sort_params = @request.session['issues_index_sort']
Chris@0 509 assert sort_params.is_a?(String)
Chris@0 510 assert_equal 'tracker,id:desc', sort_params
Chris@441 511
Chris@0 512 issues = assigns(:issues)
Chris@0 513 assert_not_nil issues
Chris@0 514 assert !issues.empty?
Chris@0 515 assert_equal issues.sort {|a,b| a.tracker == b.tracker ? b.id <=> a.id : a.tracker <=> b.tracker }.collect(&:id), issues.collect(&:id)
Chris@0 516 end
Chris@441 517
Chris@909 518 def test_index_sort_by_field_not_included_in_columns
Chris@909 519 Setting.issue_list_default_columns = %w(subject author)
Chris@909 520 get :index, :sort => 'tracker'
Chris@909 521 end
Chris@909 522
Chris@909 523 def test_index_sort_by_assigned_to
Chris@909 524 get :index, :sort => 'assigned_to'
Chris@909 525 assert_response :success
Chris@909 526 assignees = assigns(:issues).collect(&:assigned_to).compact
Chris@909 527 assert_equal assignees.sort, assignees
Chris@909 528 end
Chris@909 529
Chris@909 530 def test_index_sort_by_assigned_to_desc
Chris@909 531 get :index, :sort => 'assigned_to:desc'
Chris@909 532 assert_response :success
Chris@909 533 assignees = assigns(:issues).collect(&:assigned_to).compact
Chris@909 534 assert_equal assignees.sort.reverse, assignees
Chris@909 535 end
Chris@909 536
Chris@909 537 def test_index_group_by_assigned_to
Chris@909 538 get :index, :group_by => 'assigned_to', :sort => 'priority'
Chris@909 539 assert_response :success
Chris@909 540 end
Chris@909 541
Chris@909 542 def test_index_sort_by_author
Chris@909 543 get :index, :sort => 'author'
Chris@909 544 assert_response :success
Chris@909 545 authors = assigns(:issues).collect(&:author)
Chris@909 546 assert_equal authors.sort, authors
Chris@909 547 end
Chris@909 548
Chris@909 549 def test_index_sort_by_author_desc
Chris@909 550 get :index, :sort => 'author:desc'
Chris@909 551 assert_response :success
Chris@909 552 authors = assigns(:issues).collect(&:author)
Chris@909 553 assert_equal authors.sort.reverse, authors
Chris@909 554 end
Chris@909 555
Chris@909 556 def test_index_group_by_author
Chris@909 557 get :index, :group_by => 'author', :sort => 'priority'
Chris@909 558 assert_response :success
Chris@909 559 end
Chris@909 560
Chris@0 561 def test_index_with_columns
Chris@0 562 columns = ['tracker', 'subject', 'assigned_to']
Chris@441 563 get :index, :set_filter => 1, :c => columns
Chris@0 564 assert_response :success
Chris@441 565
Chris@0 566 # query should use specified columns
Chris@0 567 query = assigns(:query)
Chris@0 568 assert_kind_of Query, query
Chris@0 569 assert_equal columns, query.column_names.map(&:to_s)
Chris@441 570
Chris@0 571 # columns should be stored in session
Chris@0 572 assert_kind_of Hash, session[:query]
Chris@0 573 assert_kind_of Array, session[:query][:column_names]
Chris@0 574 assert_equal columns, session[:query][:column_names].map(&:to_s)
Chris@507 575
Chris@507 576 # ensure only these columns are kept in the selected columns list
Chris@507 577 assert_tag :tag => 'select', :attributes => { :id => 'selected_columns' },
Chris@507 578 :children => { :count => 3 }
Chris@507 579 assert_no_tag :tag => 'option', :attributes => { :value => 'project' },
Chris@507 580 :parent => { :tag => 'select', :attributes => { :id => "selected_columns" } }
Chris@0 581 end
Chris@0 582
Chris@909 583 def test_index_without_project_should_implicitly_add_project_column_to_default_columns
Chris@909 584 Setting.issue_list_default_columns = ['tracker', 'subject', 'assigned_to']
Chris@909 585 get :index, :set_filter => 1
Chris@909 586
Chris@909 587 # query should use specified columns
Chris@909 588 query = assigns(:query)
Chris@909 589 assert_kind_of Query, query
Chris@909 590 assert_equal [:project, :tracker, :subject, :assigned_to], query.columns.map(&:name)
Chris@909 591 end
Chris@909 592
Chris@909 593 def test_index_without_project_and_explicit_default_columns_should_not_add_project_column
Chris@909 594 Setting.issue_list_default_columns = ['tracker', 'subject', 'assigned_to']
Chris@909 595 columns = ['tracker', 'subject', 'assigned_to']
Chris@909 596 get :index, :set_filter => 1, :c => columns
Chris@909 597
Chris@909 598 # query should use specified columns
Chris@909 599 query = assigns(:query)
Chris@909 600 assert_kind_of Query, query
Chris@909 601 assert_equal columns.map(&:to_sym), query.columns.map(&:name)
Chris@909 602 end
Chris@909 603
Chris@441 604 def test_index_with_custom_field_column
Chris@441 605 columns = %w(tracker subject cf_2)
Chris@441 606 get :index, :set_filter => 1, :c => columns
Chris@441 607 assert_response :success
Chris@441 608
Chris@441 609 # query should use specified columns
Chris@441 610 query = assigns(:query)
Chris@441 611 assert_kind_of Query, query
Chris@441 612 assert_equal columns, query.column_names.map(&:to_s)
Chris@441 613
Chris@441 614 assert_tag :td,
Chris@441 615 :attributes => {:class => 'cf_2 string'},
Chris@441 616 :ancestor => {:tag => 'table', :attributes => {:class => /issues/}}
Chris@441 617 end
Chris@441 618
Chris@909 619 def test_index_with_date_column
Chris@909 620 Issue.find(1).update_attribute :start_date, '1987-08-24'
Chris@909 621
Chris@909 622 with_settings :date_format => '%d/%m/%Y' do
Chris@909 623 get :index, :set_filter => 1, :c => %w(start_date)
Chris@909 624 assert_tag 'td', :attributes => {:class => /start_date/}, :content => '24/08/1987'
Chris@909 625 end
Chris@909 626 end
Chris@909 627
Chris@909 628 def test_index_with_done_ratio
Chris@909 629 Issue.find(1).update_attribute :done_ratio, 40
Chris@909 630
Chris@909 631 get :index, :set_filter => 1, :c => %w(done_ratio)
Chris@909 632 assert_tag 'td', :attributes => {:class => /done_ratio/},
Chris@909 633 :child => {:tag => 'table', :attributes => {:class => 'progress'},
Chris@909 634 :descendant => {:tag => 'td', :attributes => {:class => 'closed', :style => 'width: 40%;'}}
Chris@909 635 }
Chris@909 636 end
Chris@909 637
Chris@909 638 def test_index_with_fixed_version
Chris@909 639 get :index, :set_filter => 1, :c => %w(fixed_version)
Chris@909 640 assert_tag 'td', :attributes => {:class => /fixed_version/},
Chris@909 641 :child => {:tag => 'a', :content => '1.0', :attributes => {:href => '/versions/2'}}
Chris@909 642 end
Chris@909 643
Chris@909 644 def test_index_send_html_if_query_is_invalid
Chris@909 645 get :index, :f => ['start_date'], :op => {:start_date => '='}
Chris@909 646 assert_equal 'text/html', @response.content_type
Chris@909 647 assert_template 'index'
Chris@909 648 end
Chris@909 649
Chris@909 650 def test_index_send_nothing_if_query_is_invalid
Chris@909 651 get :index, :f => ['start_date'], :op => {:start_date => '='}, :format => 'csv'
Chris@909 652 assert_equal 'text/csv', @response.content_type
Chris@909 653 assert @response.body.blank?
Chris@909 654 end
Chris@909 655
Chris@0 656 def test_show_by_anonymous
Chris@0 657 get :show, :id => 1
Chris@0 658 assert_response :success
Chris@909 659 assert_template 'show'
Chris@0 660 assert_not_nil assigns(:issue)
Chris@0 661 assert_equal Issue.find(1), assigns(:issue)
Chris@441 662
Chris@0 663 # anonymous role is allowed to add a note
Chris@0 664 assert_tag :tag => 'form',
Chris@0 665 :descendant => { :tag => 'fieldset',
Chris@441 666 :child => { :tag => 'legend',
Chris@0 667 :content => /Notes/ } }
Chris@909 668 assert_tag :tag => 'title',
Chris@909 669 :content => "Bug #1: Can't print recipes - eCookbook - Redmine"
Chris@0 670 end
Chris@441 671
Chris@0 672 def test_show_by_manager
Chris@0 673 @request.session[:user_id] = 2
Chris@0 674 get :show, :id => 1
Chris@0 675 assert_response :success
Chris@441 676
Chris@119 677 assert_tag :tag => 'a',
Chris@119 678 :content => /Quote/
Chris@441 679
Chris@0 680 assert_tag :tag => 'form',
Chris@0 681 :descendant => { :tag => 'fieldset',
Chris@441 682 :child => { :tag => 'legend',
Chris@0 683 :content => /Change properties/ } },
Chris@0 684 :descendant => { :tag => 'fieldset',
Chris@441 685 :child => { :tag => 'legend',
Chris@0 686 :content => /Log time/ } },
Chris@0 687 :descendant => { :tag => 'fieldset',
Chris@441 688 :child => { :tag => 'legend',
Chris@0 689 :content => /Notes/ } }
Chris@0 690 end
Chris@441 691
Chris@909 692 def test_update_form_should_not_display_inactive_enumerations
Chris@909 693 @request.session[:user_id] = 2
Chris@909 694 get :show, :id => 1
Chris@909 695 assert_response :success
Chris@909 696
Chris@909 697 assert ! IssuePriority.find(15).active?
Chris@909 698 assert_no_tag :option, :attributes => {:value => '15'},
Chris@909 699 :parent => {:tag => 'select', :attributes => {:id => 'issue_priority_id'} }
Chris@909 700 end
Chris@909 701
Chris@909 702 def test_update_form_should_allow_attachment_upload
Chris@909 703 @request.session[:user_id] = 2
Chris@909 704 get :show, :id => 1
Chris@909 705
Chris@909 706 assert_tag :tag => 'form',
Chris@909 707 :attributes => {:id => 'issue-form', :method => 'post', :enctype => 'multipart/form-data'},
Chris@909 708 :descendant => {
Chris@909 709 :tag => 'input',
Chris@909 710 :attributes => {:type => 'file', :name => 'attachments[1][file]'}
Chris@909 711 }
Chris@909 712 end
Chris@909 713
Chris@0 714 def test_show_should_deny_anonymous_access_without_permission
Chris@0 715 Role.anonymous.remove_permission!(:view_issues)
Chris@0 716 get :show, :id => 1
Chris@0 717 assert_response :redirect
Chris@0 718 end
Chris@441 719
Chris@441 720 def test_show_should_deny_anonymous_access_to_private_issue
Chris@441 721 Issue.update_all(["is_private = ?", true], "id = 1")
Chris@441 722 get :show, :id => 1
Chris@441 723 assert_response :redirect
Chris@441 724 end
Chris@441 725
Chris@0 726 def test_show_should_deny_non_member_access_without_permission
Chris@0 727 Role.non_member.remove_permission!(:view_issues)
Chris@0 728 @request.session[:user_id] = 9
Chris@0 729 get :show, :id => 1
Chris@0 730 assert_response 403
Chris@0 731 end
Chris@441 732
Chris@441 733 def test_show_should_deny_non_member_access_to_private_issue
Chris@441 734 Issue.update_all(["is_private = ?", true], "id = 1")
Chris@441 735 @request.session[:user_id] = 9
Chris@441 736 get :show, :id => 1
Chris@441 737 assert_response 403
Chris@441 738 end
Chris@441 739
Chris@0 740 def test_show_should_deny_member_access_without_permission
Chris@0 741 Role.find(1).remove_permission!(:view_issues)
Chris@0 742 @request.session[:user_id] = 2
Chris@0 743 get :show, :id => 1
Chris@0 744 assert_response 403
Chris@0 745 end
Chris@441 746
Chris@441 747 def test_show_should_deny_member_access_to_private_issue_without_permission
Chris@441 748 Issue.update_all(["is_private = ?", true], "id = 1")
Chris@441 749 @request.session[:user_id] = 3
Chris@441 750 get :show, :id => 1
Chris@441 751 assert_response 403
Chris@441 752 end
Chris@441 753
Chris@441 754 def test_show_should_allow_author_access_to_private_issue
Chris@441 755 Issue.update_all(["is_private = ?, author_id = 3", true], "id = 1")
Chris@441 756 @request.session[:user_id] = 3
Chris@441 757 get :show, :id => 1
Chris@441 758 assert_response :success
Chris@441 759 end
Chris@441 760
Chris@441 761 def test_show_should_allow_assignee_access_to_private_issue
Chris@441 762 Issue.update_all(["is_private = ?, assigned_to_id = 3", true], "id = 1")
Chris@441 763 @request.session[:user_id] = 3
Chris@441 764 get :show, :id => 1
Chris@441 765 assert_response :success
Chris@441 766 end
Chris@441 767
Chris@441 768 def test_show_should_allow_member_access_to_private_issue_with_permission
Chris@441 769 Issue.update_all(["is_private = ?", true], "id = 1")
Chris@441 770 User.find(3).roles_for_project(Project.find(1)).first.update_attribute :issues_visibility, 'all'
Chris@441 771 @request.session[:user_id] = 3
Chris@441 772 get :show, :id => 1
Chris@441 773 assert_response :success
Chris@441 774 end
Chris@441 775
Chris@0 776 def test_show_should_not_disclose_relations_to_invisible_issues
Chris@0 777 Setting.cross_project_issue_relations = '1'
Chris@0 778 IssueRelation.create!(:issue_from => Issue.find(1), :issue_to => Issue.find(2), :relation_type => 'relates')
Chris@0 779 # Relation to a private project issue
Chris@0 780 IssueRelation.create!(:issue_from => Issue.find(1), :issue_to => Issue.find(4), :relation_type => 'relates')
Chris@441 781
Chris@0 782 get :show, :id => 1
Chris@0 783 assert_response :success
Chris@441 784
Chris@0 785 assert_tag :div, :attributes => { :id => 'relations' },
Chris@0 786 :descendant => { :tag => 'a', :content => /#2$/ }
Chris@0 787 assert_no_tag :div, :attributes => { :id => 'relations' },
Chris@0 788 :descendant => { :tag => 'a', :content => /#4$/ }
Chris@0 789 end
Chris@441 790
Chris@0 791 def test_show_atom
Chris@0 792 get :show, :id => 2, :format => 'atom'
Chris@0 793 assert_response :success
Chris@909 794 assert_template 'journals/index'
Chris@0 795 # Inline image
Chris@0 796 assert_select 'content', :text => Regexp.new(Regexp.quote('http://test.host/attachments/download/10'))
Chris@0 797 end
Chris@441 798
Chris@0 799 def test_show_export_to_pdf
Chris@0 800 get :show, :id => 3, :format => 'pdf'
Chris@0 801 assert_response :success
Chris@0 802 assert_equal 'application/pdf', @response.content_type
Chris@0 803 assert @response.body.starts_with?('%PDF')
Chris@0 804 assert_not_nil assigns(:issue)
Chris@0 805 end
Chris@0 806
Chris@0 807 def test_get_new
Chris@0 808 @request.session[:user_id] = 2
Chris@0 809 get :new, :project_id => 1, :tracker_id => 1
Chris@0 810 assert_response :success
Chris@0 811 assert_template 'new'
Chris@441 812
Chris@0 813 assert_tag :tag => 'input', :attributes => { :name => 'issue[custom_field_values][2]',
Chris@0 814 :value => 'Default string' }
Chris@909 815
Chris@909 816 # Be sure we don't display inactive IssuePriorities
Chris@909 817 assert ! IssuePriority.find(15).active?
Chris@909 818 assert_no_tag :option, :attributes => {:value => '15'},
Chris@909 819 :parent => {:tag => 'select', :attributes => {:id => 'issue_priority_id'} }
Chris@909 820 end
Chris@909 821
Chris@909 822 def test_get_new_without_default_start_date_is_creation_date
Chris@909 823 Setting.default_issue_start_date_to_creation_date = 0
Chris@909 824
Chris@909 825 @request.session[:user_id] = 2
Chris@909 826 get :new, :project_id => 1, :tracker_id => 1
Chris@909 827 assert_response :success
Chris@909 828 assert_template 'new'
Chris@909 829
Chris@909 830 assert_tag :tag => 'input', :attributes => { :name => 'issue[start_date]',
Chris@909 831 :value => nil }
Chris@909 832 end
Chris@909 833
Chris@909 834 def test_get_new_with_default_start_date_is_creation_date
Chris@909 835 Setting.default_issue_start_date_to_creation_date = 1
Chris@909 836
Chris@909 837 @request.session[:user_id] = 2
Chris@909 838 get :new, :project_id => 1, :tracker_id => 1
Chris@909 839 assert_response :success
Chris@909 840 assert_template 'new'
Chris@909 841
Chris@909 842 assert_tag :tag => 'input', :attributes => { :name => 'issue[start_date]',
Chris@909 843 :value => Date.today.to_s }
Chris@909 844 end
Chris@909 845
Chris@909 846 def test_get_new_form_should_allow_attachment_upload
Chris@909 847 @request.session[:user_id] = 2
Chris@909 848 get :new, :project_id => 1, :tracker_id => 1
Chris@909 849
Chris@909 850 assert_tag :tag => 'form',
Chris@909 851 :attributes => {:id => 'issue-form', :method => 'post', :enctype => 'multipart/form-data'},
Chris@909 852 :descendant => {
Chris@909 853 :tag => 'input',
Chris@909 854 :attributes => {:type => 'file', :name => 'attachments[1][file]'}
Chris@909 855 }
Chris@0 856 end
Chris@0 857
Chris@0 858 def test_get_new_without_tracker_id
Chris@0 859 @request.session[:user_id] = 2
Chris@0 860 get :new, :project_id => 1
Chris@0 861 assert_response :success
Chris@0 862 assert_template 'new'
Chris@441 863
Chris@0 864 issue = assigns(:issue)
Chris@0 865 assert_not_nil issue
Chris@0 866 assert_equal Project.find(1).trackers.first, issue.tracker
Chris@0 867 end
Chris@441 868
Chris@0 869 def test_get_new_with_no_default_status_should_display_an_error
Chris@0 870 @request.session[:user_id] = 2
Chris@0 871 IssueStatus.delete_all
Chris@441 872
Chris@0 873 get :new, :project_id => 1
Chris@0 874 assert_response 500
chris@37 875 assert_error_tag :content => /No default issue/
Chris@0 876 end
Chris@441 877
Chris@0 878 def test_get_new_with_no_tracker_should_display_an_error
Chris@0 879 @request.session[:user_id] = 2
Chris@0 880 Tracker.delete_all
Chris@441 881
Chris@0 882 get :new, :project_id => 1
Chris@0 883 assert_response 500
chris@37 884 assert_error_tag :content => /No tracker/
Chris@0 885 end
Chris@441 886
Chris@0 887 def test_update_new_form
Chris@0 888 @request.session[:user_id] = 2
Chris@14 889 xhr :post, :new, :project_id => 1,
Chris@441 890 :issue => {:tracker_id => 2,
Chris@0 891 :subject => 'This is the test_new issue',
Chris@0 892 :description => 'This is the description',
Chris@0 893 :priority_id => 5}
Chris@0 894 assert_response :success
Chris@0 895 assert_template 'attributes'
Chris@441 896
Chris@0 897 issue = assigns(:issue)
Chris@0 898 assert_kind_of Issue, issue
Chris@0 899 assert_equal 1, issue.project_id
Chris@0 900 assert_equal 2, issue.tracker_id
Chris@0 901 assert_equal 'This is the test_new issue', issue.subject
Chris@0 902 end
Chris@441 903
Chris@0 904 def test_post_create
Chris@0 905 @request.session[:user_id] = 2
Chris@0 906 assert_difference 'Issue.count' do
Chris@441 907 post :create, :project_id => 1,
Chris@0 908 :issue => {:tracker_id => 3,
Chris@0 909 :status_id => 2,
Chris@0 910 :subject => 'This is the test_new issue',
Chris@0 911 :description => 'This is the description',
Chris@0 912 :priority_id => 5,
chris@37 913 :start_date => '2010-11-07',
Chris@0 914 :estimated_hours => '',
Chris@0 915 :custom_field_values => {'2' => 'Value for field 2'}}
Chris@0 916 end
Chris@0 917 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
Chris@441 918
Chris@0 919 issue = Issue.find_by_subject('This is the test_new issue')
Chris@0 920 assert_not_nil issue
Chris@0 921 assert_equal 2, issue.author_id
Chris@0 922 assert_equal 3, issue.tracker_id
Chris@0 923 assert_equal 2, issue.status_id
chris@37 924 assert_equal Date.parse('2010-11-07'), issue.start_date
Chris@0 925 assert_nil issue.estimated_hours
Chris@0 926 v = issue.custom_values.find(:first, :conditions => {:custom_field_id => 2})
Chris@0 927 assert_not_nil v
Chris@0 928 assert_equal 'Value for field 2', v.value
Chris@0 929 end
Chris@441 930
Chris@909 931 def test_post_new_with_group_assignment
Chris@909 932 group = Group.find(11)
Chris@909 933 project = Project.find(1)
Chris@929 934 project.members << Member.new(:principal => group, :roles => [Role.givable.first])
Chris@909 935
Chris@909 936 with_settings :issue_group_assignment => '1' do
Chris@909 937 @request.session[:user_id] = 2
Chris@909 938 assert_difference 'Issue.count' do
Chris@909 939 post :create, :project_id => project.id,
Chris@909 940 :issue => {:tracker_id => 3,
Chris@909 941 :status_id => 1,
Chris@909 942 :subject => 'This is the test_new_with_group_assignment issue',
Chris@909 943 :assigned_to_id => group.id}
Chris@909 944 end
Chris@909 945 end
Chris@909 946 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
Chris@909 947
Chris@909 948 issue = Issue.find_by_subject('This is the test_new_with_group_assignment issue')
Chris@909 949 assert_not_nil issue
Chris@909 950 assert_equal group, issue.assigned_to
Chris@909 951 end
Chris@909 952
Chris@909 953 def test_post_create_without_start_date_and_default_start_date_is_not_creation_date
Chris@909 954 Setting.default_issue_start_date_to_creation_date = 0
Chris@909 955
chris@37 956 @request.session[:user_id] = 2
chris@37 957 assert_difference 'Issue.count' do
Chris@441 958 post :create, :project_id => 1,
chris@37 959 :issue => {:tracker_id => 3,
chris@37 960 :status_id => 2,
chris@37 961 :subject => 'This is the test_new issue',
chris@37 962 :description => 'This is the description',
chris@37 963 :priority_id => 5,
chris@37 964 :estimated_hours => '',
chris@37 965 :custom_field_values => {'2' => 'Value for field 2'}}
chris@37 966 end
chris@37 967 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
Chris@441 968
chris@37 969 issue = Issue.find_by_subject('This is the test_new issue')
chris@37 970 assert_not_nil issue
chris@37 971 assert_nil issue.start_date
chris@37 972 end
Chris@441 973
Chris@909 974 def test_post_create_without_start_date_and_default_start_date_is_creation_date
Chris@909 975 Setting.default_issue_start_date_to_creation_date = 1
Chris@909 976
Chris@909 977 @request.session[:user_id] = 2
Chris@909 978 assert_difference 'Issue.count' do
Chris@909 979 post :create, :project_id => 1,
Chris@909 980 :issue => {:tracker_id => 3,
Chris@909 981 :status_id => 2,
Chris@909 982 :subject => 'This is the test_new issue',
Chris@909 983 :description => 'This is the description',
Chris@909 984 :priority_id => 5,
Chris@909 985 :estimated_hours => '',
Chris@909 986 :custom_field_values => {'2' => 'Value for field 2'}}
Chris@909 987 end
Chris@909 988 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
Chris@909 989
Chris@909 990 issue = Issue.find_by_subject('This is the test_new issue')
Chris@909 991 assert_not_nil issue
Chris@909 992 assert_equal Date.today, issue.start_date
Chris@909 993 end
Chris@909 994
Chris@0 995 def test_post_create_and_continue
Chris@0 996 @request.session[:user_id] = 2
Chris@909 997 assert_difference 'Issue.count' do
Chris@909 998 post :create, :project_id => 1,
Chris@909 999 :issue => {:tracker_id => 3, :subject => 'This is first issue', :priority_id => 5},
Chris@909 1000 :continue => ''
Chris@909 1001 end
Chris@909 1002
Chris@909 1003 issue = Issue.first(:order => 'id DESC')
Chris@909 1004 assert_redirected_to :controller => 'issues', :action => 'new', :project_id => 'ecookbook', :issue => {:tracker_id => 3}
Chris@909 1005 assert_not_nil flash[:notice], "flash was not set"
Chris@909 1006 assert flash[:notice].include?("<a href='/issues/#{issue.id}'>##{issue.id}</a>"), "issue link not found in flash: #{flash[:notice]}"
Chris@0 1007 end
Chris@441 1008
Chris@0 1009 def test_post_create_without_custom_fields_param
Chris@0 1010 @request.session[:user_id] = 2
Chris@0 1011 assert_difference 'Issue.count' do
Chris@441 1012 post :create, :project_id => 1,
Chris@0 1013 :issue => {:tracker_id => 1,
Chris@0 1014 :subject => 'This is the test_new issue',
Chris@0 1015 :description => 'This is the description',
Chris@0 1016 :priority_id => 5}
Chris@0 1017 end
Chris@0 1018 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
Chris@0 1019 end
Chris@0 1020
Chris@0 1021 def test_post_create_with_required_custom_field_and_without_custom_fields_param
Chris@0 1022 field = IssueCustomField.find_by_name('Database')
Chris@0 1023 field.update_attribute(:is_required, true)
Chris@0 1024
Chris@0 1025 @request.session[:user_id] = 2
Chris@441 1026 post :create, :project_id => 1,
Chris@0 1027 :issue => {:tracker_id => 1,
Chris@0 1028 :subject => 'This is the test_new issue',
Chris@0 1029 :description => 'This is the description',
Chris@0 1030 :priority_id => 5}
Chris@0 1031 assert_response :success
Chris@0 1032 assert_template 'new'
Chris@0 1033 issue = assigns(:issue)
Chris@0 1034 assert_not_nil issue
Chris@0 1035 assert_equal I18n.translate('activerecord.errors.messages.invalid'), issue.errors.on(:custom_values)
Chris@0 1036 end
Chris@441 1037
Chris@0 1038 def test_post_create_with_watchers
Chris@0 1039 @request.session[:user_id] = 2
Chris@0 1040 ActionMailer::Base.deliveries.clear
Chris@441 1041
Chris@0 1042 assert_difference 'Watcher.count', 2 do
Chris@441 1043 post :create, :project_id => 1,
Chris@0 1044 :issue => {:tracker_id => 1,
Chris@0 1045 :subject => 'This is a new issue with watchers',
Chris@0 1046 :description => 'This is the description',
Chris@0 1047 :priority_id => 5,
Chris@0 1048 :watcher_user_ids => ['2', '3']}
Chris@0 1049 end
Chris@0 1050 issue = Issue.find_by_subject('This is a new issue with watchers')
Chris@0 1051 assert_not_nil issue
Chris@0 1052 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue
Chris@441 1053
Chris@0 1054 # Watchers added
Chris@0 1055 assert_equal [2, 3], issue.watcher_user_ids.sort
Chris@0 1056 assert issue.watched_by?(User.find(3))
Chris@0 1057 # Watchers notified
Chris@0 1058 mail = ActionMailer::Base.deliveries.last
Chris@0 1059 assert_kind_of TMail::Mail, mail
Chris@0 1060 assert [mail.bcc, mail.cc].flatten.include?(User.find(3).mail)
Chris@0 1061 end
Chris@441 1062
Chris@0 1063 def test_post_create_subissue
Chris@0 1064 @request.session[:user_id] = 2
Chris@441 1065
Chris@0 1066 assert_difference 'Issue.count' do
Chris@441 1067 post :create, :project_id => 1,
Chris@0 1068 :issue => {:tracker_id => 1,
Chris@0 1069 :subject => 'This is a child issue',
Chris@0 1070 :parent_issue_id => 2}
Chris@0 1071 end
Chris@0 1072 issue = Issue.find_by_subject('This is a child issue')
Chris@0 1073 assert_not_nil issue
Chris@0 1074 assert_equal Issue.find(2), issue.parent
Chris@0 1075 end
Chris@119 1076
Chris@119 1077 def test_post_create_subissue_with_non_numeric_parent_id
Chris@119 1078 @request.session[:user_id] = 2
Chris@441 1079
Chris@119 1080 assert_difference 'Issue.count' do
Chris@441 1081 post :create, :project_id => 1,
Chris@119 1082 :issue => {:tracker_id => 1,
Chris@119 1083 :subject => 'This is a child issue',
Chris@119 1084 :parent_issue_id => 'ABC'}
Chris@119 1085 end
Chris@119 1086 issue = Issue.find_by_subject('This is a child issue')
Chris@119 1087 assert_not_nil issue
Chris@119 1088 assert_nil issue.parent
Chris@119 1089 end
Chris@909 1090
Chris@507 1091 def test_post_create_private
Chris@507 1092 @request.session[:user_id] = 2
Chris@507 1093
Chris@507 1094 assert_difference 'Issue.count' do
Chris@507 1095 post :create, :project_id => 1,
Chris@507 1096 :issue => {:tracker_id => 1,
Chris@507 1097 :subject => 'This is a private issue',
Chris@507 1098 :is_private => '1'}
Chris@507 1099 end
Chris@507 1100 issue = Issue.first(:order => 'id DESC')
Chris@507 1101 assert issue.is_private?
Chris@507 1102 end
Chris@909 1103
Chris@507 1104 def test_post_create_private_with_set_own_issues_private_permission
Chris@507 1105 role = Role.find(1)
Chris@507 1106 role.remove_permission! :set_issues_private
Chris@507 1107 role.add_permission! :set_own_issues_private
Chris@909 1108
Chris@507 1109 @request.session[:user_id] = 2
Chris@507 1110
Chris@507 1111 assert_difference 'Issue.count' do
Chris@507 1112 post :create, :project_id => 1,
Chris@507 1113 :issue => {:tracker_id => 1,
Chris@507 1114 :subject => 'This is a private issue',
Chris@507 1115 :is_private => '1'}
Chris@507 1116 end
Chris@507 1117 issue = Issue.first(:order => 'id DESC')
Chris@507 1118 assert issue.is_private?
Chris@507 1119 end
Chris@441 1120
Chris@0 1121 def test_post_create_should_send_a_notification
Chris@0 1122 ActionMailer::Base.deliveries.clear
Chris@0 1123 @request.session[:user_id] = 2
Chris@0 1124 assert_difference 'Issue.count' do
Chris@441 1125 post :create, :project_id => 1,
Chris@0 1126 :issue => {:tracker_id => 3,
Chris@0 1127 :subject => 'This is the test_new issue',
Chris@0 1128 :description => 'This is the description',
Chris@0 1129 :priority_id => 5,
Chris@0 1130 :estimated_hours => '',
Chris@0 1131 :custom_field_values => {'2' => 'Value for field 2'}}
Chris@0 1132 end
Chris@0 1133 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
Chris@441 1134
Chris@0 1135 assert_equal 1, ActionMailer::Base.deliveries.size
Chris@0 1136 end
Chris@441 1137
Chris@0 1138 def test_post_create_should_preserve_fields_values_on_validation_failure
Chris@0 1139 @request.session[:user_id] = 2
Chris@441 1140 post :create, :project_id => 1,
Chris@0 1141 :issue => {:tracker_id => 1,
Chris@0 1142 # empty subject
Chris@0 1143 :subject => '',
Chris@0 1144 :description => 'This is a description',
Chris@0 1145 :priority_id => 6,
Chris@0 1146 :custom_field_values => {'1' => 'Oracle', '2' => 'Value for field 2'}}
Chris@0 1147 assert_response :success
Chris@0 1148 assert_template 'new'
Chris@441 1149
Chris@0 1150 assert_tag :textarea, :attributes => { :name => 'issue[description]' },
Chris@0 1151 :content => 'This is a description'
Chris@0 1152 assert_tag :select, :attributes => { :name => 'issue[priority_id]' },
Chris@0 1153 :child => { :tag => 'option', :attributes => { :selected => 'selected',
Chris@0 1154 :value => '6' },
Chris@441 1155 :content => 'High' }
Chris@0 1156 # Custom fields
Chris@0 1157 assert_tag :select, :attributes => { :name => 'issue[custom_field_values][1]' },
Chris@0 1158 :child => { :tag => 'option', :attributes => { :selected => 'selected',
Chris@0 1159 :value => 'Oracle' },
Chris@441 1160 :content => 'Oracle' }
Chris@0 1161 assert_tag :input, :attributes => { :name => 'issue[custom_field_values][2]',
Chris@0 1162 :value => 'Value for field 2'}
Chris@0 1163 end
Chris@441 1164
Chris@0 1165 def test_post_create_should_ignore_non_safe_attributes
Chris@0 1166 @request.session[:user_id] = 2
Chris@0 1167 assert_nothing_raised do
Chris@0 1168 post :create, :project_id => 1, :issue => { :tracker => "A param can not be a Tracker" }
Chris@0 1169 end
Chris@0 1170 end
Chris@441 1171
Chris@909 1172 def test_post_create_with_attachment
Chris@909 1173 set_tmp_attachments_directory
Chris@909 1174 @request.session[:user_id] = 2
Chris@909 1175
Chris@909 1176 assert_difference 'Issue.count' do
Chris@909 1177 assert_difference 'Attachment.count' do
Chris@909 1178 post :create, :project_id => 1,
Chris@909 1179 :issue => { :tracker_id => '1', :subject => 'With attachment' },
Chris@909 1180 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}}
Chris@909 1181 end
Chris@909 1182 end
Chris@909 1183
Chris@909 1184 issue = Issue.first(:order => 'id DESC')
Chris@909 1185 attachment = Attachment.first(:order => 'id DESC')
Chris@909 1186
Chris@909 1187 assert_equal issue, attachment.container
Chris@909 1188 assert_equal 2, attachment.author_id
Chris@909 1189 assert_equal 'testfile.txt', attachment.filename
Chris@909 1190 assert_equal 'text/plain', attachment.content_type
Chris@909 1191 assert_equal 'test file', attachment.description
Chris@909 1192 assert_equal 59, attachment.filesize
Chris@909 1193 assert File.exists?(attachment.diskfile)
Chris@909 1194 assert_equal 59, File.size(attachment.diskfile)
Chris@909 1195 end
Chris@909 1196
Chris@0 1197 context "without workflow privilege" do
Chris@0 1198 setup do
Chris@0 1199 Workflow.delete_all(["role_id = ?", Role.anonymous.id])
chris@37 1200 Role.anonymous.add_permission! :add_issues, :add_issue_notes
Chris@0 1201 end
Chris@441 1202
Chris@0 1203 context "#new" do
Chris@0 1204 should "propose default status only" do
Chris@0 1205 get :new, :project_id => 1
Chris@0 1206 assert_response :success
Chris@0 1207 assert_template 'new'
Chris@0 1208 assert_tag :tag => 'select',
Chris@0 1209 :attributes => {:name => 'issue[status_id]'},
Chris@0 1210 :children => {:count => 1},
Chris@0 1211 :child => {:tag => 'option', :attributes => {:value => IssueStatus.default.id.to_s}}
Chris@0 1212 end
Chris@441 1213
Chris@0 1214 should "accept default status" do
Chris@0 1215 assert_difference 'Issue.count' do
Chris@441 1216 post :create, :project_id => 1,
Chris@0 1217 :issue => {:tracker_id => 1,
Chris@0 1218 :subject => 'This is an issue',
Chris@0 1219 :status_id => 1}
Chris@0 1220 end
Chris@0 1221 issue = Issue.last(:order => 'id')
Chris@0 1222 assert_equal IssueStatus.default, issue.status
Chris@0 1223 end
Chris@441 1224
Chris@0 1225 should "ignore unauthorized status" do
Chris@0 1226 assert_difference 'Issue.count' do
Chris@441 1227 post :create, :project_id => 1,
Chris@0 1228 :issue => {:tracker_id => 1,
Chris@0 1229 :subject => 'This is an issue',
Chris@0 1230 :status_id => 3}
Chris@0 1231 end
Chris@0 1232 issue = Issue.last(:order => 'id')
Chris@0 1233 assert_equal IssueStatus.default, issue.status
Chris@0 1234 end
Chris@0 1235 end
Chris@441 1236
chris@37 1237 context "#update" do
chris@37 1238 should "ignore status change" do
chris@37 1239 assert_difference 'Journal.count' do
chris@37 1240 put :update, :id => 1, :notes => 'just trying', :issue => {:status_id => 3}
chris@37 1241 end
chris@37 1242 assert_equal 1, Issue.find(1).status_id
chris@37 1243 end
Chris@441 1244
chris@37 1245 should "ignore attributes changes" do
chris@37 1246 assert_difference 'Journal.count' do
chris@37 1247 put :update, :id => 1, :notes => 'just trying', :issue => {:subject => 'changed', :assigned_to_id => 2}
chris@37 1248 end
chris@37 1249 issue = Issue.find(1)
chris@37 1250 assert_equal "Can't print recipes", issue.subject
chris@37 1251 assert_nil issue.assigned_to
chris@37 1252 end
chris@37 1253 end
chris@37 1254 end
Chris@441 1255
chris@37 1256 context "with workflow privilege" do
chris@37 1257 setup do
chris@37 1258 Workflow.delete_all(["role_id = ?", Role.anonymous.id])
chris@37 1259 Workflow.create!(:role => Role.anonymous, :tracker_id => 1, :old_status_id => 1, :new_status_id => 3)
chris@37 1260 Workflow.create!(:role => Role.anonymous, :tracker_id => 1, :old_status_id => 1, :new_status_id => 4)
chris@37 1261 Role.anonymous.add_permission! :add_issues, :add_issue_notes
chris@37 1262 end
Chris@441 1263
chris@37 1264 context "#update" do
chris@37 1265 should "accept authorized status" do
chris@37 1266 assert_difference 'Journal.count' do
chris@37 1267 put :update, :id => 1, :notes => 'just trying', :issue => {:status_id => 3}
chris@37 1268 end
chris@37 1269 assert_equal 3, Issue.find(1).status_id
chris@37 1270 end
Chris@441 1271
chris@37 1272 should "ignore unauthorized status" do
chris@37 1273 assert_difference 'Journal.count' do
chris@37 1274 put :update, :id => 1, :notes => 'just trying', :issue => {:status_id => 2}
chris@37 1275 end
chris@37 1276 assert_equal 1, Issue.find(1).status_id
chris@37 1277 end
Chris@441 1278
chris@37 1279 should "accept authorized attributes changes" do
chris@37 1280 assert_difference 'Journal.count' do
chris@37 1281 put :update, :id => 1, :notes => 'just trying', :issue => {:assigned_to_id => 2}
chris@37 1282 end
chris@37 1283 issue = Issue.find(1)
chris@37 1284 assert_equal 2, issue.assigned_to_id
chris@37 1285 end
Chris@441 1286
chris@37 1287 should "ignore unauthorized attributes changes" do
chris@37 1288 assert_difference 'Journal.count' do
chris@37 1289 put :update, :id => 1, :notes => 'just trying', :issue => {:subject => 'changed'}
chris@37 1290 end
chris@37 1291 issue = Issue.find(1)
chris@37 1292 assert_equal "Can't print recipes", issue.subject
chris@37 1293 end
chris@37 1294 end
Chris@441 1295
chris@37 1296 context "and :edit_issues permission" do
chris@37 1297 setup do
chris@37 1298 Role.anonymous.add_permission! :add_issues, :edit_issues
chris@37 1299 end
chris@37 1300
chris@37 1301 should "accept authorized status" do
chris@37 1302 assert_difference 'Journal.count' do
chris@37 1303 put :update, :id => 1, :notes => 'just trying', :issue => {:status_id => 3}
chris@37 1304 end
chris@37 1305 assert_equal 3, Issue.find(1).status_id
chris@37 1306 end
Chris@441 1307
chris@37 1308 should "ignore unauthorized status" do
chris@37 1309 assert_difference 'Journal.count' do
chris@37 1310 put :update, :id => 1, :notes => 'just trying', :issue => {:status_id => 2}
chris@37 1311 end
chris@37 1312 assert_equal 1, Issue.find(1).status_id
chris@37 1313 end
Chris@441 1314
chris@37 1315 should "accept authorized attributes changes" do
chris@37 1316 assert_difference 'Journal.count' do
chris@37 1317 put :update, :id => 1, :notes => 'just trying', :issue => {:subject => 'changed', :assigned_to_id => 2}
chris@37 1318 end
chris@37 1319 issue = Issue.find(1)
chris@37 1320 assert_equal "changed", issue.subject
chris@37 1321 assert_equal 2, issue.assigned_to_id
chris@37 1322 end
chris@37 1323 end
Chris@0 1324 end
Chris@441 1325
Chris@0 1326 def test_copy_issue
Chris@0 1327 @request.session[:user_id] = 2
Chris@0 1328 get :new, :project_id => 1, :copy_from => 1
Chris@0 1329 assert_template 'new'
Chris@0 1330 assert_not_nil assigns(:issue)
Chris@0 1331 orig = Issue.find(1)
Chris@0 1332 assert_equal orig.subject, assigns(:issue).subject
Chris@0 1333 end
Chris@441 1334
Chris@0 1335 def test_get_edit
Chris@0 1336 @request.session[:user_id] = 2
Chris@0 1337 get :edit, :id => 1
Chris@0 1338 assert_response :success
Chris@0 1339 assert_template 'edit'
Chris@0 1340 assert_not_nil assigns(:issue)
Chris@0 1341 assert_equal Issue.find(1), assigns(:issue)
Chris@909 1342
Chris@909 1343 # Be sure we don't display inactive IssuePriorities
Chris@909 1344 assert ! IssuePriority.find(15).active?
Chris@909 1345 assert_no_tag :option, :attributes => {:value => '15'},
Chris@909 1346 :parent => {:tag => 'select', :attributes => {:id => 'issue_priority_id'} }
Chris@909 1347 end
Chris@909 1348
Chris@909 1349 def test_get_edit_should_display_the_time_entry_form_with_log_time_permission
Chris@909 1350 @request.session[:user_id] = 2
Chris@909 1351 Role.find_by_name('Manager').update_attribute :permissions, [:view_issues, :edit_issues, :log_time]
Chris@909 1352
Chris@909 1353 get :edit, :id => 1
Chris@909 1354 assert_tag 'input', :attributes => {:name => 'time_entry[hours]'}
Chris@909 1355 end
Chris@909 1356
Chris@909 1357 def test_get_edit_should_not_display_the_time_entry_form_without_log_time_permission
Chris@909 1358 @request.session[:user_id] = 2
Chris@909 1359 Role.find_by_name('Manager').remove_permission! :log_time
Chris@909 1360
Chris@909 1361 get :edit, :id => 1
Chris@909 1362 assert_no_tag 'input', :attributes => {:name => 'time_entry[hours]'}
Chris@0 1363 end
Chris@441 1364
Chris@0 1365 def test_get_edit_with_params
Chris@0 1366 @request.session[:user_id] = 2
chris@37 1367 get :edit, :id => 1, :issue => { :status_id => 5, :priority_id => 7 },
chris@37 1368 :time_entry => { :hours => '2.5', :comments => 'test_get_edit_with_params', :activity_id => TimeEntryActivity.first.id }
Chris@0 1369 assert_response :success
Chris@0 1370 assert_template 'edit'
Chris@441 1371
Chris@0 1372 issue = assigns(:issue)
Chris@0 1373 assert_not_nil issue
Chris@441 1374
Chris@0 1375 assert_equal 5, issue.status_id
Chris@0 1376 assert_tag :select, :attributes => { :name => 'issue[status_id]' },
Chris@441 1377 :child => { :tag => 'option',
Chris@0 1378 :content => 'Closed',
Chris@0 1379 :attributes => { :selected => 'selected' } }
Chris@441 1380
Chris@0 1381 assert_equal 7, issue.priority_id
Chris@0 1382 assert_tag :select, :attributes => { :name => 'issue[priority_id]' },
Chris@441 1383 :child => { :tag => 'option',
Chris@0 1384 :content => 'Urgent',
Chris@0 1385 :attributes => { :selected => 'selected' } }
chris@37 1386
chris@37 1387 assert_tag :input, :attributes => { :name => 'time_entry[hours]', :value => '2.5' }
chris@37 1388 assert_tag :select, :attributes => { :name => 'time_entry[activity_id]' },
chris@37 1389 :child => { :tag => 'option',
chris@37 1390 :attributes => { :selected => 'selected', :value => TimeEntryActivity.first.id } }
chris@37 1391 assert_tag :input, :attributes => { :name => 'time_entry[comments]', :value => 'test_get_edit_with_params' }
Chris@0 1392 end
Chris@0 1393
Chris@0 1394 def test_update_edit_form
Chris@0 1395 @request.session[:user_id] = 2
Chris@14 1396 xhr :post, :new, :project_id => 1,
Chris@0 1397 :id => 1,
Chris@441 1398 :issue => {:tracker_id => 2,
Chris@0 1399 :subject => 'This is the test_new issue',
Chris@0 1400 :description => 'This is the description',
Chris@0 1401 :priority_id => 5}
Chris@0 1402 assert_response :success
Chris@0 1403 assert_template 'attributes'
Chris@441 1404
Chris@0 1405 issue = assigns(:issue)
Chris@0 1406 assert_kind_of Issue, issue
Chris@0 1407 assert_equal 1, issue.id
Chris@0 1408 assert_equal 1, issue.project_id
Chris@0 1409 assert_equal 2, issue.tracker_id
Chris@0 1410 assert_equal 'This is the test_new issue', issue.subject
Chris@0 1411 end
Chris@441 1412
Chris@0 1413 def test_update_using_invalid_http_verbs
Chris@0 1414 @request.session[:user_id] = 2
Chris@0 1415 subject = 'Updated by an invalid http verb'
Chris@0 1416
Chris@0 1417 get :update, :id => 1, :issue => {:subject => subject}
Chris@0 1418 assert_not_equal subject, Issue.find(1).subject
Chris@0 1419
Chris@0 1420 post :update, :id => 1, :issue => {:subject => subject}
Chris@0 1421 assert_not_equal subject, Issue.find(1).subject
Chris@0 1422
Chris@0 1423 delete :update, :id => 1, :issue => {:subject => subject}
Chris@0 1424 assert_not_equal subject, Issue.find(1).subject
Chris@0 1425 end
Chris@0 1426
Chris@0 1427 def test_put_update_without_custom_fields_param
Chris@0 1428 @request.session[:user_id] = 2
Chris@0 1429 ActionMailer::Base.deliveries.clear
Chris@441 1430
Chris@0 1431 issue = Issue.find(1)
Chris@0 1432 assert_equal '125', issue.custom_value_for(2).value
Chris@0 1433 old_subject = issue.subject
Chris@0 1434 new_subject = 'Subject modified by IssuesControllerTest#test_post_edit'
Chris@441 1435
Chris@0 1436 assert_difference('Journal.count') do
Chris@0 1437 assert_difference('JournalDetail.count', 2) do
Chris@0 1438 put :update, :id => 1, :issue => {:subject => new_subject,
Chris@0 1439 :priority_id => '6',
Chris@0 1440 :category_id => '1' # no change
Chris@0 1441 }
Chris@0 1442 end
Chris@0 1443 end
Chris@0 1444 assert_redirected_to :action => 'show', :id => '1'
Chris@0 1445 issue.reload
Chris@0 1446 assert_equal new_subject, issue.subject
Chris@0 1447 # Make sure custom fields were not cleared
Chris@0 1448 assert_equal '125', issue.custom_value_for(2).value
Chris@441 1449
Chris@0 1450 mail = ActionMailer::Base.deliveries.last
Chris@0 1451 assert_kind_of TMail::Mail, mail
Chris@0 1452 assert mail.subject.starts_with?("[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}]")
Chris@0 1453 assert mail.body.include?("Subject changed from #{old_subject} to #{new_subject}")
Chris@0 1454 end
Chris@441 1455
Chris@0 1456 def test_put_update_with_custom_field_change
Chris@0 1457 @request.session[:user_id] = 2
Chris@0 1458 issue = Issue.find(1)
Chris@0 1459 assert_equal '125', issue.custom_value_for(2).value
Chris@441 1460
Chris@0 1461 assert_difference('Journal.count') do
Chris@0 1462 assert_difference('JournalDetail.count', 3) do
Chris@0 1463 put :update, :id => 1, :issue => {:subject => 'Custom field change',
Chris@0 1464 :priority_id => '6',
Chris@0 1465 :category_id => '1', # no change
Chris@0 1466 :custom_field_values => { '2' => 'New custom value' }
Chris@0 1467 }
Chris@0 1468 end
Chris@0 1469 end
Chris@0 1470 assert_redirected_to :action => 'show', :id => '1'
Chris@0 1471 issue.reload
Chris@0 1472 assert_equal 'New custom value', issue.custom_value_for(2).value
Chris@441 1473
Chris@0 1474 mail = ActionMailer::Base.deliveries.last
Chris@0 1475 assert_kind_of TMail::Mail, mail
Chris@0 1476 assert mail.body.include?("Searchable field changed from 125 to New custom value")
Chris@0 1477 end
Chris@441 1478
Chris@0 1479 def test_put_update_with_status_and_assignee_change
Chris@0 1480 issue = Issue.find(1)
Chris@0 1481 assert_equal 1, issue.status_id
Chris@0 1482 @request.session[:user_id] = 2
Chris@0 1483 assert_difference('TimeEntry.count', 0) do
Chris@0 1484 put :update,
Chris@0 1485 :id => 1,
Chris@0 1486 :issue => { :status_id => 2, :assigned_to_id => 3 },
Chris@0 1487 :notes => 'Assigned to dlopper',
Chris@0 1488 :time_entry => { :hours => '', :comments => '', :activity_id => TimeEntryActivity.first }
Chris@0 1489 end
Chris@0 1490 assert_redirected_to :action => 'show', :id => '1'
Chris@0 1491 issue.reload
Chris@0 1492 assert_equal 2, issue.status_id
Chris@0 1493 j = Journal.find(:first, :order => 'id DESC')
Chris@0 1494 assert_equal 'Assigned to dlopper', j.notes
Chris@0 1495 assert_equal 2, j.details.size
Chris@441 1496
Chris@0 1497 mail = ActionMailer::Base.deliveries.last
Chris@0 1498 assert mail.body.include?("Status changed from New to Assigned")
Chris@0 1499 # subject should contain the new status
Chris@0 1500 assert mail.subject.include?("(#{ IssueStatus.find(2).name })")
Chris@0 1501 end
Chris@441 1502
Chris@0 1503 def test_put_update_with_note_only
Chris@0 1504 notes = 'Note added by IssuesControllerTest#test_update_with_note_only'
Chris@0 1505 # anonymous user
Chris@0 1506 put :update,
Chris@0 1507 :id => 1,
Chris@0 1508 :notes => notes
Chris@0 1509 assert_redirected_to :action => 'show', :id => '1'
Chris@0 1510 j = Journal.find(:first, :order => 'id DESC')
Chris@0 1511 assert_equal notes, j.notes
Chris@0 1512 assert_equal 0, j.details.size
Chris@0 1513 assert_equal User.anonymous, j.user
Chris@441 1514
Chris@0 1515 mail = ActionMailer::Base.deliveries.last
Chris@0 1516 assert mail.body.include?(notes)
Chris@0 1517 end
Chris@441 1518
Chris@0 1519 def test_put_update_with_note_and_spent_time
Chris@0 1520 @request.session[:user_id] = 2
Chris@0 1521 spent_hours_before = Issue.find(1).spent_hours
Chris@0 1522 assert_difference('TimeEntry.count') do
Chris@0 1523 put :update,
Chris@0 1524 :id => 1,
Chris@0 1525 :notes => '2.5 hours added',
Chris@0 1526 :time_entry => { :hours => '2.5', :comments => 'test_put_update_with_note_and_spent_time', :activity_id => TimeEntryActivity.first.id }
Chris@0 1527 end
Chris@0 1528 assert_redirected_to :action => 'show', :id => '1'
Chris@441 1529
Chris@0 1530 issue = Issue.find(1)
Chris@441 1531
Chris@0 1532 j = Journal.find(:first, :order => 'id DESC')
Chris@0 1533 assert_equal '2.5 hours added', j.notes
Chris@0 1534 assert_equal 0, j.details.size
Chris@441 1535
Chris@0 1536 t = issue.time_entries.find_by_comments('test_put_update_with_note_and_spent_time')
Chris@0 1537 assert_not_nil t
Chris@0 1538 assert_equal 2.5, t.hours
Chris@0 1539 assert_equal spent_hours_before + 2.5, issue.spent_hours
Chris@0 1540 end
Chris@441 1541
Chris@0 1542 def test_put_update_with_attachment_only
Chris@0 1543 set_tmp_attachments_directory
Chris@441 1544
Chris@0 1545 # Delete all fixtured journals, a race condition can occur causing the wrong
Chris@0 1546 # journal to get fetched in the next find.
Chris@0 1547 Journal.delete_all
Chris@0 1548
Chris@0 1549 # anonymous user
Chris@909 1550 assert_difference 'Attachment.count' do
Chris@909 1551 put :update, :id => 1,
Chris@909 1552 :notes => '',
Chris@909 1553 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}}
Chris@909 1554 end
Chris@909 1555
Chris@0 1556 assert_redirected_to :action => 'show', :id => '1'
Chris@0 1557 j = Issue.find(1).journals.find(:first, :order => 'id DESC')
Chris@0 1558 assert j.notes.blank?
Chris@0 1559 assert_equal 1, j.details.size
Chris@0 1560 assert_equal 'testfile.txt', j.details.first.value
Chris@0 1561 assert_equal User.anonymous, j.user
Chris@441 1562
Chris@909 1563 attachment = Attachment.first(:order => 'id DESC')
Chris@909 1564 assert_equal Issue.find(1), attachment.container
Chris@909 1565 assert_equal User.anonymous, attachment.author
Chris@909 1566 assert_equal 'testfile.txt', attachment.filename
Chris@909 1567 assert_equal 'text/plain', attachment.content_type
Chris@909 1568 assert_equal 'test file', attachment.description
Chris@909 1569 assert_equal 59, attachment.filesize
Chris@909 1570 assert File.exists?(attachment.diskfile)
Chris@909 1571 assert_equal 59, File.size(attachment.diskfile)
Chris@909 1572
Chris@0 1573 mail = ActionMailer::Base.deliveries.last
Chris@0 1574 assert mail.body.include?('testfile.txt')
Chris@0 1575 end
Chris@0 1576
Chris@0 1577 def test_put_update_with_attachment_that_fails_to_save
Chris@0 1578 set_tmp_attachments_directory
Chris@441 1579
Chris@0 1580 # Delete all fixtured journals, a race condition can occur causing the wrong
Chris@0 1581 # journal to get fetched in the next find.
Chris@0 1582 Journal.delete_all
Chris@0 1583
Chris@0 1584 # Mock out the unsaved attachment
Chris@0 1585 Attachment.any_instance.stubs(:create).returns(Attachment.new)
Chris@441 1586
Chris@0 1587 # anonymous user
Chris@0 1588 put :update,
Chris@0 1589 :id => 1,
Chris@0 1590 :notes => '',
Chris@0 1591 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
Chris@0 1592 assert_redirected_to :action => 'show', :id => '1'
Chris@0 1593 assert_equal '1 file(s) could not be saved.', flash[:warning]
Chris@0 1594
Chris@0 1595 end if Object.const_defined?(:Mocha)
Chris@0 1596
Chris@0 1597 def test_put_update_with_no_change
Chris@0 1598 issue = Issue.find(1)
Chris@0 1599 issue.journals.clear
Chris@0 1600 ActionMailer::Base.deliveries.clear
Chris@441 1601
Chris@0 1602 put :update,
Chris@0 1603 :id => 1,
Chris@0 1604 :notes => ''
Chris@0 1605 assert_redirected_to :action => 'show', :id => '1'
Chris@441 1606
Chris@0 1607 issue.reload
Chris@0 1608 assert issue.journals.empty?
Chris@0 1609 # No email should be sent
Chris@0 1610 assert ActionMailer::Base.deliveries.empty?
Chris@0 1611 end
Chris@0 1612
Chris@0 1613 def test_put_update_should_send_a_notification
Chris@0 1614 @request.session[:user_id] = 2
Chris@0 1615 ActionMailer::Base.deliveries.clear
Chris@0 1616 issue = Issue.find(1)
Chris@0 1617 old_subject = issue.subject
Chris@0 1618 new_subject = 'Subject modified by IssuesControllerTest#test_post_edit'
Chris@441 1619
Chris@0 1620 put :update, :id => 1, :issue => {:subject => new_subject,
Chris@0 1621 :priority_id => '6',
Chris@0 1622 :category_id => '1' # no change
Chris@0 1623 }
Chris@0 1624 assert_equal 1, ActionMailer::Base.deliveries.size
Chris@0 1625 end
Chris@441 1626
Chris@441 1627 def test_put_update_with_invalid_spent_time_hours_only
Chris@0 1628 @request.session[:user_id] = 2
Chris@0 1629 notes = 'Note added by IssuesControllerTest#test_post_edit_with_invalid_spent_time'
Chris@441 1630
Chris@0 1631 assert_no_difference('Journal.count') do
Chris@0 1632 put :update,
Chris@0 1633 :id => 1,
Chris@0 1634 :notes => notes,
Chris@0 1635 :time_entry => {"comments"=>"", "activity_id"=>"", "hours"=>"2z"}
Chris@0 1636 end
Chris@0 1637 assert_response :success
Chris@0 1638 assert_template 'edit'
Chris@441 1639
Chris@441 1640 assert_error_tag :descendant => {:content => /Activity can't be blank/}
Chris@441 1641 assert_tag :textarea, :attributes => { :name => 'notes' }, :content => notes
Chris@0 1642 assert_tag :input, :attributes => { :name => 'time_entry[hours]', :value => "2z" }
Chris@0 1643 end
Chris@441 1644
Chris@441 1645 def test_put_update_with_invalid_spent_time_comments_only
Chris@441 1646 @request.session[:user_id] = 2
Chris@441 1647 notes = 'Note added by IssuesControllerTest#test_post_edit_with_invalid_spent_time'
Chris@441 1648
Chris@441 1649 assert_no_difference('Journal.count') do
Chris@441 1650 put :update,
Chris@441 1651 :id => 1,
Chris@441 1652 :notes => notes,
Chris@441 1653 :time_entry => {"comments"=>"this is my comment", "activity_id"=>"", "hours"=>""}
Chris@441 1654 end
Chris@441 1655 assert_response :success
Chris@441 1656 assert_template 'edit'
Chris@441 1657
Chris@441 1658 assert_error_tag :descendant => {:content => /Activity can't be blank/}
Chris@441 1659 assert_error_tag :descendant => {:content => /Hours can't be blank/}
Chris@441 1660 assert_tag :textarea, :attributes => { :name => 'notes' }, :content => notes
Chris@441 1661 assert_tag :input, :attributes => { :name => 'time_entry[comments]', :value => "this is my comment" }
Chris@441 1662 end
Chris@441 1663
Chris@0 1664 def test_put_update_should_allow_fixed_version_to_be_set_to_a_subproject
Chris@0 1665 issue = Issue.find(2)
Chris@0 1666 @request.session[:user_id] = 2
Chris@0 1667
Chris@0 1668 put :update,
Chris@0 1669 :id => issue.id,
Chris@0 1670 :issue => {
Chris@0 1671 :fixed_version_id => 4
Chris@0 1672 }
Chris@0 1673
Chris@0 1674 assert_response :redirect
Chris@0 1675 issue.reload
Chris@0 1676 assert_equal 4, issue.fixed_version_id
Chris@0 1677 assert_not_equal issue.project_id, issue.fixed_version.project_id
Chris@0 1678 end
Chris@0 1679
Chris@0 1680 def test_put_update_should_redirect_back_using_the_back_url_parameter
Chris@0 1681 issue = Issue.find(2)
Chris@0 1682 @request.session[:user_id] = 2
Chris@0 1683
Chris@0 1684 put :update,
Chris@0 1685 :id => issue.id,
Chris@0 1686 :issue => {
Chris@0 1687 :fixed_version_id => 4
Chris@0 1688 },
Chris@0 1689 :back_url => '/issues'
Chris@0 1690
Chris@0 1691 assert_response :redirect
Chris@0 1692 assert_redirected_to '/issues'
Chris@0 1693 end
Chris@441 1694
Chris@0 1695 def test_put_update_should_not_redirect_back_using_the_back_url_parameter_off_the_host
Chris@0 1696 issue = Issue.find(2)
Chris@0 1697 @request.session[:user_id] = 2
Chris@0 1698
Chris@0 1699 put :update,
Chris@0 1700 :id => issue.id,
Chris@0 1701 :issue => {
Chris@0 1702 :fixed_version_id => 4
Chris@0 1703 },
Chris@0 1704 :back_url => 'http://google.com'
Chris@0 1705
Chris@0 1706 assert_response :redirect
Chris@0 1707 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue.id
Chris@0 1708 end
Chris@441 1709
Chris@0 1710 def test_get_bulk_edit
Chris@0 1711 @request.session[:user_id] = 2
Chris@0 1712 get :bulk_edit, :ids => [1, 2]
Chris@0 1713 assert_response :success
Chris@0 1714 assert_template 'bulk_edit'
Chris@441 1715
Chris@441 1716 assert_tag :input, :attributes => {:name => 'issue[parent_issue_id]'}
Chris@441 1717
Chris@0 1718 # Project specific custom field, date type
Chris@0 1719 field = CustomField.find(9)
Chris@0 1720 assert !field.is_for_all?
Chris@0 1721 assert_equal 'date', field.field_format
Chris@0 1722 assert_tag :input, :attributes => {:name => 'issue[custom_field_values][9]'}
Chris@441 1723
Chris@0 1724 # System wide custom field
Chris@0 1725 assert CustomField.find(1).is_for_all?
Chris@0 1726 assert_tag :select, :attributes => {:name => 'issue[custom_field_values][1]'}
Chris@909 1727
Chris@909 1728 # Be sure we don't display inactive IssuePriorities
Chris@909 1729 assert ! IssuePriority.find(15).active?
Chris@909 1730 assert_no_tag :option, :attributes => {:value => '15'},
Chris@909 1731 :parent => {:tag => 'select', :attributes => {:id => 'issue_priority_id'} }
Chris@0 1732 end
Chris@0 1733
chris@37 1734 def test_get_bulk_edit_on_different_projects
chris@37 1735 @request.session[:user_id] = 2
chris@37 1736 get :bulk_edit, :ids => [1, 2, 6]
chris@37 1737 assert_response :success
chris@37 1738 assert_template 'bulk_edit'
Chris@441 1739
Chris@441 1740 # Can not set issues from different projects as children of an issue
Chris@441 1741 assert_no_tag :input, :attributes => {:name => 'issue[parent_issue_id]'}
Chris@441 1742
chris@37 1743 # Project specific custom field, date type
chris@37 1744 field = CustomField.find(9)
chris@37 1745 assert !field.is_for_all?
chris@37 1746 assert !field.project_ids.include?(Issue.find(6).project_id)
chris@37 1747 assert_no_tag :input, :attributes => {:name => 'issue[custom_field_values][9]'}
chris@37 1748 end
chris@37 1749
Chris@441 1750 def test_get_bulk_edit_with_user_custom_field
Chris@441 1751 field = IssueCustomField.create!(:name => 'Tester', :field_format => 'user', :is_for_all => true)
Chris@441 1752
Chris@441 1753 @request.session[:user_id] = 2
Chris@441 1754 get :bulk_edit, :ids => [1, 2]
Chris@441 1755 assert_response :success
Chris@441 1756 assert_template 'bulk_edit'
Chris@441 1757
Chris@441 1758 assert_tag :select,
Chris@441 1759 :attributes => {:name => "issue[custom_field_values][#{field.id}]"},
Chris@441 1760 :children => {
Chris@441 1761 :only => {:tag => 'option'},
Chris@441 1762 :count => Project.find(1).users.count + 1
Chris@441 1763 }
Chris@441 1764 end
Chris@441 1765
Chris@441 1766 def test_get_bulk_edit_with_version_custom_field
Chris@441 1767 field = IssueCustomField.create!(:name => 'Affected version', :field_format => 'version', :is_for_all => true)
Chris@441 1768
Chris@441 1769 @request.session[:user_id] = 2
Chris@441 1770 get :bulk_edit, :ids => [1, 2]
Chris@441 1771 assert_response :success
Chris@441 1772 assert_template 'bulk_edit'
Chris@441 1773
Chris@441 1774 assert_tag :select,
Chris@441 1775 :attributes => {:name => "issue[custom_field_values][#{field.id}]"},
Chris@441 1776 :children => {
Chris@441 1777 :only => {:tag => 'option'},
Chris@909 1778 :count => Project.find(1).shared_versions.count + 1
Chris@441 1779 }
Chris@441 1780 end
Chris@441 1781
Chris@14 1782 def test_bulk_update
Chris@0 1783 @request.session[:user_id] = 2
Chris@0 1784 # update issues priority
Chris@14 1785 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing',
Chris@0 1786 :issue => {:priority_id => 7,
Chris@0 1787 :assigned_to_id => '',
Chris@0 1788 :custom_field_values => {'2' => ''}}
Chris@441 1789
Chris@0 1790 assert_response 302
Chris@0 1791 # check that the issues were updated
Chris@0 1792 assert_equal [7, 7], Issue.find_all_by_id([1, 2]).collect {|i| i.priority.id}
Chris@441 1793
Chris@0 1794 issue = Issue.find(1)
Chris@0 1795 journal = issue.journals.find(:first, :order => 'created_on DESC')
Chris@0 1796 assert_equal '125', issue.custom_value_for(2).value
Chris@0 1797 assert_equal 'Bulk editing', journal.notes
Chris@0 1798 assert_equal 1, journal.details.size
Chris@0 1799 end
Chris@0 1800
Chris@909 1801 def test_bulk_update_with_group_assignee
Chris@909 1802 group = Group.find(11)
Chris@909 1803 project = Project.find(1)
Chris@929 1804 project.members << Member.new(:principal => group, :roles => [Role.givable.first])
Chris@909 1805
Chris@909 1806 @request.session[:user_id] = 2
Chris@909 1807 # update issues assignee
Chris@909 1808 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing',
Chris@909 1809 :issue => {:priority_id => '',
Chris@909 1810 :assigned_to_id => group.id,
Chris@909 1811 :custom_field_values => {'2' => ''}}
Chris@909 1812
Chris@909 1813 assert_response 302
Chris@909 1814 assert_equal [group, group], Issue.find_all_by_id([1, 2]).collect {|i| i.assigned_to}
Chris@909 1815 end
Chris@909 1816
chris@37 1817 def test_bulk_update_on_different_projects
chris@37 1818 @request.session[:user_id] = 2
chris@37 1819 # update issues priority
chris@37 1820 post :bulk_update, :ids => [1, 2, 6], :notes => 'Bulk editing',
chris@37 1821 :issue => {:priority_id => 7,
chris@37 1822 :assigned_to_id => '',
chris@37 1823 :custom_field_values => {'2' => ''}}
Chris@441 1824
chris@37 1825 assert_response 302
chris@37 1826 # check that the issues were updated
chris@37 1827 assert_equal [7, 7, 7], Issue.find([1,2,6]).map(&:priority_id)
Chris@441 1828
chris@37 1829 issue = Issue.find(1)
chris@37 1830 journal = issue.journals.find(:first, :order => 'created_on DESC')
chris@37 1831 assert_equal '125', issue.custom_value_for(2).value
chris@37 1832 assert_equal 'Bulk editing', journal.notes
chris@37 1833 assert_equal 1, journal.details.size
chris@37 1834 end
chris@37 1835
chris@37 1836 def test_bulk_update_on_different_projects_without_rights
chris@37 1837 @request.session[:user_id] = 3
chris@37 1838 user = User.find(3)
chris@37 1839 action = { :controller => "issues", :action => "bulk_update" }
chris@37 1840 assert user.allowed_to?(action, Issue.find(1).project)
chris@37 1841 assert ! user.allowed_to?(action, Issue.find(6).project)
chris@37 1842 post :bulk_update, :ids => [1, 6], :notes => 'Bulk should fail',
chris@37 1843 :issue => {:priority_id => 7,
chris@37 1844 :assigned_to_id => '',
chris@37 1845 :custom_field_values => {'2' => ''}}
chris@37 1846 assert_response 403
chris@37 1847 assert_not_equal "Bulk should fail", Journal.last.notes
chris@37 1848 end
Chris@441 1849
Chris@14 1850 def test_bullk_update_should_send_a_notification
Chris@0 1851 @request.session[:user_id] = 2
Chris@0 1852 ActionMailer::Base.deliveries.clear
Chris@14 1853 post(:bulk_update,
Chris@0 1854 {
Chris@0 1855 :ids => [1, 2],
Chris@0 1856 :notes => 'Bulk editing',
Chris@0 1857 :issue => {
Chris@0 1858 :priority_id => 7,
Chris@0 1859 :assigned_to_id => '',
Chris@0 1860 :custom_field_values => {'2' => ''}
Chris@0 1861 }
Chris@0 1862 })
Chris@0 1863
Chris@0 1864 assert_response 302
Chris@0 1865 assert_equal 2, ActionMailer::Base.deliveries.size
Chris@0 1866 end
Chris@0 1867
Chris@14 1868 def test_bulk_update_status
Chris@0 1869 @request.session[:user_id] = 2
Chris@0 1870 # update issues priority
Chris@14 1871 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing status',
Chris@0 1872 :issue => {:priority_id => '',
Chris@0 1873 :assigned_to_id => '',
Chris@0 1874 :status_id => '5'}
Chris@441 1875
Chris@0 1876 assert_response 302
Chris@0 1877 issue = Issue.find(1)
Chris@0 1878 assert issue.closed?
Chris@0 1879 end
Chris@0 1880
Chris@441 1881 def test_bulk_update_parent_id
Chris@441 1882 @request.session[:user_id] = 2
Chris@441 1883 post :bulk_update, :ids => [1, 3],
Chris@441 1884 :notes => 'Bulk editing parent',
Chris@441 1885 :issue => {:priority_id => '', :assigned_to_id => '', :status_id => '', :parent_issue_id => '2'}
Chris@441 1886
Chris@441 1887 assert_response 302
Chris@441 1888 parent = Issue.find(2)
Chris@441 1889 assert_equal parent.id, Issue.find(1).parent_id
Chris@441 1890 assert_equal parent.id, Issue.find(3).parent_id
Chris@441 1891 assert_equal [1, 3], parent.children.collect(&:id).sort
Chris@441 1892 end
Chris@441 1893
Chris@14 1894 def test_bulk_update_custom_field
Chris@0 1895 @request.session[:user_id] = 2
Chris@0 1896 # update issues priority
Chris@14 1897 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing custom field',
Chris@0 1898 :issue => {:priority_id => '',
Chris@0 1899 :assigned_to_id => '',
Chris@0 1900 :custom_field_values => {'2' => '777'}}
Chris@441 1901
Chris@0 1902 assert_response 302
Chris@441 1903
Chris@0 1904 issue = Issue.find(1)
Chris@0 1905 journal = issue.journals.find(:first, :order => 'created_on DESC')
Chris@0 1906 assert_equal '777', issue.custom_value_for(2).value
Chris@0 1907 assert_equal 1, journal.details.size
Chris@0 1908 assert_equal '125', journal.details.first.old_value
Chris@0 1909 assert_equal '777', journal.details.first.value
Chris@0 1910 end
Chris@0 1911
Chris@14 1912 def test_bulk_update_unassign
Chris@0 1913 assert_not_nil Issue.find(2).assigned_to
Chris@0 1914 @request.session[:user_id] = 2
Chris@0 1915 # unassign issues
Chris@14 1916 post :bulk_update, :ids => [1, 2], :notes => 'Bulk unassigning', :issue => {:assigned_to_id => 'none'}
Chris@0 1917 assert_response 302
Chris@0 1918 # check that the issues were updated
Chris@0 1919 assert_nil Issue.find(2).assigned_to
Chris@0 1920 end
Chris@441 1921
Chris@14 1922 def test_post_bulk_update_should_allow_fixed_version_to_be_set_to_a_subproject
Chris@0 1923 @request.session[:user_id] = 2
Chris@0 1924
Chris@14 1925 post :bulk_update, :ids => [1,2], :issue => {:fixed_version_id => 4}
Chris@0 1926
Chris@0 1927 assert_response :redirect
Chris@0 1928 issues = Issue.find([1,2])
Chris@0 1929 issues.each do |issue|
Chris@0 1930 assert_equal 4, issue.fixed_version_id
Chris@0 1931 assert_not_equal issue.project_id, issue.fixed_version.project_id
Chris@0 1932 end
Chris@0 1933 end
Chris@0 1934
Chris@14 1935 def test_post_bulk_update_should_redirect_back_using_the_back_url_parameter
Chris@0 1936 @request.session[:user_id] = 2
Chris@14 1937 post :bulk_update, :ids => [1,2], :back_url => '/issues'
Chris@0 1938
Chris@0 1939 assert_response :redirect
Chris@0 1940 assert_redirected_to '/issues'
Chris@0 1941 end
Chris@0 1942
Chris@14 1943 def test_post_bulk_update_should_not_redirect_back_using_the_back_url_parameter_off_the_host
Chris@0 1944 @request.session[:user_id] = 2
Chris@14 1945 post :bulk_update, :ids => [1,2], :back_url => 'http://google.com'
Chris@0 1946
Chris@0 1947 assert_response :redirect
Chris@0 1948 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => Project.find(1).identifier
Chris@0 1949 end
Chris@441 1950
Chris@0 1951 def test_destroy_issue_with_no_time_entries
Chris@0 1952 assert_nil TimeEntry.find_by_issue_id(2)
Chris@0 1953 @request.session[:user_id] = 2
Chris@0 1954 post :destroy, :id => 2
Chris@0 1955 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
Chris@0 1956 assert_nil Issue.find_by_id(2)
Chris@0 1957 end
Chris@0 1958
Chris@0 1959 def test_destroy_issues_with_time_entries
Chris@0 1960 @request.session[:user_id] = 2
Chris@0 1961 post :destroy, :ids => [1, 3]
Chris@0 1962 assert_response :success
Chris@0 1963 assert_template 'destroy'
Chris@0 1964 assert_not_nil assigns(:hours)
Chris@0 1965 assert Issue.find_by_id(1) && Issue.find_by_id(3)
Chris@0 1966 end
Chris@0 1967
Chris@0 1968 def test_destroy_issues_and_destroy_time_entries
Chris@0 1969 @request.session[:user_id] = 2
Chris@0 1970 post :destroy, :ids => [1, 3], :todo => 'destroy'
Chris@0 1971 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
Chris@0 1972 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
Chris@0 1973 assert_nil TimeEntry.find_by_id([1, 2])
Chris@0 1974 end
Chris@0 1975
Chris@0 1976 def test_destroy_issues_and_assign_time_entries_to_project
Chris@0 1977 @request.session[:user_id] = 2
Chris@0 1978 post :destroy, :ids => [1, 3], :todo => 'nullify'
Chris@0 1979 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
Chris@0 1980 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
Chris@0 1981 assert_nil TimeEntry.find(1).issue_id
Chris@0 1982 assert_nil TimeEntry.find(2).issue_id
Chris@0 1983 end
Chris@441 1984
Chris@0 1985 def test_destroy_issues_and_reassign_time_entries_to_another_issue
Chris@0 1986 @request.session[:user_id] = 2
Chris@0 1987 post :destroy, :ids => [1, 3], :todo => 'reassign', :reassign_to_id => 2
Chris@0 1988 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
Chris@0 1989 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
Chris@0 1990 assert_equal 2, TimeEntry.find(1).issue_id
Chris@0 1991 assert_equal 2, TimeEntry.find(2).issue_id
Chris@0 1992 end
Chris@441 1993
chris@37 1994 def test_destroy_issues_from_different_projects
chris@37 1995 @request.session[:user_id] = 2
chris@37 1996 post :destroy, :ids => [1, 2, 6], :todo => 'destroy'
chris@37 1997 assert_redirected_to :controller => 'issues', :action => 'index'
chris@37 1998 assert !(Issue.find_by_id(1) || Issue.find_by_id(2) || Issue.find_by_id(6))
chris@37 1999 end
Chris@441 2000
Chris@441 2001 def test_destroy_parent_and_child_issues
Chris@441 2002 parent = Issue.generate!(:project_id => 1, :tracker_id => 1)
Chris@441 2003 child = Issue.generate!(:project_id => 1, :tracker_id => 1, :parent_issue_id => parent.id)
Chris@441 2004 assert child.is_descendant_of?(parent.reload)
Chris@441 2005
Chris@441 2006 @request.session[:user_id] = 2
Chris@441 2007 assert_difference 'Issue.count', -2 do
Chris@441 2008 post :destroy, :ids => [parent.id, child.id], :todo => 'destroy'
Chris@441 2009 end
Chris@441 2010 assert_response 302
Chris@441 2011 end
Chris@441 2012
Chris@0 2013 def test_default_search_scope
Chris@0 2014 get :index
Chris@0 2015 assert_tag :div, :attributes => {:id => 'quick-search'},
Chris@0 2016 :child => {:tag => 'form',
Chris@0 2017 :child => {:tag => 'input', :attributes => {:name => 'issues', :type => 'hidden', :value => '1'}}}
Chris@0 2018 end
Chris@0 2019 end