annotate test/functional/issues_controller_test.rb @ 1466:834828a14f2b bug_598

Close obsolete branch bug_598
author Chris Cannam
date Fri, 21 Jun 2013 14:51:55 +0100
parents 3e4c3460b6ca
children 622f24f53b42 261b3d9a4903
rev   line source
Chris@0 1 # Redmine - project management software
Chris@1115 2 # Copyright (C) 2006-2012 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@1115 44 :queries,
Chris@1115 45 :repositories,
Chris@1115 46 :changesets
Chris@441 47
Chris@909 48 include Redmine::I18n
Chris@909 49
Chris@0 50 def setup
Chris@0 51 @controller = IssuesController.new
Chris@0 52 @request = ActionController::TestRequest.new
Chris@0 53 @response = ActionController::TestResponse.new
Chris@0 54 User.current = nil
Chris@0 55 end
Chris@441 56
Chris@0 57 def test_index
Chris@1115 58 with_settings :default_language => "en" do
Chris@1115 59 get :index
Chris@1115 60 assert_response :success
Chris@1115 61 assert_template 'index'
Chris@1115 62 assert_not_nil assigns(:issues)
Chris@1115 63 assert_nil assigns(:project)
Chris@1115 64
Chris@1115 65 # links to visible issues
Chris@1115 66 assert_select 'a[href=/issues/1]', :text => /Can&#x27;t print recipes/
Chris@1115 67 assert_select 'a[href=/issues/5]', :text => /Subproject issue/
Chris@1115 68 # private projects hidden
Chris@1115 69 assert_select 'a[href=/issues/6]', 0
Chris@1115 70 assert_select 'a[href=/issues/4]', 0
Chris@1115 71 # project column
Chris@1115 72 assert_select 'th', :text => /Project/
Chris@1115 73 end
Chris@0 74 end
Chris@441 75
Chris@0 76 def test_index_should_not_list_issues_when_module_disabled
Chris@0 77 EnabledModule.delete_all("name = 'issue_tracking' AND project_id = 1")
Chris@0 78 get :index
Chris@0 79 assert_response :success
Chris@909 80 assert_template 'index'
Chris@0 81 assert_not_nil assigns(:issues)
Chris@0 82 assert_nil assigns(:project)
Chris@1115 83
Chris@1115 84 assert_select 'a[href=/issues/1]', 0
Chris@1115 85 assert_select 'a[href=/issues/5]', :text => /Subproject issue/
Chris@0 86 end
Chris@441 87
Chris@441 88 def test_index_should_list_visible_issues_only
Chris@441 89 get :index, :per_page => 100
Chris@441 90 assert_response :success
Chris@441 91 assert_not_nil assigns(:issues)
Chris@441 92 assert_nil assigns(:issues).detect {|issue| !issue.visible?}
Chris@441 93 end
Chris@441 94
Chris@0 95 def test_index_with_project
Chris@0 96 Setting.display_subprojects_issues = 0
Chris@0 97 get :index, :project_id => 1
Chris@0 98 assert_response :success
Chris@909 99 assert_template 'index'
Chris@0 100 assert_not_nil assigns(:issues)
Chris@1115 101
Chris@1115 102 assert_select 'a[href=/issues/1]', :text => /Can&#x27;t print recipes/
Chris@1115 103 assert_select 'a[href=/issues/5]', 0
Chris@0 104 end
Chris@441 105
Chris@0 106 def test_index_with_project_and_subprojects
Chris@0 107 Setting.display_subprojects_issues = 1
Chris@0 108 get :index, :project_id => 1
Chris@0 109 assert_response :success
Chris@909 110 assert_template 'index'
Chris@0 111 assert_not_nil assigns(:issues)
Chris@1115 112
Chris@1115 113 assert_select 'a[href=/issues/1]', :text => /Can&#x27;t print recipes/
Chris@1115 114 assert_select 'a[href=/issues/5]', :text => /Subproject issue/
Chris@1115 115 assert_select 'a[href=/issues/6]', 0
Chris@0 116 end
Chris@441 117
Chris@1115 118 def test_index_with_project_and_subprojects_should_show_private_subprojects_with_permission
Chris@0 119 @request.session[:user_id] = 2
Chris@0 120 Setting.display_subprojects_issues = 1
Chris@0 121 get :index, :project_id => 1
Chris@0 122 assert_response :success
Chris@909 123 assert_template 'index'
Chris@0 124 assert_not_nil assigns(:issues)
Chris@1115 125
Chris@1115 126 assert_select 'a[href=/issues/1]', :text => /Can&#x27;t print recipes/
Chris@1115 127 assert_select 'a[href=/issues/5]', :text => /Subproject issue/
Chris@1115 128 assert_select 'a[href=/issues/6]', :text => /Issue of a private subproject/
Chris@0 129 end
Chris@441 130
chris@37 131 def test_index_with_project_and_default_filter
Chris@0 132 get :index, :project_id => 1, :set_filter => 1
Chris@0 133 assert_response :success
Chris@909 134 assert_template 'index'
Chris@0 135 assert_not_nil assigns(:issues)
Chris@441 136
chris@37 137 query = assigns(:query)
chris@37 138 assert_not_nil query
chris@37 139 # default filter
chris@37 140 assert_equal({'status_id' => {:operator => 'o', :values => ['']}}, query.filters)
chris@37 141 end
Chris@441 142
chris@37 143 def test_index_with_project_and_filter
Chris@441 144 get :index, :project_id => 1, :set_filter => 1,
Chris@441 145 :f => ['tracker_id'],
Chris@441 146 :op => {'tracker_id' => '='},
Chris@441 147 :v => {'tracker_id' => ['1']}
chris@37 148 assert_response :success
Chris@909 149 assert_template 'index'
chris@37 150 assert_not_nil assigns(:issues)
Chris@441 151
chris@37 152 query = assigns(:query)
chris@37 153 assert_not_nil query
chris@37 154 assert_equal({'tracker_id' => {:operator => '=', :values => ['1']}}, query.filters)
chris@37 155 end
Chris@441 156
Chris@909 157 def test_index_with_short_filters
Chris@909 158 to_test = {
Chris@909 159 'status_id' => {
Chris@909 160 'o' => { :op => 'o', :values => [''] },
Chris@909 161 'c' => { :op => 'c', :values => [''] },
Chris@909 162 '7' => { :op => '=', :values => ['7'] },
Chris@909 163 '7|3|4' => { :op => '=', :values => ['7', '3', '4'] },
Chris@909 164 '=7' => { :op => '=', :values => ['7'] },
Chris@909 165 '!3' => { :op => '!', :values => ['3'] },
Chris@909 166 '!7|3|4' => { :op => '!', :values => ['7', '3', '4'] }},
Chris@909 167 'subject' => {
Chris@909 168 'This is a subject' => { :op => '=', :values => ['This is a subject'] },
Chris@909 169 'o' => { :op => '=', :values => ['o'] },
Chris@909 170 '~This is part of a subject' => { :op => '~', :values => ['This is part of a subject'] },
Chris@909 171 '!~This is part of a subject' => { :op => '!~', :values => ['This is part of a subject'] }},
Chris@909 172 'tracker_id' => {
Chris@909 173 '3' => { :op => '=', :values => ['3'] },
Chris@909 174 '=3' => { :op => '=', :values => ['3'] }},
Chris@909 175 'start_date' => {
Chris@909 176 '2011-10-12' => { :op => '=', :values => ['2011-10-12'] },
Chris@909 177 '=2011-10-12' => { :op => '=', :values => ['2011-10-12'] },
Chris@909 178 '>=2011-10-12' => { :op => '>=', :values => ['2011-10-12'] },
Chris@909 179 '<=2011-10-12' => { :op => '<=', :values => ['2011-10-12'] },
Chris@909 180 '><2011-10-01|2011-10-30' => { :op => '><', :values => ['2011-10-01', '2011-10-30'] },
Chris@909 181 '<t+2' => { :op => '<t+', :values => ['2'] },
Chris@909 182 '>t+2' => { :op => '>t+', :values => ['2'] },
Chris@909 183 't+2' => { :op => 't+', :values => ['2'] },
Chris@909 184 't' => { :op => 't', :values => [''] },
Chris@909 185 'w' => { :op => 'w', :values => [''] },
Chris@909 186 '>t-2' => { :op => '>t-', :values => ['2'] },
Chris@909 187 '<t-2' => { :op => '<t-', :values => ['2'] },
Chris@909 188 't-2' => { :op => 't-', :values => ['2'] }},
Chris@909 189 'created_on' => {
Chris@909 190 '>=2011-10-12' => { :op => '>=', :values => ['2011-10-12'] },
Chris@929 191 '<t-2' => { :op => '<t-', :values => ['2'] },
Chris@929 192 '>t-2' => { :op => '>t-', :values => ['2'] },
Chris@929 193 't-2' => { :op => 't-', :values => ['2'] }},
Chris@909 194 'cf_1' => {
Chris@909 195 'c' => { :op => '=', :values => ['c'] },
Chris@909 196 '!c' => { :op => '!', :values => ['c'] },
Chris@909 197 '!*' => { :op => '!*', :values => [''] },
Chris@909 198 '*' => { :op => '*', :values => [''] }},
Chris@909 199 'estimated_hours' => {
Chris@909 200 '=13.4' => { :op => '=', :values => ['13.4'] },
Chris@909 201 '>=45' => { :op => '>=', :values => ['45'] },
Chris@909 202 '<=125' => { :op => '<=', :values => ['125'] },
Chris@909 203 '><10.5|20.5' => { :op => '><', :values => ['10.5', '20.5'] },
Chris@909 204 '!*' => { :op => '!*', :values => [''] },
Chris@909 205 '*' => { :op => '*', :values => [''] }}
Chris@909 206 }
Chris@909 207
Chris@909 208 default_filter = { 'status_id' => {:operator => 'o', :values => [''] }}
Chris@909 209
Chris@909 210 to_test.each do |field, expression_and_expected|
Chris@909 211 expression_and_expected.each do |filter_expression, expected|
Chris@909 212
Chris@909 213 get :index, :set_filter => 1, field => filter_expression
Chris@909 214
Chris@909 215 assert_response :success
Chris@909 216 assert_template 'index'
Chris@909 217 assert_not_nil assigns(:issues)
Chris@909 218
Chris@909 219 query = assigns(:query)
Chris@909 220 assert_not_nil query
Chris@909 221 assert query.has_filter?(field)
Chris@909 222 assert_equal(default_filter.merge({field => {:operator => expected[:op], :values => expected[:values]}}), query.filters)
Chris@909 223 end
Chris@909 224 end
Chris@909 225 end
Chris@909 226
chris@37 227 def test_index_with_project_and_empty_filters
chris@37 228 get :index, :project_id => 1, :set_filter => 1, :fields => ['']
chris@37 229 assert_response :success
Chris@909 230 assert_template 'index'
chris@37 231 assert_not_nil assigns(:issues)
Chris@441 232
chris@37 233 query = assigns(:query)
chris@37 234 assert_not_nil query
chris@37 235 # no filter
chris@37 236 assert_equal({}, query.filters)
Chris@0 237 end
Chris@441 238
Chris@1115 239 def test_index_with_project_custom_field_filter
Chris@1115 240 field = ProjectCustomField.create!(:name => 'Client', :is_filter => true, :field_format => 'string')
Chris@1115 241 CustomValue.create!(:custom_field => field, :customized => Project.find(3), :value => 'Foo')
Chris@1115 242 CustomValue.create!(:custom_field => field, :customized => Project.find(5), :value => 'Foo')
Chris@1115 243 filter_name = "project.cf_#{field.id}"
Chris@1115 244 @request.session[:user_id] = 1
Chris@1115 245
Chris@1115 246 get :index, :set_filter => 1,
Chris@1115 247 :f => [filter_name],
Chris@1115 248 :op => {filter_name => '='},
Chris@1115 249 :v => {filter_name => ['Foo']}
Chris@1115 250 assert_response :success
Chris@1115 251 assert_template 'index'
Chris@1115 252 assert_equal [3, 5], assigns(:issues).map(&:project_id).uniq.sort
Chris@1115 253 end
Chris@1115 254
Chris@0 255 def test_index_with_query
Chris@0 256 get :index, :project_id => 1, :query_id => 5
Chris@0 257 assert_response :success
Chris@909 258 assert_template 'index'
Chris@0 259 assert_not_nil assigns(:issues)
Chris@0 260 assert_nil assigns(:issue_count_by_group)
Chris@0 261 end
Chris@441 262
Chris@0 263 def test_index_with_query_grouped_by_tracker
Chris@0 264 get :index, :project_id => 1, :query_id => 6
Chris@0 265 assert_response :success
Chris@909 266 assert_template 'index'
Chris@0 267 assert_not_nil assigns(:issues)
Chris@0 268 assert_not_nil assigns(:issue_count_by_group)
Chris@0 269 end
Chris@441 270
Chris@0 271 def test_index_with_query_grouped_by_list_custom_field
Chris@0 272 get :index, :project_id => 1, :query_id => 9
Chris@0 273 assert_response :success
Chris@909 274 assert_template 'index'
Chris@0 275 assert_not_nil assigns(:issues)
Chris@0 276 assert_not_nil assigns(:issue_count_by_group)
Chris@0 277 end
Chris@909 278
Chris@1115 279 def test_index_with_query_grouped_by_user_custom_field
Chris@1115 280 cf = IssueCustomField.create!(:name => 'User', :is_for_all => true, :tracker_ids => [1,2,3], :field_format => 'user')
Chris@1115 281 CustomValue.create!(:custom_field => cf, :customized => Issue.find(1), :value => '2')
Chris@1115 282 CustomValue.create!(:custom_field => cf, :customized => Issue.find(2), :value => '3')
Chris@1115 283 CustomValue.create!(:custom_field => cf, :customized => Issue.find(3), :value => '3')
Chris@1115 284 CustomValue.create!(:custom_field => cf, :customized => Issue.find(5), :value => '')
Chris@1115 285
Chris@1115 286 get :index, :project_id => 1, :set_filter => 1, :group_by => "cf_#{cf.id}"
Chris@1115 287 assert_response :success
Chris@1115 288
Chris@1115 289 assert_select 'tr.group', 3
Chris@1115 290 assert_select 'tr.group' do
Chris@1115 291 assert_select 'a', :text => 'John Smith'
Chris@1115 292 assert_select 'span.count', :text => '1'
Chris@1115 293 end
Chris@1115 294 assert_select 'tr.group' do
Chris@1115 295 assert_select 'a', :text => 'Dave Lopper'
Chris@1115 296 assert_select 'span.count', :text => '2'
Chris@1115 297 end
Chris@1115 298 end
Chris@1115 299
Chris@1115 300 def test_index_with_query_grouped_by_tracker
Chris@1115 301 3.times {|i| Issue.generate!(:tracker_id => (i + 1))}
Chris@1115 302
Chris@1115 303 get :index, :set_filter => 1, :group_by => 'tracker', :sort => 'id:desc'
Chris@1115 304 assert_response :success
Chris@1115 305
Chris@1115 306 trackers = assigns(:issues).map(&:tracker).uniq
Chris@1115 307 assert_equal [1, 2, 3], trackers.map(&:id)
Chris@1115 308 end
Chris@1115 309
Chris@1115 310 def test_index_with_query_grouped_by_tracker_in_reverse_order
Chris@1115 311 3.times {|i| Issue.generate!(:tracker_id => (i + 1))}
Chris@1115 312
Chris@1115 313 get :index, :set_filter => 1, :group_by => 'tracker', :sort => 'id:desc,tracker:desc'
Chris@1115 314 assert_response :success
Chris@1115 315
Chris@1115 316 trackers = assigns(:issues).map(&:tracker).uniq
Chris@1115 317 assert_equal [3, 2, 1], trackers.map(&:id)
Chris@1115 318 end
Chris@1115 319
Chris@909 320 def test_index_with_query_id_and_project_id_should_set_session_query
Chris@909 321 get :index, :project_id => 1, :query_id => 4
Chris@909 322 assert_response :success
Chris@909 323 assert_kind_of Hash, session[:query]
Chris@909 324 assert_equal 4, session[:query][:id]
Chris@909 325 assert_equal 1, session[:query][:project_id]
Chris@909 326 end
Chris@909 327
Chris@1115 328 def test_index_with_invalid_query_id_should_respond_404
Chris@1115 329 get :index, :project_id => 1, :query_id => 999
Chris@1115 330 assert_response 404
Chris@1115 331 end
Chris@1115 332
Chris@909 333 def test_index_with_cross_project_query_in_session_should_show_project_issues
Chris@909 334 q = Query.create!(:name => "test", :user_id => 2, :is_public => false, :project => nil)
Chris@909 335 @request.session[:query] = {:id => q.id, :project_id => 1}
Chris@909 336
Chris@909 337 with_settings :display_subprojects_issues => '0' do
Chris@909 338 get :index, :project_id => 1
Chris@909 339 end
Chris@909 340 assert_response :success
Chris@909 341 assert_not_nil assigns(:query)
Chris@909 342 assert_equal q.id, assigns(:query).id
Chris@909 343 assert_equal 1, assigns(:query).project_id
Chris@909 344 assert_equal [1], assigns(:issues).map(&:project_id).uniq
Chris@909 345 end
Chris@909 346
Chris@507 347 def test_private_query_should_not_be_available_to_other_users
Chris@507 348 q = Query.create!(:name => "private", :user => User.find(2), :is_public => false, :project => nil)
Chris@507 349 @request.session[:user_id] = 3
Chris@909 350
Chris@507 351 get :index, :query_id => q.id
Chris@507 352 assert_response 403
Chris@507 353 end
Chris@909 354
Chris@507 355 def test_private_query_should_be_available_to_its_user
Chris@507 356 q = Query.create!(:name => "private", :user => User.find(2), :is_public => false, :project => nil)
Chris@507 357 @request.session[:user_id] = 2
Chris@909 358
Chris@507 359 get :index, :query_id => q.id
Chris@507 360 assert_response :success
Chris@507 361 end
Chris@441 362
Chris@909 363 def test_public_query_should_be_available_to_other_users
Chris@909 364 q = Query.create!(:name => "private", :user => User.find(2), :is_public => true, :project => nil)
Chris@909 365 @request.session[:user_id] = 3
Chris@909 366
Chris@909 367 get :index, :query_id => q.id
Chris@909 368 assert_response :success
Chris@0 369 end
Chris@441 370
Chris@1115 371 def test_index_should_omit_page_param_in_export_links
Chris@1115 372 get :index, :page => 2
Chris@1115 373 assert_response :success
Chris@1115 374 assert_select 'a.atom[href=/issues.atom]'
Chris@1115 375 assert_select 'a.csv[href=/issues.csv]'
Chris@1115 376 assert_select 'a.pdf[href=/issues.pdf]'
Chris@1115 377 assert_select 'form#csv-export-form[action=/issues.csv]'
Chris@1115 378 end
Chris@1115 379
Chris@909 380 def test_index_csv
Chris@0 381 get :index, :format => 'csv'
Chris@0 382 assert_response :success
Chris@0 383 assert_not_nil assigns(:issues)
Chris@1115 384 assert_equal 'text/csv; header=present', @response.content_type
Chris@0 385 assert @response.body.starts_with?("#,")
Chris@909 386 lines = @response.body.chomp.split("\n")
Chris@909 387 assert_equal assigns(:query).columns.size + 1, lines[0].split(',').size
Chris@909 388 end
Chris@0 389
Chris@909 390 def test_index_csv_with_project
Chris@0 391 get :index, :project_id => 1, :format => 'csv'
Chris@0 392 assert_response :success
Chris@0 393 assert_not_nil assigns(:issues)
Chris@1115 394 assert_equal 'text/csv; header=present', @response.content_type
Chris@0 395 end
Chris@441 396
Chris@909 397 def test_index_csv_with_description
Chris@909 398 get :index, :format => 'csv', :description => '1'
Chris@0 399 assert_response :success
Chris@0 400 assert_not_nil assigns(:issues)
Chris@1115 401 assert_equal 'text/csv; header=present', @response.content_type
Chris@909 402 assert @response.body.starts_with?("#,")
Chris@909 403 lines = @response.body.chomp.split("\n")
Chris@909 404 assert_equal assigns(:query).columns.size + 2, lines[0].split(',').size
Chris@909 405 end
Chris@441 406
Chris@1115 407 def test_index_csv_with_spent_time_column
Chris@1115 408 issue = Issue.create!(:project_id => 1, :tracker_id => 1, :subject => 'test_index_csv_with_spent_time_column', :author_id => 2)
Chris@1115 409 TimeEntry.create!(:project => issue.project, :issue => issue, :hours => 7.33, :user => User.find(2), :spent_on => Date.today)
Chris@1115 410
Chris@1115 411 get :index, :format => 'csv', :set_filter => '1', :c => %w(subject spent_hours)
Chris@1115 412 assert_response :success
Chris@1115 413 assert_equal 'text/csv; header=present', @response.content_type
Chris@1115 414 lines = @response.body.chomp.split("\n")
Chris@1115 415 assert_include "#{issue.id},#{issue.subject},7.33", lines
Chris@1115 416 end
Chris@1115 417
Chris@909 418 def test_index_csv_with_all_columns
Chris@909 419 get :index, :format => 'csv', :columns => 'all'
Chris@0 420 assert_response :success
Chris@0 421 assert_not_nil assigns(:issues)
Chris@1115 422 assert_equal 'text/csv; header=present', @response.content_type
Chris@909 423 assert @response.body.starts_with?("#,")
Chris@909 424 lines = @response.body.chomp.split("\n")
Chris@1115 425 assert_equal assigns(:query).available_inline_columns.size + 1, lines[0].split(',').size
Chris@1115 426 end
Chris@1115 427
Chris@1115 428 def test_index_csv_with_multi_column_field
Chris@1115 429 CustomField.find(1).update_attribute :multiple, true
Chris@1115 430 issue = Issue.find(1)
Chris@1115 431 issue.custom_field_values = {1 => ['MySQL', 'Oracle']}
Chris@1115 432 issue.save!
Chris@1115 433
Chris@1115 434 get :index, :format => 'csv', :columns => 'all'
Chris@1115 435 assert_response :success
Chris@1115 436 lines = @response.body.chomp.split("\n")
Chris@1115 437 assert lines.detect {|line| line.include?('"MySQL, Oracle"')}
Chris@909 438 end
Chris@441 439
Chris@909 440 def test_index_csv_big_5
Chris@909 441 with_settings :default_language => "zh-TW" do
Chris@909 442 str_utf8 = "\xe4\xb8\x80\xe6\x9c\x88"
Chris@909 443 str_big5 = "\xa4@\xa4\xeb"
Chris@909 444 if str_utf8.respond_to?(:force_encoding)
Chris@909 445 str_utf8.force_encoding('UTF-8')
Chris@909 446 str_big5.force_encoding('Big5')
Chris@909 447 end
Chris@1115 448 issue = Issue.generate!(:subject => str_utf8)
Chris@909 449
Chris@909 450 get :index, :project_id => 1,
Chris@909 451 :f => ['subject'],
Chris@909 452 :op => '=', :values => [str_utf8],
Chris@909 453 :format => 'csv'
Chris@1115 454 assert_equal 'text/csv; header=present', @response.content_type
Chris@909 455 lines = @response.body.chomp.split("\n")
Chris@909 456 s1 = "\xaa\xac\xbaA"
Chris@909 457 if str_utf8.respond_to?(:force_encoding)
Chris@909 458 s1.force_encoding('Big5')
Chris@909 459 end
Chris@909 460 assert lines[0].include?(s1)
Chris@909 461 assert lines[1].include?(str_big5)
Chris@909 462 end
Chris@909 463 end
Chris@909 464
Chris@909 465 def test_index_csv_cannot_convert_should_be_replaced_big_5
Chris@909 466 with_settings :default_language => "zh-TW" do
Chris@909 467 str_utf8 = "\xe4\xbb\xa5\xe5\x86\x85"
Chris@909 468 if str_utf8.respond_to?(:force_encoding)
Chris@909 469 str_utf8.force_encoding('UTF-8')
Chris@909 470 end
Chris@1115 471 issue = Issue.generate!(:subject => str_utf8)
Chris@909 472
Chris@909 473 get :index, :project_id => 1,
Chris@909 474 :f => ['subject'],
Chris@909 475 :op => '=', :values => [str_utf8],
Chris@909 476 :c => ['status', 'subject'],
Chris@909 477 :format => 'csv',
Chris@909 478 :set_filter => 1
Chris@1115 479 assert_equal 'text/csv; header=present', @response.content_type
Chris@909 480 lines = @response.body.chomp.split("\n")
Chris@909 481 s1 = "\xaa\xac\xbaA" # status
Chris@909 482 if str_utf8.respond_to?(:force_encoding)
Chris@909 483 s1.force_encoding('Big5')
Chris@909 484 end
Chris@909 485 assert lines[0].include?(s1)
Chris@909 486 s2 = lines[1].split(",")[2]
Chris@909 487 if s1.respond_to?(:force_encoding)
Chris@909 488 s3 = "\xa5H?" # subject
Chris@909 489 s3.force_encoding('Big5')
Chris@909 490 assert_equal s3, s2
Chris@909 491 elsif RUBY_PLATFORM == 'java'
Chris@909 492 assert_equal "??", s2
Chris@909 493 else
Chris@909 494 assert_equal "\xa5H???", s2
Chris@909 495 end
Chris@909 496 end
Chris@909 497 end
Chris@909 498
Chris@909 499 def test_index_csv_tw
Chris@909 500 with_settings :default_language => "zh-TW" do
Chris@909 501 str1 = "test_index_csv_tw"
Chris@1115 502 issue = Issue.generate!(:subject => str1, :estimated_hours => '1234.5')
Chris@909 503
Chris@909 504 get :index, :project_id => 1,
Chris@909 505 :f => ['subject'],
Chris@909 506 :op => '=', :values => [str1],
Chris@909 507 :c => ['estimated_hours', 'subject'],
Chris@909 508 :format => 'csv',
Chris@909 509 :set_filter => 1
Chris@1115 510 assert_equal 'text/csv; header=present', @response.content_type
Chris@909 511 lines = @response.body.chomp.split("\n")
Chris@1115 512 assert_equal "#{issue.id},1234.50,#{str1}", lines[1]
Chris@909 513 end
Chris@909 514 end
Chris@909 515
Chris@909 516 def test_index_csv_fr
Chris@909 517 with_settings :default_language => "fr" do
Chris@909 518 str1 = "test_index_csv_fr"
Chris@1115 519 issue = Issue.generate!(:subject => str1, :estimated_hours => '1234.5')
Chris@909 520
Chris@909 521 get :index, :project_id => 1,
Chris@909 522 :f => ['subject'],
Chris@909 523 :op => '=', :values => [str1],
Chris@909 524 :c => ['estimated_hours', 'subject'],
Chris@909 525 :format => 'csv',
Chris@909 526 :set_filter => 1
Chris@1115 527 assert_equal 'text/csv; header=present', @response.content_type
Chris@909 528 lines = @response.body.chomp.split("\n")
Chris@1115 529 assert_equal "#{issue.id};1234,50;#{str1}", lines[1]
Chris@909 530 end
Chris@909 531 end
Chris@909 532
Chris@909 533 def test_index_pdf
Chris@909 534 ["en", "zh", "zh-TW", "ja", "ko"].each do |lang|
Chris@909 535 with_settings :default_language => lang do
Chris@909 536
Chris@909 537 get :index
Chris@909 538 assert_response :success
Chris@909 539 assert_template 'index'
Chris@909 540
Chris@909 541 if lang == "ja"
Chris@909 542 if RUBY_PLATFORM != 'java'
Chris@909 543 assert_equal "CP932", l(:general_pdf_encoding)
Chris@909 544 end
Chris@909 545 if RUBY_PLATFORM == 'java' && l(:general_pdf_encoding) == "CP932"
Chris@909 546 next
Chris@909 547 end
Chris@909 548 end
Chris@909 549
Chris@909 550 get :index, :format => 'pdf'
Chris@909 551 assert_response :success
Chris@909 552 assert_not_nil assigns(:issues)
Chris@909 553 assert_equal 'application/pdf', @response.content_type
Chris@909 554
Chris@909 555 get :index, :project_id => 1, :format => 'pdf'
Chris@909 556 assert_response :success
Chris@909 557 assert_not_nil assigns(:issues)
Chris@909 558 assert_equal 'application/pdf', @response.content_type
Chris@909 559
Chris@909 560 get :index, :project_id => 1, :query_id => 6, :format => 'pdf'
Chris@909 561 assert_response :success
Chris@909 562 assert_not_nil assigns(:issues)
Chris@909 563 assert_equal 'application/pdf', @response.content_type
Chris@909 564 end
Chris@909 565 end
Chris@0 566 end
Chris@441 567
Chris@0 568 def test_index_pdf_with_query_grouped_by_list_custom_field
Chris@0 569 get :index, :project_id => 1, :query_id => 9, :format => 'pdf'
Chris@0 570 assert_response :success
Chris@0 571 assert_not_nil assigns(:issues)
Chris@0 572 assert_not_nil assigns(:issue_count_by_group)
Chris@0 573 assert_equal 'application/pdf', @response.content_type
Chris@0 574 end
Chris@441 575
Chris@1115 576 def test_index_atom
Chris@1115 577 get :index, :project_id => 'ecookbook', :format => 'atom'
Chris@1115 578 assert_response :success
Chris@1115 579 assert_template 'common/feed'
Chris@1115 580 assert_equal 'application/atom+xml', response.content_type
Chris@1115 581
Chris@1115 582 assert_select 'feed' do
Chris@1115 583 assert_select 'link[rel=self][href=?]', 'http://test.host/projects/ecookbook/issues.atom'
Chris@1115 584 assert_select 'link[rel=alternate][href=?]', 'http://test.host/projects/ecookbook/issues'
Chris@1115 585 assert_select 'entry link[href=?]', 'http://test.host/issues/1'
Chris@1115 586 end
Chris@1115 587 end
Chris@1115 588
Chris@0 589 def test_index_sort
Chris@0 590 get :index, :sort => 'tracker,id:desc'
Chris@0 591 assert_response :success
Chris@441 592
Chris@0 593 sort_params = @request.session['issues_index_sort']
Chris@0 594 assert sort_params.is_a?(String)
Chris@0 595 assert_equal 'tracker,id:desc', sort_params
Chris@441 596
Chris@0 597 issues = assigns(:issues)
Chris@0 598 assert_not_nil issues
Chris@0 599 assert !issues.empty?
Chris@0 600 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 601 end
Chris@441 602
Chris@909 603 def test_index_sort_by_field_not_included_in_columns
Chris@909 604 Setting.issue_list_default_columns = %w(subject author)
Chris@909 605 get :index, :sort => 'tracker'
Chris@909 606 end
Chris@909 607
Chris@909 608 def test_index_sort_by_assigned_to
Chris@909 609 get :index, :sort => 'assigned_to'
Chris@909 610 assert_response :success
Chris@909 611 assignees = assigns(:issues).collect(&:assigned_to).compact
Chris@909 612 assert_equal assignees.sort, assignees
Chris@909 613 end
Chris@909 614
Chris@909 615 def test_index_sort_by_assigned_to_desc
Chris@909 616 get :index, :sort => 'assigned_to:desc'
Chris@909 617 assert_response :success
Chris@909 618 assignees = assigns(:issues).collect(&:assigned_to).compact
Chris@909 619 assert_equal assignees.sort.reverse, assignees
Chris@909 620 end
Chris@909 621
Chris@909 622 def test_index_group_by_assigned_to
Chris@909 623 get :index, :group_by => 'assigned_to', :sort => 'priority'
Chris@909 624 assert_response :success
Chris@909 625 end
Chris@909 626
Chris@909 627 def test_index_sort_by_author
Chris@909 628 get :index, :sort => 'author'
Chris@909 629 assert_response :success
Chris@909 630 authors = assigns(:issues).collect(&:author)
Chris@909 631 assert_equal authors.sort, authors
Chris@909 632 end
Chris@909 633
Chris@909 634 def test_index_sort_by_author_desc
Chris@909 635 get :index, :sort => 'author:desc'
Chris@909 636 assert_response :success
Chris@909 637 authors = assigns(:issues).collect(&:author)
Chris@909 638 assert_equal authors.sort.reverse, authors
Chris@909 639 end
Chris@909 640
Chris@909 641 def test_index_group_by_author
Chris@909 642 get :index, :group_by => 'author', :sort => 'priority'
Chris@909 643 assert_response :success
Chris@909 644 end
Chris@1115 645
Chris@1115 646 def test_index_sort_by_spent_hours
Chris@1115 647 get :index, :sort => 'spent_hours:desc'
Chris@1115 648 assert_response :success
Chris@1115 649 hours = assigns(:issues).collect(&:spent_hours)
Chris@1115 650 assert_equal hours.sort.reverse, hours
Chris@1115 651 end
Chris@1115 652
Chris@1115 653 def test_index_sort_by_user_custom_field
Chris@1115 654 cf = IssueCustomField.create!(:name => 'User', :is_for_all => true, :tracker_ids => [1,2,3], :field_format => 'user')
Chris@1115 655 CustomValue.create!(:custom_field => cf, :customized => Issue.find(1), :value => '2')
Chris@1115 656 CustomValue.create!(:custom_field => cf, :customized => Issue.find(2), :value => '3')
Chris@1115 657 CustomValue.create!(:custom_field => cf, :customized => Issue.find(3), :value => '3')
Chris@1115 658 CustomValue.create!(:custom_field => cf, :customized => Issue.find(5), :value => '')
Chris@1115 659
Chris@1115 660 get :index, :project_id => 1, :set_filter => 1, :sort => "cf_#{cf.id},id"
Chris@1115 661 assert_response :success
Chris@1115 662
Chris@1115 663 assert_equal [2, 3, 1], assigns(:issues).select {|issue| issue.custom_field_value(cf).present?}.map(&:id)
Chris@1115 664 end
Chris@909 665
Chris@0 666 def test_index_with_columns
Chris@0 667 columns = ['tracker', 'subject', 'assigned_to']
Chris@441 668 get :index, :set_filter => 1, :c => columns
Chris@0 669 assert_response :success
Chris@441 670
Chris@0 671 # query should use specified columns
Chris@0 672 query = assigns(:query)
Chris@0 673 assert_kind_of Query, query
Chris@0 674 assert_equal columns, query.column_names.map(&:to_s)
Chris@441 675
Chris@0 676 # columns should be stored in session
Chris@0 677 assert_kind_of Hash, session[:query]
Chris@0 678 assert_kind_of Array, session[:query][:column_names]
Chris@0 679 assert_equal columns, session[:query][:column_names].map(&:to_s)
Chris@507 680
Chris@507 681 # ensure only these columns are kept in the selected columns list
Chris@1115 682 assert_select 'select#selected_columns option' do
Chris@1115 683 assert_select 'option', 3
Chris@1115 684 assert_select 'option[value=tracker]'
Chris@1115 685 assert_select 'option[value=project]', 0
Chris@1115 686 end
Chris@0 687 end
Chris@0 688
Chris@909 689 def test_index_without_project_should_implicitly_add_project_column_to_default_columns
Chris@909 690 Setting.issue_list_default_columns = ['tracker', 'subject', 'assigned_to']
Chris@909 691 get :index, :set_filter => 1
Chris@909 692
Chris@909 693 # query should use specified columns
Chris@909 694 query = assigns(:query)
Chris@909 695 assert_kind_of Query, query
Chris@909 696 assert_equal [:project, :tracker, :subject, :assigned_to], query.columns.map(&:name)
Chris@909 697 end
Chris@909 698
Chris@909 699 def test_index_without_project_and_explicit_default_columns_should_not_add_project_column
Chris@909 700 Setting.issue_list_default_columns = ['tracker', 'subject', 'assigned_to']
Chris@909 701 columns = ['tracker', 'subject', 'assigned_to']
Chris@909 702 get :index, :set_filter => 1, :c => columns
Chris@909 703
Chris@909 704 # query should use specified columns
Chris@909 705 query = assigns(:query)
Chris@909 706 assert_kind_of Query, query
Chris@909 707 assert_equal columns.map(&:to_sym), query.columns.map(&:name)
Chris@909 708 end
Chris@909 709
Chris@441 710 def test_index_with_custom_field_column
Chris@441 711 columns = %w(tracker subject cf_2)
Chris@441 712 get :index, :set_filter => 1, :c => columns
Chris@441 713 assert_response :success
Chris@441 714
Chris@441 715 # query should use specified columns
Chris@441 716 query = assigns(:query)
Chris@441 717 assert_kind_of Query, query
Chris@441 718 assert_equal columns, query.column_names.map(&:to_s)
Chris@441 719
Chris@1115 720 assert_select 'table.issues td.cf_2.string'
Chris@441 721 end
Chris@441 722
Chris@1115 723 def test_index_with_multi_custom_field_column
Chris@1115 724 field = CustomField.find(1)
Chris@1115 725 field.update_attribute :multiple, true
Chris@1115 726 issue = Issue.find(1)
Chris@1115 727 issue.custom_field_values = {1 => ['MySQL', 'Oracle']}
Chris@1115 728 issue.save!
Chris@1115 729
Chris@1115 730 get :index, :set_filter => 1, :c => %w(tracker subject cf_1)
Chris@1115 731 assert_response :success
Chris@1115 732
Chris@1115 733 assert_select 'table.issues td.cf_1', :text => 'MySQL, Oracle'
Chris@1115 734 end
Chris@1115 735
Chris@1115 736 def test_index_with_multi_user_custom_field_column
Chris@1115 737 field = IssueCustomField.create!(:name => 'Multi user', :field_format => 'user', :multiple => true,
Chris@1115 738 :tracker_ids => [1], :is_for_all => true)
Chris@1115 739 issue = Issue.find(1)
Chris@1115 740 issue.custom_field_values = {field.id => ['2', '3']}
Chris@1115 741 issue.save!
Chris@1115 742
Chris@1115 743 get :index, :set_filter => 1, :c => ['tracker', 'subject', "cf_#{field.id}"]
Chris@1115 744 assert_response :success
Chris@1115 745
Chris@1115 746 assert_select "table.issues td.cf_#{field.id}" do
Chris@1115 747 assert_select 'a', 2
Chris@1115 748 assert_select 'a[href=?]', '/users/2', :text => 'John Smith'
Chris@1115 749 assert_select 'a[href=?]', '/users/3', :text => 'Dave Lopper'
Chris@909 750 end
Chris@909 751 end
Chris@909 752
Chris@1115 753 def test_index_with_date_column
Chris@1115 754 with_settings :date_format => '%d/%m/%Y' do
Chris@1115 755 Issue.find(1).update_attribute :start_date, '1987-08-24'
Chris@1115 756
Chris@1115 757 get :index, :set_filter => 1, :c => %w(start_date)
Chris@1115 758
Chris@1115 759 assert_select "table.issues td.start_date", :text => '24/08/1987'
Chris@1115 760 end
Chris@1115 761 end
Chris@1115 762
Chris@1115 763 def test_index_with_done_ratio_column
Chris@909 764 Issue.find(1).update_attribute :done_ratio, 40
Chris@909 765
Chris@909 766 get :index, :set_filter => 1, :c => %w(done_ratio)
Chris@1115 767
Chris@1115 768 assert_select 'table.issues td.done_ratio' do
Chris@1115 769 assert_select 'table.progress' do
Chris@1115 770 assert_select 'td.closed[style=?]', 'width: 40%;'
Chris@1115 771 end
Chris@1115 772 end
Chris@909 773 end
Chris@909 774
Chris@1115 775 def test_index_with_spent_hours_column
Chris@1115 776 get :index, :set_filter => 1, :c => %w(subject spent_hours)
Chris@1115 777
Chris@1115 778 assert_select 'table.issues tr#issue-3 td.spent_hours', :text => '1.00'
Chris@1115 779 end
Chris@1115 780
Chris@1115 781 def test_index_should_not_show_spent_hours_column_without_permission
Chris@1115 782 Role.anonymous.remove_permission! :view_time_entries
Chris@1115 783 get :index, :set_filter => 1, :c => %w(subject spent_hours)
Chris@1115 784
Chris@1115 785 assert_select 'td.spent_hours', 0
Chris@1115 786 end
Chris@1115 787
Chris@1115 788 def test_index_with_fixed_version_column
Chris@909 789 get :index, :set_filter => 1, :c => %w(fixed_version)
Chris@1115 790
Chris@1115 791 assert_select 'table.issues td.fixed_version' do
Chris@1115 792 assert_select 'a[href=?]', '/versions/2', :text => '1.0'
Chris@1115 793 end
Chris@1115 794 end
Chris@1115 795
Chris@1115 796 def test_index_with_relations_column
Chris@1115 797 IssueRelation.delete_all
Chris@1115 798 IssueRelation.create!(:relation_type => "relates", :issue_from => Issue.find(1), :issue_to => Issue.find(7))
Chris@1115 799 IssueRelation.create!(:relation_type => "relates", :issue_from => Issue.find(8), :issue_to => Issue.find(1))
Chris@1115 800 IssueRelation.create!(:relation_type => "blocks", :issue_from => Issue.find(1), :issue_to => Issue.find(11))
Chris@1115 801 IssueRelation.create!(:relation_type => "blocks", :issue_from => Issue.find(12), :issue_to => Issue.find(2))
Chris@1115 802
Chris@1115 803 get :index, :set_filter => 1, :c => %w(subject relations)
Chris@1115 804 assert_response :success
Chris@1115 805 assert_select "tr#issue-1 td.relations" do
Chris@1115 806 assert_select "span", 3
Chris@1115 807 assert_select "span", :text => "Related to #7"
Chris@1115 808 assert_select "span", :text => "Related to #8"
Chris@1115 809 assert_select "span", :text => "Blocks #11"
Chris@1115 810 end
Chris@1115 811 assert_select "tr#issue-2 td.relations" do
Chris@1115 812 assert_select "span", 1
Chris@1115 813 assert_select "span", :text => "Blocked by #12"
Chris@1115 814 end
Chris@1115 815 assert_select "tr#issue-3 td.relations" do
Chris@1115 816 assert_select "span", 0
Chris@1115 817 end
Chris@1115 818
Chris@1115 819 get :index, :set_filter => 1, :c => %w(relations), :format => 'csv'
Chris@1115 820 assert_response :success
Chris@1115 821 assert_equal 'text/csv; header=present', response.content_type
Chris@1115 822 lines = response.body.chomp.split("\n")
Chris@1115 823 assert_include '1,"Related to #7, Related to #8, Blocks #11"', lines
Chris@1115 824 assert_include '2,Blocked by #12', lines
Chris@1115 825 assert_include '3,""', lines
Chris@1115 826
Chris@1115 827 get :index, :set_filter => 1, :c => %w(subject relations), :format => 'pdf'
Chris@1115 828 assert_response :success
Chris@1115 829 assert_equal 'application/pdf', response.content_type
Chris@1115 830 end
Chris@1115 831
Chris@1115 832 def test_index_with_description_column
Chris@1115 833 get :index, :set_filter => 1, :c => %w(subject description)
Chris@1115 834
Chris@1115 835 assert_select 'table.issues thead th', 3 # columns: chekbox + id + subject
Chris@1115 836 assert_select 'td.description[colspan=3]', :text => 'Unable to print recipes'
Chris@1115 837
Chris@1115 838 get :index, :set_filter => 1, :c => %w(subject description), :format => 'pdf'
Chris@1115 839 assert_response :success
Chris@1115 840 assert_equal 'application/pdf', response.content_type
Chris@909 841 end
Chris@909 842
Chris@909 843 def test_index_send_html_if_query_is_invalid
Chris@909 844 get :index, :f => ['start_date'], :op => {:start_date => '='}
Chris@909 845 assert_equal 'text/html', @response.content_type
Chris@909 846 assert_template 'index'
Chris@909 847 end
Chris@909 848
Chris@909 849 def test_index_send_nothing_if_query_is_invalid
Chris@909 850 get :index, :f => ['start_date'], :op => {:start_date => '='}, :format => 'csv'
Chris@909 851 assert_equal 'text/csv', @response.content_type
Chris@909 852 assert @response.body.blank?
Chris@909 853 end
Chris@909 854
Chris@0 855 def test_show_by_anonymous
Chris@0 856 get :show, :id => 1
Chris@0 857 assert_response :success
Chris@909 858 assert_template 'show'
Chris@0 859 assert_equal Issue.find(1), assigns(:issue)
Chris@441 860
Chris@1115 861 assert_select 'div.issue div.description', :text => /Unable to print recipes/
Chris@1115 862
Chris@0 863 # anonymous role is allowed to add a note
Chris@1115 864 assert_select 'form#issue-form' do
Chris@1115 865 assert_select 'fieldset' do
Chris@1115 866 assert_select 'legend', :text => 'Notes'
Chris@1115 867 assert_select 'textarea[name=?]', 'issue[notes]'
Chris@1115 868 end
Chris@1115 869 end
Chris@1115 870
Chris@1115 871 assert_select 'title', :text => "Bug #1: Can&#x27;t print recipes - eCookbook - Redmine"
Chris@0 872 end
Chris@441 873
Chris@0 874 def test_show_by_manager
Chris@0 875 @request.session[:user_id] = 2
Chris@0 876 get :show, :id => 1
Chris@0 877 assert_response :success
Chris@441 878
Chris@1115 879 assert_select 'a', :text => /Quote/
Chris@1115 880
Chris@1115 881 assert_select 'form#issue-form' do
Chris@1115 882 assert_select 'fieldset' do
Chris@1115 883 assert_select 'legend', :text => 'Change properties'
Chris@1115 884 assert_select 'input[name=?]', 'issue[subject]'
Chris@1115 885 end
Chris@1115 886 assert_select 'fieldset' do
Chris@1115 887 assert_select 'legend', :text => 'Log time'
Chris@1115 888 assert_select 'input[name=?]', 'time_entry[hours]'
Chris@1115 889 end
Chris@1115 890 assert_select 'fieldset' do
Chris@1115 891 assert_select 'legend', :text => 'Notes'
Chris@1115 892 assert_select 'textarea[name=?]', 'issue[notes]'
Chris@1115 893 end
Chris@1115 894 end
Chris@0 895 end
Chris@441 896
Chris@1115 897 def test_show_should_display_update_form
Chris@909 898 @request.session[:user_id] = 2
Chris@909 899 get :show, :id => 1
Chris@909 900 assert_response :success
Chris@909 901
Chris@1115 902 assert_tag 'form', :attributes => {:id => 'issue-form'}
Chris@1115 903 assert_tag 'input', :attributes => {:name => 'issue[is_private]'}
Chris@1115 904 assert_tag 'select', :attributes => {:name => 'issue[project_id]'}
Chris@1115 905 assert_tag 'select', :attributes => {:name => 'issue[tracker_id]'}
Chris@1115 906 assert_tag 'input', :attributes => {:name => 'issue[subject]'}
Chris@1115 907 assert_tag 'textarea', :attributes => {:name => 'issue[description]'}
Chris@1115 908 assert_tag 'select', :attributes => {:name => 'issue[status_id]'}
Chris@1115 909 assert_tag 'select', :attributes => {:name => 'issue[priority_id]'}
Chris@1115 910 assert_tag 'select', :attributes => {:name => 'issue[assigned_to_id]'}
Chris@1115 911 assert_tag 'select', :attributes => {:name => 'issue[category_id]'}
Chris@1115 912 assert_tag 'select', :attributes => {:name => 'issue[fixed_version_id]'}
Chris@1115 913 assert_tag 'input', :attributes => {:name => 'issue[parent_issue_id]'}
Chris@1115 914 assert_tag 'input', :attributes => {:name => 'issue[start_date]'}
Chris@1115 915 assert_tag 'input', :attributes => {:name => 'issue[due_date]'}
Chris@1115 916 assert_tag 'select', :attributes => {:name => 'issue[done_ratio]'}
Chris@1115 917 assert_tag 'input', :attributes => { :name => 'issue[custom_field_values][2]' }
Chris@1115 918 assert_no_tag 'input', :attributes => {:name => 'issue[watcher_user_ids][]'}
Chris@1115 919 assert_tag 'textarea', :attributes => {:name => 'issue[notes]'}
Chris@1115 920 end
Chris@1115 921
Chris@1115 922 def test_show_should_display_update_form_with_minimal_permissions
Chris@1115 923 Role.find(1).update_attribute :permissions, [:view_issues, :add_issue_notes]
Chris@1115 924 WorkflowTransition.delete_all :role_id => 1
Chris@1115 925
Chris@1115 926 @request.session[:user_id] = 2
Chris@1115 927 get :show, :id => 1
Chris@1115 928 assert_response :success
Chris@1115 929
Chris@1115 930 assert_tag 'form', :attributes => {:id => 'issue-form'}
Chris@1115 931 assert_no_tag 'input', :attributes => {:name => 'issue[is_private]'}
Chris@1115 932 assert_no_tag 'select', :attributes => {:name => 'issue[project_id]'}
Chris@1115 933 assert_no_tag 'select', :attributes => {:name => 'issue[tracker_id]'}
Chris@1115 934 assert_no_tag 'input', :attributes => {:name => 'issue[subject]'}
Chris@1115 935 assert_no_tag 'textarea', :attributes => {:name => 'issue[description]'}
Chris@1115 936 assert_no_tag 'select', :attributes => {:name => 'issue[status_id]'}
Chris@1115 937 assert_no_tag 'select', :attributes => {:name => 'issue[priority_id]'}
Chris@1115 938 assert_no_tag 'select', :attributes => {:name => 'issue[assigned_to_id]'}
Chris@1115 939 assert_no_tag 'select', :attributes => {:name => 'issue[category_id]'}
Chris@1115 940 assert_no_tag 'select', :attributes => {:name => 'issue[fixed_version_id]'}
Chris@1115 941 assert_no_tag 'input', :attributes => {:name => 'issue[parent_issue_id]'}
Chris@1115 942 assert_no_tag 'input', :attributes => {:name => 'issue[start_date]'}
Chris@1115 943 assert_no_tag 'input', :attributes => {:name => 'issue[due_date]'}
Chris@1115 944 assert_no_tag 'select', :attributes => {:name => 'issue[done_ratio]'}
Chris@1115 945 assert_no_tag 'input', :attributes => { :name => 'issue[custom_field_values][2]' }
Chris@1115 946 assert_no_tag 'input', :attributes => {:name => 'issue[watcher_user_ids][]'}
Chris@1115 947 assert_tag 'textarea', :attributes => {:name => 'issue[notes]'}
Chris@1115 948 end
Chris@1115 949
Chris@1115 950 def test_show_should_display_update_form_with_workflow_permissions
Chris@1115 951 Role.find(1).update_attribute :permissions, [:view_issues, :add_issue_notes]
Chris@1115 952
Chris@1115 953 @request.session[:user_id] = 2
Chris@1115 954 get :show, :id => 1
Chris@1115 955 assert_response :success
Chris@1115 956
Chris@1115 957 assert_tag 'form', :attributes => {:id => 'issue-form'}
Chris@1115 958 assert_no_tag 'input', :attributes => {:name => 'issue[is_private]'}
Chris@1115 959 assert_no_tag 'select', :attributes => {:name => 'issue[project_id]'}
Chris@1115 960 assert_no_tag 'select', :attributes => {:name => 'issue[tracker_id]'}
Chris@1115 961 assert_no_tag 'input', :attributes => {:name => 'issue[subject]'}
Chris@1115 962 assert_no_tag 'textarea', :attributes => {:name => 'issue[description]'}
Chris@1115 963 assert_tag 'select', :attributes => {:name => 'issue[status_id]'}
Chris@1115 964 assert_no_tag 'select', :attributes => {:name => 'issue[priority_id]'}
Chris@1115 965 assert_tag 'select', :attributes => {:name => 'issue[assigned_to_id]'}
Chris@1115 966 assert_no_tag 'select', :attributes => {:name => 'issue[category_id]'}
Chris@1115 967 assert_tag 'select', :attributes => {:name => 'issue[fixed_version_id]'}
Chris@1115 968 assert_no_tag 'input', :attributes => {:name => 'issue[parent_issue_id]'}
Chris@1115 969 assert_no_tag 'input', :attributes => {:name => 'issue[start_date]'}
Chris@1115 970 assert_no_tag 'input', :attributes => {:name => 'issue[due_date]'}
Chris@1115 971 assert_tag 'select', :attributes => {:name => 'issue[done_ratio]'}
Chris@1115 972 assert_no_tag 'input', :attributes => { :name => 'issue[custom_field_values][2]' }
Chris@1115 973 assert_no_tag 'input', :attributes => {:name => 'issue[watcher_user_ids][]'}
Chris@1115 974 assert_tag 'textarea', :attributes => {:name => 'issue[notes]'}
Chris@1115 975 end
Chris@1115 976
Chris@1115 977 def test_show_should_not_display_update_form_without_permissions
Chris@1115 978 Role.find(1).update_attribute :permissions, [:view_issues]
Chris@1115 979
Chris@1115 980 @request.session[:user_id] = 2
Chris@1115 981 get :show, :id => 1
Chris@1115 982 assert_response :success
Chris@1115 983
Chris@1115 984 assert_select 'form#issue-form', 0
Chris@1115 985 end
Chris@1115 986
Chris@1115 987 def test_update_form_should_not_display_inactive_enumerations
Chris@1115 988 assert !IssuePriority.find(15).active?
Chris@1115 989
Chris@1115 990 @request.session[:user_id] = 2
Chris@1115 991 get :show, :id => 1
Chris@1115 992 assert_response :success
Chris@1115 993
Chris@1115 994 assert_select 'form#issue-form' do
Chris@1115 995 assert_select 'select[name=?]', 'issue[priority_id]' do
Chris@1115 996 assert_select 'option[value=4]'
Chris@1115 997 assert_select 'option[value=15]', 0
Chris@1115 998 end
Chris@1115 999 end
Chris@909 1000 end
Chris@909 1001
Chris@909 1002 def test_update_form_should_allow_attachment_upload
Chris@909 1003 @request.session[:user_id] = 2
Chris@909 1004 get :show, :id => 1
Chris@909 1005
Chris@1115 1006 assert_select 'form#issue-form[method=post][enctype=multipart/form-data]' do
Chris@1115 1007 assert_select 'input[type=file][name=?]', 'attachments[1][file]'
Chris@1115 1008 end
Chris@909 1009 end
Chris@909 1010
Chris@0 1011 def test_show_should_deny_anonymous_access_without_permission
Chris@0 1012 Role.anonymous.remove_permission!(:view_issues)
Chris@0 1013 get :show, :id => 1
Chris@0 1014 assert_response :redirect
Chris@0 1015 end
Chris@441 1016
Chris@441 1017 def test_show_should_deny_anonymous_access_to_private_issue
Chris@441 1018 Issue.update_all(["is_private = ?", true], "id = 1")
Chris@441 1019 get :show, :id => 1
Chris@441 1020 assert_response :redirect
Chris@441 1021 end
Chris@441 1022
Chris@0 1023 def test_show_should_deny_non_member_access_without_permission
Chris@0 1024 Role.non_member.remove_permission!(:view_issues)
Chris@0 1025 @request.session[:user_id] = 9
Chris@0 1026 get :show, :id => 1
Chris@0 1027 assert_response 403
Chris@0 1028 end
Chris@441 1029
Chris@441 1030 def test_show_should_deny_non_member_access_to_private_issue
Chris@441 1031 Issue.update_all(["is_private = ?", true], "id = 1")
Chris@441 1032 @request.session[:user_id] = 9
Chris@441 1033 get :show, :id => 1
Chris@441 1034 assert_response 403
Chris@441 1035 end
Chris@441 1036
Chris@0 1037 def test_show_should_deny_member_access_without_permission
Chris@0 1038 Role.find(1).remove_permission!(:view_issues)
Chris@0 1039 @request.session[:user_id] = 2
Chris@0 1040 get :show, :id => 1
Chris@0 1041 assert_response 403
Chris@0 1042 end
Chris@441 1043
Chris@441 1044 def test_show_should_deny_member_access_to_private_issue_without_permission
Chris@441 1045 Issue.update_all(["is_private = ?", true], "id = 1")
Chris@441 1046 @request.session[:user_id] = 3
Chris@441 1047 get :show, :id => 1
Chris@441 1048 assert_response 403
Chris@441 1049 end
Chris@441 1050
Chris@441 1051 def test_show_should_allow_author_access_to_private_issue
Chris@441 1052 Issue.update_all(["is_private = ?, author_id = 3", true], "id = 1")
Chris@441 1053 @request.session[:user_id] = 3
Chris@441 1054 get :show, :id => 1
Chris@441 1055 assert_response :success
Chris@441 1056 end
Chris@441 1057
Chris@441 1058 def test_show_should_allow_assignee_access_to_private_issue
Chris@441 1059 Issue.update_all(["is_private = ?, assigned_to_id = 3", true], "id = 1")
Chris@441 1060 @request.session[:user_id] = 3
Chris@441 1061 get :show, :id => 1
Chris@441 1062 assert_response :success
Chris@441 1063 end
Chris@441 1064
Chris@441 1065 def test_show_should_allow_member_access_to_private_issue_with_permission
Chris@441 1066 Issue.update_all(["is_private = ?", true], "id = 1")
Chris@441 1067 User.find(3).roles_for_project(Project.find(1)).first.update_attribute :issues_visibility, 'all'
Chris@441 1068 @request.session[:user_id] = 3
Chris@441 1069 get :show, :id => 1
Chris@441 1070 assert_response :success
Chris@441 1071 end
Chris@441 1072
Chris@0 1073 def test_show_should_not_disclose_relations_to_invisible_issues
Chris@0 1074 Setting.cross_project_issue_relations = '1'
Chris@0 1075 IssueRelation.create!(:issue_from => Issue.find(1), :issue_to => Issue.find(2), :relation_type => 'relates')
Chris@0 1076 # Relation to a private project issue
Chris@0 1077 IssueRelation.create!(:issue_from => Issue.find(1), :issue_to => Issue.find(4), :relation_type => 'relates')
Chris@441 1078
Chris@0 1079 get :show, :id => 1
Chris@0 1080 assert_response :success
Chris@441 1081
Chris@1115 1082 assert_select 'div#relations' do
Chris@1115 1083 assert_select 'a', :text => /#2$/
Chris@1115 1084 assert_select 'a', :text => /#4$/, :count => 0
Chris@1115 1085 end
Chris@1115 1086 end
Chris@1115 1087
Chris@1115 1088 def test_show_should_list_subtasks
Chris@1115 1089 Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :parent_issue_id => 1, :subject => 'Child Issue')
Chris@1115 1090
Chris@1115 1091 get :show, :id => 1
Chris@1115 1092 assert_response :success
Chris@1115 1093
Chris@1115 1094 assert_select 'div#issue_tree' do
Chris@1115 1095 assert_select 'td.subject', :text => /Child Issue/
Chris@1115 1096 end
Chris@1115 1097 end
Chris@1115 1098
Chris@1115 1099 def test_show_should_list_parents
Chris@1115 1100 issue = Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :parent_issue_id => 1, :subject => 'Child Issue')
Chris@1115 1101
Chris@1115 1102 get :show, :id => issue.id
Chris@1115 1103 assert_response :success
Chris@1115 1104
Chris@1115 1105 assert_select 'div.subject' do
Chris@1115 1106 assert_select 'h3', 'Child Issue'
Chris@1115 1107 assert_select 'a[href=/issues/1]'
Chris@1115 1108 end
Chris@1115 1109 end
Chris@1115 1110
Chris@1115 1111 def test_show_should_not_display_prev_next_links_without_query_in_session
Chris@1115 1112 get :show, :id => 1
Chris@1115 1113 assert_response :success
Chris@1115 1114 assert_nil assigns(:prev_issue_id)
Chris@1115 1115 assert_nil assigns(:next_issue_id)
Chris@1115 1116
Chris@1115 1117 assert_select 'div.next-prev-links', 0
Chris@1115 1118 end
Chris@1115 1119
Chris@1115 1120 def test_show_should_display_prev_next_links_with_query_in_session
Chris@1115 1121 @request.session[:query] = {:filters => {'status_id' => {:values => [''], :operator => 'o'}}, :project_id => nil}
Chris@1115 1122 @request.session['issues_index_sort'] = 'id'
Chris@1115 1123
Chris@1115 1124 with_settings :display_subprojects_issues => '0' do
Chris@1115 1125 get :show, :id => 3
Chris@1115 1126 end
Chris@1115 1127
Chris@1115 1128 assert_response :success
Chris@1115 1129 # Previous and next issues for all projects
Chris@1115 1130 assert_equal 2, assigns(:prev_issue_id)
Chris@1115 1131 assert_equal 5, assigns(:next_issue_id)
Chris@1115 1132
Chris@1115 1133 count = Issue.open.visible.count
Chris@1115 1134
Chris@1115 1135 assert_select 'div.next-prev-links' do
Chris@1115 1136 assert_select 'a[href=/issues/2]', :text => /Previous/
Chris@1115 1137 assert_select 'a[href=/issues/5]', :text => /Next/
Chris@1115 1138 assert_select 'span.position', :text => "3 of #{count}"
Chris@1115 1139 end
Chris@1115 1140 end
Chris@1115 1141
Chris@1115 1142 def test_show_should_display_prev_next_links_with_saved_query_in_session
Chris@1115 1143 query = Query.create!(:name => 'test', :is_public => true, :user_id => 1,
Chris@1115 1144 :filters => {'status_id' => {:values => ['5'], :operator => '='}},
Chris@1115 1145 :sort_criteria => [['id', 'asc']])
Chris@1115 1146 @request.session[:query] = {:id => query.id, :project_id => nil}
Chris@1115 1147
Chris@1115 1148 get :show, :id => 11
Chris@1115 1149
Chris@1115 1150 assert_response :success
Chris@1115 1151 assert_equal query, assigns(:query)
Chris@1115 1152 # Previous and next issues for all projects
Chris@1115 1153 assert_equal 8, assigns(:prev_issue_id)
Chris@1115 1154 assert_equal 12, assigns(:next_issue_id)
Chris@1115 1155
Chris@1115 1156 assert_select 'div.next-prev-links' do
Chris@1115 1157 assert_select 'a[href=/issues/8]', :text => /Previous/
Chris@1115 1158 assert_select 'a[href=/issues/12]', :text => /Next/
Chris@1115 1159 end
Chris@1115 1160 end
Chris@1115 1161
Chris@1115 1162 def test_show_should_display_prev_next_links_with_query_and_sort_on_association
Chris@1115 1163 @request.session[:query] = {:filters => {'status_id' => {:values => [''], :operator => 'o'}}, :project_id => nil}
Chris@1115 1164
Chris@1115 1165 %w(project tracker status priority author assigned_to category fixed_version).each do |assoc_sort|
Chris@1115 1166 @request.session['issues_index_sort'] = assoc_sort
Chris@1115 1167
Chris@1115 1168 get :show, :id => 3
Chris@1115 1169 assert_response :success, "Wrong response status for #{assoc_sort} sort"
Chris@1115 1170
Chris@1115 1171 assert_select 'div.next-prev-links' do
Chris@1115 1172 assert_select 'a', :text => /(Previous|Next)/
Chris@1115 1173 end
Chris@1115 1174 end
Chris@1115 1175 end
Chris@1115 1176
Chris@1115 1177 def test_show_should_display_prev_next_links_with_project_query_in_session
Chris@1115 1178 @request.session[:query] = {:filters => {'status_id' => {:values => [''], :operator => 'o'}}, :project_id => 1}
Chris@1115 1179 @request.session['issues_index_sort'] = 'id'
Chris@1115 1180
Chris@1115 1181 with_settings :display_subprojects_issues => '0' do
Chris@1115 1182 get :show, :id => 3
Chris@1115 1183 end
Chris@1115 1184
Chris@1115 1185 assert_response :success
Chris@1115 1186 # Previous and next issues inside project
Chris@1115 1187 assert_equal 2, assigns(:prev_issue_id)
Chris@1115 1188 assert_equal 7, assigns(:next_issue_id)
Chris@1115 1189
Chris@1115 1190 assert_select 'div.next-prev-links' do
Chris@1115 1191 assert_select 'a[href=/issues/2]', :text => /Previous/
Chris@1115 1192 assert_select 'a[href=/issues/7]', :text => /Next/
Chris@1115 1193 end
Chris@1115 1194 end
Chris@1115 1195
Chris@1115 1196 def test_show_should_not_display_prev_link_for_first_issue
Chris@1115 1197 @request.session[:query] = {:filters => {'status_id' => {:values => [''], :operator => 'o'}}, :project_id => 1}
Chris@1115 1198 @request.session['issues_index_sort'] = 'id'
Chris@1115 1199
Chris@1115 1200 with_settings :display_subprojects_issues => '0' do
Chris@1115 1201 get :show, :id => 1
Chris@1115 1202 end
Chris@1115 1203
Chris@1115 1204 assert_response :success
Chris@1115 1205 assert_nil assigns(:prev_issue_id)
Chris@1115 1206 assert_equal 2, assigns(:next_issue_id)
Chris@1115 1207
Chris@1115 1208 assert_select 'div.next-prev-links' do
Chris@1115 1209 assert_select 'a', :text => /Previous/, :count => 0
Chris@1115 1210 assert_select 'a[href=/issues/2]', :text => /Next/
Chris@1115 1211 end
Chris@1115 1212 end
Chris@1115 1213
Chris@1115 1214 def test_show_should_not_display_prev_next_links_for_issue_not_in_query_results
Chris@1115 1215 @request.session[:query] = {:filters => {'status_id' => {:values => [''], :operator => 'c'}}, :project_id => 1}
Chris@1115 1216 @request.session['issues_index_sort'] = 'id'
Chris@1115 1217
Chris@1115 1218 get :show, :id => 1
Chris@1115 1219
Chris@1115 1220 assert_response :success
Chris@1115 1221 assert_nil assigns(:prev_issue_id)
Chris@1115 1222 assert_nil assigns(:next_issue_id)
Chris@1115 1223
Chris@1115 1224 assert_select 'a', :text => /Previous/, :count => 0
Chris@1115 1225 assert_select 'a', :text => /Next/, :count => 0
Chris@1115 1226 end
Chris@1115 1227
Chris@1115 1228 def test_show_show_should_display_prev_next_links_with_query_sort_by_user_custom_field
Chris@1115 1229 cf = IssueCustomField.create!(:name => 'User', :is_for_all => true, :tracker_ids => [1,2,3], :field_format => 'user')
Chris@1115 1230 CustomValue.create!(:custom_field => cf, :customized => Issue.find(1), :value => '2')
Chris@1115 1231 CustomValue.create!(:custom_field => cf, :customized => Issue.find(2), :value => '3')
Chris@1115 1232 CustomValue.create!(:custom_field => cf, :customized => Issue.find(3), :value => '3')
Chris@1115 1233 CustomValue.create!(:custom_field => cf, :customized => Issue.find(5), :value => '')
Chris@1115 1234
Chris@1115 1235 query = Query.create!(:name => 'test', :is_public => true, :user_id => 1, :filters => {},
Chris@1115 1236 :sort_criteria => [["cf_#{cf.id}", 'asc'], ['id', 'asc']])
Chris@1115 1237 @request.session[:query] = {:id => query.id, :project_id => nil}
Chris@1115 1238
Chris@1115 1239 get :show, :id => 3
Chris@1115 1240 assert_response :success
Chris@1115 1241
Chris@1115 1242 assert_equal 2, assigns(:prev_issue_id)
Chris@1115 1243 assert_equal 1, assigns(:next_issue_id)
Chris@1115 1244
Chris@1115 1245 assert_select 'div.next-prev-links' do
Chris@1115 1246 assert_select 'a[href=/issues/2]', :text => /Previous/
Chris@1115 1247 assert_select 'a[href=/issues/1]', :text => /Next/
Chris@1115 1248 end
Chris@1115 1249 end
Chris@1115 1250
Chris@1115 1251 def test_show_should_display_link_to_the_assignee
Chris@1115 1252 get :show, :id => 2
Chris@1115 1253 assert_response :success
Chris@1115 1254 assert_select '.assigned-to' do
Chris@1115 1255 assert_select 'a[href=/users/3]'
Chris@1115 1256 end
Chris@1115 1257 end
Chris@1115 1258
Chris@1115 1259 def test_show_should_display_visible_changesets_from_other_projects
Chris@1115 1260 project = Project.find(2)
Chris@1115 1261 issue = project.issues.first
Chris@1115 1262 issue.changeset_ids = [102]
Chris@1115 1263 issue.save!
Chris@1115 1264 # changesets from other projects should be displayed even if repository
Chris@1115 1265 # is disabled on issue's project
Chris@1115 1266 project.disable_module! :repository
Chris@1115 1267
Chris@1115 1268 @request.session[:user_id] = 2
Chris@1115 1269 get :show, :id => issue.id
Chris@1115 1270
Chris@1115 1271 assert_select 'a[href=?]', '/projects/ecookbook/repository/revisions/3'
Chris@1115 1272 end
Chris@1115 1273
Chris@1115 1274 def test_show_should_display_watchers
Chris@1115 1275 @request.session[:user_id] = 2
Chris@1115 1276 Issue.find(1).add_watcher User.find(2)
Chris@1115 1277
Chris@1115 1278 get :show, :id => 1
Chris@1115 1279 assert_select 'div#watchers ul' do
Chris@1115 1280 assert_select 'li' do
Chris@1115 1281 assert_select 'a[href=/users/2]'
Chris@1115 1282 assert_select 'a img[alt=Delete]'
Chris@1115 1283 end
Chris@1115 1284 end
Chris@1115 1285 end
Chris@1115 1286
Chris@1115 1287 def test_show_should_display_watchers_with_gravatars
Chris@1115 1288 @request.session[:user_id] = 2
Chris@1115 1289 Issue.find(1).add_watcher User.find(2)
Chris@1115 1290
Chris@1115 1291 with_settings :gravatar_enabled => '1' do
Chris@1115 1292 get :show, :id => 1
Chris@1115 1293 end
Chris@1115 1294
Chris@1115 1295 assert_select 'div#watchers ul' do
Chris@1115 1296 assert_select 'li' do
Chris@1115 1297 assert_select 'img.gravatar'
Chris@1115 1298 assert_select 'a[href=/users/2]'
Chris@1115 1299 assert_select 'a img[alt=Delete]'
Chris@1115 1300 end
Chris@1115 1301 end
Chris@1115 1302 end
Chris@1115 1303
Chris@1115 1304 def test_show_with_thumbnails_enabled_should_display_thumbnails
Chris@1115 1305 @request.session[:user_id] = 2
Chris@1115 1306
Chris@1115 1307 with_settings :thumbnails_enabled => '1' do
Chris@1115 1308 get :show, :id => 14
Chris@1115 1309 assert_response :success
Chris@1115 1310 end
Chris@1115 1311
Chris@1115 1312 assert_select 'div.thumbnails' do
Chris@1115 1313 assert_select 'a[href=/attachments/16/testfile.png]' do
Chris@1115 1314 assert_select 'img[src=/attachments/thumbnail/16]'
Chris@1115 1315 end
Chris@1115 1316 end
Chris@1115 1317 end
Chris@1115 1318
Chris@1115 1319 def test_show_with_thumbnails_disabled_should_not_display_thumbnails
Chris@1115 1320 @request.session[:user_id] = 2
Chris@1115 1321
Chris@1115 1322 with_settings :thumbnails_enabled => '0' do
Chris@1115 1323 get :show, :id => 14
Chris@1115 1324 assert_response :success
Chris@1115 1325 end
Chris@1115 1326
Chris@1115 1327 assert_select 'div.thumbnails', 0
Chris@1115 1328 end
Chris@1115 1329
Chris@1115 1330 def test_show_with_multi_custom_field
Chris@1115 1331 field = CustomField.find(1)
Chris@1115 1332 field.update_attribute :multiple, true
Chris@1115 1333 issue = Issue.find(1)
Chris@1115 1334 issue.custom_field_values = {1 => ['MySQL', 'Oracle']}
Chris@1115 1335 issue.save!
Chris@1115 1336
Chris@1115 1337 get :show, :id => 1
Chris@1115 1338 assert_response :success
Chris@1115 1339
Chris@1115 1340 assert_select 'td', :text => 'MySQL, Oracle'
Chris@1115 1341 end
Chris@1115 1342
Chris@1115 1343 def test_show_with_multi_user_custom_field
Chris@1115 1344 field = IssueCustomField.create!(:name => 'Multi user', :field_format => 'user', :multiple => true,
Chris@1115 1345 :tracker_ids => [1], :is_for_all => true)
Chris@1115 1346 issue = Issue.find(1)
Chris@1115 1347 issue.custom_field_values = {field.id => ['2', '3']}
Chris@1115 1348 issue.save!
Chris@1115 1349
Chris@1115 1350 get :show, :id => 1
Chris@1115 1351 assert_response :success
Chris@1115 1352
Chris@1115 1353 # TODO: should display links
Chris@1115 1354 assert_select 'td', :text => 'Dave Lopper, John Smith'
Chris@1115 1355 end
Chris@1115 1356
Chris@1115 1357 def test_show_should_display_private_notes_with_permission_only
Chris@1115 1358 journal = Journal.create!(:journalized => Issue.find(2), :notes => 'Privates notes', :private_notes => true, :user_id => 1)
Chris@1115 1359 @request.session[:user_id] = 2
Chris@1115 1360
Chris@1115 1361 get :show, :id => 2
Chris@1115 1362 assert_response :success
Chris@1115 1363 assert_include journal, assigns(:journals)
Chris@1115 1364
Chris@1115 1365 Role.find(1).remove_permission! :view_private_notes
Chris@1115 1366 get :show, :id => 2
Chris@1115 1367 assert_response :success
Chris@1115 1368 assert_not_include journal, assigns(:journals)
Chris@0 1369 end
Chris@441 1370
Chris@0 1371 def test_show_atom
Chris@0 1372 get :show, :id => 2, :format => 'atom'
Chris@0 1373 assert_response :success
Chris@909 1374 assert_template 'journals/index'
Chris@0 1375 # Inline image
Chris@0 1376 assert_select 'content', :text => Regexp.new(Regexp.quote('http://test.host/attachments/download/10'))
Chris@0 1377 end
Chris@441 1378
Chris@0 1379 def test_show_export_to_pdf
Chris@0 1380 get :show, :id => 3, :format => 'pdf'
Chris@0 1381 assert_response :success
Chris@0 1382 assert_equal 'application/pdf', @response.content_type
Chris@0 1383 assert @response.body.starts_with?('%PDF')
Chris@0 1384 assert_not_nil assigns(:issue)
Chris@0 1385 end
Chris@0 1386
Chris@1115 1387 def test_show_export_to_pdf_with_ancestors
Chris@1115 1388 issue = Issue.generate!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'child', :parent_issue_id => 1)
Chris@1115 1389
Chris@1115 1390 get :show, :id => issue.id, :format => 'pdf'
Chris@1115 1391 assert_response :success
Chris@1115 1392 assert_equal 'application/pdf', @response.content_type
Chris@1115 1393 assert @response.body.starts_with?('%PDF')
Chris@1115 1394 end
Chris@1115 1395
Chris@1115 1396 def test_show_export_to_pdf_with_descendants
Chris@1115 1397 c1 = Issue.generate!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'child', :parent_issue_id => 1)
Chris@1115 1398 c2 = Issue.generate!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'child', :parent_issue_id => 1)
Chris@1115 1399 c3 = Issue.generate!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'child', :parent_issue_id => c1.id)
Chris@1115 1400
Chris@1115 1401 get :show, :id => 1, :format => 'pdf'
Chris@1115 1402 assert_response :success
Chris@1115 1403 assert_equal 'application/pdf', @response.content_type
Chris@1115 1404 assert @response.body.starts_with?('%PDF')
Chris@1115 1405 end
Chris@1115 1406
Chris@1115 1407 def test_show_export_to_pdf_with_journals
Chris@1115 1408 get :show, :id => 1, :format => 'pdf'
Chris@1115 1409 assert_response :success
Chris@1115 1410 assert_equal 'application/pdf', @response.content_type
Chris@1115 1411 assert @response.body.starts_with?('%PDF')
Chris@1115 1412 end
Chris@1115 1413
Chris@1115 1414 def test_show_export_to_pdf_with_changesets
Chris@1115 1415 Issue.find(3).changesets = Changeset.find_all_by_id(100, 101, 102)
Chris@1115 1416
Chris@1115 1417 get :show, :id => 3, :format => 'pdf'
Chris@1115 1418 assert_response :success
Chris@1115 1419 assert_equal 'application/pdf', @response.content_type
Chris@1115 1420 assert @response.body.starts_with?('%PDF')
Chris@1115 1421 end
Chris@1115 1422
Chris@0 1423 def test_get_new
Chris@0 1424 @request.session[:user_id] = 2
Chris@0 1425 get :new, :project_id => 1, :tracker_id => 1
Chris@0 1426 assert_response :success
Chris@0 1427 assert_template 'new'
Chris@441 1428
Chris@1115 1429 assert_tag 'input', :attributes => {:name => 'issue[is_private]'}
Chris@1115 1430 assert_no_tag 'select', :attributes => {:name => 'issue[project_id]'}
Chris@1115 1431 assert_tag 'select', :attributes => {:name => 'issue[tracker_id]'}
Chris@1115 1432 assert_tag 'input', :attributes => {:name => 'issue[subject]'}
Chris@1115 1433 assert_tag 'textarea', :attributes => {:name => 'issue[description]'}
Chris@1115 1434 assert_tag 'select', :attributes => {:name => 'issue[status_id]'}
Chris@1115 1435 assert_tag 'select', :attributes => {:name => 'issue[priority_id]'}
Chris@1115 1436 assert_tag 'select', :attributes => {:name => 'issue[assigned_to_id]'}
Chris@1115 1437 assert_tag 'select', :attributes => {:name => 'issue[category_id]'}
Chris@1115 1438 assert_tag 'select', :attributes => {:name => 'issue[fixed_version_id]'}
Chris@1115 1439 assert_tag 'input', :attributes => {:name => 'issue[parent_issue_id]'}
Chris@1115 1440 assert_tag 'input', :attributes => {:name => 'issue[start_date]'}
Chris@1115 1441 assert_tag 'input', :attributes => {:name => 'issue[due_date]'}
Chris@1115 1442 assert_tag 'select', :attributes => {:name => 'issue[done_ratio]'}
Chris@1115 1443 assert_tag 'input', :attributes => { :name => 'issue[custom_field_values][2]', :value => 'Default string' }
Chris@1115 1444 assert_tag 'input', :attributes => {:name => 'issue[watcher_user_ids][]'}
Chris@909 1445
Chris@909 1446 # Be sure we don't display inactive IssuePriorities
Chris@909 1447 assert ! IssuePriority.find(15).active?
Chris@909 1448 assert_no_tag :option, :attributes => {:value => '15'},
Chris@909 1449 :parent => {:tag => 'select', :attributes => {:id => 'issue_priority_id'} }
Chris@909 1450 end
Chris@909 1451
Chris@1115 1452 def test_get_new_with_minimal_permissions
Chris@1115 1453 Role.find(1).update_attribute :permissions, [:add_issues]
Chris@1115 1454 WorkflowTransition.delete_all :role_id => 1
Chris@909 1455
Chris@909 1456 @request.session[:user_id] = 2
Chris@909 1457 get :new, :project_id => 1, :tracker_id => 1
Chris@909 1458 assert_response :success
Chris@909 1459 assert_template 'new'
Chris@909 1460
Chris@1115 1461 assert_no_tag 'input', :attributes => {:name => 'issue[is_private]'}
Chris@1115 1462 assert_no_tag 'select', :attributes => {:name => 'issue[project_id]'}
Chris@1115 1463 assert_tag 'select', :attributes => {:name => 'issue[tracker_id]'}
Chris@1115 1464 assert_tag 'input', :attributes => {:name => 'issue[subject]'}
Chris@1115 1465 assert_tag 'textarea', :attributes => {:name => 'issue[description]'}
Chris@1115 1466 assert_tag 'select', :attributes => {:name => 'issue[status_id]'}
Chris@1115 1467 assert_tag 'select', :attributes => {:name => 'issue[priority_id]'}
Chris@1115 1468 assert_tag 'select', :attributes => {:name => 'issue[assigned_to_id]'}
Chris@1115 1469 assert_tag 'select', :attributes => {:name => 'issue[category_id]'}
Chris@1115 1470 assert_tag 'select', :attributes => {:name => 'issue[fixed_version_id]'}
Chris@1115 1471 assert_no_tag 'input', :attributes => {:name => 'issue[parent_issue_id]'}
Chris@1115 1472 assert_tag 'input', :attributes => {:name => 'issue[start_date]'}
Chris@1115 1473 assert_tag 'input', :attributes => {:name => 'issue[due_date]'}
Chris@1115 1474 assert_tag 'select', :attributes => {:name => 'issue[done_ratio]'}
Chris@1115 1475 assert_tag 'input', :attributes => { :name => 'issue[custom_field_values][2]', :value => 'Default string' }
Chris@1115 1476 assert_no_tag 'input', :attributes => {:name => 'issue[watcher_user_ids][]'}
Chris@909 1477 end
Chris@909 1478
Chris@1115 1479 def test_get_new_with_list_custom_field
Chris@909 1480 @request.session[:user_id] = 2
Chris@909 1481 get :new, :project_id => 1, :tracker_id => 1
Chris@909 1482 assert_response :success
Chris@909 1483 assert_template 'new'
Chris@909 1484
Chris@1115 1485 assert_select 'select.list_cf[name=?]', 'issue[custom_field_values][1]' do
Chris@1115 1486 assert_select 'option', 4
Chris@1115 1487 assert_select 'option[value=MySQL]', :text => 'MySQL'
Chris@1115 1488 end
Chris@1115 1489 end
Chris@1115 1490
Chris@1115 1491 def test_get_new_with_multi_custom_field
Chris@1115 1492 field = IssueCustomField.find(1)
Chris@1115 1493 field.update_attribute :multiple, true
Chris@1115 1494
Chris@1115 1495 @request.session[:user_id] = 2
Chris@1115 1496 get :new, :project_id => 1, :tracker_id => 1
Chris@1115 1497 assert_response :success
Chris@1115 1498 assert_template 'new'
Chris@1115 1499
Chris@1115 1500 assert_select 'select[name=?][multiple=multiple]', 'issue[custom_field_values][1][]' do
Chris@1115 1501 assert_select 'option', 3
Chris@1115 1502 assert_select 'option[value=MySQL]', :text => 'MySQL'
Chris@1115 1503 end
Chris@1115 1504 assert_select 'input[name=?][type=hidden][value=?]', 'issue[custom_field_values][1][]', ''
Chris@1115 1505 end
Chris@1115 1506
Chris@1115 1507 def test_get_new_with_multi_user_custom_field
Chris@1115 1508 field = IssueCustomField.create!(:name => 'Multi user', :field_format => 'user', :multiple => true,
Chris@1115 1509 :tracker_ids => [1], :is_for_all => true)
Chris@1115 1510
Chris@1115 1511 @request.session[:user_id] = 2
Chris@1115 1512 get :new, :project_id => 1, :tracker_id => 1
Chris@1115 1513 assert_response :success
Chris@1115 1514 assert_template 'new'
Chris@1115 1515
Chris@1115 1516 assert_select 'select[name=?][multiple=multiple]', "issue[custom_field_values][#{field.id}][]" do
Chris@1115 1517 assert_select 'option', Project.find(1).users.count
Chris@1115 1518 assert_select 'option[value=2]', :text => 'John Smith'
Chris@1115 1519 end
Chris@1115 1520 assert_select 'input[name=?][type=hidden][value=?]', "issue[custom_field_values][#{field.id}][]", ''
Chris@1115 1521 end
Chris@1115 1522
Chris@1115 1523 def test_get_new_with_date_custom_field
Chris@1115 1524 field = IssueCustomField.create!(:name => 'Date', :field_format => 'date', :tracker_ids => [1], :is_for_all => true)
Chris@1115 1525
Chris@1115 1526 @request.session[:user_id] = 2
Chris@1115 1527 get :new, :project_id => 1, :tracker_id => 1
Chris@1115 1528 assert_response :success
Chris@1115 1529
Chris@1115 1530 assert_select 'input[name=?]', "issue[custom_field_values][#{field.id}]"
Chris@1115 1531 end
Chris@1115 1532
Chris@1115 1533 def test_get_new_with_text_custom_field
Chris@1115 1534 field = IssueCustomField.create!(:name => 'Text', :field_format => 'text', :tracker_ids => [1], :is_for_all => true)
Chris@1115 1535
Chris@1115 1536 @request.session[:user_id] = 2
Chris@1115 1537 get :new, :project_id => 1, :tracker_id => 1
Chris@1115 1538 assert_response :success
Chris@1115 1539
Chris@1115 1540 assert_select 'textarea[name=?]', "issue[custom_field_values][#{field.id}]"
Chris@1115 1541 end
Chris@1115 1542
Chris@1115 1543 def test_get_new_without_default_start_date_is_creation_date
Chris@1115 1544 Setting.default_issue_start_date_to_creation_date = 0
Chris@1115 1545
Chris@1115 1546 @request.session[:user_id] = 2
Chris@1115 1547 get :new, :project_id => 1, :tracker_id => 1
Chris@1115 1548 assert_response :success
Chris@1115 1549 assert_template 'new'
Chris@1115 1550
Chris@1115 1551 assert_select 'input[name=?]', 'issue[start_date]'
Chris@1115 1552 assert_select 'input[name=?][value]', 'issue[start_date]', 0
Chris@1115 1553 end
Chris@1115 1554
Chris@1115 1555 def test_get_new_with_default_start_date_is_creation_date
Chris@1115 1556 Setting.default_issue_start_date_to_creation_date = 1
Chris@1115 1557
Chris@1115 1558 @request.session[:user_id] = 2
Chris@1115 1559 get :new, :project_id => 1, :tracker_id => 1
Chris@1115 1560 assert_response :success
Chris@1115 1561 assert_template 'new'
Chris@1115 1562
Chris@1115 1563 assert_select 'input[name=?][value=?]', 'issue[start_date]', Date.today.to_s
Chris@909 1564 end
Chris@909 1565
Chris@909 1566 def test_get_new_form_should_allow_attachment_upload
Chris@909 1567 @request.session[:user_id] = 2
Chris@909 1568 get :new, :project_id => 1, :tracker_id => 1
Chris@909 1569
Chris@1115 1570 assert_select 'form[id=issue-form][method=post][enctype=multipart/form-data]' do
Chris@1115 1571 assert_select 'input[name=?][type=file]', 'attachments[1][file]'
Chris@1115 1572 assert_select 'input[name=?][maxlength=255]', 'attachments[1][description]'
Chris@1115 1573 end
Chris@1115 1574 end
Chris@1115 1575
Chris@1115 1576 def test_get_new_should_prefill_the_form_from_params
Chris@1115 1577 @request.session[:user_id] = 2
Chris@1115 1578 get :new, :project_id => 1,
Chris@1115 1579 :issue => {:tracker_id => 3, :description => 'Prefilled', :custom_field_values => {'2' => 'Custom field value'}}
Chris@1115 1580
Chris@1115 1581 issue = assigns(:issue)
Chris@1115 1582 assert_equal 3, issue.tracker_id
Chris@1115 1583 assert_equal 'Prefilled', issue.description
Chris@1115 1584 assert_equal 'Custom field value', issue.custom_field_value(2)
Chris@1115 1585
Chris@1115 1586 assert_select 'select[name=?]', 'issue[tracker_id]' do
Chris@1115 1587 assert_select 'option[value=3][selected=selected]'
Chris@1115 1588 end
Chris@1115 1589 assert_select 'textarea[name=?]', 'issue[description]', :text => /Prefilled/
Chris@1115 1590 assert_select 'input[name=?][value=?]', 'issue[custom_field_values][2]', 'Custom field value'
Chris@1115 1591 end
Chris@1115 1592
Chris@1115 1593 def test_get_new_should_mark_required_fields
Chris@1115 1594 cf1 = IssueCustomField.create!(:name => 'Foo', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
Chris@1115 1595 cf2 = IssueCustomField.create!(:name => 'Bar', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
Chris@1115 1596 WorkflowPermission.delete_all
Chris@1115 1597 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1, :role_id => 1, :field_name => 'due_date', :rule => 'required')
Chris@1115 1598 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1, :role_id => 1, :field_name => cf2.id.to_s, :rule => 'required')
Chris@1115 1599 @request.session[:user_id] = 2
Chris@1115 1600
Chris@1115 1601 get :new, :project_id => 1
Chris@1115 1602 assert_response :success
Chris@1115 1603 assert_template 'new'
Chris@1115 1604
Chris@1115 1605 assert_select 'label[for=issue_start_date]' do
Chris@1115 1606 assert_select 'span[class=required]', 0
Chris@1115 1607 end
Chris@1115 1608 assert_select 'label[for=issue_due_date]' do
Chris@1115 1609 assert_select 'span[class=required]'
Chris@1115 1610 end
Chris@1115 1611 assert_select 'label[for=?]', "issue_custom_field_values_#{cf1.id}" do
Chris@1115 1612 assert_select 'span[class=required]', 0
Chris@1115 1613 end
Chris@1115 1614 assert_select 'label[for=?]', "issue_custom_field_values_#{cf2.id}" do
Chris@1115 1615 assert_select 'span[class=required]'
Chris@1115 1616 end
Chris@1115 1617 end
Chris@1115 1618
Chris@1115 1619 def test_get_new_should_not_display_readonly_fields
Chris@1115 1620 cf1 = IssueCustomField.create!(:name => 'Foo', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
Chris@1115 1621 cf2 = IssueCustomField.create!(:name => 'Bar', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
Chris@1115 1622 WorkflowPermission.delete_all
Chris@1115 1623 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1, :role_id => 1, :field_name => 'due_date', :rule => 'readonly')
Chris@1115 1624 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1, :role_id => 1, :field_name => cf2.id.to_s, :rule => 'readonly')
Chris@1115 1625 @request.session[:user_id] = 2
Chris@1115 1626
Chris@1115 1627 get :new, :project_id => 1
Chris@1115 1628 assert_response :success
Chris@1115 1629 assert_template 'new'
Chris@1115 1630
Chris@1115 1631 assert_select 'input[name=?]', 'issue[start_date]'
Chris@1115 1632 assert_select 'input[name=?]', 'issue[due_date]', 0
Chris@1115 1633 assert_select 'input[name=?]', "issue[custom_field_values][#{cf1.id}]"
Chris@1115 1634 assert_select 'input[name=?]', "issue[custom_field_values][#{cf2.id}]", 0
Chris@0 1635 end
Chris@0 1636
Chris@0 1637 def test_get_new_without_tracker_id
Chris@0 1638 @request.session[:user_id] = 2
Chris@0 1639 get :new, :project_id => 1
Chris@0 1640 assert_response :success
Chris@0 1641 assert_template 'new'
Chris@441 1642
Chris@0 1643 issue = assigns(:issue)
Chris@0 1644 assert_not_nil issue
Chris@0 1645 assert_equal Project.find(1).trackers.first, issue.tracker
Chris@0 1646 end
Chris@441 1647
Chris@0 1648 def test_get_new_with_no_default_status_should_display_an_error
Chris@0 1649 @request.session[:user_id] = 2
Chris@0 1650 IssueStatus.delete_all
Chris@441 1651
Chris@0 1652 get :new, :project_id => 1
Chris@0 1653 assert_response 500
chris@37 1654 assert_error_tag :content => /No default issue/
Chris@0 1655 end
Chris@441 1656
Chris@0 1657 def test_get_new_with_no_tracker_should_display_an_error
Chris@0 1658 @request.session[:user_id] = 2
Chris@0 1659 Tracker.delete_all
Chris@441 1660
Chris@0 1661 get :new, :project_id => 1
Chris@0 1662 assert_response 500
chris@37 1663 assert_error_tag :content => /No tracker/
Chris@0 1664 end
Chris@441 1665
Chris@0 1666 def test_update_new_form
Chris@0 1667 @request.session[:user_id] = 2
Chris@14 1668 xhr :post, :new, :project_id => 1,
Chris@441 1669 :issue => {:tracker_id => 2,
Chris@0 1670 :subject => 'This is the test_new issue',
Chris@0 1671 :description => 'This is the description',
Chris@0 1672 :priority_id => 5}
Chris@0 1673 assert_response :success
Chris@1115 1674 assert_template 'update_form'
Chris@1115 1675 assert_template 'form'
Chris@1115 1676 assert_equal 'text/javascript', response.content_type
Chris@441 1677
Chris@0 1678 issue = assigns(:issue)
Chris@0 1679 assert_kind_of Issue, issue
Chris@0 1680 assert_equal 1, issue.project_id
Chris@0 1681 assert_equal 2, issue.tracker_id
Chris@0 1682 assert_equal 'This is the test_new issue', issue.subject
Chris@0 1683 end
Chris@441 1684
Chris@1115 1685 def test_update_new_form_should_propose_transitions_based_on_initial_status
Chris@1115 1686 @request.session[:user_id] = 2
Chris@1115 1687 WorkflowTransition.delete_all
Chris@1115 1688 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 2)
Chris@1115 1689 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 5)
Chris@1115 1690 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 5, :new_status_id => 4)
Chris@1115 1691
Chris@1115 1692 xhr :post, :new, :project_id => 1,
Chris@1115 1693 :issue => {:tracker_id => 1,
Chris@1115 1694 :status_id => 5,
Chris@1115 1695 :subject => 'This is an issue'}
Chris@1115 1696
Chris@1115 1697 assert_equal 5, assigns(:issue).status_id
Chris@1115 1698 assert_equal [1,2,5], assigns(:allowed_statuses).map(&:id).sort
Chris@1115 1699 end
Chris@1115 1700
Chris@0 1701 def test_post_create
Chris@0 1702 @request.session[:user_id] = 2
Chris@0 1703 assert_difference 'Issue.count' do
Chris@441 1704 post :create, :project_id => 1,
Chris@0 1705 :issue => {:tracker_id => 3,
Chris@0 1706 :status_id => 2,
Chris@0 1707 :subject => 'This is the test_new issue',
Chris@0 1708 :description => 'This is the description',
Chris@0 1709 :priority_id => 5,
chris@37 1710 :start_date => '2010-11-07',
Chris@0 1711 :estimated_hours => '',
Chris@0 1712 :custom_field_values => {'2' => 'Value for field 2'}}
Chris@0 1713 end
Chris@0 1714 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
Chris@441 1715
Chris@0 1716 issue = Issue.find_by_subject('This is the test_new issue')
Chris@0 1717 assert_not_nil issue
Chris@0 1718 assert_equal 2, issue.author_id
Chris@0 1719 assert_equal 3, issue.tracker_id
Chris@0 1720 assert_equal 2, issue.status_id
chris@37 1721 assert_equal Date.parse('2010-11-07'), issue.start_date
Chris@0 1722 assert_nil issue.estimated_hours
Chris@0 1723 v = issue.custom_values.find(:first, :conditions => {:custom_field_id => 2})
Chris@0 1724 assert_not_nil v
Chris@0 1725 assert_equal 'Value for field 2', v.value
Chris@0 1726 end
Chris@441 1727
Chris@909 1728 def test_post_new_with_group_assignment
Chris@909 1729 group = Group.find(11)
Chris@909 1730 project = Project.find(1)
Chris@929 1731 project.members << Member.new(:principal => group, :roles => [Role.givable.first])
Chris@909 1732
Chris@909 1733 with_settings :issue_group_assignment => '1' do
Chris@909 1734 @request.session[:user_id] = 2
Chris@909 1735 assert_difference 'Issue.count' do
Chris@909 1736 post :create, :project_id => project.id,
Chris@909 1737 :issue => {:tracker_id => 3,
Chris@909 1738 :status_id => 1,
Chris@909 1739 :subject => 'This is the test_new_with_group_assignment issue',
Chris@909 1740 :assigned_to_id => group.id}
Chris@909 1741 end
Chris@909 1742 end
Chris@909 1743 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
Chris@909 1744
Chris@909 1745 issue = Issue.find_by_subject('This is the test_new_with_group_assignment issue')
Chris@909 1746 assert_not_nil issue
Chris@909 1747 assert_equal group, issue.assigned_to
Chris@909 1748 end
Chris@909 1749
Chris@909 1750 def test_post_create_without_start_date_and_default_start_date_is_not_creation_date
Chris@909 1751 Setting.default_issue_start_date_to_creation_date = 0
Chris@909 1752
chris@37 1753 @request.session[:user_id] = 2
chris@37 1754 assert_difference 'Issue.count' do
Chris@441 1755 post :create, :project_id => 1,
chris@37 1756 :issue => {:tracker_id => 3,
chris@37 1757 :status_id => 2,
chris@37 1758 :subject => 'This is the test_new issue',
chris@37 1759 :description => 'This is the description',
chris@37 1760 :priority_id => 5,
chris@37 1761 :estimated_hours => '',
chris@37 1762 :custom_field_values => {'2' => 'Value for field 2'}}
chris@37 1763 end
chris@37 1764 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
Chris@441 1765
chris@37 1766 issue = Issue.find_by_subject('This is the test_new issue')
chris@37 1767 assert_not_nil issue
chris@37 1768 assert_nil issue.start_date
chris@37 1769 end
Chris@441 1770
Chris@909 1771 def test_post_create_without_start_date_and_default_start_date_is_creation_date
Chris@909 1772 Setting.default_issue_start_date_to_creation_date = 1
Chris@909 1773
Chris@909 1774 @request.session[:user_id] = 2
Chris@909 1775 assert_difference 'Issue.count' do
Chris@909 1776 post :create, :project_id => 1,
Chris@909 1777 :issue => {:tracker_id => 3,
Chris@909 1778 :status_id => 2,
Chris@909 1779 :subject => 'This is the test_new issue',
Chris@909 1780 :description => 'This is the description',
Chris@909 1781 :priority_id => 5,
Chris@909 1782 :estimated_hours => '',
Chris@909 1783 :custom_field_values => {'2' => 'Value for field 2'}}
Chris@909 1784 end
Chris@909 1785 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
Chris@909 1786
Chris@909 1787 issue = Issue.find_by_subject('This is the test_new issue')
Chris@909 1788 assert_not_nil issue
Chris@909 1789 assert_equal Date.today, issue.start_date
Chris@909 1790 end
Chris@909 1791
Chris@0 1792 def test_post_create_and_continue
Chris@0 1793 @request.session[:user_id] = 2
Chris@909 1794 assert_difference 'Issue.count' do
Chris@909 1795 post :create, :project_id => 1,
Chris@909 1796 :issue => {:tracker_id => 3, :subject => 'This is first issue', :priority_id => 5},
Chris@909 1797 :continue => ''
Chris@909 1798 end
Chris@909 1799
Chris@909 1800 issue = Issue.first(:order => 'id DESC')
Chris@909 1801 assert_redirected_to :controller => 'issues', :action => 'new', :project_id => 'ecookbook', :issue => {:tracker_id => 3}
Chris@909 1802 assert_not_nil flash[:notice], "flash was not set"
Chris@1115 1803 assert_include %|<a href="/issues/#{issue.id}" title="This is first issue">##{issue.id}</a>|, flash[:notice], "issue link not found in the flash message"
Chris@0 1804 end
Chris@441 1805
Chris@0 1806 def test_post_create_without_custom_fields_param
Chris@0 1807 @request.session[:user_id] = 2
Chris@0 1808 assert_difference 'Issue.count' do
Chris@441 1809 post :create, :project_id => 1,
Chris@0 1810 :issue => {:tracker_id => 1,
Chris@0 1811 :subject => 'This is the test_new issue',
Chris@0 1812 :description => 'This is the description',
Chris@0 1813 :priority_id => 5}
Chris@0 1814 end
Chris@0 1815 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
Chris@0 1816 end
Chris@0 1817
Chris@1115 1818 def test_post_create_with_multi_custom_field
Chris@1115 1819 field = IssueCustomField.find_by_name('Database')
Chris@1115 1820 field.update_attribute(:multiple, true)
Chris@1115 1821
Chris@1115 1822 @request.session[:user_id] = 2
Chris@1115 1823 assert_difference 'Issue.count' do
Chris@1115 1824 post :create, :project_id => 1,
Chris@1115 1825 :issue => {:tracker_id => 1,
Chris@1115 1826 :subject => 'This is the test_new issue',
Chris@1115 1827 :description => 'This is the description',
Chris@1115 1828 :priority_id => 5,
Chris@1115 1829 :custom_field_values => {'1' => ['', 'MySQL', 'Oracle']}}
Chris@1115 1830 end
Chris@1115 1831 assert_response 302
Chris@1115 1832 issue = Issue.first(:order => 'id DESC')
Chris@1115 1833 assert_equal ['MySQL', 'Oracle'], issue.custom_field_value(1).sort
Chris@1115 1834 end
Chris@1115 1835
Chris@1115 1836 def test_post_create_with_empty_multi_custom_field
Chris@1115 1837 field = IssueCustomField.find_by_name('Database')
Chris@1115 1838 field.update_attribute(:multiple, true)
Chris@1115 1839
Chris@1115 1840 @request.session[:user_id] = 2
Chris@1115 1841 assert_difference 'Issue.count' do
Chris@1115 1842 post :create, :project_id => 1,
Chris@1115 1843 :issue => {:tracker_id => 1,
Chris@1115 1844 :subject => 'This is the test_new issue',
Chris@1115 1845 :description => 'This is the description',
Chris@1115 1846 :priority_id => 5,
Chris@1115 1847 :custom_field_values => {'1' => ['']}}
Chris@1115 1848 end
Chris@1115 1849 assert_response 302
Chris@1115 1850 issue = Issue.first(:order => 'id DESC')
Chris@1115 1851 assert_equal [''], issue.custom_field_value(1).sort
Chris@1115 1852 end
Chris@1115 1853
Chris@1115 1854 def test_post_create_with_multi_user_custom_field
Chris@1115 1855 field = IssueCustomField.create!(:name => 'Multi user', :field_format => 'user', :multiple => true,
Chris@1115 1856 :tracker_ids => [1], :is_for_all => true)
Chris@1115 1857
Chris@1115 1858 @request.session[:user_id] = 2
Chris@1115 1859 assert_difference 'Issue.count' do
Chris@1115 1860 post :create, :project_id => 1,
Chris@1115 1861 :issue => {:tracker_id => 1,
Chris@1115 1862 :subject => 'This is the test_new issue',
Chris@1115 1863 :description => 'This is the description',
Chris@1115 1864 :priority_id => 5,
Chris@1115 1865 :custom_field_values => {field.id.to_s => ['', '2', '3']}}
Chris@1115 1866 end
Chris@1115 1867 assert_response 302
Chris@1115 1868 issue = Issue.first(:order => 'id DESC')
Chris@1115 1869 assert_equal ['2', '3'], issue.custom_field_value(field).sort
Chris@1115 1870 end
Chris@1115 1871
Chris@0 1872 def test_post_create_with_required_custom_field_and_without_custom_fields_param
Chris@0 1873 field = IssueCustomField.find_by_name('Database')
Chris@0 1874 field.update_attribute(:is_required, true)
Chris@0 1875
Chris@0 1876 @request.session[:user_id] = 2
Chris@1115 1877 assert_no_difference 'Issue.count' do
Chris@1115 1878 post :create, :project_id => 1,
Chris@1115 1879 :issue => {:tracker_id => 1,
Chris@1115 1880 :subject => 'This is the test_new issue',
Chris@1115 1881 :description => 'This is the description',
Chris@1115 1882 :priority_id => 5}
Chris@1115 1883 end
Chris@0 1884 assert_response :success
Chris@0 1885 assert_template 'new'
Chris@0 1886 issue = assigns(:issue)
Chris@0 1887 assert_not_nil issue
Chris@1115 1888 assert_error_tag :content => /Database can&#x27;t be blank/
Chris@1115 1889 end
Chris@1115 1890
Chris@1115 1891 def test_create_should_validate_required_fields
Chris@1115 1892 cf1 = IssueCustomField.create!(:name => 'Foo', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
Chris@1115 1893 cf2 = IssueCustomField.create!(:name => 'Bar', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
Chris@1115 1894 WorkflowPermission.delete_all
Chris@1115 1895 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 2, :role_id => 1, :field_name => 'due_date', :rule => 'required')
Chris@1115 1896 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 2, :role_id => 1, :field_name => cf2.id.to_s, :rule => 'required')
Chris@1115 1897 @request.session[:user_id] = 2
Chris@1115 1898
Chris@1115 1899 assert_no_difference 'Issue.count' do
Chris@1115 1900 post :create, :project_id => 1, :issue => {
Chris@1115 1901 :tracker_id => 2,
Chris@1115 1902 :status_id => 1,
Chris@1115 1903 :subject => 'Test',
Chris@1115 1904 :start_date => '',
Chris@1115 1905 :due_date => '',
Chris@1115 1906 :custom_field_values => {cf1.id.to_s => '', cf2.id.to_s => ''}
Chris@1115 1907 }
Chris@1115 1908 assert_response :success
Chris@1115 1909 assert_template 'new'
Chris@1115 1910 end
Chris@1115 1911
Chris@1115 1912 assert_error_tag :content => /Due date can&#x27;t be blank/i
Chris@1115 1913 assert_error_tag :content => /Bar can&#x27;t be blank/i
Chris@1115 1914 end
Chris@1115 1915
Chris@1115 1916 def test_create_should_ignore_readonly_fields
Chris@1115 1917 cf1 = IssueCustomField.create!(:name => 'Foo', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
Chris@1115 1918 cf2 = IssueCustomField.create!(:name => 'Bar', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
Chris@1115 1919 WorkflowPermission.delete_all
Chris@1115 1920 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 2, :role_id => 1, :field_name => 'due_date', :rule => 'readonly')
Chris@1115 1921 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 2, :role_id => 1, :field_name => cf2.id.to_s, :rule => 'readonly')
Chris@1115 1922 @request.session[:user_id] = 2
Chris@1115 1923
Chris@1115 1924 assert_difference 'Issue.count' do
Chris@1115 1925 post :create, :project_id => 1, :issue => {
Chris@1115 1926 :tracker_id => 2,
Chris@1115 1927 :status_id => 1,
Chris@1115 1928 :subject => 'Test',
Chris@1115 1929 :start_date => '2012-07-14',
Chris@1115 1930 :due_date => '2012-07-16',
Chris@1115 1931 :custom_field_values => {cf1.id.to_s => 'value1', cf2.id.to_s => 'value2'}
Chris@1115 1932 }
Chris@1115 1933 assert_response 302
Chris@1115 1934 end
Chris@1115 1935
Chris@1115 1936 issue = Issue.first(:order => 'id DESC')
Chris@1115 1937 assert_equal Date.parse('2012-07-14'), issue.start_date
Chris@1115 1938 assert_nil issue.due_date
Chris@1115 1939 assert_equal 'value1', issue.custom_field_value(cf1)
Chris@1115 1940 assert_nil issue.custom_field_value(cf2)
Chris@0 1941 end
Chris@441 1942
Chris@0 1943 def test_post_create_with_watchers
Chris@0 1944 @request.session[:user_id] = 2
Chris@0 1945 ActionMailer::Base.deliveries.clear
Chris@441 1946
Chris@0 1947 assert_difference 'Watcher.count', 2 do
Chris@441 1948 post :create, :project_id => 1,
Chris@0 1949 :issue => {:tracker_id => 1,
Chris@0 1950 :subject => 'This is a new issue with watchers',
Chris@0 1951 :description => 'This is the description',
Chris@0 1952 :priority_id => 5,
Chris@0 1953 :watcher_user_ids => ['2', '3']}
Chris@0 1954 end
Chris@0 1955 issue = Issue.find_by_subject('This is a new issue with watchers')
Chris@0 1956 assert_not_nil issue
Chris@0 1957 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue
Chris@441 1958
Chris@0 1959 # Watchers added
Chris@0 1960 assert_equal [2, 3], issue.watcher_user_ids.sort
Chris@0 1961 assert issue.watched_by?(User.find(3))
Chris@0 1962 # Watchers notified
Chris@0 1963 mail = ActionMailer::Base.deliveries.last
Chris@1115 1964 assert_not_nil mail
Chris@0 1965 assert [mail.bcc, mail.cc].flatten.include?(User.find(3).mail)
Chris@0 1966 end
Chris@441 1967
Chris@0 1968 def test_post_create_subissue
Chris@0 1969 @request.session[:user_id] = 2
Chris@441 1970
Chris@0 1971 assert_difference 'Issue.count' do
Chris@441 1972 post :create, :project_id => 1,
Chris@0 1973 :issue => {:tracker_id => 1,
Chris@0 1974 :subject => 'This is a child issue',
Chris@1115 1975 :parent_issue_id => '2'}
Chris@1115 1976 assert_response 302
Chris@0 1977 end
Chris@1115 1978 issue = Issue.order('id DESC').first
Chris@0 1979 assert_equal Issue.find(2), issue.parent
Chris@0 1980 end
Chris@119 1981
Chris@1115 1982 def test_post_create_subissue_with_sharp_parent_id
Chris@119 1983 @request.session[:user_id] = 2
Chris@441 1984
Chris@119 1985 assert_difference 'Issue.count' do
Chris@441 1986 post :create, :project_id => 1,
Chris@119 1987 :issue => {:tracker_id => 1,
Chris@119 1988 :subject => 'This is a child issue',
Chris@1115 1989 :parent_issue_id => '#2'}
Chris@1115 1990 assert_response 302
Chris@119 1991 end
Chris@1115 1992 issue = Issue.order('id DESC').first
Chris@1115 1993 assert_equal Issue.find(2), issue.parent
Chris@1115 1994 end
Chris@1115 1995
Chris@1115 1996 def test_post_create_subissue_with_non_visible_parent_id_should_not_validate
Chris@1115 1997 @request.session[:user_id] = 2
Chris@1115 1998
Chris@1115 1999 assert_no_difference 'Issue.count' do
Chris@1115 2000 post :create, :project_id => 1,
Chris@1115 2001 :issue => {:tracker_id => 1,
Chris@1115 2002 :subject => 'This is a child issue',
Chris@1115 2003 :parent_issue_id => '4'}
Chris@1115 2004
Chris@1115 2005 assert_response :success
Chris@1115 2006 assert_select 'input[name=?][value=?]', 'issue[parent_issue_id]', '4'
Chris@1115 2007 assert_error_tag :content => /Parent task is invalid/i
Chris@1115 2008 end
Chris@1115 2009 end
Chris@1115 2010
Chris@1115 2011 def test_post_create_subissue_with_non_numeric_parent_id_should_not_validate
Chris@1115 2012 @request.session[:user_id] = 2
Chris@1115 2013
Chris@1115 2014 assert_no_difference 'Issue.count' do
Chris@1115 2015 post :create, :project_id => 1,
Chris@1115 2016 :issue => {:tracker_id => 1,
Chris@1115 2017 :subject => 'This is a child issue',
Chris@1115 2018 :parent_issue_id => '01ABC'}
Chris@1115 2019
Chris@1115 2020 assert_response :success
Chris@1115 2021 assert_select 'input[name=?][value=?]', 'issue[parent_issue_id]', '01ABC'
Chris@1115 2022 assert_error_tag :content => /Parent task is invalid/i
Chris@1115 2023 end
Chris@119 2024 end
Chris@909 2025
Chris@507 2026 def test_post_create_private
Chris@507 2027 @request.session[:user_id] = 2
Chris@507 2028
Chris@507 2029 assert_difference 'Issue.count' do
Chris@507 2030 post :create, :project_id => 1,
Chris@507 2031 :issue => {:tracker_id => 1,
Chris@507 2032 :subject => 'This is a private issue',
Chris@507 2033 :is_private => '1'}
Chris@507 2034 end
Chris@507 2035 issue = Issue.first(:order => 'id DESC')
Chris@507 2036 assert issue.is_private?
Chris@507 2037 end
Chris@909 2038
Chris@507 2039 def test_post_create_private_with_set_own_issues_private_permission
Chris@507 2040 role = Role.find(1)
Chris@507 2041 role.remove_permission! :set_issues_private
Chris@507 2042 role.add_permission! :set_own_issues_private
Chris@909 2043
Chris@507 2044 @request.session[:user_id] = 2
Chris@507 2045
Chris@507 2046 assert_difference 'Issue.count' do
Chris@507 2047 post :create, :project_id => 1,
Chris@507 2048 :issue => {:tracker_id => 1,
Chris@507 2049 :subject => 'This is a private issue',
Chris@507 2050 :is_private => '1'}
Chris@507 2051 end
Chris@507 2052 issue = Issue.first(:order => 'id DESC')
Chris@507 2053 assert issue.is_private?
Chris@507 2054 end
Chris@441 2055
Chris@0 2056 def test_post_create_should_send_a_notification
Chris@0 2057 ActionMailer::Base.deliveries.clear
Chris@0 2058 @request.session[:user_id] = 2
Chris@0 2059 assert_difference 'Issue.count' do
Chris@441 2060 post :create, :project_id => 1,
Chris@0 2061 :issue => {:tracker_id => 3,
Chris@0 2062 :subject => 'This is the test_new issue',
Chris@0 2063 :description => 'This is the description',
Chris@0 2064 :priority_id => 5,
Chris@0 2065 :estimated_hours => '',
Chris@0 2066 :custom_field_values => {'2' => 'Value for field 2'}}
Chris@0 2067 end
Chris@0 2068 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
Chris@441 2069
Chris@0 2070 assert_equal 1, ActionMailer::Base.deliveries.size
Chris@0 2071 end
Chris@441 2072
Chris@0 2073 def test_post_create_should_preserve_fields_values_on_validation_failure
Chris@0 2074 @request.session[:user_id] = 2
Chris@441 2075 post :create, :project_id => 1,
Chris@0 2076 :issue => {:tracker_id => 1,
Chris@0 2077 # empty subject
Chris@0 2078 :subject => '',
Chris@0 2079 :description => 'This is a description',
Chris@0 2080 :priority_id => 6,
Chris@0 2081 :custom_field_values => {'1' => 'Oracle', '2' => 'Value for field 2'}}
Chris@0 2082 assert_response :success
Chris@0 2083 assert_template 'new'
Chris@441 2084
Chris@0 2085 assert_tag :textarea, :attributes => { :name => 'issue[description]' },
Chris@1115 2086 :content => "\nThis is a description"
Chris@0 2087 assert_tag :select, :attributes => { :name => 'issue[priority_id]' },
Chris@0 2088 :child => { :tag => 'option', :attributes => { :selected => 'selected',
Chris@0 2089 :value => '6' },
Chris@441 2090 :content => 'High' }
Chris@0 2091 # Custom fields
Chris@0 2092 assert_tag :select, :attributes => { :name => 'issue[custom_field_values][1]' },
Chris@0 2093 :child => { :tag => 'option', :attributes => { :selected => 'selected',
Chris@0 2094 :value => 'Oracle' },
Chris@441 2095 :content => 'Oracle' }
Chris@0 2096 assert_tag :input, :attributes => { :name => 'issue[custom_field_values][2]',
Chris@0 2097 :value => 'Value for field 2'}
Chris@0 2098 end
Chris@441 2099
Chris@1115 2100 def test_post_create_with_failure_should_preserve_watchers
Chris@1115 2101 assert !User.find(8).member_of?(Project.find(1))
Chris@1115 2102
Chris@1115 2103 @request.session[:user_id] = 2
Chris@1115 2104 post :create, :project_id => 1,
Chris@1115 2105 :issue => {:tracker_id => 1,
Chris@1115 2106 :watcher_user_ids => ['3', '8']}
Chris@1115 2107 assert_response :success
Chris@1115 2108 assert_template 'new'
Chris@1115 2109
Chris@1115 2110 assert_tag 'input', :attributes => {:name => 'issue[watcher_user_ids][]', :value => '2', :checked => nil}
Chris@1115 2111 assert_tag 'input', :attributes => {:name => 'issue[watcher_user_ids][]', :value => '3', :checked => 'checked'}
Chris@1115 2112 assert_tag 'input', :attributes => {:name => 'issue[watcher_user_ids][]', :value => '8', :checked => 'checked'}
Chris@1115 2113 end
Chris@1115 2114
Chris@0 2115 def test_post_create_should_ignore_non_safe_attributes
Chris@0 2116 @request.session[:user_id] = 2
Chris@0 2117 assert_nothing_raised do
Chris@0 2118 post :create, :project_id => 1, :issue => { :tracker => "A param can not be a Tracker" }
Chris@0 2119 end
Chris@0 2120 end
Chris@441 2121
Chris@909 2122 def test_post_create_with_attachment
Chris@909 2123 set_tmp_attachments_directory
Chris@909 2124 @request.session[:user_id] = 2
Chris@909 2125
Chris@909 2126 assert_difference 'Issue.count' do
Chris@909 2127 assert_difference 'Attachment.count' do
Chris@909 2128 post :create, :project_id => 1,
Chris@909 2129 :issue => { :tracker_id => '1', :subject => 'With attachment' },
Chris@909 2130 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}}
Chris@909 2131 end
Chris@909 2132 end
Chris@909 2133
Chris@909 2134 issue = Issue.first(:order => 'id DESC')
Chris@909 2135 attachment = Attachment.first(:order => 'id DESC')
Chris@909 2136
Chris@909 2137 assert_equal issue, attachment.container
Chris@909 2138 assert_equal 2, attachment.author_id
Chris@909 2139 assert_equal 'testfile.txt', attachment.filename
Chris@909 2140 assert_equal 'text/plain', attachment.content_type
Chris@909 2141 assert_equal 'test file', attachment.description
Chris@909 2142 assert_equal 59, attachment.filesize
Chris@909 2143 assert File.exists?(attachment.diskfile)
Chris@909 2144 assert_equal 59, File.size(attachment.diskfile)
Chris@909 2145 end
Chris@909 2146
Chris@1115 2147 def test_post_create_with_failure_should_save_attachments
Chris@1115 2148 set_tmp_attachments_directory
Chris@1115 2149 @request.session[:user_id] = 2
Chris@1115 2150
Chris@1115 2151 assert_no_difference 'Issue.count' do
Chris@1115 2152 assert_difference 'Attachment.count' do
Chris@1115 2153 post :create, :project_id => 1,
Chris@1115 2154 :issue => { :tracker_id => '1', :subject => '' },
Chris@1115 2155 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}}
Chris@1115 2156 assert_response :success
Chris@1115 2157 assert_template 'new'
Chris@1115 2158 end
Chris@1115 2159 end
Chris@1115 2160
Chris@1115 2161 attachment = Attachment.first(:order => 'id DESC')
Chris@1115 2162 assert_equal 'testfile.txt', attachment.filename
Chris@1115 2163 assert File.exists?(attachment.diskfile)
Chris@1115 2164 assert_nil attachment.container
Chris@1115 2165
Chris@1115 2166 assert_tag 'input', :attributes => {:name => 'attachments[p0][token]', :value => attachment.token}
Chris@1115 2167 assert_tag 'span', :content => /testfile.txt/
Chris@1115 2168 end
Chris@1115 2169
Chris@1115 2170 def test_post_create_with_failure_should_keep_saved_attachments
Chris@1115 2171 set_tmp_attachments_directory
Chris@1115 2172 attachment = Attachment.create!(:file => uploaded_test_file("testfile.txt", "text/plain"), :author_id => 2)
Chris@1115 2173 @request.session[:user_id] = 2
Chris@1115 2174
Chris@1115 2175 assert_no_difference 'Issue.count' do
Chris@1115 2176 assert_no_difference 'Attachment.count' do
Chris@1115 2177 post :create, :project_id => 1,
Chris@1115 2178 :issue => { :tracker_id => '1', :subject => '' },
Chris@1115 2179 :attachments => {'p0' => {'token' => attachment.token}}
Chris@1115 2180 assert_response :success
Chris@1115 2181 assert_template 'new'
Chris@1115 2182 end
Chris@1115 2183 end
Chris@1115 2184
Chris@1115 2185 assert_tag 'input', :attributes => {:name => 'attachments[p0][token]', :value => attachment.token}
Chris@1115 2186 assert_tag 'span', :content => /testfile.txt/
Chris@1115 2187 end
Chris@1115 2188
Chris@1115 2189 def test_post_create_should_attach_saved_attachments
Chris@1115 2190 set_tmp_attachments_directory
Chris@1115 2191 attachment = Attachment.create!(:file => uploaded_test_file("testfile.txt", "text/plain"), :author_id => 2)
Chris@1115 2192 @request.session[:user_id] = 2
Chris@1115 2193
Chris@1115 2194 assert_difference 'Issue.count' do
Chris@1115 2195 assert_no_difference 'Attachment.count' do
Chris@1115 2196 post :create, :project_id => 1,
Chris@1115 2197 :issue => { :tracker_id => '1', :subject => 'Saved attachments' },
Chris@1115 2198 :attachments => {'p0' => {'token' => attachment.token}}
Chris@1115 2199 assert_response 302
Chris@1115 2200 end
Chris@1115 2201 end
Chris@1115 2202
Chris@1115 2203 issue = Issue.first(:order => 'id DESC')
Chris@1115 2204 assert_equal 1, issue.attachments.count
Chris@1115 2205
Chris@1115 2206 attachment.reload
Chris@1115 2207 assert_equal issue, attachment.container
Chris@1115 2208 end
Chris@1115 2209
Chris@0 2210 context "without workflow privilege" do
Chris@0 2211 setup do
Chris@1115 2212 WorkflowTransition.delete_all(["role_id = ?", Role.anonymous.id])
chris@37 2213 Role.anonymous.add_permission! :add_issues, :add_issue_notes
Chris@0 2214 end
Chris@441 2215
Chris@0 2216 context "#new" do
Chris@0 2217 should "propose default status only" do
Chris@0 2218 get :new, :project_id => 1
Chris@0 2219 assert_response :success
Chris@0 2220 assert_template 'new'
Chris@0 2221 assert_tag :tag => 'select',
Chris@0 2222 :attributes => {:name => 'issue[status_id]'},
Chris@0 2223 :children => {:count => 1},
Chris@0 2224 :child => {:tag => 'option', :attributes => {:value => IssueStatus.default.id.to_s}}
Chris@0 2225 end
Chris@441 2226
Chris@0 2227 should "accept default status" do
Chris@0 2228 assert_difference 'Issue.count' do
Chris@441 2229 post :create, :project_id => 1,
Chris@0 2230 :issue => {:tracker_id => 1,
Chris@0 2231 :subject => 'This is an issue',
Chris@0 2232 :status_id => 1}
Chris@0 2233 end
Chris@0 2234 issue = Issue.last(:order => 'id')
Chris@0 2235 assert_equal IssueStatus.default, issue.status
Chris@0 2236 end
Chris@441 2237
Chris@0 2238 should "ignore unauthorized status" do
Chris@0 2239 assert_difference 'Issue.count' do
Chris@441 2240 post :create, :project_id => 1,
Chris@0 2241 :issue => {:tracker_id => 1,
Chris@0 2242 :subject => 'This is an issue',
Chris@0 2243 :status_id => 3}
Chris@0 2244 end
Chris@0 2245 issue = Issue.last(:order => 'id')
Chris@0 2246 assert_equal IssueStatus.default, issue.status
Chris@0 2247 end
Chris@0 2248 end
Chris@441 2249
chris@37 2250 context "#update" do
chris@37 2251 should "ignore status change" do
chris@37 2252 assert_difference 'Journal.count' do
Chris@1115 2253 put :update, :id => 1, :issue => {:status_id => 3, :notes => 'just trying'}
chris@37 2254 end
chris@37 2255 assert_equal 1, Issue.find(1).status_id
chris@37 2256 end
Chris@441 2257
chris@37 2258 should "ignore attributes changes" do
chris@37 2259 assert_difference 'Journal.count' do
Chris@1115 2260 put :update, :id => 1, :issue => {:subject => 'changed', :assigned_to_id => 2, :notes => 'just trying'}
chris@37 2261 end
chris@37 2262 issue = Issue.find(1)
chris@37 2263 assert_equal "Can't print recipes", issue.subject
chris@37 2264 assert_nil issue.assigned_to
chris@37 2265 end
chris@37 2266 end
chris@37 2267 end
Chris@441 2268
chris@37 2269 context "with workflow privilege" do
chris@37 2270 setup do
Chris@1115 2271 WorkflowTransition.delete_all(["role_id = ?", Role.anonymous.id])
Chris@1115 2272 WorkflowTransition.create!(:role => Role.anonymous, :tracker_id => 1, :old_status_id => 1, :new_status_id => 3)
Chris@1115 2273 WorkflowTransition.create!(:role => Role.anonymous, :tracker_id => 1, :old_status_id => 1, :new_status_id => 4)
chris@37 2274 Role.anonymous.add_permission! :add_issues, :add_issue_notes
chris@37 2275 end
Chris@441 2276
chris@37 2277 context "#update" do
chris@37 2278 should "accept authorized status" do
chris@37 2279 assert_difference 'Journal.count' do
Chris@1115 2280 put :update, :id => 1, :issue => {:status_id => 3, :notes => 'just trying'}
chris@37 2281 end
chris@37 2282 assert_equal 3, Issue.find(1).status_id
chris@37 2283 end
Chris@441 2284
chris@37 2285 should "ignore unauthorized status" do
chris@37 2286 assert_difference 'Journal.count' do
Chris@1115 2287 put :update, :id => 1, :issue => {:status_id => 2, :notes => 'just trying'}
chris@37 2288 end
chris@37 2289 assert_equal 1, Issue.find(1).status_id
chris@37 2290 end
Chris@441 2291
chris@37 2292 should "accept authorized attributes changes" do
chris@37 2293 assert_difference 'Journal.count' do
Chris@1115 2294 put :update, :id => 1, :issue => {:assigned_to_id => 2, :notes => 'just trying'}
chris@37 2295 end
chris@37 2296 issue = Issue.find(1)
chris@37 2297 assert_equal 2, issue.assigned_to_id
chris@37 2298 end
Chris@441 2299
chris@37 2300 should "ignore unauthorized attributes changes" do
chris@37 2301 assert_difference 'Journal.count' do
Chris@1115 2302 put :update, :id => 1, :issue => {:subject => 'changed', :notes => 'just trying'}
chris@37 2303 end
chris@37 2304 issue = Issue.find(1)
chris@37 2305 assert_equal "Can't print recipes", issue.subject
chris@37 2306 end
chris@37 2307 end
Chris@441 2308
chris@37 2309 context "and :edit_issues permission" do
chris@37 2310 setup do
chris@37 2311 Role.anonymous.add_permission! :add_issues, :edit_issues
chris@37 2312 end
chris@37 2313
chris@37 2314 should "accept authorized status" do
chris@37 2315 assert_difference 'Journal.count' do
Chris@1115 2316 put :update, :id => 1, :issue => {:status_id => 3, :notes => 'just trying'}
chris@37 2317 end
chris@37 2318 assert_equal 3, Issue.find(1).status_id
chris@37 2319 end
Chris@441 2320
chris@37 2321 should "ignore unauthorized status" do
chris@37 2322 assert_difference 'Journal.count' do
Chris@1115 2323 put :update, :id => 1, :issue => {:status_id => 2, :notes => 'just trying'}
chris@37 2324 end
chris@37 2325 assert_equal 1, Issue.find(1).status_id
chris@37 2326 end
Chris@441 2327
chris@37 2328 should "accept authorized attributes changes" do
chris@37 2329 assert_difference 'Journal.count' do
Chris@1115 2330 put :update, :id => 1, :issue => {:subject => 'changed', :assigned_to_id => 2, :notes => 'just trying'}
chris@37 2331 end
chris@37 2332 issue = Issue.find(1)
chris@37 2333 assert_equal "changed", issue.subject
chris@37 2334 assert_equal 2, issue.assigned_to_id
chris@37 2335 end
chris@37 2336 end
Chris@0 2337 end
Chris@441 2338
Chris@1115 2339 def test_new_as_copy
Chris@0 2340 @request.session[:user_id] = 2
Chris@0 2341 get :new, :project_id => 1, :copy_from => 1
Chris@1115 2342
Chris@1115 2343 assert_response :success
Chris@0 2344 assert_template 'new'
Chris@1115 2345
Chris@0 2346 assert_not_nil assigns(:issue)
Chris@0 2347 orig = Issue.find(1)
Chris@1115 2348 assert_equal 1, assigns(:issue).project_id
Chris@0 2349 assert_equal orig.subject, assigns(:issue).subject
Chris@1115 2350 assert assigns(:issue).copy?
Chris@1115 2351
Chris@1115 2352 assert_tag 'form', :attributes => {:id => 'issue-form', :action => '/projects/ecookbook/issues'}
Chris@1115 2353 assert_tag 'select', :attributes => {:name => 'issue[project_id]'}
Chris@1115 2354 assert_tag 'select', :attributes => {:name => 'issue[project_id]'},
Chris@1115 2355 :child => {:tag => 'option', :attributes => {:value => '1', :selected => 'selected'}, :content => 'eCookbook'}
Chris@1115 2356 assert_tag 'select', :attributes => {:name => 'issue[project_id]'},
Chris@1115 2357 :child => {:tag => 'option', :attributes => {:value => '2', :selected => nil}, :content => 'OnlineStore'}
Chris@1115 2358 assert_tag 'input', :attributes => {:name => 'copy_from', :value => '1'}
Chris@1294 2359
Chris@1294 2360 # "New issue" menu item should not link to copy
Chris@1294 2361 assert_select '#main-menu a.new-issue[href=/projects/ecookbook/issues/new]'
Chris@1115 2362 end
Chris@1115 2363
Chris@1115 2364 def test_new_as_copy_with_attachments_should_show_copy_attachments_checkbox
Chris@1115 2365 @request.session[:user_id] = 2
Chris@1115 2366 issue = Issue.find(3)
Chris@1115 2367 assert issue.attachments.count > 0
Chris@1115 2368 get :new, :project_id => 1, :copy_from => 3
Chris@1115 2369
Chris@1115 2370 assert_tag 'input', :attributes => {:name => 'copy_attachments', :type => 'checkbox', :checked => 'checked', :value => '1'}
Chris@1115 2371 end
Chris@1115 2372
Chris@1115 2373 def test_new_as_copy_without_attachments_should_not_show_copy_attachments_checkbox
Chris@1115 2374 @request.session[:user_id] = 2
Chris@1115 2375 issue = Issue.find(3)
Chris@1115 2376 issue.attachments.delete_all
Chris@1115 2377 get :new, :project_id => 1, :copy_from => 3
Chris@1115 2378
Chris@1115 2379 assert_no_tag 'input', :attributes => {:name => 'copy_attachments', :type => 'checkbox', :checked => 'checked', :value => '1'}
Chris@1115 2380 end
Chris@1115 2381
Chris@1115 2382 def test_new_as_copy_with_subtasks_should_show_copy_subtasks_checkbox
Chris@1115 2383 @request.session[:user_id] = 2
Chris@1115 2384 issue = Issue.generate_with_descendants!
Chris@1115 2385 get :new, :project_id => 1, :copy_from => issue.id
Chris@1115 2386
Chris@1115 2387 assert_select 'input[type=checkbox][name=copy_subtasks][checked=checked][value=1]'
Chris@1115 2388 end
Chris@1115 2389
Chris@1115 2390 def test_new_as_copy_with_invalid_issue_should_respond_with_404
Chris@1115 2391 @request.session[:user_id] = 2
Chris@1115 2392 get :new, :project_id => 1, :copy_from => 99999
Chris@1115 2393 assert_response 404
Chris@1115 2394 end
Chris@1115 2395
Chris@1115 2396 def test_create_as_copy_on_different_project
Chris@1115 2397 @request.session[:user_id] = 2
Chris@1115 2398 assert_difference 'Issue.count' do
Chris@1115 2399 post :create, :project_id => 1, :copy_from => 1,
Chris@1115 2400 :issue => {:project_id => '2', :tracker_id => '3', :status_id => '1', :subject => 'Copy'}
Chris@1115 2401
Chris@1115 2402 assert_not_nil assigns(:issue)
Chris@1115 2403 assert assigns(:issue).copy?
Chris@1115 2404 end
Chris@1115 2405 issue = Issue.first(:order => 'id DESC')
Chris@1115 2406 assert_redirected_to "/issues/#{issue.id}"
Chris@1115 2407
Chris@1115 2408 assert_equal 2, issue.project_id
Chris@1115 2409 assert_equal 3, issue.tracker_id
Chris@1115 2410 assert_equal 'Copy', issue.subject
Chris@1115 2411 end
Chris@1115 2412
Chris@1115 2413 def test_create_as_copy_should_copy_attachments
Chris@1115 2414 @request.session[:user_id] = 2
Chris@1115 2415 issue = Issue.find(3)
Chris@1115 2416 count = issue.attachments.count
Chris@1115 2417 assert count > 0
Chris@1115 2418
Chris@1115 2419 assert_difference 'Issue.count' do
Chris@1115 2420 assert_difference 'Attachment.count', count do
Chris@1115 2421 assert_no_difference 'Journal.count' do
Chris@1115 2422 post :create, :project_id => 1, :copy_from => 3,
Chris@1115 2423 :issue => {:project_id => '1', :tracker_id => '3', :status_id => '1', :subject => 'Copy with attachments'},
Chris@1115 2424 :copy_attachments => '1'
Chris@1115 2425 end
Chris@1115 2426 end
Chris@1115 2427 end
Chris@1115 2428 copy = Issue.first(:order => 'id DESC')
Chris@1115 2429 assert_equal count, copy.attachments.count
Chris@1115 2430 assert_equal issue.attachments.map(&:filename).sort, copy.attachments.map(&:filename).sort
Chris@1115 2431 end
Chris@1115 2432
Chris@1115 2433 def test_create_as_copy_without_copy_attachments_option_should_not_copy_attachments
Chris@1115 2434 @request.session[:user_id] = 2
Chris@1115 2435 issue = Issue.find(3)
Chris@1115 2436 count = issue.attachments.count
Chris@1115 2437 assert count > 0
Chris@1115 2438
Chris@1115 2439 assert_difference 'Issue.count' do
Chris@1115 2440 assert_no_difference 'Attachment.count' do
Chris@1115 2441 assert_no_difference 'Journal.count' do
Chris@1115 2442 post :create, :project_id => 1, :copy_from => 3,
Chris@1115 2443 :issue => {:project_id => '1', :tracker_id => '3', :status_id => '1', :subject => 'Copy with attachments'}
Chris@1115 2444 end
Chris@1115 2445 end
Chris@1115 2446 end
Chris@1115 2447 copy = Issue.first(:order => 'id DESC')
Chris@1115 2448 assert_equal 0, copy.attachments.count
Chris@1115 2449 end
Chris@1115 2450
Chris@1115 2451 def test_create_as_copy_with_attachments_should_add_new_files
Chris@1115 2452 @request.session[:user_id] = 2
Chris@1115 2453 issue = Issue.find(3)
Chris@1115 2454 count = issue.attachments.count
Chris@1115 2455 assert count > 0
Chris@1115 2456
Chris@1115 2457 assert_difference 'Issue.count' do
Chris@1115 2458 assert_difference 'Attachment.count', count + 1 do
Chris@1115 2459 assert_no_difference 'Journal.count' do
Chris@1115 2460 post :create, :project_id => 1, :copy_from => 3,
Chris@1115 2461 :issue => {:project_id => '1', :tracker_id => '3', :status_id => '1', :subject => 'Copy with attachments'},
Chris@1115 2462 :copy_attachments => '1',
Chris@1115 2463 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}}
Chris@1115 2464 end
Chris@1115 2465 end
Chris@1115 2466 end
Chris@1115 2467 copy = Issue.first(:order => 'id DESC')
Chris@1115 2468 assert_equal count + 1, copy.attachments.count
Chris@1115 2469 end
Chris@1115 2470
Chris@1115 2471 def test_create_as_copy_should_add_relation_with_copied_issue
Chris@1115 2472 @request.session[:user_id] = 2
Chris@1115 2473
Chris@1115 2474 assert_difference 'Issue.count' do
Chris@1115 2475 assert_difference 'IssueRelation.count' do
Chris@1115 2476 post :create, :project_id => 1, :copy_from => 1,
Chris@1115 2477 :issue => {:project_id => '1', :tracker_id => '3', :status_id => '1', :subject => 'Copy'}
Chris@1115 2478 end
Chris@1115 2479 end
Chris@1115 2480 copy = Issue.first(:order => 'id DESC')
Chris@1115 2481 assert_equal 1, copy.relations.size
Chris@1115 2482 end
Chris@1115 2483
Chris@1115 2484 def test_create_as_copy_should_copy_subtasks
Chris@1115 2485 @request.session[:user_id] = 2
Chris@1115 2486 issue = Issue.generate_with_descendants!
Chris@1115 2487 count = issue.descendants.count
Chris@1115 2488
Chris@1115 2489 assert_difference 'Issue.count', count+1 do
Chris@1115 2490 assert_no_difference 'Journal.count' do
Chris@1115 2491 post :create, :project_id => 1, :copy_from => issue.id,
Chris@1115 2492 :issue => {:project_id => '1', :tracker_id => '3', :status_id => '1', :subject => 'Copy with subtasks'},
Chris@1115 2493 :copy_subtasks => '1'
Chris@1115 2494 end
Chris@1115 2495 end
Chris@1115 2496 copy = Issue.where(:parent_id => nil).first(:order => 'id DESC')
Chris@1115 2497 assert_equal count, copy.descendants.count
Chris@1115 2498 assert_equal issue.descendants.map(&:subject).sort, copy.descendants.map(&:subject).sort
Chris@1115 2499 end
Chris@1115 2500
Chris@1115 2501 def test_create_as_copy_without_copy_subtasks_option_should_not_copy_subtasks
Chris@1115 2502 @request.session[:user_id] = 2
Chris@1115 2503 issue = Issue.generate_with_descendants!
Chris@1115 2504
Chris@1115 2505 assert_difference 'Issue.count', 1 do
Chris@1115 2506 assert_no_difference 'Journal.count' do
Chris@1115 2507 post :create, :project_id => 1, :copy_from => 3,
Chris@1115 2508 :issue => {:project_id => '1', :tracker_id => '3', :status_id => '1', :subject => 'Copy with subtasks'}
Chris@1115 2509 end
Chris@1115 2510 end
Chris@1115 2511 copy = Issue.where(:parent_id => nil).first(:order => 'id DESC')
Chris@1115 2512 assert_equal 0, copy.descendants.count
Chris@1115 2513 end
Chris@1115 2514
Chris@1115 2515 def test_create_as_copy_with_failure
Chris@1115 2516 @request.session[:user_id] = 2
Chris@1115 2517 post :create, :project_id => 1, :copy_from => 1,
Chris@1115 2518 :issue => {:project_id => '2', :tracker_id => '3', :status_id => '1', :subject => ''}
Chris@1115 2519
Chris@1115 2520 assert_response :success
Chris@1115 2521 assert_template 'new'
Chris@1115 2522
Chris@1115 2523 assert_not_nil assigns(:issue)
Chris@1115 2524 assert assigns(:issue).copy?
Chris@1115 2525
Chris@1115 2526 assert_tag 'form', :attributes => {:id => 'issue-form', :action => '/projects/ecookbook/issues'}
Chris@1115 2527 assert_tag 'select', :attributes => {:name => 'issue[project_id]'}
Chris@1115 2528 assert_tag 'select', :attributes => {:name => 'issue[project_id]'},
Chris@1115 2529 :child => {:tag => 'option', :attributes => {:value => '1', :selected => nil}, :content => 'eCookbook'}
Chris@1115 2530 assert_tag 'select', :attributes => {:name => 'issue[project_id]'},
Chris@1115 2531 :child => {:tag => 'option', :attributes => {:value => '2', :selected => 'selected'}, :content => 'OnlineStore'}
Chris@1115 2532 assert_tag 'input', :attributes => {:name => 'copy_from', :value => '1'}
Chris@1115 2533 end
Chris@1115 2534
Chris@1115 2535 def test_create_as_copy_on_project_without_permission_should_ignore_target_project
Chris@1115 2536 @request.session[:user_id] = 2
Chris@1115 2537 assert !User.find(2).member_of?(Project.find(4))
Chris@1115 2538
Chris@1115 2539 assert_difference 'Issue.count' do
Chris@1115 2540 post :create, :project_id => 1, :copy_from => 1,
Chris@1115 2541 :issue => {:project_id => '4', :tracker_id => '3', :status_id => '1', :subject => 'Copy'}
Chris@1115 2542 end
Chris@1115 2543 issue = Issue.first(:order => 'id DESC')
Chris@1115 2544 assert_equal 1, issue.project_id
Chris@0 2545 end
Chris@441 2546
Chris@0 2547 def test_get_edit
Chris@0 2548 @request.session[:user_id] = 2
Chris@0 2549 get :edit, :id => 1
Chris@0 2550 assert_response :success
Chris@0 2551 assert_template 'edit'
Chris@0 2552 assert_not_nil assigns(:issue)
Chris@0 2553 assert_equal Issue.find(1), assigns(:issue)
Chris@909 2554
Chris@909 2555 # Be sure we don't display inactive IssuePriorities
Chris@909 2556 assert ! IssuePriority.find(15).active?
Chris@909 2557 assert_no_tag :option, :attributes => {:value => '15'},
Chris@909 2558 :parent => {:tag => 'select', :attributes => {:id => 'issue_priority_id'} }
Chris@909 2559 end
Chris@909 2560
Chris@909 2561 def test_get_edit_should_display_the_time_entry_form_with_log_time_permission
Chris@909 2562 @request.session[:user_id] = 2
Chris@909 2563 Role.find_by_name('Manager').update_attribute :permissions, [:view_issues, :edit_issues, :log_time]
Chris@909 2564
Chris@909 2565 get :edit, :id => 1
Chris@909 2566 assert_tag 'input', :attributes => {:name => 'time_entry[hours]'}
Chris@909 2567 end
Chris@909 2568
Chris@909 2569 def test_get_edit_should_not_display_the_time_entry_form_without_log_time_permission
Chris@909 2570 @request.session[:user_id] = 2
Chris@909 2571 Role.find_by_name('Manager').remove_permission! :log_time
Chris@909 2572
Chris@909 2573 get :edit, :id => 1
Chris@909 2574 assert_no_tag 'input', :attributes => {:name => 'time_entry[hours]'}
Chris@0 2575 end
Chris@441 2576
Chris@0 2577 def test_get_edit_with_params
Chris@0 2578 @request.session[:user_id] = 2
chris@37 2579 get :edit, :id => 1, :issue => { :status_id => 5, :priority_id => 7 },
chris@37 2580 :time_entry => { :hours => '2.5', :comments => 'test_get_edit_with_params', :activity_id => TimeEntryActivity.first.id }
Chris@0 2581 assert_response :success
Chris@0 2582 assert_template 'edit'
Chris@441 2583
Chris@0 2584 issue = assigns(:issue)
Chris@0 2585 assert_not_nil issue
Chris@441 2586
Chris@0 2587 assert_equal 5, issue.status_id
Chris@0 2588 assert_tag :select, :attributes => { :name => 'issue[status_id]' },
Chris@441 2589 :child => { :tag => 'option',
Chris@0 2590 :content => 'Closed',
Chris@0 2591 :attributes => { :selected => 'selected' } }
Chris@441 2592
Chris@0 2593 assert_equal 7, issue.priority_id
Chris@0 2594 assert_tag :select, :attributes => { :name => 'issue[priority_id]' },
Chris@441 2595 :child => { :tag => 'option',
Chris@0 2596 :content => 'Urgent',
Chris@0 2597 :attributes => { :selected => 'selected' } }
chris@37 2598
chris@37 2599 assert_tag :input, :attributes => { :name => 'time_entry[hours]', :value => '2.5' }
chris@37 2600 assert_tag :select, :attributes => { :name => 'time_entry[activity_id]' },
chris@37 2601 :child => { :tag => 'option',
chris@37 2602 :attributes => { :selected => 'selected', :value => TimeEntryActivity.first.id } }
chris@37 2603 assert_tag :input, :attributes => { :name => 'time_entry[comments]', :value => 'test_get_edit_with_params' }
Chris@0 2604 end
Chris@0 2605
Chris@1115 2606 def test_get_edit_with_multi_custom_field
Chris@1115 2607 field = CustomField.find(1)
Chris@1115 2608 field.update_attribute :multiple, true
Chris@1115 2609 issue = Issue.find(1)
Chris@1115 2610 issue.custom_field_values = {1 => ['MySQL', 'Oracle']}
Chris@1115 2611 issue.save!
Chris@1115 2612
Chris@1115 2613 @request.session[:user_id] = 2
Chris@1115 2614 get :edit, :id => 1
Chris@1115 2615 assert_response :success
Chris@1115 2616 assert_template 'edit'
Chris@1115 2617
Chris@1115 2618 assert_tag 'select', :attributes => {:name => 'issue[custom_field_values][1][]', :multiple => 'multiple'}
Chris@1115 2619 assert_tag 'select', :attributes => {:name => 'issue[custom_field_values][1][]'},
Chris@1115 2620 :child => {:tag => 'option', :attributes => {:value => 'MySQL', :selected => 'selected'}}
Chris@1115 2621 assert_tag 'select', :attributes => {:name => 'issue[custom_field_values][1][]'},
Chris@1115 2622 :child => {:tag => 'option', :attributes => {:value => 'PostgreSQL', :selected => nil}}
Chris@1115 2623 assert_tag 'select', :attributes => {:name => 'issue[custom_field_values][1][]'},
Chris@1115 2624 :child => {:tag => 'option', :attributes => {:value => 'Oracle', :selected => 'selected'}}
Chris@1115 2625 end
Chris@1115 2626
Chris@0 2627 def test_update_edit_form
Chris@0 2628 @request.session[:user_id] = 2
Chris@1115 2629 xhr :put, :new, :project_id => 1,
Chris@0 2630 :id => 1,
Chris@441 2631 :issue => {:tracker_id => 2,
Chris@0 2632 :subject => 'This is the test_new issue',
Chris@0 2633 :description => 'This is the description',
Chris@0 2634 :priority_id => 5}
Chris@0 2635 assert_response :success
Chris@1115 2636 assert_equal 'text/javascript', response.content_type
Chris@1115 2637 assert_template 'update_form'
Chris@1115 2638 assert_template 'form'
Chris@441 2639
Chris@0 2640 issue = assigns(:issue)
Chris@0 2641 assert_kind_of Issue, issue
Chris@0 2642 assert_equal 1, issue.id
Chris@0 2643 assert_equal 1, issue.project_id
Chris@0 2644 assert_equal 2, issue.tracker_id
Chris@0 2645 assert_equal 'This is the test_new issue', issue.subject
Chris@0 2646 end
Chris@441 2647
Chris@1115 2648 def test_update_edit_form_should_keep_issue_author
Chris@1115 2649 @request.session[:user_id] = 3
Chris@1115 2650 xhr :put, :new, :project_id => 1, :id => 1, :issue => {:subject => 'Changed'}
Chris@1115 2651 assert_response :success
Chris@1115 2652 assert_equal 'text/javascript', response.content_type
Chris@1115 2653
Chris@1115 2654 issue = assigns(:issue)
Chris@1115 2655 assert_equal User.find(2), issue.author
Chris@1115 2656 assert_equal 2, issue.author_id
Chris@1115 2657 assert_not_equal User.current, issue.author
Chris@1115 2658 end
Chris@1115 2659
Chris@1115 2660 def test_update_edit_form_should_propose_transitions_based_on_initial_status
Chris@0 2661 @request.session[:user_id] = 2
Chris@1115 2662 WorkflowTransition.delete_all
Chris@1115 2663 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :new_status_id => 1)
Chris@1115 2664 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :new_status_id => 5)
Chris@1115 2665 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 5, :new_status_id => 4)
Chris@1115 2666
Chris@1115 2667 xhr :put, :new, :project_id => 1,
Chris@1115 2668 :id => 2,
Chris@1115 2669 :issue => {:tracker_id => 2,
Chris@1115 2670 :status_id => 5,
Chris@1115 2671 :subject => 'This is an issue'}
Chris@1115 2672
Chris@1115 2673 assert_equal 5, assigns(:issue).status_id
Chris@1115 2674 assert_equal [1,2,5], assigns(:allowed_statuses).map(&:id).sort
Chris@1115 2675 end
Chris@1115 2676
Chris@1115 2677 def test_update_edit_form_with_project_change
Chris@1115 2678 @request.session[:user_id] = 2
Chris@1115 2679 xhr :put, :new, :project_id => 1,
Chris@1115 2680 :id => 1,
Chris@1115 2681 :issue => {:project_id => 2,
Chris@1115 2682 :tracker_id => 2,
Chris@1115 2683 :subject => 'This is the test_new issue',
Chris@1115 2684 :description => 'This is the description',
Chris@1115 2685 :priority_id => 5}
Chris@1115 2686 assert_response :success
Chris@1115 2687 assert_template 'form'
Chris@1115 2688
Chris@1115 2689 issue = assigns(:issue)
Chris@1115 2690 assert_kind_of Issue, issue
Chris@1115 2691 assert_equal 1, issue.id
Chris@1115 2692 assert_equal 2, issue.project_id
Chris@1115 2693 assert_equal 2, issue.tracker_id
Chris@1115 2694 assert_equal 'This is the test_new issue', issue.subject
Chris@0 2695 end
Chris@0 2696
Chris@0 2697 def test_put_update_without_custom_fields_param
Chris@0 2698 @request.session[:user_id] = 2
Chris@0 2699 ActionMailer::Base.deliveries.clear
Chris@441 2700
Chris@0 2701 issue = Issue.find(1)
Chris@0 2702 assert_equal '125', issue.custom_value_for(2).value
Chris@0 2703 old_subject = issue.subject
Chris@0 2704 new_subject = 'Subject modified by IssuesControllerTest#test_post_edit'
Chris@441 2705
Chris@0 2706 assert_difference('Journal.count') do
Chris@0 2707 assert_difference('JournalDetail.count', 2) do
Chris@0 2708 put :update, :id => 1, :issue => {:subject => new_subject,
Chris@0 2709 :priority_id => '6',
Chris@0 2710 :category_id => '1' # no change
Chris@0 2711 }
Chris@0 2712 end
Chris@0 2713 end
Chris@0 2714 assert_redirected_to :action => 'show', :id => '1'
Chris@0 2715 issue.reload
Chris@0 2716 assert_equal new_subject, issue.subject
Chris@0 2717 # Make sure custom fields were not cleared
Chris@0 2718 assert_equal '125', issue.custom_value_for(2).value
Chris@441 2719
Chris@0 2720 mail = ActionMailer::Base.deliveries.last
Chris@1115 2721 assert_not_nil mail
Chris@0 2722 assert mail.subject.starts_with?("[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}]")
Chris@1115 2723 assert_mail_body_match "Subject changed from #{old_subject} to #{new_subject}", mail
Chris@1115 2724 end
Chris@1115 2725
Chris@1115 2726 def test_put_update_with_project_change
Chris@1115 2727 @request.session[:user_id] = 2
Chris@1115 2728 ActionMailer::Base.deliveries.clear
Chris@1115 2729
Chris@1115 2730 assert_difference('Journal.count') do
Chris@1115 2731 assert_difference('JournalDetail.count', 3) do
Chris@1115 2732 put :update, :id => 1, :issue => {:project_id => '2',
Chris@1115 2733 :tracker_id => '1', # no change
Chris@1115 2734 :priority_id => '6',
Chris@1115 2735 :category_id => '3'
Chris@1115 2736 }
Chris@1115 2737 end
Chris@1115 2738 end
Chris@1115 2739 assert_redirected_to :action => 'show', :id => '1'
Chris@1115 2740 issue = Issue.find(1)
Chris@1115 2741 assert_equal 2, issue.project_id
Chris@1115 2742 assert_equal 1, issue.tracker_id
Chris@1115 2743 assert_equal 6, issue.priority_id
Chris@1115 2744 assert_equal 3, issue.category_id
Chris@1115 2745
Chris@1115 2746 mail = ActionMailer::Base.deliveries.last
Chris@1115 2747 assert_not_nil mail
Chris@1115 2748 assert mail.subject.starts_with?("[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}]")
Chris@1115 2749 assert_mail_body_match "Project changed from eCookbook to OnlineStore", mail
Chris@1115 2750 end
Chris@1115 2751
Chris@1115 2752 def test_put_update_with_tracker_change
Chris@1115 2753 @request.session[:user_id] = 2
Chris@1115 2754 ActionMailer::Base.deliveries.clear
Chris@1115 2755
Chris@1115 2756 assert_difference('Journal.count') do
Chris@1115 2757 assert_difference('JournalDetail.count', 2) do
Chris@1115 2758 put :update, :id => 1, :issue => {:project_id => '1',
Chris@1115 2759 :tracker_id => '2',
Chris@1115 2760 :priority_id => '6'
Chris@1115 2761 }
Chris@1115 2762 end
Chris@1115 2763 end
Chris@1115 2764 assert_redirected_to :action => 'show', :id => '1'
Chris@1115 2765 issue = Issue.find(1)
Chris@1115 2766 assert_equal 1, issue.project_id
Chris@1115 2767 assert_equal 2, issue.tracker_id
Chris@1115 2768 assert_equal 6, issue.priority_id
Chris@1115 2769 assert_equal 1, issue.category_id
Chris@1115 2770
Chris@1115 2771 mail = ActionMailer::Base.deliveries.last
Chris@1115 2772 assert_not_nil mail
Chris@1115 2773 assert mail.subject.starts_with?("[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}]")
Chris@1115 2774 assert_mail_body_match "Tracker changed from Bug to Feature request", mail
Chris@0 2775 end
Chris@441 2776
Chris@0 2777 def test_put_update_with_custom_field_change
Chris@0 2778 @request.session[:user_id] = 2
Chris@0 2779 issue = Issue.find(1)
Chris@0 2780 assert_equal '125', issue.custom_value_for(2).value
Chris@441 2781
Chris@0 2782 assert_difference('Journal.count') do
Chris@0 2783 assert_difference('JournalDetail.count', 3) do
Chris@0 2784 put :update, :id => 1, :issue => {:subject => 'Custom field change',
Chris@0 2785 :priority_id => '6',
Chris@0 2786 :category_id => '1', # no change
Chris@0 2787 :custom_field_values => { '2' => 'New custom value' }
Chris@0 2788 }
Chris@0 2789 end
Chris@0 2790 end
Chris@0 2791 assert_redirected_to :action => 'show', :id => '1'
Chris@0 2792 issue.reload
Chris@0 2793 assert_equal 'New custom value', issue.custom_value_for(2).value
Chris@441 2794
Chris@0 2795 mail = ActionMailer::Base.deliveries.last
Chris@1115 2796 assert_not_nil mail
Chris@1115 2797 assert_mail_body_match "Searchable field changed from 125 to New custom value", mail
Chris@1115 2798 end
Chris@1115 2799
Chris@1115 2800 def test_put_update_with_multi_custom_field_change
Chris@1115 2801 field = CustomField.find(1)
Chris@1115 2802 field.update_attribute :multiple, true
Chris@1115 2803 issue = Issue.find(1)
Chris@1115 2804 issue.custom_field_values = {1 => ['MySQL', 'Oracle']}
Chris@1115 2805 issue.save!
Chris@1115 2806
Chris@1115 2807 @request.session[:user_id] = 2
Chris@1115 2808 assert_difference('Journal.count') do
Chris@1115 2809 assert_difference('JournalDetail.count', 3) do
Chris@1115 2810 put :update, :id => 1,
Chris@1115 2811 :issue => {
Chris@1115 2812 :subject => 'Custom field change',
Chris@1115 2813 :custom_field_values => { '1' => ['', 'Oracle', 'PostgreSQL'] }
Chris@1115 2814 }
Chris@1115 2815 end
Chris@1115 2816 end
Chris@1115 2817 assert_redirected_to :action => 'show', :id => '1'
Chris@1115 2818 assert_equal ['Oracle', 'PostgreSQL'], Issue.find(1).custom_field_value(1).sort
Chris@0 2819 end
Chris@441 2820
Chris@0 2821 def test_put_update_with_status_and_assignee_change
Chris@0 2822 issue = Issue.find(1)
Chris@0 2823 assert_equal 1, issue.status_id
Chris@0 2824 @request.session[:user_id] = 2
Chris@0 2825 assert_difference('TimeEntry.count', 0) do
Chris@0 2826 put :update,
Chris@0 2827 :id => 1,
Chris@1115 2828 :issue => { :status_id => 2, :assigned_to_id => 3, :notes => 'Assigned to dlopper' },
Chris@0 2829 :time_entry => { :hours => '', :comments => '', :activity_id => TimeEntryActivity.first }
Chris@0 2830 end
Chris@0 2831 assert_redirected_to :action => 'show', :id => '1'
Chris@0 2832 issue.reload
Chris@0 2833 assert_equal 2, issue.status_id
Chris@0 2834 j = Journal.find(:first, :order => 'id DESC')
Chris@0 2835 assert_equal 'Assigned to dlopper', j.notes
Chris@0 2836 assert_equal 2, j.details.size
Chris@441 2837
Chris@0 2838 mail = ActionMailer::Base.deliveries.last
Chris@1115 2839 assert_mail_body_match "Status changed from New to Assigned", mail
Chris@0 2840 # subject should contain the new status
Chris@0 2841 assert mail.subject.include?("(#{ IssueStatus.find(2).name })")
Chris@0 2842 end
Chris@441 2843
Chris@0 2844 def test_put_update_with_note_only
Chris@0 2845 notes = 'Note added by IssuesControllerTest#test_update_with_note_only'
Chris@0 2846 # anonymous user
Chris@0 2847 put :update,
Chris@0 2848 :id => 1,
Chris@1115 2849 :issue => { :notes => notes }
Chris@0 2850 assert_redirected_to :action => 'show', :id => '1'
Chris@0 2851 j = Journal.find(:first, :order => 'id DESC')
Chris@0 2852 assert_equal notes, j.notes
Chris@0 2853 assert_equal 0, j.details.size
Chris@0 2854 assert_equal User.anonymous, j.user
Chris@441 2855
Chris@0 2856 mail = ActionMailer::Base.deliveries.last
Chris@1115 2857 assert_mail_body_match notes, mail
Chris@1115 2858 end
Chris@1115 2859
Chris@1115 2860 def test_put_update_with_private_note_only
Chris@1115 2861 notes = 'Private note'
Chris@1115 2862 @request.session[:user_id] = 2
Chris@1115 2863
Chris@1115 2864 assert_difference 'Journal.count' do
Chris@1115 2865 put :update, :id => 1, :issue => {:notes => notes, :private_notes => '1'}
Chris@1115 2866 assert_redirected_to :action => 'show', :id => '1'
Chris@1115 2867 end
Chris@1115 2868
Chris@1115 2869 j = Journal.order('id DESC').first
Chris@1115 2870 assert_equal notes, j.notes
Chris@1115 2871 assert_equal true, j.private_notes
Chris@1115 2872 end
Chris@1115 2873
Chris@1115 2874 def test_put_update_with_private_note_and_changes
Chris@1115 2875 notes = 'Private note'
Chris@1115 2876 @request.session[:user_id] = 2
Chris@1115 2877
Chris@1115 2878 assert_difference 'Journal.count', 2 do
Chris@1115 2879 put :update, :id => 1, :issue => {:subject => 'New subject', :notes => notes, :private_notes => '1'}
Chris@1115 2880 assert_redirected_to :action => 'show', :id => '1'
Chris@1115 2881 end
Chris@1115 2882
Chris@1115 2883 j = Journal.order('id DESC').first
Chris@1115 2884 assert_equal notes, j.notes
Chris@1115 2885 assert_equal true, j.private_notes
Chris@1115 2886 assert_equal 0, j.details.count
Chris@1115 2887
Chris@1115 2888 j = Journal.order('id DESC').offset(1).first
Chris@1115 2889 assert_nil j.notes
Chris@1115 2890 assert_equal false, j.private_notes
Chris@1115 2891 assert_equal 1, j.details.count
Chris@0 2892 end
Chris@441 2893
Chris@0 2894 def test_put_update_with_note_and_spent_time
Chris@0 2895 @request.session[:user_id] = 2
Chris@0 2896 spent_hours_before = Issue.find(1).spent_hours
Chris@0 2897 assert_difference('TimeEntry.count') do
Chris@0 2898 put :update,
Chris@0 2899 :id => 1,
Chris@1115 2900 :issue => { :notes => '2.5 hours added' },
Chris@0 2901 :time_entry => { :hours => '2.5', :comments => 'test_put_update_with_note_and_spent_time', :activity_id => TimeEntryActivity.first.id }
Chris@0 2902 end
Chris@0 2903 assert_redirected_to :action => 'show', :id => '1'
Chris@441 2904
Chris@0 2905 issue = Issue.find(1)
Chris@441 2906
Chris@0 2907 j = Journal.find(:first, :order => 'id DESC')
Chris@0 2908 assert_equal '2.5 hours added', j.notes
Chris@0 2909 assert_equal 0, j.details.size
Chris@441 2910
Chris@0 2911 t = issue.time_entries.find_by_comments('test_put_update_with_note_and_spent_time')
Chris@0 2912 assert_not_nil t
Chris@0 2913 assert_equal 2.5, t.hours
Chris@0 2914 assert_equal spent_hours_before + 2.5, issue.spent_hours
Chris@0 2915 end
Chris@441 2916
Chris@1294 2917 def test_put_update_should_preserve_parent_issue_even_if_not_visible
Chris@1294 2918 parent = Issue.generate!(:project_id => 1, :is_private => true)
Chris@1294 2919 issue = Issue.generate!(:parent_issue_id => parent.id)
Chris@1294 2920 assert !parent.visible?(User.find(3))
Chris@1294 2921 @request.session[:user_id] = 3
Chris@1294 2922
Chris@1294 2923 get :edit, :id => issue.id
Chris@1294 2924 assert_select 'input[name=?][value=?]', 'issue[parent_issue_id]', parent.id.to_s
Chris@1294 2925
Chris@1294 2926 put :update, :id => issue.id, :issue => {:subject => 'New subject', :parent_issue_id => parent.id.to_s}
Chris@1294 2927 assert_response 302
Chris@1294 2928 assert_equal parent, issue.parent
Chris@1294 2929 end
Chris@1294 2930
Chris@0 2931 def test_put_update_with_attachment_only
Chris@0 2932 set_tmp_attachments_directory
Chris@441 2933
Chris@0 2934 # Delete all fixtured journals, a race condition can occur causing the wrong
Chris@0 2935 # journal to get fetched in the next find.
Chris@0 2936 Journal.delete_all
Chris@0 2937
Chris@0 2938 # anonymous user
Chris@909 2939 assert_difference 'Attachment.count' do
Chris@909 2940 put :update, :id => 1,
Chris@1115 2941 :issue => {:notes => ''},
Chris@909 2942 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}}
Chris@909 2943 end
Chris@909 2944
Chris@0 2945 assert_redirected_to :action => 'show', :id => '1'
Chris@0 2946 j = Issue.find(1).journals.find(:first, :order => 'id DESC')
Chris@0 2947 assert j.notes.blank?
Chris@0 2948 assert_equal 1, j.details.size
Chris@0 2949 assert_equal 'testfile.txt', j.details.first.value
Chris@0 2950 assert_equal User.anonymous, j.user
Chris@441 2951
Chris@909 2952 attachment = Attachment.first(:order => 'id DESC')
Chris@909 2953 assert_equal Issue.find(1), attachment.container
Chris@909 2954 assert_equal User.anonymous, attachment.author
Chris@909 2955 assert_equal 'testfile.txt', attachment.filename
Chris@909 2956 assert_equal 'text/plain', attachment.content_type
Chris@909 2957 assert_equal 'test file', attachment.description
Chris@909 2958 assert_equal 59, attachment.filesize
Chris@909 2959 assert File.exists?(attachment.diskfile)
Chris@909 2960 assert_equal 59, File.size(attachment.diskfile)
Chris@909 2961
Chris@0 2962 mail = ActionMailer::Base.deliveries.last
Chris@1115 2963 assert_mail_body_match 'testfile.txt', mail
Chris@1115 2964 end
Chris@1115 2965
Chris@1115 2966 def test_put_update_with_failure_should_save_attachments
Chris@1115 2967 set_tmp_attachments_directory
Chris@1115 2968 @request.session[:user_id] = 2
Chris@1115 2969
Chris@1115 2970 assert_no_difference 'Journal.count' do
Chris@1115 2971 assert_difference 'Attachment.count' do
Chris@1115 2972 put :update, :id => 1,
Chris@1115 2973 :issue => { :subject => '' },
Chris@1115 2974 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}}
Chris@1115 2975 assert_response :success
Chris@1115 2976 assert_template 'edit'
Chris@1115 2977 end
Chris@1115 2978 end
Chris@1115 2979
Chris@1115 2980 attachment = Attachment.first(:order => 'id DESC')
Chris@1115 2981 assert_equal 'testfile.txt', attachment.filename
Chris@1115 2982 assert File.exists?(attachment.diskfile)
Chris@1115 2983 assert_nil attachment.container
Chris@1115 2984
Chris@1115 2985 assert_tag 'input', :attributes => {:name => 'attachments[p0][token]', :value => attachment.token}
Chris@1115 2986 assert_tag 'span', :content => /testfile.txt/
Chris@1115 2987 end
Chris@1115 2988
Chris@1115 2989 def test_put_update_with_failure_should_keep_saved_attachments
Chris@1115 2990 set_tmp_attachments_directory
Chris@1115 2991 attachment = Attachment.create!(:file => uploaded_test_file("testfile.txt", "text/plain"), :author_id => 2)
Chris@1115 2992 @request.session[:user_id] = 2
Chris@1115 2993
Chris@1115 2994 assert_no_difference 'Journal.count' do
Chris@1115 2995 assert_no_difference 'Attachment.count' do
Chris@1115 2996 put :update, :id => 1,
Chris@1115 2997 :issue => { :subject => '' },
Chris@1115 2998 :attachments => {'p0' => {'token' => attachment.token}}
Chris@1115 2999 assert_response :success
Chris@1115 3000 assert_template 'edit'
Chris@1115 3001 end
Chris@1115 3002 end
Chris@1115 3003
Chris@1115 3004 assert_tag 'input', :attributes => {:name => 'attachments[p0][token]', :value => attachment.token}
Chris@1115 3005 assert_tag 'span', :content => /testfile.txt/
Chris@1115 3006 end
Chris@1115 3007
Chris@1115 3008 def test_put_update_should_attach_saved_attachments
Chris@1115 3009 set_tmp_attachments_directory
Chris@1115 3010 attachment = Attachment.create!(:file => uploaded_test_file("testfile.txt", "text/plain"), :author_id => 2)
Chris@1115 3011 @request.session[:user_id] = 2
Chris@1115 3012
Chris@1115 3013 assert_difference 'Journal.count' do
Chris@1115 3014 assert_difference 'JournalDetail.count' do
Chris@1115 3015 assert_no_difference 'Attachment.count' do
Chris@1115 3016 put :update, :id => 1,
Chris@1115 3017 :issue => {:notes => 'Attachment added'},
Chris@1115 3018 :attachments => {'p0' => {'token' => attachment.token}}
Chris@1115 3019 assert_redirected_to '/issues/1'
Chris@1115 3020 end
Chris@1115 3021 end
Chris@1115 3022 end
Chris@1115 3023
Chris@1115 3024 attachment.reload
Chris@1115 3025 assert_equal Issue.find(1), attachment.container
Chris@1115 3026
Chris@1115 3027 journal = Journal.first(:order => 'id DESC')
Chris@1115 3028 assert_equal 1, journal.details.size
Chris@1115 3029 assert_equal 'testfile.txt', journal.details.first.value
Chris@0 3030 end
Chris@0 3031
Chris@0 3032 def test_put_update_with_attachment_that_fails_to_save
Chris@0 3033 set_tmp_attachments_directory
Chris@441 3034
Chris@0 3035 # Delete all fixtured journals, a race condition can occur causing the wrong
Chris@0 3036 # journal to get fetched in the next find.
Chris@0 3037 Journal.delete_all
Chris@0 3038
Chris@0 3039 # Mock out the unsaved attachment
Chris@0 3040 Attachment.any_instance.stubs(:create).returns(Attachment.new)
Chris@441 3041
Chris@0 3042 # anonymous user
Chris@0 3043 put :update,
Chris@0 3044 :id => 1,
Chris@1115 3045 :issue => {:notes => ''},
Chris@0 3046 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
Chris@0 3047 assert_redirected_to :action => 'show', :id => '1'
Chris@0 3048 assert_equal '1 file(s) could not be saved.', flash[:warning]
Chris@1115 3049 end
Chris@0 3050
Chris@0 3051 def test_put_update_with_no_change
Chris@0 3052 issue = Issue.find(1)
Chris@0 3053 issue.journals.clear
Chris@0 3054 ActionMailer::Base.deliveries.clear
Chris@441 3055
Chris@0 3056 put :update,
Chris@0 3057 :id => 1,
Chris@1115 3058 :issue => {:notes => ''}
Chris@0 3059 assert_redirected_to :action => 'show', :id => '1'
Chris@441 3060
Chris@0 3061 issue.reload
Chris@0 3062 assert issue.journals.empty?
Chris@0 3063 # No email should be sent
Chris@0 3064 assert ActionMailer::Base.deliveries.empty?
Chris@0 3065 end
Chris@0 3066
Chris@0 3067 def test_put_update_should_send_a_notification
Chris@0 3068 @request.session[:user_id] = 2
Chris@0 3069 ActionMailer::Base.deliveries.clear
Chris@0 3070 issue = Issue.find(1)
Chris@0 3071 old_subject = issue.subject
Chris@0 3072 new_subject = 'Subject modified by IssuesControllerTest#test_post_edit'
Chris@441 3073
Chris@0 3074 put :update, :id => 1, :issue => {:subject => new_subject,
Chris@0 3075 :priority_id => '6',
Chris@0 3076 :category_id => '1' # no change
Chris@0 3077 }
Chris@0 3078 assert_equal 1, ActionMailer::Base.deliveries.size
Chris@0 3079 end
Chris@441 3080
Chris@441 3081 def test_put_update_with_invalid_spent_time_hours_only
Chris@0 3082 @request.session[:user_id] = 2
Chris@0 3083 notes = 'Note added by IssuesControllerTest#test_post_edit_with_invalid_spent_time'
Chris@441 3084
Chris@0 3085 assert_no_difference('Journal.count') do
Chris@0 3086 put :update,
Chris@0 3087 :id => 1,
Chris@1115 3088 :issue => {:notes => notes},
Chris@0 3089 :time_entry => {"comments"=>"", "activity_id"=>"", "hours"=>"2z"}
Chris@0 3090 end
Chris@0 3091 assert_response :success
Chris@0 3092 assert_template 'edit'
Chris@441 3093
Chris@1115 3094 assert_error_tag :descendant => {:content => /Activity can&#x27;t be blank/}
Chris@1115 3095 assert_tag :textarea, :attributes => { :name => 'issue[notes]' }, :content => "\n"+notes
Chris@0 3096 assert_tag :input, :attributes => { :name => 'time_entry[hours]', :value => "2z" }
Chris@0 3097 end
Chris@441 3098
Chris@441 3099 def test_put_update_with_invalid_spent_time_comments_only
Chris@441 3100 @request.session[:user_id] = 2
Chris@441 3101 notes = 'Note added by IssuesControllerTest#test_post_edit_with_invalid_spent_time'
Chris@441 3102
Chris@441 3103 assert_no_difference('Journal.count') do
Chris@441 3104 put :update,
Chris@441 3105 :id => 1,
Chris@1115 3106 :issue => {:notes => notes},
Chris@441 3107 :time_entry => {"comments"=>"this is my comment", "activity_id"=>"", "hours"=>""}
Chris@441 3108 end
Chris@441 3109 assert_response :success
Chris@441 3110 assert_template 'edit'
Chris@441 3111
Chris@1115 3112 assert_error_tag :descendant => {:content => /Activity can&#x27;t be blank/}
Chris@1115 3113 assert_error_tag :descendant => {:content => /Hours can&#x27;t be blank/}
Chris@1115 3114 assert_tag :textarea, :attributes => { :name => 'issue[notes]' }, :content => "\n"+notes
Chris@441 3115 assert_tag :input, :attributes => { :name => 'time_entry[comments]', :value => "this is my comment" }
Chris@441 3116 end
Chris@441 3117
Chris@0 3118 def test_put_update_should_allow_fixed_version_to_be_set_to_a_subproject
Chris@0 3119 issue = Issue.find(2)
Chris@0 3120 @request.session[:user_id] = 2
Chris@0 3121
Chris@0 3122 put :update,
Chris@0 3123 :id => issue.id,
Chris@0 3124 :issue => {
Chris@0 3125 :fixed_version_id => 4
Chris@0 3126 }
Chris@0 3127
Chris@0 3128 assert_response :redirect
Chris@0 3129 issue.reload
Chris@0 3130 assert_equal 4, issue.fixed_version_id
Chris@0 3131 assert_not_equal issue.project_id, issue.fixed_version.project_id
Chris@0 3132 end
Chris@0 3133
Chris@0 3134 def test_put_update_should_redirect_back_using_the_back_url_parameter
Chris@0 3135 issue = Issue.find(2)
Chris@0 3136 @request.session[:user_id] = 2
Chris@0 3137
Chris@0 3138 put :update,
Chris@0 3139 :id => issue.id,
Chris@0 3140 :issue => {
Chris@0 3141 :fixed_version_id => 4
Chris@0 3142 },
Chris@0 3143 :back_url => '/issues'
Chris@0 3144
Chris@0 3145 assert_response :redirect
Chris@0 3146 assert_redirected_to '/issues'
Chris@0 3147 end
Chris@441 3148
Chris@0 3149 def test_put_update_should_not_redirect_back_using_the_back_url_parameter_off_the_host
Chris@0 3150 issue = Issue.find(2)
Chris@0 3151 @request.session[:user_id] = 2
Chris@0 3152
Chris@0 3153 put :update,
Chris@0 3154 :id => issue.id,
Chris@0 3155 :issue => {
Chris@0 3156 :fixed_version_id => 4
Chris@0 3157 },
Chris@0 3158 :back_url => 'http://google.com'
Chris@0 3159
Chris@0 3160 assert_response :redirect
Chris@0 3161 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue.id
Chris@0 3162 end
Chris@441 3163
Chris@0 3164 def test_get_bulk_edit
Chris@0 3165 @request.session[:user_id] = 2
Chris@0 3166 get :bulk_edit, :ids => [1, 2]
Chris@0 3167 assert_response :success
Chris@0 3168 assert_template 'bulk_edit'
Chris@441 3169
Chris@1115 3170 assert_tag :select, :attributes => {:name => 'issue[project_id]'}
Chris@441 3171 assert_tag :input, :attributes => {:name => 'issue[parent_issue_id]'}
Chris@441 3172
Chris@0 3173 # Project specific custom field, date type
Chris@0 3174 field = CustomField.find(9)
Chris@0 3175 assert !field.is_for_all?
Chris@0 3176 assert_equal 'date', field.field_format
Chris@0 3177 assert_tag :input, :attributes => {:name => 'issue[custom_field_values][9]'}
Chris@441 3178
Chris@0 3179 # System wide custom field
Chris@0 3180 assert CustomField.find(1).is_for_all?
Chris@0 3181 assert_tag :select, :attributes => {:name => 'issue[custom_field_values][1]'}
Chris@909 3182
Chris@909 3183 # Be sure we don't display inactive IssuePriorities
Chris@909 3184 assert ! IssuePriority.find(15).active?
Chris@909 3185 assert_no_tag :option, :attributes => {:value => '15'},
Chris@909 3186 :parent => {:tag => 'select', :attributes => {:id => 'issue_priority_id'} }
Chris@0 3187 end
Chris@0 3188
chris@37 3189 def test_get_bulk_edit_on_different_projects
chris@37 3190 @request.session[:user_id] = 2
chris@37 3191 get :bulk_edit, :ids => [1, 2, 6]
chris@37 3192 assert_response :success
chris@37 3193 assert_template 'bulk_edit'
Chris@441 3194
Chris@441 3195 # Can not set issues from different projects as children of an issue
Chris@441 3196 assert_no_tag :input, :attributes => {:name => 'issue[parent_issue_id]'}
Chris@441 3197
chris@37 3198 # Project specific custom field, date type
chris@37 3199 field = CustomField.find(9)
chris@37 3200 assert !field.is_for_all?
chris@37 3201 assert !field.project_ids.include?(Issue.find(6).project_id)
chris@37 3202 assert_no_tag :input, :attributes => {:name => 'issue[custom_field_values][9]'}
chris@37 3203 end
chris@37 3204
Chris@441 3205 def test_get_bulk_edit_with_user_custom_field
Chris@441 3206 field = IssueCustomField.create!(:name => 'Tester', :field_format => 'user', :is_for_all => true)
Chris@441 3207
Chris@441 3208 @request.session[:user_id] = 2
Chris@441 3209 get :bulk_edit, :ids => [1, 2]
Chris@441 3210 assert_response :success
Chris@441 3211 assert_template 'bulk_edit'
Chris@441 3212
Chris@441 3213 assert_tag :select,
Chris@1115 3214 :attributes => {:name => "issue[custom_field_values][#{field.id}]", :class => 'user_cf'},
Chris@441 3215 :children => {
Chris@441 3216 :only => {:tag => 'option'},
Chris@1115 3217 :count => Project.find(1).users.count + 2 # "no change" + "none" options
Chris@441 3218 }
Chris@441 3219 end
Chris@441 3220
Chris@441 3221 def test_get_bulk_edit_with_version_custom_field
Chris@441 3222 field = IssueCustomField.create!(:name => 'Affected version', :field_format => 'version', :is_for_all => true)
Chris@441 3223
Chris@441 3224 @request.session[:user_id] = 2
Chris@441 3225 get :bulk_edit, :ids => [1, 2]
Chris@441 3226 assert_response :success
Chris@441 3227 assert_template 'bulk_edit'
Chris@441 3228
Chris@441 3229 assert_tag :select,
Chris@441 3230 :attributes => {:name => "issue[custom_field_values][#{field.id}]"},
Chris@441 3231 :children => {
Chris@441 3232 :only => {:tag => 'option'},
Chris@1115 3233 :count => Project.find(1).shared_versions.count + 2 # "no change" + "none" options
Chris@441 3234 }
Chris@441 3235 end
Chris@441 3236
Chris@1115 3237 def test_get_bulk_edit_with_multi_custom_field
Chris@1115 3238 field = CustomField.find(1)
Chris@1115 3239 field.update_attribute :multiple, true
Chris@1115 3240
Chris@1115 3241 @request.session[:user_id] = 2
Chris@1115 3242 get :bulk_edit, :ids => [1, 2]
Chris@1115 3243 assert_response :success
Chris@1115 3244 assert_template 'bulk_edit'
Chris@1115 3245
Chris@1115 3246 assert_tag :select,
Chris@1115 3247 :attributes => {:name => "issue[custom_field_values][1][]"},
Chris@1115 3248 :children => {
Chris@1115 3249 :only => {:tag => 'option'},
Chris@1115 3250 :count => field.possible_values.size + 1 # "none" options
Chris@1115 3251 }
Chris@1115 3252 end
Chris@1115 3253
Chris@1115 3254 def test_bulk_edit_should_only_propose_statuses_allowed_for_all_issues
Chris@1115 3255 WorkflowTransition.delete_all
Chris@1115 3256 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 1)
Chris@1115 3257 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 3)
Chris@1115 3258 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 4)
Chris@1115 3259 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :new_status_id => 1)
Chris@1115 3260 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :new_status_id => 3)
Chris@1115 3261 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :new_status_id => 5)
Chris@1115 3262 @request.session[:user_id] = 2
Chris@1115 3263 get :bulk_edit, :ids => [1, 2]
Chris@1115 3264
Chris@1115 3265 assert_response :success
Chris@1115 3266 statuses = assigns(:available_statuses)
Chris@1115 3267 assert_not_nil statuses
Chris@1115 3268 assert_equal [1, 3], statuses.map(&:id).sort
Chris@1115 3269
Chris@1115 3270 assert_tag 'select', :attributes => {:name => 'issue[status_id]'},
Chris@1115 3271 :children => {:count => 3} # 2 statuses + "no change" option
Chris@1115 3272 end
Chris@1115 3273
Chris@1115 3274 def test_bulk_edit_should_propose_target_project_open_shared_versions
Chris@1115 3275 @request.session[:user_id] = 2
Chris@1115 3276 post :bulk_edit, :ids => [1, 2, 6], :issue => {:project_id => 1}
Chris@1115 3277 assert_response :success
Chris@1115 3278 assert_template 'bulk_edit'
Chris@1115 3279 assert_equal Project.find(1).shared_versions.open.all.sort, assigns(:versions).sort
Chris@1115 3280 assert_tag 'select',
Chris@1115 3281 :attributes => {:name => 'issue[fixed_version_id]'},
Chris@1115 3282 :descendant => {:tag => 'option', :content => '2.0'}
Chris@1115 3283 end
Chris@1115 3284
Chris@1115 3285 def test_bulk_edit_should_propose_target_project_categories
Chris@1115 3286 @request.session[:user_id] = 2
Chris@1115 3287 post :bulk_edit, :ids => [1, 2, 6], :issue => {:project_id => 1}
Chris@1115 3288 assert_response :success
Chris@1115 3289 assert_template 'bulk_edit'
Chris@1115 3290 assert_equal Project.find(1).issue_categories.sort, assigns(:categories).sort
Chris@1115 3291 assert_tag 'select',
Chris@1115 3292 :attributes => {:name => 'issue[category_id]'},
Chris@1115 3293 :descendant => {:tag => 'option', :content => 'Recipes'}
Chris@1115 3294 end
Chris@1115 3295
Chris@14 3296 def test_bulk_update
Chris@0 3297 @request.session[:user_id] = 2
Chris@0 3298 # update issues priority
Chris@14 3299 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing',
Chris@0 3300 :issue => {:priority_id => 7,
Chris@0 3301 :assigned_to_id => '',
Chris@0 3302 :custom_field_values => {'2' => ''}}
Chris@441 3303
Chris@0 3304 assert_response 302
Chris@0 3305 # check that the issues were updated
Chris@0 3306 assert_equal [7, 7], Issue.find_all_by_id([1, 2]).collect {|i| i.priority.id}
Chris@441 3307
Chris@0 3308 issue = Issue.find(1)
Chris@0 3309 journal = issue.journals.find(:first, :order => 'created_on DESC')
Chris@0 3310 assert_equal '125', issue.custom_value_for(2).value
Chris@0 3311 assert_equal 'Bulk editing', journal.notes
Chris@0 3312 assert_equal 1, journal.details.size
Chris@0 3313 end
Chris@0 3314
Chris@909 3315 def test_bulk_update_with_group_assignee
Chris@909 3316 group = Group.find(11)
Chris@909 3317 project = Project.find(1)
Chris@929 3318 project.members << Member.new(:principal => group, :roles => [Role.givable.first])
Chris@909 3319
Chris@909 3320 @request.session[:user_id] = 2
Chris@909 3321 # update issues assignee
Chris@909 3322 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing',
Chris@909 3323 :issue => {:priority_id => '',
Chris@909 3324 :assigned_to_id => group.id,
Chris@909 3325 :custom_field_values => {'2' => ''}}
Chris@909 3326
Chris@909 3327 assert_response 302
Chris@909 3328 assert_equal [group, group], Issue.find_all_by_id([1, 2]).collect {|i| i.assigned_to}
Chris@909 3329 end
Chris@909 3330
chris@37 3331 def test_bulk_update_on_different_projects
chris@37 3332 @request.session[:user_id] = 2
chris@37 3333 # update issues priority
chris@37 3334 post :bulk_update, :ids => [1, 2, 6], :notes => 'Bulk editing',
chris@37 3335 :issue => {:priority_id => 7,
chris@37 3336 :assigned_to_id => '',
chris@37 3337 :custom_field_values => {'2' => ''}}
Chris@441 3338
chris@37 3339 assert_response 302
chris@37 3340 # check that the issues were updated
chris@37 3341 assert_equal [7, 7, 7], Issue.find([1,2,6]).map(&:priority_id)
Chris@441 3342
chris@37 3343 issue = Issue.find(1)
chris@37 3344 journal = issue.journals.find(:first, :order => 'created_on DESC')
chris@37 3345 assert_equal '125', issue.custom_value_for(2).value
chris@37 3346 assert_equal 'Bulk editing', journal.notes
chris@37 3347 assert_equal 1, journal.details.size
chris@37 3348 end
chris@37 3349
chris@37 3350 def test_bulk_update_on_different_projects_without_rights
chris@37 3351 @request.session[:user_id] = 3
chris@37 3352 user = User.find(3)
chris@37 3353 action = { :controller => "issues", :action => "bulk_update" }
chris@37 3354 assert user.allowed_to?(action, Issue.find(1).project)
chris@37 3355 assert ! user.allowed_to?(action, Issue.find(6).project)
chris@37 3356 post :bulk_update, :ids => [1, 6], :notes => 'Bulk should fail',
chris@37 3357 :issue => {:priority_id => 7,
chris@37 3358 :assigned_to_id => '',
chris@37 3359 :custom_field_values => {'2' => ''}}
chris@37 3360 assert_response 403
chris@37 3361 assert_not_equal "Bulk should fail", Journal.last.notes
chris@37 3362 end
Chris@441 3363
Chris@14 3364 def test_bullk_update_should_send_a_notification
Chris@0 3365 @request.session[:user_id] = 2
Chris@0 3366 ActionMailer::Base.deliveries.clear
Chris@14 3367 post(:bulk_update,
Chris@0 3368 {
Chris@0 3369 :ids => [1, 2],
Chris@0 3370 :notes => 'Bulk editing',
Chris@0 3371 :issue => {
Chris@0 3372 :priority_id => 7,
Chris@0 3373 :assigned_to_id => '',
Chris@0 3374 :custom_field_values => {'2' => ''}
Chris@0 3375 }
Chris@0 3376 })
Chris@0 3377
Chris@0 3378 assert_response 302
Chris@0 3379 assert_equal 2, ActionMailer::Base.deliveries.size
Chris@0 3380 end
Chris@0 3381
Chris@1115 3382 def test_bulk_update_project
Chris@1115 3383 @request.session[:user_id] = 2
Chris@1115 3384 post :bulk_update, :ids => [1, 2], :issue => {:project_id => '2'}
Chris@1115 3385 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook'
Chris@1115 3386 # Issues moved to project 2
Chris@1115 3387 assert_equal 2, Issue.find(1).project_id
Chris@1115 3388 assert_equal 2, Issue.find(2).project_id
Chris@1115 3389 # No tracker change
Chris@1115 3390 assert_equal 1, Issue.find(1).tracker_id
Chris@1115 3391 assert_equal 2, Issue.find(2).tracker_id
Chris@1115 3392 end
Chris@1115 3393
Chris@1115 3394 def test_bulk_update_project_on_single_issue_should_follow_when_needed
Chris@1115 3395 @request.session[:user_id] = 2
Chris@1115 3396 post :bulk_update, :id => 1, :issue => {:project_id => '2'}, :follow => '1'
Chris@1115 3397 assert_redirected_to '/issues/1'
Chris@1115 3398 end
Chris@1115 3399
Chris@1115 3400 def test_bulk_update_project_on_multiple_issues_should_follow_when_needed
Chris@1115 3401 @request.session[:user_id] = 2
Chris@1115 3402 post :bulk_update, :id => [1, 2], :issue => {:project_id => '2'}, :follow => '1'
Chris@1115 3403 assert_redirected_to '/projects/onlinestore/issues'
Chris@1115 3404 end
Chris@1115 3405
Chris@1115 3406 def test_bulk_update_tracker
Chris@1115 3407 @request.session[:user_id] = 2
Chris@1115 3408 post :bulk_update, :ids => [1, 2], :issue => {:tracker_id => '2'}
Chris@1115 3409 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook'
Chris@1115 3410 assert_equal 2, Issue.find(1).tracker_id
Chris@1115 3411 assert_equal 2, Issue.find(2).tracker_id
Chris@1115 3412 end
Chris@1115 3413
Chris@14 3414 def test_bulk_update_status
Chris@0 3415 @request.session[:user_id] = 2
Chris@0 3416 # update issues priority
Chris@14 3417 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing status',
Chris@0 3418 :issue => {:priority_id => '',
Chris@0 3419 :assigned_to_id => '',
Chris@0 3420 :status_id => '5'}
Chris@441 3421
Chris@0 3422 assert_response 302
Chris@0 3423 issue = Issue.find(1)
Chris@0 3424 assert issue.closed?
Chris@0 3425 end
Chris@0 3426
Chris@1115 3427 def test_bulk_update_priority
Chris@1115 3428 @request.session[:user_id] = 2
Chris@1115 3429 post :bulk_update, :ids => [1, 2], :issue => {:priority_id => 6}
Chris@1115 3430
Chris@1115 3431 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook'
Chris@1115 3432 assert_equal 6, Issue.find(1).priority_id
Chris@1115 3433 assert_equal 6, Issue.find(2).priority_id
Chris@1115 3434 end
Chris@1115 3435
Chris@1115 3436 def test_bulk_update_with_notes
Chris@1115 3437 @request.session[:user_id] = 2
Chris@1115 3438 post :bulk_update, :ids => [1, 2], :notes => 'Moving two issues'
Chris@1115 3439
Chris@1115 3440 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook'
Chris@1115 3441 assert_equal 'Moving two issues', Issue.find(1).journals.sort_by(&:id).last.notes
Chris@1115 3442 assert_equal 'Moving two issues', Issue.find(2).journals.sort_by(&:id).last.notes
Chris@1115 3443 end
Chris@1115 3444
Chris@441 3445 def test_bulk_update_parent_id
Chris@441 3446 @request.session[:user_id] = 2
Chris@441 3447 post :bulk_update, :ids => [1, 3],
Chris@441 3448 :notes => 'Bulk editing parent',
Chris@441 3449 :issue => {:priority_id => '', :assigned_to_id => '', :status_id => '', :parent_issue_id => '2'}
Chris@441 3450
Chris@441 3451 assert_response 302
Chris@441 3452 parent = Issue.find(2)
Chris@441 3453 assert_equal parent.id, Issue.find(1).parent_id
Chris@441 3454 assert_equal parent.id, Issue.find(3).parent_id
Chris@441 3455 assert_equal [1, 3], parent.children.collect(&:id).sort
Chris@441 3456 end
Chris@441 3457
Chris@14 3458 def test_bulk_update_custom_field
Chris@0 3459 @request.session[:user_id] = 2
Chris@0 3460 # update issues priority
Chris@14 3461 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing custom field',
Chris@0 3462 :issue => {:priority_id => '',
Chris@0 3463 :assigned_to_id => '',
Chris@0 3464 :custom_field_values => {'2' => '777'}}
Chris@441 3465
Chris@0 3466 assert_response 302
Chris@441 3467
Chris@0 3468 issue = Issue.find(1)
Chris@0 3469 journal = issue.journals.find(:first, :order => 'created_on DESC')
Chris@0 3470 assert_equal '777', issue.custom_value_for(2).value
Chris@0 3471 assert_equal 1, journal.details.size
Chris@0 3472 assert_equal '125', journal.details.first.old_value
Chris@0 3473 assert_equal '777', journal.details.first.value
Chris@0 3474 end
Chris@0 3475
Chris@1115 3476 def test_bulk_update_custom_field_to_blank
Chris@1115 3477 @request.session[:user_id] = 2
Chris@1115 3478 post :bulk_update, :ids => [1, 3], :notes => 'Bulk editing custom field',
Chris@1115 3479 :issue => {:priority_id => '',
Chris@1115 3480 :assigned_to_id => '',
Chris@1115 3481 :custom_field_values => {'1' => '__none__'}}
Chris@1115 3482 assert_response 302
Chris@1115 3483 assert_equal '', Issue.find(1).custom_field_value(1)
Chris@1115 3484 assert_equal '', Issue.find(3).custom_field_value(1)
Chris@1115 3485 end
Chris@1115 3486
Chris@1115 3487 def test_bulk_update_multi_custom_field
Chris@1115 3488 field = CustomField.find(1)
Chris@1115 3489 field.update_attribute :multiple, true
Chris@1115 3490
Chris@1115 3491 @request.session[:user_id] = 2
Chris@1115 3492 post :bulk_update, :ids => [1, 2, 3], :notes => 'Bulk editing multi custom field',
Chris@1115 3493 :issue => {:priority_id => '',
Chris@1115 3494 :assigned_to_id => '',
Chris@1115 3495 :custom_field_values => {'1' => ['MySQL', 'Oracle']}}
Chris@1115 3496
Chris@1115 3497 assert_response 302
Chris@1115 3498
Chris@1115 3499 assert_equal ['MySQL', 'Oracle'], Issue.find(1).custom_field_value(1).sort
Chris@1115 3500 assert_equal ['MySQL', 'Oracle'], Issue.find(3).custom_field_value(1).sort
Chris@1115 3501 # the custom field is not associated with the issue tracker
Chris@1115 3502 assert_nil Issue.find(2).custom_field_value(1)
Chris@1115 3503 end
Chris@1115 3504
Chris@1115 3505 def test_bulk_update_multi_custom_field_to_blank
Chris@1115 3506 field = CustomField.find(1)
Chris@1115 3507 field.update_attribute :multiple, true
Chris@1115 3508
Chris@1115 3509 @request.session[:user_id] = 2
Chris@1115 3510 post :bulk_update, :ids => [1, 3], :notes => 'Bulk editing multi custom field',
Chris@1115 3511 :issue => {:priority_id => '',
Chris@1115 3512 :assigned_to_id => '',
Chris@1115 3513 :custom_field_values => {'1' => ['__none__']}}
Chris@1115 3514 assert_response 302
Chris@1115 3515 assert_equal [''], Issue.find(1).custom_field_value(1)
Chris@1115 3516 assert_equal [''], Issue.find(3).custom_field_value(1)
Chris@1115 3517 end
Chris@1115 3518
Chris@14 3519 def test_bulk_update_unassign
Chris@0 3520 assert_not_nil Issue.find(2).assigned_to
Chris@0 3521 @request.session[:user_id] = 2
Chris@0 3522 # unassign issues
Chris@14 3523 post :bulk_update, :ids => [1, 2], :notes => 'Bulk unassigning', :issue => {:assigned_to_id => 'none'}
Chris@0 3524 assert_response 302
Chris@0 3525 # check that the issues were updated
Chris@0 3526 assert_nil Issue.find(2).assigned_to
Chris@0 3527 end
Chris@441 3528
Chris@14 3529 def test_post_bulk_update_should_allow_fixed_version_to_be_set_to_a_subproject
Chris@0 3530 @request.session[:user_id] = 2
Chris@0 3531
Chris@14 3532 post :bulk_update, :ids => [1,2], :issue => {:fixed_version_id => 4}
Chris@0 3533
Chris@0 3534 assert_response :redirect
Chris@0 3535 issues = Issue.find([1,2])
Chris@0 3536 issues.each do |issue|
Chris@0 3537 assert_equal 4, issue.fixed_version_id
Chris@0 3538 assert_not_equal issue.project_id, issue.fixed_version.project_id
Chris@0 3539 end
Chris@0 3540 end
Chris@0 3541
Chris@14 3542 def test_post_bulk_update_should_redirect_back_using_the_back_url_parameter
Chris@0 3543 @request.session[:user_id] = 2
Chris@14 3544 post :bulk_update, :ids => [1,2], :back_url => '/issues'
Chris@0 3545
Chris@0 3546 assert_response :redirect
Chris@0 3547 assert_redirected_to '/issues'
Chris@0 3548 end
Chris@0 3549
Chris@14 3550 def test_post_bulk_update_should_not_redirect_back_using_the_back_url_parameter_off_the_host
Chris@0 3551 @request.session[:user_id] = 2
Chris@14 3552 post :bulk_update, :ids => [1,2], :back_url => 'http://google.com'
Chris@0 3553
Chris@0 3554 assert_response :redirect
Chris@0 3555 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => Project.find(1).identifier
Chris@0 3556 end
Chris@441 3557
Chris@1115 3558 def test_bulk_update_with_failure_should_set_flash
Chris@1115 3559 @request.session[:user_id] = 2
Chris@1115 3560 Issue.update_all("subject = ''", "id = 2") # Make it invalid
Chris@1115 3561 post :bulk_update, :ids => [1, 2], :issue => {:priority_id => 6}
Chris@1115 3562
Chris@1115 3563 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook'
Chris@1115 3564 assert_equal 'Failed to save 1 issue(s) on 2 selected: #2.', flash[:error]
Chris@1115 3565 end
Chris@1115 3566
Chris@1115 3567 def test_get_bulk_copy
Chris@1115 3568 @request.session[:user_id] = 2
Chris@1115 3569 get :bulk_edit, :ids => [1, 2, 3], :copy => '1'
Chris@1115 3570 assert_response :success
Chris@1115 3571 assert_template 'bulk_edit'
Chris@1115 3572
Chris@1115 3573 issues = assigns(:issues)
Chris@1115 3574 assert_not_nil issues
Chris@1115 3575 assert_equal [1, 2, 3], issues.map(&:id).sort
Chris@1115 3576
Chris@1115 3577 assert_select 'input[name=copy_attachments]'
Chris@1115 3578 end
Chris@1115 3579
Chris@1115 3580 def test_bulk_copy_to_another_project
Chris@1115 3581 @request.session[:user_id] = 2
Chris@1115 3582 assert_difference 'Issue.count', 2 do
Chris@1115 3583 assert_no_difference 'Project.find(1).issues.count' do
Chris@1115 3584 post :bulk_update, :ids => [1, 2], :issue => {:project_id => '2'}, :copy => '1'
Chris@1115 3585 end
Chris@1115 3586 end
Chris@1115 3587 assert_redirected_to '/projects/ecookbook/issues'
Chris@1115 3588
Chris@1115 3589 copies = Issue.all(:order => 'id DESC', :limit => issues.size)
Chris@1115 3590 copies.each do |copy|
Chris@1115 3591 assert_equal 2, copy.project_id
Chris@1115 3592 end
Chris@1115 3593 end
Chris@1115 3594
Chris@1115 3595 def test_bulk_copy_should_allow_not_changing_the_issue_attributes
Chris@1115 3596 @request.session[:user_id] = 2
Chris@1115 3597 issues = [
Chris@1115 3598 Issue.create!(:project_id => 1, :tracker_id => 1, :status_id => 1, :priority_id => 2, :subject => 'issue 1', :author_id => 1, :assigned_to_id => nil),
Chris@1115 3599 Issue.create!(:project_id => 2, :tracker_id => 3, :status_id => 2, :priority_id => 1, :subject => 'issue 2', :author_id => 2, :assigned_to_id => 3)
Chris@1115 3600 ]
Chris@1115 3601
Chris@1115 3602 assert_difference 'Issue.count', issues.size do
Chris@1115 3603 post :bulk_update, :ids => issues.map(&:id), :copy => '1',
Chris@1115 3604 :issue => {
Chris@1115 3605 :project_id => '', :tracker_id => '', :assigned_to_id => '',
Chris@1115 3606 :status_id => '', :start_date => '', :due_date => ''
Chris@1115 3607 }
Chris@1115 3608 end
Chris@1115 3609
Chris@1115 3610 copies = Issue.all(:order => 'id DESC', :limit => issues.size)
Chris@1115 3611 issues.each do |orig|
Chris@1115 3612 copy = copies.detect {|c| c.subject == orig.subject}
Chris@1115 3613 assert_not_nil copy
Chris@1115 3614 assert_equal orig.project_id, copy.project_id
Chris@1115 3615 assert_equal orig.tracker_id, copy.tracker_id
Chris@1115 3616 assert_equal orig.status_id, copy.status_id
Chris@1115 3617 assert_equal orig.assigned_to_id, copy.assigned_to_id
Chris@1115 3618 assert_equal orig.priority_id, copy.priority_id
Chris@1115 3619 end
Chris@1115 3620 end
Chris@1115 3621
Chris@1115 3622 def test_bulk_copy_should_allow_changing_the_issue_attributes
Chris@1115 3623 # Fixes random test failure with Mysql
Chris@1115 3624 # where Issue.all(:limit => 2, :order => 'id desc', :conditions => {:project_id => 2})
Chris@1115 3625 # doesn't return the expected results
Chris@1115 3626 Issue.delete_all("project_id=2")
Chris@1115 3627
Chris@1115 3628 @request.session[:user_id] = 2
Chris@1115 3629 assert_difference 'Issue.count', 2 do
Chris@1115 3630 assert_no_difference 'Project.find(1).issues.count' do
Chris@1115 3631 post :bulk_update, :ids => [1, 2], :copy => '1',
Chris@1115 3632 :issue => {
Chris@1115 3633 :project_id => '2', :tracker_id => '', :assigned_to_id => '4',
Chris@1115 3634 :status_id => '1', :start_date => '2009-12-01', :due_date => '2009-12-31'
Chris@1115 3635 }
Chris@1115 3636 end
Chris@1115 3637 end
Chris@1115 3638
Chris@1115 3639 copied_issues = Issue.all(:limit => 2, :order => 'id desc', :conditions => {:project_id => 2})
Chris@1115 3640 assert_equal 2, copied_issues.size
Chris@1115 3641 copied_issues.each do |issue|
Chris@1115 3642 assert_equal 2, issue.project_id, "Project is incorrect"
Chris@1115 3643 assert_equal 4, issue.assigned_to_id, "Assigned to is incorrect"
Chris@1115 3644 assert_equal 1, issue.status_id, "Status is incorrect"
Chris@1115 3645 assert_equal '2009-12-01', issue.start_date.to_s, "Start date is incorrect"
Chris@1115 3646 assert_equal '2009-12-31', issue.due_date.to_s, "Due date is incorrect"
Chris@1115 3647 end
Chris@1115 3648 end
Chris@1115 3649
Chris@1115 3650 def test_bulk_copy_should_allow_adding_a_note
Chris@1115 3651 @request.session[:user_id] = 2
Chris@1115 3652 assert_difference 'Issue.count', 1 do
Chris@1115 3653 post :bulk_update, :ids => [1], :copy => '1',
Chris@1115 3654 :notes => 'Copying one issue',
Chris@1115 3655 :issue => {
Chris@1115 3656 :project_id => '', :tracker_id => '', :assigned_to_id => '4',
Chris@1115 3657 :status_id => '3', :start_date => '2009-12-01', :due_date => '2009-12-31'
Chris@1115 3658 }
Chris@1115 3659 end
Chris@1115 3660
Chris@1115 3661 issue = Issue.first(:order => 'id DESC')
Chris@1115 3662 assert_equal 1, issue.journals.size
Chris@1115 3663 journal = issue.journals.first
Chris@1115 3664 assert_equal 0, journal.details.size
Chris@1115 3665 assert_equal 'Copying one issue', journal.notes
Chris@1115 3666 end
Chris@1115 3667
Chris@1115 3668 def test_bulk_copy_should_allow_not_copying_the_attachments
Chris@1115 3669 attachment_count = Issue.find(3).attachments.size
Chris@1115 3670 assert attachment_count > 0
Chris@1115 3671 @request.session[:user_id] = 2
Chris@1115 3672
Chris@1115 3673 assert_difference 'Issue.count', 1 do
Chris@1115 3674 assert_no_difference 'Attachment.count' do
Chris@1115 3675 post :bulk_update, :ids => [3], :copy => '1',
Chris@1115 3676 :issue => {
Chris@1115 3677 :project_id => ''
Chris@1115 3678 }
Chris@1115 3679 end
Chris@1115 3680 end
Chris@1115 3681 end
Chris@1115 3682
Chris@1115 3683 def test_bulk_copy_should_allow_copying_the_attachments
Chris@1115 3684 attachment_count = Issue.find(3).attachments.size
Chris@1115 3685 assert attachment_count > 0
Chris@1115 3686 @request.session[:user_id] = 2
Chris@1115 3687
Chris@1115 3688 assert_difference 'Issue.count', 1 do
Chris@1115 3689 assert_difference 'Attachment.count', attachment_count do
Chris@1115 3690 post :bulk_update, :ids => [3], :copy => '1', :copy_attachments => '1',
Chris@1115 3691 :issue => {
Chris@1115 3692 :project_id => ''
Chris@1115 3693 }
Chris@1115 3694 end
Chris@1115 3695 end
Chris@1115 3696 end
Chris@1115 3697
Chris@1115 3698 def test_bulk_copy_should_add_relations_with_copied_issues
Chris@1115 3699 @request.session[:user_id] = 2
Chris@1115 3700
Chris@1115 3701 assert_difference 'Issue.count', 2 do
Chris@1115 3702 assert_difference 'IssueRelation.count', 2 do
Chris@1115 3703 post :bulk_update, :ids => [1, 3], :copy => '1',
Chris@1115 3704 :issue => {
Chris@1115 3705 :project_id => '1'
Chris@1115 3706 }
Chris@1115 3707 end
Chris@1115 3708 end
Chris@1115 3709 end
Chris@1115 3710
Chris@1115 3711 def test_bulk_copy_should_allow_not_copying_the_subtasks
Chris@1115 3712 issue = Issue.generate_with_descendants!
Chris@1115 3713 @request.session[:user_id] = 2
Chris@1115 3714
Chris@1115 3715 assert_difference 'Issue.count', 1 do
Chris@1115 3716 post :bulk_update, :ids => [issue.id], :copy => '1',
Chris@1115 3717 :issue => {
Chris@1115 3718 :project_id => ''
Chris@1115 3719 }
Chris@1115 3720 end
Chris@1115 3721 end
Chris@1115 3722
Chris@1115 3723 def test_bulk_copy_should_allow_copying_the_subtasks
Chris@1115 3724 issue = Issue.generate_with_descendants!
Chris@1115 3725 count = issue.descendants.count
Chris@1115 3726 @request.session[:user_id] = 2
Chris@1115 3727
Chris@1115 3728 assert_difference 'Issue.count', count+1 do
Chris@1115 3729 post :bulk_update, :ids => [issue.id], :copy => '1', :copy_subtasks => '1',
Chris@1115 3730 :issue => {
Chris@1115 3731 :project_id => ''
Chris@1115 3732 }
Chris@1115 3733 end
Chris@1115 3734 copy = Issue.where(:parent_id => nil).order("id DESC").first
Chris@1115 3735 assert_equal count, copy.descendants.count
Chris@1115 3736 end
Chris@1115 3737
Chris@1115 3738 def test_bulk_copy_should_not_copy_selected_subtasks_twice
Chris@1115 3739 issue = Issue.generate_with_descendants!
Chris@1115 3740 count = issue.descendants.count
Chris@1115 3741 @request.session[:user_id] = 2
Chris@1115 3742
Chris@1115 3743 assert_difference 'Issue.count', count+1 do
Chris@1115 3744 post :bulk_update, :ids => issue.self_and_descendants.map(&:id), :copy => '1', :copy_subtasks => '1',
Chris@1115 3745 :issue => {
Chris@1115 3746 :project_id => ''
Chris@1115 3747 }
Chris@1115 3748 end
Chris@1115 3749 copy = Issue.where(:parent_id => nil).order("id DESC").first
Chris@1115 3750 assert_equal count, copy.descendants.count
Chris@1115 3751 end
Chris@1115 3752
Chris@1115 3753 def test_bulk_copy_to_another_project_should_follow_when_needed
Chris@1115 3754 @request.session[:user_id] = 2
Chris@1115 3755 post :bulk_update, :ids => [1], :copy => '1', :issue => {:project_id => 2}, :follow => '1'
Chris@1115 3756 issue = Issue.first(:order => 'id DESC')
Chris@1115 3757 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue
Chris@1115 3758 end
Chris@1115 3759
Chris@0 3760 def test_destroy_issue_with_no_time_entries
Chris@0 3761 assert_nil TimeEntry.find_by_issue_id(2)
Chris@0 3762 @request.session[:user_id] = 2
Chris@1115 3763
Chris@1115 3764 assert_difference 'Issue.count', -1 do
Chris@1115 3765 delete :destroy, :id => 2
Chris@1115 3766 end
Chris@0 3767 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
Chris@0 3768 assert_nil Issue.find_by_id(2)
Chris@0 3769 end
Chris@0 3770
Chris@0 3771 def test_destroy_issues_with_time_entries
Chris@0 3772 @request.session[:user_id] = 2
Chris@1115 3773
Chris@1115 3774 assert_no_difference 'Issue.count' do
Chris@1115 3775 delete :destroy, :ids => [1, 3]
Chris@1115 3776 end
Chris@0 3777 assert_response :success
Chris@0 3778 assert_template 'destroy'
Chris@0 3779 assert_not_nil assigns(:hours)
Chris@0 3780 assert Issue.find_by_id(1) && Issue.find_by_id(3)
Chris@1115 3781 assert_tag 'form',
Chris@1115 3782 :descendant => {:tag => 'input', :attributes => {:name => '_method', :value => 'delete'}}
Chris@0 3783 end
Chris@0 3784
Chris@0 3785 def test_destroy_issues_and_destroy_time_entries
Chris@0 3786 @request.session[:user_id] = 2
Chris@1115 3787
Chris@1115 3788 assert_difference 'Issue.count', -2 do
Chris@1115 3789 assert_difference 'TimeEntry.count', -3 do
Chris@1115 3790 delete :destroy, :ids => [1, 3], :todo => 'destroy'
Chris@1115 3791 end
Chris@1115 3792 end
Chris@0 3793 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
Chris@0 3794 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
Chris@0 3795 assert_nil TimeEntry.find_by_id([1, 2])
Chris@0 3796 end
Chris@0 3797
Chris@0 3798 def test_destroy_issues_and_assign_time_entries_to_project
Chris@0 3799 @request.session[:user_id] = 2
Chris@1115 3800
Chris@1115 3801 assert_difference 'Issue.count', -2 do
Chris@1115 3802 assert_no_difference 'TimeEntry.count' do
Chris@1115 3803 delete :destroy, :ids => [1, 3], :todo => 'nullify'
Chris@1115 3804 end
Chris@1115 3805 end
Chris@0 3806 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
Chris@0 3807 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
Chris@0 3808 assert_nil TimeEntry.find(1).issue_id
Chris@0 3809 assert_nil TimeEntry.find(2).issue_id
Chris@0 3810 end
Chris@441 3811
Chris@0 3812 def test_destroy_issues_and_reassign_time_entries_to_another_issue
Chris@0 3813 @request.session[:user_id] = 2
Chris@1115 3814
Chris@1115 3815 assert_difference 'Issue.count', -2 do
Chris@1115 3816 assert_no_difference 'TimeEntry.count' do
Chris@1115 3817 delete :destroy, :ids => [1, 3], :todo => 'reassign', :reassign_to_id => 2
Chris@1115 3818 end
Chris@1115 3819 end
Chris@0 3820 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
Chris@0 3821 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
Chris@0 3822 assert_equal 2, TimeEntry.find(1).issue_id
Chris@0 3823 assert_equal 2, TimeEntry.find(2).issue_id
Chris@0 3824 end
Chris@441 3825
chris@37 3826 def test_destroy_issues_from_different_projects
chris@37 3827 @request.session[:user_id] = 2
Chris@1115 3828
Chris@1115 3829 assert_difference 'Issue.count', -3 do
Chris@1115 3830 delete :destroy, :ids => [1, 2, 6], :todo => 'destroy'
Chris@1115 3831 end
chris@37 3832 assert_redirected_to :controller => 'issues', :action => 'index'
chris@37 3833 assert !(Issue.find_by_id(1) || Issue.find_by_id(2) || Issue.find_by_id(6))
chris@37 3834 end
Chris@441 3835
Chris@441 3836 def test_destroy_parent_and_child_issues
Chris@1115 3837 parent = Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :subject => 'Parent Issue')
Chris@1115 3838 child = Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :subject => 'Child Issue', :parent_issue_id => parent.id)
Chris@441 3839 assert child.is_descendant_of?(parent.reload)
Chris@441 3840
Chris@441 3841 @request.session[:user_id] = 2
Chris@441 3842 assert_difference 'Issue.count', -2 do
Chris@1115 3843 delete :destroy, :ids => [parent.id, child.id], :todo => 'destroy'
Chris@441 3844 end
Chris@441 3845 assert_response 302
Chris@441 3846 end
Chris@441 3847
Chris@0 3848 def test_default_search_scope
Chris@0 3849 get :index
Chris@0 3850 assert_tag :div, :attributes => {:id => 'quick-search'},
Chris@0 3851 :child => {:tag => 'form',
Chris@0 3852 :child => {:tag => 'input', :attributes => {:name => 'issues', :type => 'hidden', :value => '1'}}}
Chris@0 3853 end
Chris@0 3854 end