annotate .svn/pristine/e8/e8af336e029a6602b0fdba6904707aee64d5e11d.svn-base @ 1519:afce8026aaeb redmine-2.4-integration

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