##// END OF EJS Templates
add test to respond nothing in case of content type is html with invalid query params (#8883, #6317)....
Toshi MARUYAMA -
r6905:4645cf0ac8f2
parent child
Show More
@@ -1,1613 +1,1619
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2011 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 require File.expand_path('../../test_helper', __FILE__)
19 19 require 'issues_controller'
20 20
21 21 class IssuesControllerTest < ActionController::TestCase
22 22 fixtures :projects,
23 23 :users,
24 24 :roles,
25 25 :members,
26 26 :member_roles,
27 27 :issues,
28 28 :issue_statuses,
29 29 :versions,
30 30 :trackers,
31 31 :projects_trackers,
32 32 :issue_categories,
33 33 :enabled_modules,
34 34 :enumerations,
35 35 :attachments,
36 36 :workflows,
37 37 :custom_fields,
38 38 :custom_values,
39 39 :custom_fields_projects,
40 40 :custom_fields_trackers,
41 41 :time_entries,
42 42 :journals,
43 43 :journal_details,
44 44 :queries
45 45
46 46 def setup
47 47 @controller = IssuesController.new
48 48 @request = ActionController::TestRequest.new
49 49 @response = ActionController::TestResponse.new
50 50 User.current = nil
51 51 end
52 52
53 53 def test_index
54 54 Setting.default_language = 'en'
55 55
56 56 get :index
57 57 assert_response :success
58 58 assert_template 'index.rhtml'
59 59 assert_not_nil assigns(:issues)
60 60 assert_nil assigns(:project)
61 61 assert_tag :tag => 'a', :content => /Can't print recipes/
62 62 assert_tag :tag => 'a', :content => /Subproject issue/
63 63 # private projects hidden
64 64 assert_no_tag :tag => 'a', :content => /Issue of a private subproject/
65 65 assert_no_tag :tag => 'a', :content => /Issue on project 2/
66 66 # project column
67 67 assert_tag :tag => 'th', :content => /Project/
68 68 end
69 69
70 70 def test_index_should_not_list_issues_when_module_disabled
71 71 EnabledModule.delete_all("name = 'issue_tracking' AND project_id = 1")
72 72 get :index
73 73 assert_response :success
74 74 assert_template 'index.rhtml'
75 75 assert_not_nil assigns(:issues)
76 76 assert_nil assigns(:project)
77 77 assert_no_tag :tag => 'a', :content => /Can't print recipes/
78 78 assert_tag :tag => 'a', :content => /Subproject issue/
79 79 end
80 80
81 81 def test_index_should_not_list_issues_when_module_disabled
82 82 EnabledModule.delete_all("name = 'issue_tracking' AND project_id = 1")
83 83 get :index
84 84 assert_response :success
85 85 assert_template 'index.rhtml'
86 86 assert_not_nil assigns(:issues)
87 87 assert_nil assigns(:project)
88 88 assert_no_tag :tag => 'a', :content => /Can't print recipes/
89 89 assert_tag :tag => 'a', :content => /Subproject issue/
90 90 end
91 91
92 92 def test_index_should_list_visible_issues_only
93 93 get :index, :per_page => 100
94 94 assert_response :success
95 95 assert_not_nil assigns(:issues)
96 96 assert_nil assigns(:issues).detect {|issue| !issue.visible?}
97 97 end
98 98
99 99 def test_index_with_project
100 100 Setting.display_subprojects_issues = 0
101 101 get :index, :project_id => 1
102 102 assert_response :success
103 103 assert_template 'index.rhtml'
104 104 assert_not_nil assigns(:issues)
105 105 assert_tag :tag => 'a', :content => /Can't print recipes/
106 106 assert_no_tag :tag => 'a', :content => /Subproject issue/
107 107 end
108 108
109 109 def test_index_with_project_and_subprojects
110 110 Setting.display_subprojects_issues = 1
111 111 get :index, :project_id => 1
112 112 assert_response :success
113 113 assert_template 'index.rhtml'
114 114 assert_not_nil assigns(:issues)
115 115 assert_tag :tag => 'a', :content => /Can't print recipes/
116 116 assert_tag :tag => 'a', :content => /Subproject issue/
117 117 assert_no_tag :tag => 'a', :content => /Issue of a private subproject/
118 118 end
119 119
120 120 def test_index_with_project_and_subprojects_should_show_private_subprojects
121 121 @request.session[:user_id] = 2
122 122 Setting.display_subprojects_issues = 1
123 123 get :index, :project_id => 1
124 124 assert_response :success
125 125 assert_template 'index.rhtml'
126 126 assert_not_nil assigns(:issues)
127 127 assert_tag :tag => 'a', :content => /Can't print recipes/
128 128 assert_tag :tag => 'a', :content => /Subproject issue/
129 129 assert_tag :tag => 'a', :content => /Issue of a private subproject/
130 130 end
131 131
132 132 def test_index_with_project_and_default_filter
133 133 get :index, :project_id => 1, :set_filter => 1
134 134 assert_response :success
135 135 assert_template 'index.rhtml'
136 136 assert_not_nil assigns(:issues)
137 137
138 138 query = assigns(:query)
139 139 assert_not_nil query
140 140 # default filter
141 141 assert_equal({'status_id' => {:operator => 'o', :values => ['']}}, query.filters)
142 142 end
143 143
144 144 def test_index_with_project_and_filter
145 145 get :index, :project_id => 1, :set_filter => 1,
146 146 :f => ['tracker_id'],
147 147 :op => {'tracker_id' => '='},
148 148 :v => {'tracker_id' => ['1']}
149 149 assert_response :success
150 150 assert_template 'index.rhtml'
151 151 assert_not_nil assigns(:issues)
152 152
153 153 query = assigns(:query)
154 154 assert_not_nil query
155 155 assert_equal({'tracker_id' => {:operator => '=', :values => ['1']}}, query.filters)
156 156 end
157 157
158 158 def test_index_with_project_and_empty_filters
159 159 get :index, :project_id => 1, :set_filter => 1, :fields => ['']
160 160 assert_response :success
161 161 assert_template 'index.rhtml'
162 162 assert_not_nil assigns(:issues)
163 163
164 164 query = assigns(:query)
165 165 assert_not_nil query
166 166 # no filter
167 167 assert_equal({}, query.filters)
168 168 end
169 169
170 170 def test_index_with_query
171 171 get :index, :project_id => 1, :query_id => 5
172 172 assert_response :success
173 173 assert_template 'index.rhtml'
174 174 assert_not_nil assigns(:issues)
175 175 assert_nil assigns(:issue_count_by_group)
176 176 end
177 177
178 178 def test_index_with_query_grouped_by_tracker
179 179 get :index, :project_id => 1, :query_id => 6
180 180 assert_response :success
181 181 assert_template 'index.rhtml'
182 182 assert_not_nil assigns(:issues)
183 183 assert_not_nil assigns(:issue_count_by_group)
184 184 end
185 185
186 186 def test_index_with_query_grouped_by_list_custom_field
187 187 get :index, :project_id => 1, :query_id => 9
188 188 assert_response :success
189 189 assert_template 'index.rhtml'
190 190 assert_not_nil assigns(:issues)
191 191 assert_not_nil assigns(:issue_count_by_group)
192 192 end
193 193
194 194 def test_private_query_should_not_be_available_to_other_users
195 195 q = Query.create!(:name => "private", :user => User.find(2), :is_public => false, :project => nil)
196 196 @request.session[:user_id] = 3
197 197
198 198 get :index, :query_id => q.id
199 199 assert_response 403
200 200 end
201 201
202 202 def test_private_query_should_be_available_to_its_user
203 203 q = Query.create!(:name => "private", :user => User.find(2), :is_public => false, :project => nil)
204 204 @request.session[:user_id] = 2
205 205
206 206 get :index, :query_id => q.id
207 207 assert_response :success
208 208 end
209 209
210 210 def test_public_query_should_be_available_to_other_users
211 211 q = Query.create!(:name => "private", :user => User.find(2), :is_public => true, :project => nil)
212 212 @request.session[:user_id] = 3
213 213
214 214 get :index, :query_id => q.id
215 215 assert_response :success
216 216 end
217 217
218 218 def test_index_sort_by_field_not_included_in_columns
219 219 Setting.issue_list_default_columns = %w(subject author)
220 220 get :index, :sort => 'tracker'
221 221 end
222 222
223 223 def test_index_csv_with_project
224 224 Setting.default_language = 'en'
225 225
226 226 get :index, :format => 'csv'
227 227 assert_response :success
228 228 assert_not_nil assigns(:issues)
229 229 assert_equal 'text/csv', @response.content_type
230 230 assert @response.body.starts_with?("#,")
231 231
232 232 get :index, :project_id => 1, :format => 'csv'
233 233 assert_response :success
234 234 assert_not_nil assigns(:issues)
235 235 assert_equal 'text/csv', @response.content_type
236 236 end
237 237
238 238 def test_index_pdf
239 239 get :index, :format => 'pdf'
240 240 assert_response :success
241 241 assert_not_nil assigns(:issues)
242 242 assert_equal 'application/pdf', @response.content_type
243 243
244 244 get :index, :project_id => 1, :format => 'pdf'
245 245 assert_response :success
246 246 assert_not_nil assigns(:issues)
247 247 assert_equal 'application/pdf', @response.content_type
248 248
249 249 get :index, :project_id => 1, :query_id => 6, :format => 'pdf'
250 250 assert_response :success
251 251 assert_not_nil assigns(:issues)
252 252 assert_equal 'application/pdf', @response.content_type
253 253 end
254 254
255 255 def test_index_pdf_with_query_grouped_by_list_custom_field
256 256 get :index, :project_id => 1, :query_id => 9, :format => 'pdf'
257 257 assert_response :success
258 258 assert_not_nil assigns(:issues)
259 259 assert_not_nil assigns(:issue_count_by_group)
260 260 assert_equal 'application/pdf', @response.content_type
261 261 end
262 262
263 263 def test_index_sort
264 264 get :index, :sort => 'tracker,id:desc'
265 265 assert_response :success
266 266
267 267 sort_params = @request.session['issues_index_sort']
268 268 assert sort_params.is_a?(String)
269 269 assert_equal 'tracker,id:desc', sort_params
270 270
271 271 issues = assigns(:issues)
272 272 assert_not_nil issues
273 273 assert !issues.empty?
274 274 assert_equal issues.sort {|a,b| a.tracker == b.tracker ? b.id <=> a.id : a.tracker <=> b.tracker }.collect(&:id), issues.collect(&:id)
275 275 end
276 276
277 277 def test_index_with_columns
278 278 columns = ['tracker', 'subject', 'assigned_to']
279 279 get :index, :set_filter => 1, :c => columns
280 280 assert_response :success
281 281
282 282 # query should use specified columns
283 283 query = assigns(:query)
284 284 assert_kind_of Query, query
285 285 assert_equal columns, query.column_names.map(&:to_s)
286 286
287 287 # columns should be stored in session
288 288 assert_kind_of Hash, session[:query]
289 289 assert_kind_of Array, session[:query][:column_names]
290 290 assert_equal columns, session[:query][:column_names].map(&:to_s)
291 291
292 292 # ensure only these columns are kept in the selected columns list
293 293 assert_tag :tag => 'select', :attributes => { :id => 'selected_columns' },
294 294 :children => { :count => 3 }
295 295 assert_no_tag :tag => 'option', :attributes => { :value => 'project' },
296 296 :parent => { :tag => 'select', :attributes => { :id => "selected_columns" } }
297 297 end
298 298
299 299 def test_index_with_custom_field_column
300 300 columns = %w(tracker subject cf_2)
301 301 get :index, :set_filter => 1, :c => columns
302 302 assert_response :success
303 303
304 304 # query should use specified columns
305 305 query = assigns(:query)
306 306 assert_kind_of Query, query
307 307 assert_equal columns, query.column_names.map(&:to_s)
308 308
309 309 assert_tag :td,
310 310 :attributes => {:class => 'cf_2 string'},
311 311 :ancestor => {:tag => 'table', :attributes => {:class => /issues/}}
312 312 end
313 313
314 def test_index_send_html_if_query_is_invalid
315 get :index, :f => ['start_date'], :op => {:start_date => '='}
316 assert_equal 'text/html', @response.content_type
317 assert_template 'index'
318 end
319
314 320 def test_show_by_anonymous
315 321 get :show, :id => 1
316 322 assert_response :success
317 323 assert_template 'show.rhtml'
318 324 assert_not_nil assigns(:issue)
319 325 assert_equal Issue.find(1), assigns(:issue)
320 326
321 327 # anonymous role is allowed to add a note
322 328 assert_tag :tag => 'form',
323 329 :descendant => { :tag => 'fieldset',
324 330 :child => { :tag => 'legend',
325 331 :content => /Notes/ } }
326 332 end
327 333
328 334 def test_show_by_manager
329 335 @request.session[:user_id] = 2
330 336 get :show, :id => 1
331 337 assert_response :success
332 338
333 339 assert_tag :tag => 'a',
334 340 :content => /Quote/
335 341
336 342 assert_tag :tag => 'form',
337 343 :descendant => { :tag => 'fieldset',
338 344 :child => { :tag => 'legend',
339 345 :content => /Change properties/ } },
340 346 :descendant => { :tag => 'fieldset',
341 347 :child => { :tag => 'legend',
342 348 :content => /Log time/ } },
343 349 :descendant => { :tag => 'fieldset',
344 350 :child => { :tag => 'legend',
345 351 :content => /Notes/ } }
346 352 end
347 353
348 354 def test_update_form_should_not_display_inactive_enumerations
349 355 @request.session[:user_id] = 2
350 356 get :show, :id => 1
351 357 assert_response :success
352 358
353 359 assert ! IssuePriority.find(15).active?
354 360 assert_no_tag :option, :attributes => {:value => '15'},
355 361 :parent => {:tag => 'select', :attributes => {:id => 'issue_priority_id'} }
356 362 end
357 363
358 364 def test_update_form_should_allow_attachment_upload
359 365 @request.session[:user_id] = 2
360 366 get :show, :id => 1
361 367
362 368 assert_tag :tag => 'form',
363 369 :attributes => {:id => 'issue-form', :method => 'post', :enctype => 'multipart/form-data'},
364 370 :descendant => {
365 371 :tag => 'input',
366 372 :attributes => {:type => 'file', :name => 'attachments[1][file]'}
367 373 }
368 374 end
369 375
370 376 def test_show_should_deny_anonymous_access_without_permission
371 377 Role.anonymous.remove_permission!(:view_issues)
372 378 get :show, :id => 1
373 379 assert_response :redirect
374 380 end
375 381
376 382 def test_show_should_deny_anonymous_access_to_private_issue
377 383 Issue.update_all(["is_private = ?", true], "id = 1")
378 384 get :show, :id => 1
379 385 assert_response :redirect
380 386 end
381 387
382 388 def test_show_should_deny_non_member_access_without_permission
383 389 Role.non_member.remove_permission!(:view_issues)
384 390 @request.session[:user_id] = 9
385 391 get :show, :id => 1
386 392 assert_response 403
387 393 end
388 394
389 395 def test_show_should_deny_non_member_access_to_private_issue
390 396 Issue.update_all(["is_private = ?", true], "id = 1")
391 397 @request.session[:user_id] = 9
392 398 get :show, :id => 1
393 399 assert_response 403
394 400 end
395 401
396 402 def test_show_should_deny_member_access_without_permission
397 403 Role.find(1).remove_permission!(:view_issues)
398 404 @request.session[:user_id] = 2
399 405 get :show, :id => 1
400 406 assert_response 403
401 407 end
402 408
403 409 def test_show_should_deny_member_access_to_private_issue_without_permission
404 410 Issue.update_all(["is_private = ?", true], "id = 1")
405 411 @request.session[:user_id] = 3
406 412 get :show, :id => 1
407 413 assert_response 403
408 414 end
409 415
410 416 def test_show_should_allow_author_access_to_private_issue
411 417 Issue.update_all(["is_private = ?, author_id = 3", true], "id = 1")
412 418 @request.session[:user_id] = 3
413 419 get :show, :id => 1
414 420 assert_response :success
415 421 end
416 422
417 423 def test_show_should_allow_assignee_access_to_private_issue
418 424 Issue.update_all(["is_private = ?, assigned_to_id = 3", true], "id = 1")
419 425 @request.session[:user_id] = 3
420 426 get :show, :id => 1
421 427 assert_response :success
422 428 end
423 429
424 430 def test_show_should_allow_member_access_to_private_issue_with_permission
425 431 Issue.update_all(["is_private = ?", true], "id = 1")
426 432 User.find(3).roles_for_project(Project.find(1)).first.update_attribute :issues_visibility, 'all'
427 433 @request.session[:user_id] = 3
428 434 get :show, :id => 1
429 435 assert_response :success
430 436 end
431 437
432 438 def test_show_should_not_disclose_relations_to_invisible_issues
433 439 Setting.cross_project_issue_relations = '1'
434 440 IssueRelation.create!(:issue_from => Issue.find(1), :issue_to => Issue.find(2), :relation_type => 'relates')
435 441 # Relation to a private project issue
436 442 IssueRelation.create!(:issue_from => Issue.find(1), :issue_to => Issue.find(4), :relation_type => 'relates')
437 443
438 444 get :show, :id => 1
439 445 assert_response :success
440 446
441 447 assert_tag :div, :attributes => { :id => 'relations' },
442 448 :descendant => { :tag => 'a', :content => /#2$/ }
443 449 assert_no_tag :div, :attributes => { :id => 'relations' },
444 450 :descendant => { :tag => 'a', :content => /#4$/ }
445 451 end
446 452
447 453 def test_show_atom
448 454 get :show, :id => 2, :format => 'atom'
449 455 assert_response :success
450 456 assert_template 'journals/index.rxml'
451 457 # Inline image
452 458 assert_select 'content', :text => Regexp.new(Regexp.quote('http://test.host/attachments/download/10'))
453 459 end
454 460
455 461 def test_show_export_to_pdf
456 462 get :show, :id => 3, :format => 'pdf'
457 463 assert_response :success
458 464 assert_equal 'application/pdf', @response.content_type
459 465 assert @response.body.starts_with?('%PDF')
460 466 assert_not_nil assigns(:issue)
461 467 end
462 468
463 469 def test_get_new
464 470 @request.session[:user_id] = 2
465 471 get :new, :project_id => 1, :tracker_id => 1
466 472 assert_response :success
467 473 assert_template 'new'
468 474
469 475 assert_tag :tag => 'input', :attributes => { :name => 'issue[custom_field_values][2]',
470 476 :value => 'Default string' }
471 477
472 478 # Be sure we don't display inactive IssuePriorities
473 479 assert ! IssuePriority.find(15).active?
474 480 assert_no_tag :option, :attributes => {:value => '15'},
475 481 :parent => {:tag => 'select', :attributes => {:id => 'issue_priority_id'} }
476 482 end
477 483
478 484 def test_get_new_form_should_allow_attachment_upload
479 485 @request.session[:user_id] = 2
480 486 get :new, :project_id => 1, :tracker_id => 1
481 487
482 488 assert_tag :tag => 'form',
483 489 :attributes => {:id => 'issue-form', :method => 'post', :enctype => 'multipart/form-data'},
484 490 :descendant => {
485 491 :tag => 'input',
486 492 :attributes => {:type => 'file', :name => 'attachments[1][file]'}
487 493 }
488 494 end
489 495
490 496 def test_get_new_without_tracker_id
491 497 @request.session[:user_id] = 2
492 498 get :new, :project_id => 1
493 499 assert_response :success
494 500 assert_template 'new'
495 501
496 502 issue = assigns(:issue)
497 503 assert_not_nil issue
498 504 assert_equal Project.find(1).trackers.first, issue.tracker
499 505 end
500 506
501 507 def test_get_new_with_no_default_status_should_display_an_error
502 508 @request.session[:user_id] = 2
503 509 IssueStatus.delete_all
504 510
505 511 get :new, :project_id => 1
506 512 assert_response 500
507 513 assert_error_tag :content => /No default issue/
508 514 end
509 515
510 516 def test_get_new_with_no_tracker_should_display_an_error
511 517 @request.session[:user_id] = 2
512 518 Tracker.delete_all
513 519
514 520 get :new, :project_id => 1
515 521 assert_response 500
516 522 assert_error_tag :content => /No tracker/
517 523 end
518 524
519 525 def test_update_new_form
520 526 @request.session[:user_id] = 2
521 527 xhr :post, :new, :project_id => 1,
522 528 :issue => {:tracker_id => 2,
523 529 :subject => 'This is the test_new issue',
524 530 :description => 'This is the description',
525 531 :priority_id => 5}
526 532 assert_response :success
527 533 assert_template 'attributes'
528 534
529 535 issue = assigns(:issue)
530 536 assert_kind_of Issue, issue
531 537 assert_equal 1, issue.project_id
532 538 assert_equal 2, issue.tracker_id
533 539 assert_equal 'This is the test_new issue', issue.subject
534 540 end
535 541
536 542 def test_post_create
537 543 @request.session[:user_id] = 2
538 544 assert_difference 'Issue.count' do
539 545 post :create, :project_id => 1,
540 546 :issue => {:tracker_id => 3,
541 547 :status_id => 2,
542 548 :subject => 'This is the test_new issue',
543 549 :description => 'This is the description',
544 550 :priority_id => 5,
545 551 :start_date => '2010-11-07',
546 552 :estimated_hours => '',
547 553 :custom_field_values => {'2' => 'Value for field 2'}}
548 554 end
549 555 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
550 556
551 557 issue = Issue.find_by_subject('This is the test_new issue')
552 558 assert_not_nil issue
553 559 assert_equal 2, issue.author_id
554 560 assert_equal 3, issue.tracker_id
555 561 assert_equal 2, issue.status_id
556 562 assert_equal Date.parse('2010-11-07'), issue.start_date
557 563 assert_nil issue.estimated_hours
558 564 v = issue.custom_values.find(:first, :conditions => {:custom_field_id => 2})
559 565 assert_not_nil v
560 566 assert_equal 'Value for field 2', v.value
561 567 end
562 568
563 569 def test_post_new_with_group_assignment
564 570 group = Group.find(11)
565 571 project = Project.find(1)
566 572 project.members << Member.new(:principal => group, :roles => [Role.first])
567 573
568 574 with_settings :issue_group_assignment => '1' do
569 575 @request.session[:user_id] = 2
570 576 assert_difference 'Issue.count' do
571 577 post :create, :project_id => project.id,
572 578 :issue => {:tracker_id => 3,
573 579 :status_id => 1,
574 580 :subject => 'This is the test_new_with_group_assignment issue',
575 581 :assigned_to_id => group.id}
576 582 end
577 583 end
578 584 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
579 585
580 586 issue = Issue.find_by_subject('This is the test_new_with_group_assignment issue')
581 587 assert_not_nil issue
582 588 assert_equal group, issue.assigned_to
583 589 end
584 590
585 591 def test_post_create_without_start_date
586 592 @request.session[:user_id] = 2
587 593 assert_difference 'Issue.count' do
588 594 post :create, :project_id => 1,
589 595 :issue => {:tracker_id => 3,
590 596 :status_id => 2,
591 597 :subject => 'This is the test_new issue',
592 598 :description => 'This is the description',
593 599 :priority_id => 5,
594 600 :start_date => '',
595 601 :estimated_hours => '',
596 602 :custom_field_values => {'2' => 'Value for field 2'}}
597 603 end
598 604 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
599 605
600 606 issue = Issue.find_by_subject('This is the test_new issue')
601 607 assert_not_nil issue
602 608 assert_nil issue.start_date
603 609 end
604 610
605 611 def test_post_create_and_continue
606 612 @request.session[:user_id] = 2
607 613 assert_difference 'Issue.count' do
608 614 post :create, :project_id => 1,
609 615 :issue => {:tracker_id => 3, :subject => 'This is first issue', :priority_id => 5},
610 616 :continue => ''
611 617 end
612 618
613 619 issue = Issue.first(:order => 'id DESC')
614 620 assert_redirected_to :controller => 'issues', :action => 'new', :project_id => 'ecookbook', :issue => {:tracker_id => 3}
615 621 assert_not_nil flash[:notice], "flash was not set"
616 622 assert flash[:notice].include?("<a href='/issues/#{issue.id}'>##{issue.id}</a>"), "issue link not found in flash: #{flash[:notice]}"
617 623 end
618 624
619 625 def test_post_create_without_custom_fields_param
620 626 @request.session[:user_id] = 2
621 627 assert_difference 'Issue.count' do
622 628 post :create, :project_id => 1,
623 629 :issue => {:tracker_id => 1,
624 630 :subject => 'This is the test_new issue',
625 631 :description => 'This is the description',
626 632 :priority_id => 5}
627 633 end
628 634 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
629 635 end
630 636
631 637 def test_post_create_with_required_custom_field_and_without_custom_fields_param
632 638 field = IssueCustomField.find_by_name('Database')
633 639 field.update_attribute(:is_required, true)
634 640
635 641 @request.session[:user_id] = 2
636 642 post :create, :project_id => 1,
637 643 :issue => {:tracker_id => 1,
638 644 :subject => 'This is the test_new issue',
639 645 :description => 'This is the description',
640 646 :priority_id => 5}
641 647 assert_response :success
642 648 assert_template 'new'
643 649 issue = assigns(:issue)
644 650 assert_not_nil issue
645 651 assert_equal I18n.translate('activerecord.errors.messages.invalid'), issue.errors.on(:custom_values)
646 652 end
647 653
648 654 def test_post_create_with_watchers
649 655 @request.session[:user_id] = 2
650 656 ActionMailer::Base.deliveries.clear
651 657
652 658 assert_difference 'Watcher.count', 2 do
653 659 post :create, :project_id => 1,
654 660 :issue => {:tracker_id => 1,
655 661 :subject => 'This is a new issue with watchers',
656 662 :description => 'This is the description',
657 663 :priority_id => 5,
658 664 :watcher_user_ids => ['2', '3']}
659 665 end
660 666 issue = Issue.find_by_subject('This is a new issue with watchers')
661 667 assert_not_nil issue
662 668 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue
663 669
664 670 # Watchers added
665 671 assert_equal [2, 3], issue.watcher_user_ids.sort
666 672 assert issue.watched_by?(User.find(3))
667 673 # Watchers notified
668 674 mail = ActionMailer::Base.deliveries.last
669 675 assert_kind_of TMail::Mail, mail
670 676 assert [mail.bcc, mail.cc].flatten.include?(User.find(3).mail)
671 677 end
672 678
673 679 def test_post_create_subissue
674 680 @request.session[:user_id] = 2
675 681
676 682 assert_difference 'Issue.count' do
677 683 post :create, :project_id => 1,
678 684 :issue => {:tracker_id => 1,
679 685 :subject => 'This is a child issue',
680 686 :parent_issue_id => 2}
681 687 end
682 688 issue = Issue.find_by_subject('This is a child issue')
683 689 assert_not_nil issue
684 690 assert_equal Issue.find(2), issue.parent
685 691 end
686 692
687 693 def test_post_create_subissue_with_non_numeric_parent_id
688 694 @request.session[:user_id] = 2
689 695
690 696 assert_difference 'Issue.count' do
691 697 post :create, :project_id => 1,
692 698 :issue => {:tracker_id => 1,
693 699 :subject => 'This is a child issue',
694 700 :parent_issue_id => 'ABC'}
695 701 end
696 702 issue = Issue.find_by_subject('This is a child issue')
697 703 assert_not_nil issue
698 704 assert_nil issue.parent
699 705 end
700 706
701 707 def test_post_create_private
702 708 @request.session[:user_id] = 2
703 709
704 710 assert_difference 'Issue.count' do
705 711 post :create, :project_id => 1,
706 712 :issue => {:tracker_id => 1,
707 713 :subject => 'This is a private issue',
708 714 :is_private => '1'}
709 715 end
710 716 issue = Issue.first(:order => 'id DESC')
711 717 assert issue.is_private?
712 718 end
713 719
714 720 def test_post_create_private_with_set_own_issues_private_permission
715 721 role = Role.find(1)
716 722 role.remove_permission! :set_issues_private
717 723 role.add_permission! :set_own_issues_private
718 724
719 725 @request.session[:user_id] = 2
720 726
721 727 assert_difference 'Issue.count' do
722 728 post :create, :project_id => 1,
723 729 :issue => {:tracker_id => 1,
724 730 :subject => 'This is a private issue',
725 731 :is_private => '1'}
726 732 end
727 733 issue = Issue.first(:order => 'id DESC')
728 734 assert issue.is_private?
729 735 end
730 736
731 737 def test_post_create_should_send_a_notification
732 738 ActionMailer::Base.deliveries.clear
733 739 @request.session[:user_id] = 2
734 740 assert_difference 'Issue.count' do
735 741 post :create, :project_id => 1,
736 742 :issue => {:tracker_id => 3,
737 743 :subject => 'This is the test_new issue',
738 744 :description => 'This is the description',
739 745 :priority_id => 5,
740 746 :estimated_hours => '',
741 747 :custom_field_values => {'2' => 'Value for field 2'}}
742 748 end
743 749 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
744 750
745 751 assert_equal 1, ActionMailer::Base.deliveries.size
746 752 end
747 753
748 754 def test_post_create_should_preserve_fields_values_on_validation_failure
749 755 @request.session[:user_id] = 2
750 756 post :create, :project_id => 1,
751 757 :issue => {:tracker_id => 1,
752 758 # empty subject
753 759 :subject => '',
754 760 :description => 'This is a description',
755 761 :priority_id => 6,
756 762 :custom_field_values => {'1' => 'Oracle', '2' => 'Value for field 2'}}
757 763 assert_response :success
758 764 assert_template 'new'
759 765
760 766 assert_tag :textarea, :attributes => { :name => 'issue[description]' },
761 767 :content => 'This is a description'
762 768 assert_tag :select, :attributes => { :name => 'issue[priority_id]' },
763 769 :child => { :tag => 'option', :attributes => { :selected => 'selected',
764 770 :value => '6' },
765 771 :content => 'High' }
766 772 # Custom fields
767 773 assert_tag :select, :attributes => { :name => 'issue[custom_field_values][1]' },
768 774 :child => { :tag => 'option', :attributes => { :selected => 'selected',
769 775 :value => 'Oracle' },
770 776 :content => 'Oracle' }
771 777 assert_tag :input, :attributes => { :name => 'issue[custom_field_values][2]',
772 778 :value => 'Value for field 2'}
773 779 end
774 780
775 781 def test_post_create_should_ignore_non_safe_attributes
776 782 @request.session[:user_id] = 2
777 783 assert_nothing_raised do
778 784 post :create, :project_id => 1, :issue => { :tracker => "A param can not be a Tracker" }
779 785 end
780 786 end
781 787
782 788 def test_post_create_with_attachment
783 789 set_tmp_attachments_directory
784 790 @request.session[:user_id] = 2
785 791
786 792 assert_difference 'Issue.count' do
787 793 assert_difference 'Attachment.count' do
788 794 post :create, :project_id => 1,
789 795 :issue => { :tracker_id => '1', :subject => 'With attachment' },
790 796 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}}
791 797 end
792 798 end
793 799
794 800 issue = Issue.first(:order => 'id DESC')
795 801 attachment = Attachment.first(:order => 'id DESC')
796 802
797 803 assert_equal issue, attachment.container
798 804 assert_equal 2, attachment.author_id
799 805 assert_equal 'testfile.txt', attachment.filename
800 806 assert_equal 'text/plain', attachment.content_type
801 807 assert_equal 'test file', attachment.description
802 808 assert_equal 59, attachment.filesize
803 809 assert File.exists?(attachment.diskfile)
804 810 assert_equal 59, File.size(attachment.diskfile)
805 811 end
806 812
807 813 context "without workflow privilege" do
808 814 setup do
809 815 Workflow.delete_all(["role_id = ?", Role.anonymous.id])
810 816 Role.anonymous.add_permission! :add_issues, :add_issue_notes
811 817 end
812 818
813 819 context "#new" do
814 820 should "propose default status only" do
815 821 get :new, :project_id => 1
816 822 assert_response :success
817 823 assert_template 'new'
818 824 assert_tag :tag => 'select',
819 825 :attributes => {:name => 'issue[status_id]'},
820 826 :children => {:count => 1},
821 827 :child => {:tag => 'option', :attributes => {:value => IssueStatus.default.id.to_s}}
822 828 end
823 829
824 830 should "accept default status" do
825 831 assert_difference 'Issue.count' do
826 832 post :create, :project_id => 1,
827 833 :issue => {:tracker_id => 1,
828 834 :subject => 'This is an issue',
829 835 :status_id => 1}
830 836 end
831 837 issue = Issue.last(:order => 'id')
832 838 assert_equal IssueStatus.default, issue.status
833 839 end
834 840
835 841 should "ignore unauthorized status" do
836 842 assert_difference 'Issue.count' do
837 843 post :create, :project_id => 1,
838 844 :issue => {:tracker_id => 1,
839 845 :subject => 'This is an issue',
840 846 :status_id => 3}
841 847 end
842 848 issue = Issue.last(:order => 'id')
843 849 assert_equal IssueStatus.default, issue.status
844 850 end
845 851 end
846 852
847 853 context "#update" do
848 854 should "ignore status change" do
849 855 assert_difference 'Journal.count' do
850 856 put :update, :id => 1, :notes => 'just trying', :issue => {:status_id => 3}
851 857 end
852 858 assert_equal 1, Issue.find(1).status_id
853 859 end
854 860
855 861 should "ignore attributes changes" do
856 862 assert_difference 'Journal.count' do
857 863 put :update, :id => 1, :notes => 'just trying', :issue => {:subject => 'changed', :assigned_to_id => 2}
858 864 end
859 865 issue = Issue.find(1)
860 866 assert_equal "Can't print recipes", issue.subject
861 867 assert_nil issue.assigned_to
862 868 end
863 869 end
864 870 end
865 871
866 872 context "with workflow privilege" do
867 873 setup do
868 874 Workflow.delete_all(["role_id = ?", Role.anonymous.id])
869 875 Workflow.create!(:role => Role.anonymous, :tracker_id => 1, :old_status_id => 1, :new_status_id => 3)
870 876 Workflow.create!(:role => Role.anonymous, :tracker_id => 1, :old_status_id => 1, :new_status_id => 4)
871 877 Role.anonymous.add_permission! :add_issues, :add_issue_notes
872 878 end
873 879
874 880 context "#update" do
875 881 should "accept authorized status" do
876 882 assert_difference 'Journal.count' do
877 883 put :update, :id => 1, :notes => 'just trying', :issue => {:status_id => 3}
878 884 end
879 885 assert_equal 3, Issue.find(1).status_id
880 886 end
881 887
882 888 should "ignore unauthorized status" do
883 889 assert_difference 'Journal.count' do
884 890 put :update, :id => 1, :notes => 'just trying', :issue => {:status_id => 2}
885 891 end
886 892 assert_equal 1, Issue.find(1).status_id
887 893 end
888 894
889 895 should "accept authorized attributes changes" do
890 896 assert_difference 'Journal.count' do
891 897 put :update, :id => 1, :notes => 'just trying', :issue => {:assigned_to_id => 2}
892 898 end
893 899 issue = Issue.find(1)
894 900 assert_equal 2, issue.assigned_to_id
895 901 end
896 902
897 903 should "ignore unauthorized attributes changes" do
898 904 assert_difference 'Journal.count' do
899 905 put :update, :id => 1, :notes => 'just trying', :issue => {:subject => 'changed'}
900 906 end
901 907 issue = Issue.find(1)
902 908 assert_equal "Can't print recipes", issue.subject
903 909 end
904 910 end
905 911
906 912 context "and :edit_issues permission" do
907 913 setup do
908 914 Role.anonymous.add_permission! :add_issues, :edit_issues
909 915 end
910 916
911 917 should "accept authorized status" do
912 918 assert_difference 'Journal.count' do
913 919 put :update, :id => 1, :notes => 'just trying', :issue => {:status_id => 3}
914 920 end
915 921 assert_equal 3, Issue.find(1).status_id
916 922 end
917 923
918 924 should "ignore unauthorized status" do
919 925 assert_difference 'Journal.count' do
920 926 put :update, :id => 1, :notes => 'just trying', :issue => {:status_id => 2}
921 927 end
922 928 assert_equal 1, Issue.find(1).status_id
923 929 end
924 930
925 931 should "accept authorized attributes changes" do
926 932 assert_difference 'Journal.count' do
927 933 put :update, :id => 1, :notes => 'just trying', :issue => {:subject => 'changed', :assigned_to_id => 2}
928 934 end
929 935 issue = Issue.find(1)
930 936 assert_equal "changed", issue.subject
931 937 assert_equal 2, issue.assigned_to_id
932 938 end
933 939 end
934 940 end
935 941
936 942 def test_copy_issue
937 943 @request.session[:user_id] = 2
938 944 get :new, :project_id => 1, :copy_from => 1
939 945 assert_template 'new'
940 946 assert_not_nil assigns(:issue)
941 947 orig = Issue.find(1)
942 948 assert_equal orig.subject, assigns(:issue).subject
943 949 end
944 950
945 951 def test_get_edit
946 952 @request.session[:user_id] = 2
947 953 get :edit, :id => 1
948 954 assert_response :success
949 955 assert_template 'edit'
950 956 assert_not_nil assigns(:issue)
951 957 assert_equal Issue.find(1), assigns(:issue)
952 958
953 959 # Be sure we don't display inactive IssuePriorities
954 960 assert ! IssuePriority.find(15).active?
955 961 assert_no_tag :option, :attributes => {:value => '15'},
956 962 :parent => {:tag => 'select', :attributes => {:id => 'issue_priority_id'} }
957 963 end
958 964
959 965 def test_get_edit_with_params
960 966 @request.session[:user_id] = 2
961 967 get :edit, :id => 1, :issue => { :status_id => 5, :priority_id => 7 },
962 968 :time_entry => { :hours => '2.5', :comments => 'test_get_edit_with_params', :activity_id => TimeEntryActivity.first.id }
963 969 assert_response :success
964 970 assert_template 'edit'
965 971
966 972 issue = assigns(:issue)
967 973 assert_not_nil issue
968 974
969 975 assert_equal 5, issue.status_id
970 976 assert_tag :select, :attributes => { :name => 'issue[status_id]' },
971 977 :child => { :tag => 'option',
972 978 :content => 'Closed',
973 979 :attributes => { :selected => 'selected' } }
974 980
975 981 assert_equal 7, issue.priority_id
976 982 assert_tag :select, :attributes => { :name => 'issue[priority_id]' },
977 983 :child => { :tag => 'option',
978 984 :content => 'Urgent',
979 985 :attributes => { :selected => 'selected' } }
980 986
981 987 assert_tag :input, :attributes => { :name => 'time_entry[hours]', :value => '2.5' }
982 988 assert_tag :select, :attributes => { :name => 'time_entry[activity_id]' },
983 989 :child => { :tag => 'option',
984 990 :attributes => { :selected => 'selected', :value => TimeEntryActivity.first.id } }
985 991 assert_tag :input, :attributes => { :name => 'time_entry[comments]', :value => 'test_get_edit_with_params' }
986 992 end
987 993
988 994 def test_update_edit_form
989 995 @request.session[:user_id] = 2
990 996 xhr :post, :new, :project_id => 1,
991 997 :id => 1,
992 998 :issue => {:tracker_id => 2,
993 999 :subject => 'This is the test_new issue',
994 1000 :description => 'This is the description',
995 1001 :priority_id => 5}
996 1002 assert_response :success
997 1003 assert_template 'attributes'
998 1004
999 1005 issue = assigns(:issue)
1000 1006 assert_kind_of Issue, issue
1001 1007 assert_equal 1, issue.id
1002 1008 assert_equal 1, issue.project_id
1003 1009 assert_equal 2, issue.tracker_id
1004 1010 assert_equal 'This is the test_new issue', issue.subject
1005 1011 end
1006 1012
1007 1013 def test_update_using_invalid_http_verbs
1008 1014 @request.session[:user_id] = 2
1009 1015 subject = 'Updated by an invalid http verb'
1010 1016
1011 1017 get :update, :id => 1, :issue => {:subject => subject}
1012 1018 assert_not_equal subject, Issue.find(1).subject
1013 1019
1014 1020 post :update, :id => 1, :issue => {:subject => subject}
1015 1021 assert_not_equal subject, Issue.find(1).subject
1016 1022
1017 1023 delete :update, :id => 1, :issue => {:subject => subject}
1018 1024 assert_not_equal subject, Issue.find(1).subject
1019 1025 end
1020 1026
1021 1027 def test_put_update_without_custom_fields_param
1022 1028 @request.session[:user_id] = 2
1023 1029 ActionMailer::Base.deliveries.clear
1024 1030
1025 1031 issue = Issue.find(1)
1026 1032 assert_equal '125', issue.custom_value_for(2).value
1027 1033 old_subject = issue.subject
1028 1034 new_subject = 'Subject modified by IssuesControllerTest#test_post_edit'
1029 1035
1030 1036 assert_difference('Journal.count') do
1031 1037 assert_difference('JournalDetail.count', 2) do
1032 1038 put :update, :id => 1, :issue => {:subject => new_subject,
1033 1039 :priority_id => '6',
1034 1040 :category_id => '1' # no change
1035 1041 }
1036 1042 end
1037 1043 end
1038 1044 assert_redirected_to :action => 'show', :id => '1'
1039 1045 issue.reload
1040 1046 assert_equal new_subject, issue.subject
1041 1047 # Make sure custom fields were not cleared
1042 1048 assert_equal '125', issue.custom_value_for(2).value
1043 1049
1044 1050 mail = ActionMailer::Base.deliveries.last
1045 1051 assert_kind_of TMail::Mail, mail
1046 1052 assert mail.subject.starts_with?("[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}]")
1047 1053 assert mail.body.include?("Subject changed from #{old_subject} to #{new_subject}")
1048 1054 end
1049 1055
1050 1056 def test_put_update_with_custom_field_change
1051 1057 @request.session[:user_id] = 2
1052 1058 issue = Issue.find(1)
1053 1059 assert_equal '125', issue.custom_value_for(2).value
1054 1060
1055 1061 assert_difference('Journal.count') do
1056 1062 assert_difference('JournalDetail.count', 3) do
1057 1063 put :update, :id => 1, :issue => {:subject => 'Custom field change',
1058 1064 :priority_id => '6',
1059 1065 :category_id => '1', # no change
1060 1066 :custom_field_values => { '2' => 'New custom value' }
1061 1067 }
1062 1068 end
1063 1069 end
1064 1070 assert_redirected_to :action => 'show', :id => '1'
1065 1071 issue.reload
1066 1072 assert_equal 'New custom value', issue.custom_value_for(2).value
1067 1073
1068 1074 mail = ActionMailer::Base.deliveries.last
1069 1075 assert_kind_of TMail::Mail, mail
1070 1076 assert mail.body.include?("Searchable field changed from 125 to New custom value")
1071 1077 end
1072 1078
1073 1079 def test_put_update_with_status_and_assignee_change
1074 1080 issue = Issue.find(1)
1075 1081 assert_equal 1, issue.status_id
1076 1082 @request.session[:user_id] = 2
1077 1083 assert_difference('TimeEntry.count', 0) do
1078 1084 put :update,
1079 1085 :id => 1,
1080 1086 :issue => { :status_id => 2, :assigned_to_id => 3 },
1081 1087 :notes => 'Assigned to dlopper',
1082 1088 :time_entry => { :hours => '', :comments => '', :activity_id => TimeEntryActivity.first }
1083 1089 end
1084 1090 assert_redirected_to :action => 'show', :id => '1'
1085 1091 issue.reload
1086 1092 assert_equal 2, issue.status_id
1087 1093 j = Journal.find(:first, :order => 'id DESC')
1088 1094 assert_equal 'Assigned to dlopper', j.notes
1089 1095 assert_equal 2, j.details.size
1090 1096
1091 1097 mail = ActionMailer::Base.deliveries.last
1092 1098 assert mail.body.include?("Status changed from New to Assigned")
1093 1099 # subject should contain the new status
1094 1100 assert mail.subject.include?("(#{ IssueStatus.find(2).name })")
1095 1101 end
1096 1102
1097 1103 def test_put_update_with_note_only
1098 1104 notes = 'Note added by IssuesControllerTest#test_update_with_note_only'
1099 1105 # anonymous user
1100 1106 put :update,
1101 1107 :id => 1,
1102 1108 :notes => notes
1103 1109 assert_redirected_to :action => 'show', :id => '1'
1104 1110 j = Journal.find(:first, :order => 'id DESC')
1105 1111 assert_equal notes, j.notes
1106 1112 assert_equal 0, j.details.size
1107 1113 assert_equal User.anonymous, j.user
1108 1114
1109 1115 mail = ActionMailer::Base.deliveries.last
1110 1116 assert mail.body.include?(notes)
1111 1117 end
1112 1118
1113 1119 def test_put_update_with_note_and_spent_time
1114 1120 @request.session[:user_id] = 2
1115 1121 spent_hours_before = Issue.find(1).spent_hours
1116 1122 assert_difference('TimeEntry.count') do
1117 1123 put :update,
1118 1124 :id => 1,
1119 1125 :notes => '2.5 hours added',
1120 1126 :time_entry => { :hours => '2.5', :comments => 'test_put_update_with_note_and_spent_time', :activity_id => TimeEntryActivity.first.id }
1121 1127 end
1122 1128 assert_redirected_to :action => 'show', :id => '1'
1123 1129
1124 1130 issue = Issue.find(1)
1125 1131
1126 1132 j = Journal.find(:first, :order => 'id DESC')
1127 1133 assert_equal '2.5 hours added', j.notes
1128 1134 assert_equal 0, j.details.size
1129 1135
1130 1136 t = issue.time_entries.find_by_comments('test_put_update_with_note_and_spent_time')
1131 1137 assert_not_nil t
1132 1138 assert_equal 2.5, t.hours
1133 1139 assert_equal spent_hours_before + 2.5, issue.spent_hours
1134 1140 end
1135 1141
1136 1142 def test_put_update_with_attachment_only
1137 1143 set_tmp_attachments_directory
1138 1144
1139 1145 # Delete all fixtured journals, a race condition can occur causing the wrong
1140 1146 # journal to get fetched in the next find.
1141 1147 Journal.delete_all
1142 1148
1143 1149 # anonymous user
1144 1150 assert_difference 'Attachment.count' do
1145 1151 put :update, :id => 1,
1146 1152 :notes => '',
1147 1153 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}}
1148 1154 end
1149 1155
1150 1156 assert_redirected_to :action => 'show', :id => '1'
1151 1157 j = Issue.find(1).journals.find(:first, :order => 'id DESC')
1152 1158 assert j.notes.blank?
1153 1159 assert_equal 1, j.details.size
1154 1160 assert_equal 'testfile.txt', j.details.first.value
1155 1161 assert_equal User.anonymous, j.user
1156 1162
1157 1163 attachment = Attachment.first(:order => 'id DESC')
1158 1164 assert_equal Issue.find(1), attachment.container
1159 1165 assert_equal User.anonymous, attachment.author
1160 1166 assert_equal 'testfile.txt', attachment.filename
1161 1167 assert_equal 'text/plain', attachment.content_type
1162 1168 assert_equal 'test file', attachment.description
1163 1169 assert_equal 59, attachment.filesize
1164 1170 assert File.exists?(attachment.diskfile)
1165 1171 assert_equal 59, File.size(attachment.diskfile)
1166 1172
1167 1173 mail = ActionMailer::Base.deliveries.last
1168 1174 assert mail.body.include?('testfile.txt')
1169 1175 end
1170 1176
1171 1177 def test_put_update_with_attachment_that_fails_to_save
1172 1178 set_tmp_attachments_directory
1173 1179
1174 1180 # Delete all fixtured journals, a race condition can occur causing the wrong
1175 1181 # journal to get fetched in the next find.
1176 1182 Journal.delete_all
1177 1183
1178 1184 # Mock out the unsaved attachment
1179 1185 Attachment.any_instance.stubs(:create).returns(Attachment.new)
1180 1186
1181 1187 # anonymous user
1182 1188 put :update,
1183 1189 :id => 1,
1184 1190 :notes => '',
1185 1191 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
1186 1192 assert_redirected_to :action => 'show', :id => '1'
1187 1193 assert_equal '1 file(s) could not be saved.', flash[:warning]
1188 1194
1189 1195 end if Object.const_defined?(:Mocha)
1190 1196
1191 1197 def test_put_update_with_no_change
1192 1198 issue = Issue.find(1)
1193 1199 issue.journals.clear
1194 1200 ActionMailer::Base.deliveries.clear
1195 1201
1196 1202 put :update,
1197 1203 :id => 1,
1198 1204 :notes => ''
1199 1205 assert_redirected_to :action => 'show', :id => '1'
1200 1206
1201 1207 issue.reload
1202 1208 assert issue.journals.empty?
1203 1209 # No email should be sent
1204 1210 assert ActionMailer::Base.deliveries.empty?
1205 1211 end
1206 1212
1207 1213 def test_put_update_should_send_a_notification
1208 1214 @request.session[:user_id] = 2
1209 1215 ActionMailer::Base.deliveries.clear
1210 1216 issue = Issue.find(1)
1211 1217 old_subject = issue.subject
1212 1218 new_subject = 'Subject modified by IssuesControllerTest#test_post_edit'
1213 1219
1214 1220 put :update, :id => 1, :issue => {:subject => new_subject,
1215 1221 :priority_id => '6',
1216 1222 :category_id => '1' # no change
1217 1223 }
1218 1224 assert_equal 1, ActionMailer::Base.deliveries.size
1219 1225 end
1220 1226
1221 1227 def test_put_update_with_invalid_spent_time_hours_only
1222 1228 @request.session[:user_id] = 2
1223 1229 notes = 'Note added by IssuesControllerTest#test_post_edit_with_invalid_spent_time'
1224 1230
1225 1231 assert_no_difference('Journal.count') do
1226 1232 put :update,
1227 1233 :id => 1,
1228 1234 :notes => notes,
1229 1235 :time_entry => {"comments"=>"", "activity_id"=>"", "hours"=>"2z"}
1230 1236 end
1231 1237 assert_response :success
1232 1238 assert_template 'edit'
1233 1239
1234 1240 assert_error_tag :descendant => {:content => /Activity can't be blank/}
1235 1241 assert_tag :textarea, :attributes => { :name => 'notes' }, :content => notes
1236 1242 assert_tag :input, :attributes => { :name => 'time_entry[hours]', :value => "2z" }
1237 1243 end
1238 1244
1239 1245 def test_put_update_with_invalid_spent_time_comments_only
1240 1246 @request.session[:user_id] = 2
1241 1247 notes = 'Note added by IssuesControllerTest#test_post_edit_with_invalid_spent_time'
1242 1248
1243 1249 assert_no_difference('Journal.count') do
1244 1250 put :update,
1245 1251 :id => 1,
1246 1252 :notes => notes,
1247 1253 :time_entry => {"comments"=>"this is my comment", "activity_id"=>"", "hours"=>""}
1248 1254 end
1249 1255 assert_response :success
1250 1256 assert_template 'edit'
1251 1257
1252 1258 assert_error_tag :descendant => {:content => /Activity can't be blank/}
1253 1259 assert_error_tag :descendant => {:content => /Hours can't be blank/}
1254 1260 assert_tag :textarea, :attributes => { :name => 'notes' }, :content => notes
1255 1261 assert_tag :input, :attributes => { :name => 'time_entry[comments]', :value => "this is my comment" }
1256 1262 end
1257 1263
1258 1264 def test_put_update_should_allow_fixed_version_to_be_set_to_a_subproject
1259 1265 issue = Issue.find(2)
1260 1266 @request.session[:user_id] = 2
1261 1267
1262 1268 put :update,
1263 1269 :id => issue.id,
1264 1270 :issue => {
1265 1271 :fixed_version_id => 4
1266 1272 }
1267 1273
1268 1274 assert_response :redirect
1269 1275 issue.reload
1270 1276 assert_equal 4, issue.fixed_version_id
1271 1277 assert_not_equal issue.project_id, issue.fixed_version.project_id
1272 1278 end
1273 1279
1274 1280 def test_put_update_should_redirect_back_using_the_back_url_parameter
1275 1281 issue = Issue.find(2)
1276 1282 @request.session[:user_id] = 2
1277 1283
1278 1284 put :update,
1279 1285 :id => issue.id,
1280 1286 :issue => {
1281 1287 :fixed_version_id => 4
1282 1288 },
1283 1289 :back_url => '/issues'
1284 1290
1285 1291 assert_response :redirect
1286 1292 assert_redirected_to '/issues'
1287 1293 end
1288 1294
1289 1295 def test_put_update_should_not_redirect_back_using_the_back_url_parameter_off_the_host
1290 1296 issue = Issue.find(2)
1291 1297 @request.session[:user_id] = 2
1292 1298
1293 1299 put :update,
1294 1300 :id => issue.id,
1295 1301 :issue => {
1296 1302 :fixed_version_id => 4
1297 1303 },
1298 1304 :back_url => 'http://google.com'
1299 1305
1300 1306 assert_response :redirect
1301 1307 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue.id
1302 1308 end
1303 1309
1304 1310 def test_get_bulk_edit
1305 1311 @request.session[:user_id] = 2
1306 1312 get :bulk_edit, :ids => [1, 2]
1307 1313 assert_response :success
1308 1314 assert_template 'bulk_edit'
1309 1315
1310 1316 assert_tag :input, :attributes => {:name => 'issue[parent_issue_id]'}
1311 1317
1312 1318 # Project specific custom field, date type
1313 1319 field = CustomField.find(9)
1314 1320 assert !field.is_for_all?
1315 1321 assert_equal 'date', field.field_format
1316 1322 assert_tag :input, :attributes => {:name => 'issue[custom_field_values][9]'}
1317 1323
1318 1324 # System wide custom field
1319 1325 assert CustomField.find(1).is_for_all?
1320 1326 assert_tag :select, :attributes => {:name => 'issue[custom_field_values][1]'}
1321 1327
1322 1328 # Be sure we don't display inactive IssuePriorities
1323 1329 assert ! IssuePriority.find(15).active?
1324 1330 assert_no_tag :option, :attributes => {:value => '15'},
1325 1331 :parent => {:tag => 'select', :attributes => {:id => 'issue_priority_id'} }
1326 1332 end
1327 1333
1328 1334 def test_get_bulk_edit_on_different_projects
1329 1335 @request.session[:user_id] = 2
1330 1336 get :bulk_edit, :ids => [1, 2, 6]
1331 1337 assert_response :success
1332 1338 assert_template 'bulk_edit'
1333 1339
1334 1340 # Can not set issues from different projects as children of an issue
1335 1341 assert_no_tag :input, :attributes => {:name => 'issue[parent_issue_id]'}
1336 1342
1337 1343 # Project specific custom field, date type
1338 1344 field = CustomField.find(9)
1339 1345 assert !field.is_for_all?
1340 1346 assert !field.project_ids.include?(Issue.find(6).project_id)
1341 1347 assert_no_tag :input, :attributes => {:name => 'issue[custom_field_values][9]'}
1342 1348 end
1343 1349
1344 1350 def test_get_bulk_edit_with_user_custom_field
1345 1351 field = IssueCustomField.create!(:name => 'Tester', :field_format => 'user', :is_for_all => true)
1346 1352
1347 1353 @request.session[:user_id] = 2
1348 1354 get :bulk_edit, :ids => [1, 2]
1349 1355 assert_response :success
1350 1356 assert_template 'bulk_edit'
1351 1357
1352 1358 assert_tag :select,
1353 1359 :attributes => {:name => "issue[custom_field_values][#{field.id}]"},
1354 1360 :children => {
1355 1361 :only => {:tag => 'option'},
1356 1362 :count => Project.find(1).users.count + 1
1357 1363 }
1358 1364 end
1359 1365
1360 1366 def test_get_bulk_edit_with_version_custom_field
1361 1367 field = IssueCustomField.create!(:name => 'Affected version', :field_format => 'version', :is_for_all => true)
1362 1368
1363 1369 @request.session[:user_id] = 2
1364 1370 get :bulk_edit, :ids => [1, 2]
1365 1371 assert_response :success
1366 1372 assert_template 'bulk_edit'
1367 1373
1368 1374 assert_tag :select,
1369 1375 :attributes => {:name => "issue[custom_field_values][#{field.id}]"},
1370 1376 :children => {
1371 1377 :only => {:tag => 'option'},
1372 1378 :count => Project.find(1).versions.count + 1
1373 1379 }
1374 1380 end
1375 1381
1376 1382 def test_bulk_update
1377 1383 @request.session[:user_id] = 2
1378 1384 # update issues priority
1379 1385 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing',
1380 1386 :issue => {:priority_id => 7,
1381 1387 :assigned_to_id => '',
1382 1388 :custom_field_values => {'2' => ''}}
1383 1389
1384 1390 assert_response 302
1385 1391 # check that the issues were updated
1386 1392 assert_equal [7, 7], Issue.find_all_by_id([1, 2]).collect {|i| i.priority.id}
1387 1393
1388 1394 issue = Issue.find(1)
1389 1395 journal = issue.journals.find(:first, :order => 'created_on DESC')
1390 1396 assert_equal '125', issue.custom_value_for(2).value
1391 1397 assert_equal 'Bulk editing', journal.notes
1392 1398 assert_equal 1, journal.details.size
1393 1399 end
1394 1400
1395 1401 def test_bulk_update_with_group_assignee
1396 1402 group = Group.find(11)
1397 1403 project = Project.find(1)
1398 1404 project.members << Member.new(:principal => group, :roles => [Role.first])
1399 1405
1400 1406 @request.session[:user_id] = 2
1401 1407 # update issues assignee
1402 1408 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing',
1403 1409 :issue => {:priority_id => '',
1404 1410 :assigned_to_id => group.id,
1405 1411 :custom_field_values => {'2' => ''}}
1406 1412
1407 1413 assert_response 302
1408 1414 assert_equal [group, group], Issue.find_all_by_id([1, 2]).collect {|i| i.assigned_to}
1409 1415 end
1410 1416
1411 1417 def test_bulk_update_on_different_projects
1412 1418 @request.session[:user_id] = 2
1413 1419 # update issues priority
1414 1420 post :bulk_update, :ids => [1, 2, 6], :notes => 'Bulk editing',
1415 1421 :issue => {:priority_id => 7,
1416 1422 :assigned_to_id => '',
1417 1423 :custom_field_values => {'2' => ''}}
1418 1424
1419 1425 assert_response 302
1420 1426 # check that the issues were updated
1421 1427 assert_equal [7, 7, 7], Issue.find([1,2,6]).map(&:priority_id)
1422 1428
1423 1429 issue = Issue.find(1)
1424 1430 journal = issue.journals.find(:first, :order => 'created_on DESC')
1425 1431 assert_equal '125', issue.custom_value_for(2).value
1426 1432 assert_equal 'Bulk editing', journal.notes
1427 1433 assert_equal 1, journal.details.size
1428 1434 end
1429 1435
1430 1436 def test_bulk_update_on_different_projects_without_rights
1431 1437 @request.session[:user_id] = 3
1432 1438 user = User.find(3)
1433 1439 action = { :controller => "issues", :action => "bulk_update" }
1434 1440 assert user.allowed_to?(action, Issue.find(1).project)
1435 1441 assert ! user.allowed_to?(action, Issue.find(6).project)
1436 1442 post :bulk_update, :ids => [1, 6], :notes => 'Bulk should fail',
1437 1443 :issue => {:priority_id => 7,
1438 1444 :assigned_to_id => '',
1439 1445 :custom_field_values => {'2' => ''}}
1440 1446 assert_response 403
1441 1447 assert_not_equal "Bulk should fail", Journal.last.notes
1442 1448 end
1443 1449
1444 1450 def test_bullk_update_should_send_a_notification
1445 1451 @request.session[:user_id] = 2
1446 1452 ActionMailer::Base.deliveries.clear
1447 1453 post(:bulk_update,
1448 1454 {
1449 1455 :ids => [1, 2],
1450 1456 :notes => 'Bulk editing',
1451 1457 :issue => {
1452 1458 :priority_id => 7,
1453 1459 :assigned_to_id => '',
1454 1460 :custom_field_values => {'2' => ''}
1455 1461 }
1456 1462 })
1457 1463
1458 1464 assert_response 302
1459 1465 assert_equal 2, ActionMailer::Base.deliveries.size
1460 1466 end
1461 1467
1462 1468 def test_bulk_update_status
1463 1469 @request.session[:user_id] = 2
1464 1470 # update issues priority
1465 1471 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing status',
1466 1472 :issue => {:priority_id => '',
1467 1473 :assigned_to_id => '',
1468 1474 :status_id => '5'}
1469 1475
1470 1476 assert_response 302
1471 1477 issue = Issue.find(1)
1472 1478 assert issue.closed?
1473 1479 end
1474 1480
1475 1481 def test_bulk_update_parent_id
1476 1482 @request.session[:user_id] = 2
1477 1483 post :bulk_update, :ids => [1, 3],
1478 1484 :notes => 'Bulk editing parent',
1479 1485 :issue => {:priority_id => '', :assigned_to_id => '', :status_id => '', :parent_issue_id => '2'}
1480 1486
1481 1487 assert_response 302
1482 1488 parent = Issue.find(2)
1483 1489 assert_equal parent.id, Issue.find(1).parent_id
1484 1490 assert_equal parent.id, Issue.find(3).parent_id
1485 1491 assert_equal [1, 3], parent.children.collect(&:id).sort
1486 1492 end
1487 1493
1488 1494 def test_bulk_update_custom_field
1489 1495 @request.session[:user_id] = 2
1490 1496 # update issues priority
1491 1497 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing custom field',
1492 1498 :issue => {:priority_id => '',
1493 1499 :assigned_to_id => '',
1494 1500 :custom_field_values => {'2' => '777'}}
1495 1501
1496 1502 assert_response 302
1497 1503
1498 1504 issue = Issue.find(1)
1499 1505 journal = issue.journals.find(:first, :order => 'created_on DESC')
1500 1506 assert_equal '777', issue.custom_value_for(2).value
1501 1507 assert_equal 1, journal.details.size
1502 1508 assert_equal '125', journal.details.first.old_value
1503 1509 assert_equal '777', journal.details.first.value
1504 1510 end
1505 1511
1506 1512 def test_bulk_update_unassign
1507 1513 assert_not_nil Issue.find(2).assigned_to
1508 1514 @request.session[:user_id] = 2
1509 1515 # unassign issues
1510 1516 post :bulk_update, :ids => [1, 2], :notes => 'Bulk unassigning', :issue => {:assigned_to_id => 'none'}
1511 1517 assert_response 302
1512 1518 # check that the issues were updated
1513 1519 assert_nil Issue.find(2).assigned_to
1514 1520 end
1515 1521
1516 1522 def test_post_bulk_update_should_allow_fixed_version_to_be_set_to_a_subproject
1517 1523 @request.session[:user_id] = 2
1518 1524
1519 1525 post :bulk_update, :ids => [1,2], :issue => {:fixed_version_id => 4}
1520 1526
1521 1527 assert_response :redirect
1522 1528 issues = Issue.find([1,2])
1523 1529 issues.each do |issue|
1524 1530 assert_equal 4, issue.fixed_version_id
1525 1531 assert_not_equal issue.project_id, issue.fixed_version.project_id
1526 1532 end
1527 1533 end
1528 1534
1529 1535 def test_post_bulk_update_should_redirect_back_using_the_back_url_parameter
1530 1536 @request.session[:user_id] = 2
1531 1537 post :bulk_update, :ids => [1,2], :back_url => '/issues'
1532 1538
1533 1539 assert_response :redirect
1534 1540 assert_redirected_to '/issues'
1535 1541 end
1536 1542
1537 1543 def test_post_bulk_update_should_not_redirect_back_using_the_back_url_parameter_off_the_host
1538 1544 @request.session[:user_id] = 2
1539 1545 post :bulk_update, :ids => [1,2], :back_url => 'http://google.com'
1540 1546
1541 1547 assert_response :redirect
1542 1548 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => Project.find(1).identifier
1543 1549 end
1544 1550
1545 1551 def test_destroy_issue_with_no_time_entries
1546 1552 assert_nil TimeEntry.find_by_issue_id(2)
1547 1553 @request.session[:user_id] = 2
1548 1554 post :destroy, :id => 2
1549 1555 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
1550 1556 assert_nil Issue.find_by_id(2)
1551 1557 end
1552 1558
1553 1559 def test_destroy_issues_with_time_entries
1554 1560 @request.session[:user_id] = 2
1555 1561 post :destroy, :ids => [1, 3]
1556 1562 assert_response :success
1557 1563 assert_template 'destroy'
1558 1564 assert_not_nil assigns(:hours)
1559 1565 assert Issue.find_by_id(1) && Issue.find_by_id(3)
1560 1566 end
1561 1567
1562 1568 def test_destroy_issues_and_destroy_time_entries
1563 1569 @request.session[:user_id] = 2
1564 1570 post :destroy, :ids => [1, 3], :todo => 'destroy'
1565 1571 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
1566 1572 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
1567 1573 assert_nil TimeEntry.find_by_id([1, 2])
1568 1574 end
1569 1575
1570 1576 def test_destroy_issues_and_assign_time_entries_to_project
1571 1577 @request.session[:user_id] = 2
1572 1578 post :destroy, :ids => [1, 3], :todo => 'nullify'
1573 1579 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
1574 1580 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
1575 1581 assert_nil TimeEntry.find(1).issue_id
1576 1582 assert_nil TimeEntry.find(2).issue_id
1577 1583 end
1578 1584
1579 1585 def test_destroy_issues_and_reassign_time_entries_to_another_issue
1580 1586 @request.session[:user_id] = 2
1581 1587 post :destroy, :ids => [1, 3], :todo => 'reassign', :reassign_to_id => 2
1582 1588 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
1583 1589 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
1584 1590 assert_equal 2, TimeEntry.find(1).issue_id
1585 1591 assert_equal 2, TimeEntry.find(2).issue_id
1586 1592 end
1587 1593
1588 1594 def test_destroy_issues_from_different_projects
1589 1595 @request.session[:user_id] = 2
1590 1596 post :destroy, :ids => [1, 2, 6], :todo => 'destroy'
1591 1597 assert_redirected_to :controller => 'issues', :action => 'index'
1592 1598 assert !(Issue.find_by_id(1) || Issue.find_by_id(2) || Issue.find_by_id(6))
1593 1599 end
1594 1600
1595 1601 def test_destroy_parent_and_child_issues
1596 1602 parent = Issue.generate!(:project_id => 1, :tracker_id => 1)
1597 1603 child = Issue.generate!(:project_id => 1, :tracker_id => 1, :parent_issue_id => parent.id)
1598 1604 assert child.is_descendant_of?(parent.reload)
1599 1605
1600 1606 @request.session[:user_id] = 2
1601 1607 assert_difference 'Issue.count', -2 do
1602 1608 post :destroy, :ids => [parent.id, child.id], :todo => 'destroy'
1603 1609 end
1604 1610 assert_response 302
1605 1611 end
1606 1612
1607 1613 def test_default_search_scope
1608 1614 get :index
1609 1615 assert_tag :div, :attributes => {:id => 'quick-search'},
1610 1616 :child => {:tag => 'form',
1611 1617 :child => {:tag => 'input', :attributes => {:name => 'issues', :type => 'hidden', :value => '1'}}}
1612 1618 end
1613 1619 end
General Comments 0
You need to be logged in to leave comments. Login now