annotate .svn/pristine/e4/e4d010d3b6164a54f0034d95f4b23cdc28bbe4ec.svn-base @ 1298:4f746d8966dd redmine_2.3_integration

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