##// END OF EJS Templates
remove trailing white-spaces from test/functional/issues_controller_test.rb....
Toshi MARUYAMA -
r6793:aa05bd775102
parent child
Show More
@@ -1,1613 +1,1613
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 314 def test_show_by_anonymous
315 315 get :show, :id => 1
316 316 assert_response :success
317 317 assert_template 'show.rhtml'
318 318 assert_not_nil assigns(:issue)
319 319 assert_equal Issue.find(1), assigns(:issue)
320 320
321 321 # anonymous role is allowed to add a note
322 322 assert_tag :tag => 'form',
323 323 :descendant => { :tag => 'fieldset',
324 324 :child => { :tag => 'legend',
325 325 :content => /Notes/ } }
326 326 end
327 327
328 328 def test_show_by_manager
329 329 @request.session[:user_id] = 2
330 330 get :show, :id => 1
331 331 assert_response :success
332 332
333 333 assert_tag :tag => 'a',
334 334 :content => /Quote/
335 335
336 336 assert_tag :tag => 'form',
337 337 :descendant => { :tag => 'fieldset',
338 338 :child => { :tag => 'legend',
339 339 :content => /Change properties/ } },
340 340 :descendant => { :tag => 'fieldset',
341 341 :child => { :tag => 'legend',
342 342 :content => /Log time/ } },
343 343 :descendant => { :tag => 'fieldset',
344 344 :child => { :tag => 'legend',
345 345 :content => /Notes/ } }
346 346 end
347 347
348 348 def test_update_form_should_not_display_inactive_enumerations
349 349 @request.session[:user_id] = 2
350 350 get :show, :id => 1
351 351 assert_response :success
352 352
353 353 assert ! IssuePriority.find(15).active?
354 354 assert_no_tag :option, :attributes => {:value => '15'},
355 355 :parent => {:tag => 'select', :attributes => {:id => 'issue_priority_id'} }
356 356 end
357
357
358 358 def test_update_form_should_allow_attachment_upload
359 359 @request.session[:user_id] = 2
360 360 get :show, :id => 1
361
361
362 362 assert_tag :tag => 'form',
363 363 :attributes => {:id => 'issue-form', :method => 'post', :enctype => 'multipart/form-data'},
364 364 :descendant => {
365 365 :tag => 'input',
366 366 :attributes => {:type => 'file', :name => 'attachments[1][file]'}
367 367 }
368 368 end
369 369
370 370 def test_show_should_deny_anonymous_access_without_permission
371 371 Role.anonymous.remove_permission!(:view_issues)
372 372 get :show, :id => 1
373 373 assert_response :redirect
374 374 end
375 375
376 376 def test_show_should_deny_anonymous_access_to_private_issue
377 377 Issue.update_all(["is_private = ?", true], "id = 1")
378 378 get :show, :id => 1
379 379 assert_response :redirect
380 380 end
381 381
382 382 def test_show_should_deny_non_member_access_without_permission
383 383 Role.non_member.remove_permission!(:view_issues)
384 384 @request.session[:user_id] = 9
385 385 get :show, :id => 1
386 386 assert_response 403
387 387 end
388 388
389 389 def test_show_should_deny_non_member_access_to_private_issue
390 390 Issue.update_all(["is_private = ?", true], "id = 1")
391 391 @request.session[:user_id] = 9
392 392 get :show, :id => 1
393 393 assert_response 403
394 394 end
395 395
396 396 def test_show_should_deny_member_access_without_permission
397 397 Role.find(1).remove_permission!(:view_issues)
398 398 @request.session[:user_id] = 2
399 399 get :show, :id => 1
400 400 assert_response 403
401 401 end
402 402
403 403 def test_show_should_deny_member_access_to_private_issue_without_permission
404 404 Issue.update_all(["is_private = ?", true], "id = 1")
405 405 @request.session[:user_id] = 3
406 406 get :show, :id => 1
407 407 assert_response 403
408 408 end
409 409
410 410 def test_show_should_allow_author_access_to_private_issue
411 411 Issue.update_all(["is_private = ?, author_id = 3", true], "id = 1")
412 412 @request.session[:user_id] = 3
413 413 get :show, :id => 1
414 414 assert_response :success
415 415 end
416 416
417 417 def test_show_should_allow_assignee_access_to_private_issue
418 418 Issue.update_all(["is_private = ?, assigned_to_id = 3", true], "id = 1")
419 419 @request.session[:user_id] = 3
420 420 get :show, :id => 1
421 421 assert_response :success
422 422 end
423 423
424 424 def test_show_should_allow_member_access_to_private_issue_with_permission
425 425 Issue.update_all(["is_private = ?", true], "id = 1")
426 426 User.find(3).roles_for_project(Project.find(1)).first.update_attribute :issues_visibility, 'all'
427 427 @request.session[:user_id] = 3
428 428 get :show, :id => 1
429 429 assert_response :success
430 430 end
431 431
432 432 def test_show_should_not_disclose_relations_to_invisible_issues
433 433 Setting.cross_project_issue_relations = '1'
434 434 IssueRelation.create!(:issue_from => Issue.find(1), :issue_to => Issue.find(2), :relation_type => 'relates')
435 435 # Relation to a private project issue
436 436 IssueRelation.create!(:issue_from => Issue.find(1), :issue_to => Issue.find(4), :relation_type => 'relates')
437 437
438 438 get :show, :id => 1
439 439 assert_response :success
440 440
441 441 assert_tag :div, :attributes => { :id => 'relations' },
442 442 :descendant => { :tag => 'a', :content => /#2$/ }
443 443 assert_no_tag :div, :attributes => { :id => 'relations' },
444 444 :descendant => { :tag => 'a', :content => /#4$/ }
445 445 end
446 446
447 447 def test_show_atom
448 448 get :show, :id => 2, :format => 'atom'
449 449 assert_response :success
450 450 assert_template 'journals/index.rxml'
451 451 # Inline image
452 452 assert_select 'content', :text => Regexp.new(Regexp.quote('http://test.host/attachments/download/10'))
453 453 end
454 454
455 455 def test_show_export_to_pdf
456 456 get :show, :id => 3, :format => 'pdf'
457 457 assert_response :success
458 458 assert_equal 'application/pdf', @response.content_type
459 459 assert @response.body.starts_with?('%PDF')
460 460 assert_not_nil assigns(:issue)
461 461 end
462 462
463 463 def test_get_new
464 464 @request.session[:user_id] = 2
465 465 get :new, :project_id => 1, :tracker_id => 1
466 466 assert_response :success
467 467 assert_template 'new'
468 468
469 469 assert_tag :tag => 'input', :attributes => { :name => 'issue[custom_field_values][2]',
470 470 :value => 'Default string' }
471 471
472 472 # Be sure we don't display inactive IssuePriorities
473 473 assert ! IssuePriority.find(15).active?
474 474 assert_no_tag :option, :attributes => {:value => '15'},
475 475 :parent => {:tag => 'select', :attributes => {:id => 'issue_priority_id'} }
476 476 end
477
477
478 478 def test_get_new_form_should_allow_attachment_upload
479 479 @request.session[:user_id] = 2
480 480 get :new, :project_id => 1, :tracker_id => 1
481
481
482 482 assert_tag :tag => 'form',
483 483 :attributes => {:id => 'issue-form', :method => 'post', :enctype => 'multipart/form-data'},
484 484 :descendant => {
485 485 :tag => 'input',
486 486 :attributes => {:type => 'file', :name => 'attachments[1][file]'}
487 487 }
488 488 end
489 489
490 490 def test_get_new_without_tracker_id
491 491 @request.session[:user_id] = 2
492 492 get :new, :project_id => 1
493 493 assert_response :success
494 494 assert_template 'new'
495 495
496 496 issue = assigns(:issue)
497 497 assert_not_nil issue
498 498 assert_equal Project.find(1).trackers.first, issue.tracker
499 499 end
500 500
501 501 def test_get_new_with_no_default_status_should_display_an_error
502 502 @request.session[:user_id] = 2
503 503 IssueStatus.delete_all
504 504
505 505 get :new, :project_id => 1
506 506 assert_response 500
507 507 assert_error_tag :content => /No default issue/
508 508 end
509 509
510 510 def test_get_new_with_no_tracker_should_display_an_error
511 511 @request.session[:user_id] = 2
512 512 Tracker.delete_all
513 513
514 514 get :new, :project_id => 1
515 515 assert_response 500
516 516 assert_error_tag :content => /No tracker/
517 517 end
518 518
519 519 def test_update_new_form
520 520 @request.session[:user_id] = 2
521 521 xhr :post, :new, :project_id => 1,
522 522 :issue => {:tracker_id => 2,
523 523 :subject => 'This is the test_new issue',
524 524 :description => 'This is the description',
525 525 :priority_id => 5}
526 526 assert_response :success
527 527 assert_template 'attributes'
528 528
529 529 issue = assigns(:issue)
530 530 assert_kind_of Issue, issue
531 531 assert_equal 1, issue.project_id
532 532 assert_equal 2, issue.tracker_id
533 533 assert_equal 'This is the test_new issue', issue.subject
534 534 end
535 535
536 536 def test_post_create
537 537 @request.session[:user_id] = 2
538 538 assert_difference 'Issue.count' do
539 539 post :create, :project_id => 1,
540 540 :issue => {:tracker_id => 3,
541 541 :status_id => 2,
542 542 :subject => 'This is the test_new issue',
543 543 :description => 'This is the description',
544 544 :priority_id => 5,
545 545 :start_date => '2010-11-07',
546 546 :estimated_hours => '',
547 547 :custom_field_values => {'2' => 'Value for field 2'}}
548 548 end
549 549 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
550 550
551 551 issue = Issue.find_by_subject('This is the test_new issue')
552 552 assert_not_nil issue
553 553 assert_equal 2, issue.author_id
554 554 assert_equal 3, issue.tracker_id
555 555 assert_equal 2, issue.status_id
556 556 assert_equal Date.parse('2010-11-07'), issue.start_date
557 557 assert_nil issue.estimated_hours
558 558 v = issue.custom_values.find(:first, :conditions => {:custom_field_id => 2})
559 559 assert_not_nil v
560 560 assert_equal 'Value for field 2', v.value
561 561 end
562
562
563 563 def test_post_new_with_group_assignment
564 564 group = Group.find(11)
565 565 project = Project.find(1)
566 566 project.members << Member.new(:principal => group, :roles => [Role.first])
567 567
568 568 with_settings :issue_group_assignment => '1' do
569 569 @request.session[:user_id] = 2
570 570 assert_difference 'Issue.count' do
571 post :create, :project_id => project.id,
571 post :create, :project_id => project.id,
572 572 :issue => {:tracker_id => 3,
573 573 :status_id => 1,
574 574 :subject => 'This is the test_new_with_group_assignment issue',
575 575 :assigned_to_id => group.id}
576 576 end
577 577 end
578 578 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
579
579
580 580 issue = Issue.find_by_subject('This is the test_new_with_group_assignment issue')
581 581 assert_not_nil issue
582 582 assert_equal group, issue.assigned_to
583 583 end
584 584
585 585 def test_post_create_without_start_date
586 586 @request.session[:user_id] = 2
587 587 assert_difference 'Issue.count' do
588 588 post :create, :project_id => 1,
589 589 :issue => {:tracker_id => 3,
590 590 :status_id => 2,
591 591 :subject => 'This is the test_new issue',
592 592 :description => 'This is the description',
593 593 :priority_id => 5,
594 594 :start_date => '',
595 595 :estimated_hours => '',
596 596 :custom_field_values => {'2' => 'Value for field 2'}}
597 597 end
598 598 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
599 599
600 600 issue = Issue.find_by_subject('This is the test_new issue')
601 601 assert_not_nil issue
602 602 assert_nil issue.start_date
603 603 end
604 604
605 605 def test_post_create_and_continue
606 606 @request.session[:user_id] = 2
607 607 assert_difference 'Issue.count' do
608 608 post :create, :project_id => 1,
609 609 :issue => {:tracker_id => 3, :subject => 'This is first issue', :priority_id => 5},
610 610 :continue => ''
611 611 end
612
612
613 613 issue = Issue.first(:order => 'id DESC')
614 614 assert_redirected_to :controller => 'issues', :action => 'new', :project_id => 'ecookbook', :issue => {:tracker_id => 3}
615 615 assert_not_nil flash[:notice], "flash was not set"
616 616 assert flash[:notice].include?("<a href='/issues/#{issue.id}'>##{issue.id}</a>"), "issue link not found in flash: #{flash[:notice]}"
617 617 end
618 618
619 619 def test_post_create_without_custom_fields_param
620 620 @request.session[:user_id] = 2
621 621 assert_difference 'Issue.count' do
622 622 post :create, :project_id => 1,
623 623 :issue => {:tracker_id => 1,
624 624 :subject => 'This is the test_new issue',
625 625 :description => 'This is the description',
626 626 :priority_id => 5}
627 627 end
628 628 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
629 629 end
630 630
631 631 def test_post_create_with_required_custom_field_and_without_custom_fields_param
632 632 field = IssueCustomField.find_by_name('Database')
633 633 field.update_attribute(:is_required, true)
634 634
635 635 @request.session[:user_id] = 2
636 636 post :create, :project_id => 1,
637 637 :issue => {:tracker_id => 1,
638 638 :subject => 'This is the test_new issue',
639 639 :description => 'This is the description',
640 640 :priority_id => 5}
641 641 assert_response :success
642 642 assert_template 'new'
643 643 issue = assigns(:issue)
644 644 assert_not_nil issue
645 645 assert_equal I18n.translate('activerecord.errors.messages.invalid'), issue.errors.on(:custom_values)
646 646 end
647 647
648 648 def test_post_create_with_watchers
649 649 @request.session[:user_id] = 2
650 650 ActionMailer::Base.deliveries.clear
651 651
652 652 assert_difference 'Watcher.count', 2 do
653 653 post :create, :project_id => 1,
654 654 :issue => {:tracker_id => 1,
655 655 :subject => 'This is a new issue with watchers',
656 656 :description => 'This is the description',
657 657 :priority_id => 5,
658 658 :watcher_user_ids => ['2', '3']}
659 659 end
660 660 issue = Issue.find_by_subject('This is a new issue with watchers')
661 661 assert_not_nil issue
662 662 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue
663 663
664 664 # Watchers added
665 665 assert_equal [2, 3], issue.watcher_user_ids.sort
666 666 assert issue.watched_by?(User.find(3))
667 667 # Watchers notified
668 668 mail = ActionMailer::Base.deliveries.last
669 669 assert_kind_of TMail::Mail, mail
670 670 assert [mail.bcc, mail.cc].flatten.include?(User.find(3).mail)
671 671 end
672 672
673 673 def test_post_create_subissue
674 674 @request.session[:user_id] = 2
675 675
676 676 assert_difference 'Issue.count' do
677 677 post :create, :project_id => 1,
678 678 :issue => {:tracker_id => 1,
679 679 :subject => 'This is a child issue',
680 680 :parent_issue_id => 2}
681 681 end
682 682 issue = Issue.find_by_subject('This is a child issue')
683 683 assert_not_nil issue
684 684 assert_equal Issue.find(2), issue.parent
685 685 end
686 686
687 687 def test_post_create_subissue_with_non_numeric_parent_id
688 688 @request.session[:user_id] = 2
689 689
690 690 assert_difference 'Issue.count' do
691 691 post :create, :project_id => 1,
692 692 :issue => {:tracker_id => 1,
693 693 :subject => 'This is a child issue',
694 694 :parent_issue_id => 'ABC'}
695 695 end
696 696 issue = Issue.find_by_subject('This is a child issue')
697 697 assert_not_nil issue
698 698 assert_nil issue.parent
699 699 end
700
700
701 701 def test_post_create_private
702 702 @request.session[:user_id] = 2
703 703
704 704 assert_difference 'Issue.count' do
705 705 post :create, :project_id => 1,
706 706 :issue => {:tracker_id => 1,
707 707 :subject => 'This is a private issue',
708 708 :is_private => '1'}
709 709 end
710 710 issue = Issue.first(:order => 'id DESC')
711 711 assert issue.is_private?
712 712 end
713
713
714 714 def test_post_create_private_with_set_own_issues_private_permission
715 715 role = Role.find(1)
716 716 role.remove_permission! :set_issues_private
717 717 role.add_permission! :set_own_issues_private
718
718
719 719 @request.session[:user_id] = 2
720 720
721 721 assert_difference 'Issue.count' do
722 722 post :create, :project_id => 1,
723 723 :issue => {:tracker_id => 1,
724 724 :subject => 'This is a private issue',
725 725 :is_private => '1'}
726 726 end
727 727 issue = Issue.first(:order => 'id DESC')
728 728 assert issue.is_private?
729 729 end
730 730
731 731 def test_post_create_should_send_a_notification
732 732 ActionMailer::Base.deliveries.clear
733 733 @request.session[:user_id] = 2
734 734 assert_difference 'Issue.count' do
735 735 post :create, :project_id => 1,
736 736 :issue => {:tracker_id => 3,
737 737 :subject => 'This is the test_new issue',
738 738 :description => 'This is the description',
739 739 :priority_id => 5,
740 740 :estimated_hours => '',
741 741 :custom_field_values => {'2' => 'Value for field 2'}}
742 742 end
743 743 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
744 744
745 745 assert_equal 1, ActionMailer::Base.deliveries.size
746 746 end
747 747
748 748 def test_post_create_should_preserve_fields_values_on_validation_failure
749 749 @request.session[:user_id] = 2
750 750 post :create, :project_id => 1,
751 751 :issue => {:tracker_id => 1,
752 752 # empty subject
753 753 :subject => '',
754 754 :description => 'This is a description',
755 755 :priority_id => 6,
756 756 :custom_field_values => {'1' => 'Oracle', '2' => 'Value for field 2'}}
757 757 assert_response :success
758 758 assert_template 'new'
759 759
760 760 assert_tag :textarea, :attributes => { :name => 'issue[description]' },
761 761 :content => 'This is a description'
762 762 assert_tag :select, :attributes => { :name => 'issue[priority_id]' },
763 763 :child => { :tag => 'option', :attributes => { :selected => 'selected',
764 764 :value => '6' },
765 765 :content => 'High' }
766 766 # Custom fields
767 767 assert_tag :select, :attributes => { :name => 'issue[custom_field_values][1]' },
768 768 :child => { :tag => 'option', :attributes => { :selected => 'selected',
769 769 :value => 'Oracle' },
770 770 :content => 'Oracle' }
771 771 assert_tag :input, :attributes => { :name => 'issue[custom_field_values][2]',
772 772 :value => 'Value for field 2'}
773 773 end
774 774
775 775 def test_post_create_should_ignore_non_safe_attributes
776 776 @request.session[:user_id] = 2
777 777 assert_nothing_raised do
778 778 post :create, :project_id => 1, :issue => { :tracker => "A param can not be a Tracker" }
779 779 end
780 780 end
781 781
782 782 def test_post_create_with_attachment
783 783 set_tmp_attachments_directory
784 784 @request.session[:user_id] = 2
785
785
786 786 assert_difference 'Issue.count' do
787 787 assert_difference 'Attachment.count' do
788 post :create, :project_id => 1,
788 post :create, :project_id => 1,
789 789 :issue => { :tracker_id => '1', :subject => 'With attachment' },
790 790 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}}
791 791 end
792 792 end
793
793
794 794 issue = Issue.first(:order => 'id DESC')
795 795 attachment = Attachment.first(:order => 'id DESC')
796
796
797 797 assert_equal issue, attachment.container
798 798 assert_equal 2, attachment.author_id
799 799 assert_equal 'testfile.txt', attachment.filename
800 800 assert_equal 'text/plain', attachment.content_type
801 801 assert_equal 'test file', attachment.description
802 802 assert_equal 59, attachment.filesize
803 803 assert File.exists?(attachment.diskfile)
804 804 assert_equal 59, File.size(attachment.diskfile)
805 805 end
806 806
807 807 context "without workflow privilege" do
808 808 setup do
809 809 Workflow.delete_all(["role_id = ?", Role.anonymous.id])
810 810 Role.anonymous.add_permission! :add_issues, :add_issue_notes
811 811 end
812 812
813 813 context "#new" do
814 814 should "propose default status only" do
815 815 get :new, :project_id => 1
816 816 assert_response :success
817 817 assert_template 'new'
818 818 assert_tag :tag => 'select',
819 819 :attributes => {:name => 'issue[status_id]'},
820 820 :children => {:count => 1},
821 821 :child => {:tag => 'option', :attributes => {:value => IssueStatus.default.id.to_s}}
822 822 end
823 823
824 824 should "accept default status" do
825 825 assert_difference 'Issue.count' do
826 826 post :create, :project_id => 1,
827 827 :issue => {:tracker_id => 1,
828 828 :subject => 'This is an issue',
829 829 :status_id => 1}
830 830 end
831 831 issue = Issue.last(:order => 'id')
832 832 assert_equal IssueStatus.default, issue.status
833 833 end
834 834
835 835 should "ignore unauthorized status" do
836 836 assert_difference 'Issue.count' do
837 837 post :create, :project_id => 1,
838 838 :issue => {:tracker_id => 1,
839 839 :subject => 'This is an issue',
840 840 :status_id => 3}
841 841 end
842 842 issue = Issue.last(:order => 'id')
843 843 assert_equal IssueStatus.default, issue.status
844 844 end
845 845 end
846 846
847 847 context "#update" do
848 848 should "ignore status change" do
849 849 assert_difference 'Journal.count' do
850 850 put :update, :id => 1, :notes => 'just trying', :issue => {:status_id => 3}
851 851 end
852 852 assert_equal 1, Issue.find(1).status_id
853 853 end
854 854
855 855 should "ignore attributes changes" do
856 856 assert_difference 'Journal.count' do
857 857 put :update, :id => 1, :notes => 'just trying', :issue => {:subject => 'changed', :assigned_to_id => 2}
858 858 end
859 859 issue = Issue.find(1)
860 860 assert_equal "Can't print recipes", issue.subject
861 861 assert_nil issue.assigned_to
862 862 end
863 863 end
864 864 end
865 865
866 866 context "with workflow privilege" do
867 867 setup do
868 868 Workflow.delete_all(["role_id = ?", Role.anonymous.id])
869 869 Workflow.create!(:role => Role.anonymous, :tracker_id => 1, :old_status_id => 1, :new_status_id => 3)
870 870 Workflow.create!(:role => Role.anonymous, :tracker_id => 1, :old_status_id => 1, :new_status_id => 4)
871 871 Role.anonymous.add_permission! :add_issues, :add_issue_notes
872 872 end
873 873
874 874 context "#update" do
875 875 should "accept authorized status" do
876 876 assert_difference 'Journal.count' do
877 877 put :update, :id => 1, :notes => 'just trying', :issue => {:status_id => 3}
878 878 end
879 879 assert_equal 3, Issue.find(1).status_id
880 880 end
881 881
882 882 should "ignore unauthorized status" do
883 883 assert_difference 'Journal.count' do
884 884 put :update, :id => 1, :notes => 'just trying', :issue => {:status_id => 2}
885 885 end
886 886 assert_equal 1, Issue.find(1).status_id
887 887 end
888 888
889 889 should "accept authorized attributes changes" do
890 890 assert_difference 'Journal.count' do
891 891 put :update, :id => 1, :notes => 'just trying', :issue => {:assigned_to_id => 2}
892 892 end
893 893 issue = Issue.find(1)
894 894 assert_equal 2, issue.assigned_to_id
895 895 end
896 896
897 897 should "ignore unauthorized attributes changes" do
898 898 assert_difference 'Journal.count' do
899 899 put :update, :id => 1, :notes => 'just trying', :issue => {:subject => 'changed'}
900 900 end
901 901 issue = Issue.find(1)
902 902 assert_equal "Can't print recipes", issue.subject
903 903 end
904 904 end
905 905
906 906 context "and :edit_issues permission" do
907 907 setup do
908 908 Role.anonymous.add_permission! :add_issues, :edit_issues
909 909 end
910 910
911 911 should "accept authorized status" do
912 912 assert_difference 'Journal.count' do
913 913 put :update, :id => 1, :notes => 'just trying', :issue => {:status_id => 3}
914 914 end
915 915 assert_equal 3, Issue.find(1).status_id
916 916 end
917 917
918 918 should "ignore unauthorized status" do
919 919 assert_difference 'Journal.count' do
920 920 put :update, :id => 1, :notes => 'just trying', :issue => {:status_id => 2}
921 921 end
922 922 assert_equal 1, Issue.find(1).status_id
923 923 end
924 924
925 925 should "accept authorized attributes changes" do
926 926 assert_difference 'Journal.count' do
927 927 put :update, :id => 1, :notes => 'just trying', :issue => {:subject => 'changed', :assigned_to_id => 2}
928 928 end
929 929 issue = Issue.find(1)
930 930 assert_equal "changed", issue.subject
931 931 assert_equal 2, issue.assigned_to_id
932 932 end
933 933 end
934 934 end
935 935
936 936 def test_copy_issue
937 937 @request.session[:user_id] = 2
938 938 get :new, :project_id => 1, :copy_from => 1
939 939 assert_template 'new'
940 940 assert_not_nil assigns(:issue)
941 941 orig = Issue.find(1)
942 942 assert_equal orig.subject, assigns(:issue).subject
943 943 end
944 944
945 945 def test_get_edit
946 946 @request.session[:user_id] = 2
947 947 get :edit, :id => 1
948 948 assert_response :success
949 949 assert_template 'edit'
950 950 assert_not_nil assigns(:issue)
951 951 assert_equal Issue.find(1), assigns(:issue)
952 952
953 953 # Be sure we don't display inactive IssuePriorities
954 954 assert ! IssuePriority.find(15).active?
955 955 assert_no_tag :option, :attributes => {:value => '15'},
956 956 :parent => {:tag => 'select', :attributes => {:id => 'issue_priority_id'} }
957 957 end
958 958
959 959 def test_get_edit_with_params
960 960 @request.session[:user_id] = 2
961 961 get :edit, :id => 1, :issue => { :status_id => 5, :priority_id => 7 },
962 962 :time_entry => { :hours => '2.5', :comments => 'test_get_edit_with_params', :activity_id => TimeEntryActivity.first.id }
963 963 assert_response :success
964 964 assert_template 'edit'
965 965
966 966 issue = assigns(:issue)
967 967 assert_not_nil issue
968 968
969 969 assert_equal 5, issue.status_id
970 970 assert_tag :select, :attributes => { :name => 'issue[status_id]' },
971 971 :child => { :tag => 'option',
972 972 :content => 'Closed',
973 973 :attributes => { :selected => 'selected' } }
974 974
975 975 assert_equal 7, issue.priority_id
976 976 assert_tag :select, :attributes => { :name => 'issue[priority_id]' },
977 977 :child => { :tag => 'option',
978 978 :content => 'Urgent',
979 979 :attributes => { :selected => 'selected' } }
980 980
981 981 assert_tag :input, :attributes => { :name => 'time_entry[hours]', :value => '2.5' }
982 982 assert_tag :select, :attributes => { :name => 'time_entry[activity_id]' },
983 983 :child => { :tag => 'option',
984 984 :attributes => { :selected => 'selected', :value => TimeEntryActivity.first.id } }
985 985 assert_tag :input, :attributes => { :name => 'time_entry[comments]', :value => 'test_get_edit_with_params' }
986 986 end
987 987
988 988 def test_update_edit_form
989 989 @request.session[:user_id] = 2
990 990 xhr :post, :new, :project_id => 1,
991 991 :id => 1,
992 992 :issue => {:tracker_id => 2,
993 993 :subject => 'This is the test_new issue',
994 994 :description => 'This is the description',
995 995 :priority_id => 5}
996 996 assert_response :success
997 997 assert_template 'attributes'
998 998
999 999 issue = assigns(:issue)
1000 1000 assert_kind_of Issue, issue
1001 1001 assert_equal 1, issue.id
1002 1002 assert_equal 1, issue.project_id
1003 1003 assert_equal 2, issue.tracker_id
1004 1004 assert_equal 'This is the test_new issue', issue.subject
1005 1005 end
1006 1006
1007 1007 def test_update_using_invalid_http_verbs
1008 1008 @request.session[:user_id] = 2
1009 1009 subject = 'Updated by an invalid http verb'
1010 1010
1011 1011 get :update, :id => 1, :issue => {:subject => subject}
1012 1012 assert_not_equal subject, Issue.find(1).subject
1013 1013
1014 1014 post :update, :id => 1, :issue => {:subject => subject}
1015 1015 assert_not_equal subject, Issue.find(1).subject
1016 1016
1017 1017 delete :update, :id => 1, :issue => {:subject => subject}
1018 1018 assert_not_equal subject, Issue.find(1).subject
1019 1019 end
1020 1020
1021 1021 def test_put_update_without_custom_fields_param
1022 1022 @request.session[:user_id] = 2
1023 1023 ActionMailer::Base.deliveries.clear
1024 1024
1025 1025 issue = Issue.find(1)
1026 1026 assert_equal '125', issue.custom_value_for(2).value
1027 1027 old_subject = issue.subject
1028 1028 new_subject = 'Subject modified by IssuesControllerTest#test_post_edit'
1029 1029
1030 1030 assert_difference('Journal.count') do
1031 1031 assert_difference('JournalDetail.count', 2) do
1032 1032 put :update, :id => 1, :issue => {:subject => new_subject,
1033 1033 :priority_id => '6',
1034 1034 :category_id => '1' # no change
1035 1035 }
1036 1036 end
1037 1037 end
1038 1038 assert_redirected_to :action => 'show', :id => '1'
1039 1039 issue.reload
1040 1040 assert_equal new_subject, issue.subject
1041 1041 # Make sure custom fields were not cleared
1042 1042 assert_equal '125', issue.custom_value_for(2).value
1043 1043
1044 1044 mail = ActionMailer::Base.deliveries.last
1045 1045 assert_kind_of TMail::Mail, mail
1046 1046 assert mail.subject.starts_with?("[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}]")
1047 1047 assert mail.body.include?("Subject changed from #{old_subject} to #{new_subject}")
1048 1048 end
1049 1049
1050 1050 def test_put_update_with_custom_field_change
1051 1051 @request.session[:user_id] = 2
1052 1052 issue = Issue.find(1)
1053 1053 assert_equal '125', issue.custom_value_for(2).value
1054 1054
1055 1055 assert_difference('Journal.count') do
1056 1056 assert_difference('JournalDetail.count', 3) do
1057 1057 put :update, :id => 1, :issue => {:subject => 'Custom field change',
1058 1058 :priority_id => '6',
1059 1059 :category_id => '1', # no change
1060 1060 :custom_field_values => { '2' => 'New custom value' }
1061 1061 }
1062 1062 end
1063 1063 end
1064 1064 assert_redirected_to :action => 'show', :id => '1'
1065 1065 issue.reload
1066 1066 assert_equal 'New custom value', issue.custom_value_for(2).value
1067 1067
1068 1068 mail = ActionMailer::Base.deliveries.last
1069 1069 assert_kind_of TMail::Mail, mail
1070 1070 assert mail.body.include?("Searchable field changed from 125 to New custom value")
1071 1071 end
1072 1072
1073 1073 def test_put_update_with_status_and_assignee_change
1074 1074 issue = Issue.find(1)
1075 1075 assert_equal 1, issue.status_id
1076 1076 @request.session[:user_id] = 2
1077 1077 assert_difference('TimeEntry.count', 0) do
1078 1078 put :update,
1079 1079 :id => 1,
1080 1080 :issue => { :status_id => 2, :assigned_to_id => 3 },
1081 1081 :notes => 'Assigned to dlopper',
1082 1082 :time_entry => { :hours => '', :comments => '', :activity_id => TimeEntryActivity.first }
1083 1083 end
1084 1084 assert_redirected_to :action => 'show', :id => '1'
1085 1085 issue.reload
1086 1086 assert_equal 2, issue.status_id
1087 1087 j = Journal.find(:first, :order => 'id DESC')
1088 1088 assert_equal 'Assigned to dlopper', j.notes
1089 1089 assert_equal 2, j.details.size
1090 1090
1091 1091 mail = ActionMailer::Base.deliveries.last
1092 1092 assert mail.body.include?("Status changed from New to Assigned")
1093 1093 # subject should contain the new status
1094 1094 assert mail.subject.include?("(#{ IssueStatus.find(2).name })")
1095 1095 end
1096 1096
1097 1097 def test_put_update_with_note_only
1098 1098 notes = 'Note added by IssuesControllerTest#test_update_with_note_only'
1099 1099 # anonymous user
1100 1100 put :update,
1101 1101 :id => 1,
1102 1102 :notes => notes
1103 1103 assert_redirected_to :action => 'show', :id => '1'
1104 1104 j = Journal.find(:first, :order => 'id DESC')
1105 1105 assert_equal notes, j.notes
1106 1106 assert_equal 0, j.details.size
1107 1107 assert_equal User.anonymous, j.user
1108 1108
1109 1109 mail = ActionMailer::Base.deliveries.last
1110 1110 assert mail.body.include?(notes)
1111 1111 end
1112 1112
1113 1113 def test_put_update_with_note_and_spent_time
1114 1114 @request.session[:user_id] = 2
1115 1115 spent_hours_before = Issue.find(1).spent_hours
1116 1116 assert_difference('TimeEntry.count') do
1117 1117 put :update,
1118 1118 :id => 1,
1119 1119 :notes => '2.5 hours added',
1120 1120 :time_entry => { :hours => '2.5', :comments => 'test_put_update_with_note_and_spent_time', :activity_id => TimeEntryActivity.first.id }
1121 1121 end
1122 1122 assert_redirected_to :action => 'show', :id => '1'
1123 1123
1124 1124 issue = Issue.find(1)
1125 1125
1126 1126 j = Journal.find(:first, :order => 'id DESC')
1127 1127 assert_equal '2.5 hours added', j.notes
1128 1128 assert_equal 0, j.details.size
1129 1129
1130 1130 t = issue.time_entries.find_by_comments('test_put_update_with_note_and_spent_time')
1131 1131 assert_not_nil t
1132 1132 assert_equal 2.5, t.hours
1133 1133 assert_equal spent_hours_before + 2.5, issue.spent_hours
1134 1134 end
1135 1135
1136 1136 def test_put_update_with_attachment_only
1137 1137 set_tmp_attachments_directory
1138 1138
1139 1139 # Delete all fixtured journals, a race condition can occur causing the wrong
1140 1140 # journal to get fetched in the next find.
1141 1141 Journal.delete_all
1142 1142
1143 1143 # anonymous user
1144 1144 assert_difference 'Attachment.count' do
1145 1145 put :update, :id => 1,
1146 1146 :notes => '',
1147 1147 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}}
1148 1148 end
1149
1149
1150 1150 assert_redirected_to :action => 'show', :id => '1'
1151 1151 j = Issue.find(1).journals.find(:first, :order => 'id DESC')
1152 1152 assert j.notes.blank?
1153 1153 assert_equal 1, j.details.size
1154 1154 assert_equal 'testfile.txt', j.details.first.value
1155 1155 assert_equal User.anonymous, j.user
1156
1156
1157 1157 attachment = Attachment.first(:order => 'id DESC')
1158 1158 assert_equal Issue.find(1), attachment.container
1159 1159 assert_equal User.anonymous, attachment.author
1160 1160 assert_equal 'testfile.txt', attachment.filename
1161 1161 assert_equal 'text/plain', attachment.content_type
1162 1162 assert_equal 'test file', attachment.description
1163 1163 assert_equal 59, attachment.filesize
1164 1164 assert File.exists?(attachment.diskfile)
1165 1165 assert_equal 59, File.size(attachment.diskfile)
1166 1166
1167 1167 mail = ActionMailer::Base.deliveries.last
1168 1168 assert mail.body.include?('testfile.txt')
1169 1169 end
1170 1170
1171 1171 def test_put_update_with_attachment_that_fails_to_save
1172 1172 set_tmp_attachments_directory
1173 1173
1174 1174 # Delete all fixtured journals, a race condition can occur causing the wrong
1175 1175 # journal to get fetched in the next find.
1176 1176 Journal.delete_all
1177 1177
1178 1178 # Mock out the unsaved attachment
1179 1179 Attachment.any_instance.stubs(:create).returns(Attachment.new)
1180 1180
1181 1181 # anonymous user
1182 1182 put :update,
1183 1183 :id => 1,
1184 1184 :notes => '',
1185 1185 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
1186 1186 assert_redirected_to :action => 'show', :id => '1'
1187 1187 assert_equal '1 file(s) could not be saved.', flash[:warning]
1188 1188
1189 1189 end if Object.const_defined?(:Mocha)
1190 1190
1191 1191 def test_put_update_with_no_change
1192 1192 issue = Issue.find(1)
1193 1193 issue.journals.clear
1194 1194 ActionMailer::Base.deliveries.clear
1195 1195
1196 1196 put :update,
1197 1197 :id => 1,
1198 1198 :notes => ''
1199 1199 assert_redirected_to :action => 'show', :id => '1'
1200 1200
1201 1201 issue.reload
1202 1202 assert issue.journals.empty?
1203 1203 # No email should be sent
1204 1204 assert ActionMailer::Base.deliveries.empty?
1205 1205 end
1206 1206
1207 1207 def test_put_update_should_send_a_notification
1208 1208 @request.session[:user_id] = 2
1209 1209 ActionMailer::Base.deliveries.clear
1210 1210 issue = Issue.find(1)
1211 1211 old_subject = issue.subject
1212 1212 new_subject = 'Subject modified by IssuesControllerTest#test_post_edit'
1213 1213
1214 1214 put :update, :id => 1, :issue => {:subject => new_subject,
1215 1215 :priority_id => '6',
1216 1216 :category_id => '1' # no change
1217 1217 }
1218 1218 assert_equal 1, ActionMailer::Base.deliveries.size
1219 1219 end
1220 1220
1221 1221 def test_put_update_with_invalid_spent_time_hours_only
1222 1222 @request.session[:user_id] = 2
1223 1223 notes = 'Note added by IssuesControllerTest#test_post_edit_with_invalid_spent_time'
1224 1224
1225 1225 assert_no_difference('Journal.count') do
1226 1226 put :update,
1227 1227 :id => 1,
1228 1228 :notes => notes,
1229 1229 :time_entry => {"comments"=>"", "activity_id"=>"", "hours"=>"2z"}
1230 1230 end
1231 1231 assert_response :success
1232 1232 assert_template 'edit'
1233 1233
1234 1234 assert_error_tag :descendant => {:content => /Activity can't be blank/}
1235 1235 assert_tag :textarea, :attributes => { :name => 'notes' }, :content => notes
1236 1236 assert_tag :input, :attributes => { :name => 'time_entry[hours]', :value => "2z" }
1237 1237 end
1238 1238
1239 1239 def test_put_update_with_invalid_spent_time_comments_only
1240 1240 @request.session[:user_id] = 2
1241 1241 notes = 'Note added by IssuesControllerTest#test_post_edit_with_invalid_spent_time'
1242 1242
1243 1243 assert_no_difference('Journal.count') do
1244 1244 put :update,
1245 1245 :id => 1,
1246 1246 :notes => notes,
1247 1247 :time_entry => {"comments"=>"this is my comment", "activity_id"=>"", "hours"=>""}
1248 1248 end
1249 1249 assert_response :success
1250 1250 assert_template 'edit'
1251 1251
1252 1252 assert_error_tag :descendant => {:content => /Activity can't be blank/}
1253 1253 assert_error_tag :descendant => {:content => /Hours can't be blank/}
1254 1254 assert_tag :textarea, :attributes => { :name => 'notes' }, :content => notes
1255 1255 assert_tag :input, :attributes => { :name => 'time_entry[comments]', :value => "this is my comment" }
1256 1256 end
1257 1257
1258 1258 def test_put_update_should_allow_fixed_version_to_be_set_to_a_subproject
1259 1259 issue = Issue.find(2)
1260 1260 @request.session[:user_id] = 2
1261 1261
1262 1262 put :update,
1263 1263 :id => issue.id,
1264 1264 :issue => {
1265 1265 :fixed_version_id => 4
1266 1266 }
1267 1267
1268 1268 assert_response :redirect
1269 1269 issue.reload
1270 1270 assert_equal 4, issue.fixed_version_id
1271 1271 assert_not_equal issue.project_id, issue.fixed_version.project_id
1272 1272 end
1273 1273
1274 1274 def test_put_update_should_redirect_back_using_the_back_url_parameter
1275 1275 issue = Issue.find(2)
1276 1276 @request.session[:user_id] = 2
1277 1277
1278 1278 put :update,
1279 1279 :id => issue.id,
1280 1280 :issue => {
1281 1281 :fixed_version_id => 4
1282 1282 },
1283 1283 :back_url => '/issues'
1284 1284
1285 1285 assert_response :redirect
1286 1286 assert_redirected_to '/issues'
1287 1287 end
1288 1288
1289 1289 def test_put_update_should_not_redirect_back_using_the_back_url_parameter_off_the_host
1290 1290 issue = Issue.find(2)
1291 1291 @request.session[:user_id] = 2
1292 1292
1293 1293 put :update,
1294 1294 :id => issue.id,
1295 1295 :issue => {
1296 1296 :fixed_version_id => 4
1297 1297 },
1298 1298 :back_url => 'http://google.com'
1299 1299
1300 1300 assert_response :redirect
1301 1301 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue.id
1302 1302 end
1303 1303
1304 1304 def test_get_bulk_edit
1305 1305 @request.session[:user_id] = 2
1306 1306 get :bulk_edit, :ids => [1, 2]
1307 1307 assert_response :success
1308 1308 assert_template 'bulk_edit'
1309 1309
1310 1310 assert_tag :input, :attributes => {:name => 'issue[parent_issue_id]'}
1311 1311
1312 1312 # Project specific custom field, date type
1313 1313 field = CustomField.find(9)
1314 1314 assert !field.is_for_all?
1315 1315 assert_equal 'date', field.field_format
1316 1316 assert_tag :input, :attributes => {:name => 'issue[custom_field_values][9]'}
1317 1317
1318 1318 # System wide custom field
1319 1319 assert CustomField.find(1).is_for_all?
1320 1320 assert_tag :select, :attributes => {:name => 'issue[custom_field_values][1]'}
1321 1321
1322 1322 # Be sure we don't display inactive IssuePriorities
1323 1323 assert ! IssuePriority.find(15).active?
1324 1324 assert_no_tag :option, :attributes => {:value => '15'},
1325 1325 :parent => {:tag => 'select', :attributes => {:id => 'issue_priority_id'} }
1326 1326 end
1327 1327
1328 1328 def test_get_bulk_edit_on_different_projects
1329 1329 @request.session[:user_id] = 2
1330 1330 get :bulk_edit, :ids => [1, 2, 6]
1331 1331 assert_response :success
1332 1332 assert_template 'bulk_edit'
1333 1333
1334 1334 # Can not set issues from different projects as children of an issue
1335 1335 assert_no_tag :input, :attributes => {:name => 'issue[parent_issue_id]'}
1336 1336
1337 1337 # Project specific custom field, date type
1338 1338 field = CustomField.find(9)
1339 1339 assert !field.is_for_all?
1340 1340 assert !field.project_ids.include?(Issue.find(6).project_id)
1341 1341 assert_no_tag :input, :attributes => {:name => 'issue[custom_field_values][9]'}
1342 1342 end
1343 1343
1344 1344 def test_get_bulk_edit_with_user_custom_field
1345 1345 field = IssueCustomField.create!(:name => 'Tester', :field_format => 'user', :is_for_all => true)
1346 1346
1347 1347 @request.session[:user_id] = 2
1348 1348 get :bulk_edit, :ids => [1, 2]
1349 1349 assert_response :success
1350 1350 assert_template 'bulk_edit'
1351 1351
1352 1352 assert_tag :select,
1353 1353 :attributes => {:name => "issue[custom_field_values][#{field.id}]"},
1354 1354 :children => {
1355 1355 :only => {:tag => 'option'},
1356 1356 :count => Project.find(1).users.count + 1
1357 1357 }
1358 1358 end
1359 1359
1360 1360 def test_get_bulk_edit_with_version_custom_field
1361 1361 field = IssueCustomField.create!(:name => 'Affected version', :field_format => 'version', :is_for_all => true)
1362 1362
1363 1363 @request.session[:user_id] = 2
1364 1364 get :bulk_edit, :ids => [1, 2]
1365 1365 assert_response :success
1366 1366 assert_template 'bulk_edit'
1367 1367
1368 1368 assert_tag :select,
1369 1369 :attributes => {:name => "issue[custom_field_values][#{field.id}]"},
1370 1370 :children => {
1371 1371 :only => {:tag => 'option'},
1372 1372 :count => Project.find(1).versions.count + 1
1373 1373 }
1374 1374 end
1375 1375
1376 1376 def test_bulk_update
1377 1377 @request.session[:user_id] = 2
1378 1378 # update issues priority
1379 1379 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing',
1380 1380 :issue => {:priority_id => 7,
1381 1381 :assigned_to_id => '',
1382 1382 :custom_field_values => {'2' => ''}}
1383 1383
1384 1384 assert_response 302
1385 1385 # check that the issues were updated
1386 1386 assert_equal [7, 7], Issue.find_all_by_id([1, 2]).collect {|i| i.priority.id}
1387 1387
1388 1388 issue = Issue.find(1)
1389 1389 journal = issue.journals.find(:first, :order => 'created_on DESC')
1390 1390 assert_equal '125', issue.custom_value_for(2).value
1391 1391 assert_equal 'Bulk editing', journal.notes
1392 1392 assert_equal 1, journal.details.size
1393 1393 end
1394 1394
1395 1395 def test_bulk_update_with_group_assignee
1396 1396 group = Group.find(11)
1397 1397 project = Project.find(1)
1398 1398 project.members << Member.new(:principal => group, :roles => [Role.first])
1399
1399
1400 1400 @request.session[:user_id] = 2
1401 1401 # update issues assignee
1402 1402 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing',
1403 1403 :issue => {:priority_id => '',
1404 1404 :assigned_to_id => group.id,
1405 1405 :custom_field_values => {'2' => ''}}
1406 1406
1407 1407 assert_response 302
1408 1408 assert_equal [group, group], Issue.find_all_by_id([1, 2]).collect {|i| i.assigned_to}
1409 1409 end
1410 1410
1411 1411 def test_bulk_update_on_different_projects
1412 1412 @request.session[:user_id] = 2
1413 1413 # update issues priority
1414 1414 post :bulk_update, :ids => [1, 2, 6], :notes => 'Bulk editing',
1415 1415 :issue => {:priority_id => 7,
1416 1416 :assigned_to_id => '',
1417 1417 :custom_field_values => {'2' => ''}}
1418 1418
1419 1419 assert_response 302
1420 1420 # check that the issues were updated
1421 1421 assert_equal [7, 7, 7], Issue.find([1,2,6]).map(&:priority_id)
1422 1422
1423 1423 issue = Issue.find(1)
1424 1424 journal = issue.journals.find(:first, :order => 'created_on DESC')
1425 1425 assert_equal '125', issue.custom_value_for(2).value
1426 1426 assert_equal 'Bulk editing', journal.notes
1427 1427 assert_equal 1, journal.details.size
1428 1428 end
1429 1429
1430 1430 def test_bulk_update_on_different_projects_without_rights
1431 1431 @request.session[:user_id] = 3
1432 1432 user = User.find(3)
1433 1433 action = { :controller => "issues", :action => "bulk_update" }
1434 1434 assert user.allowed_to?(action, Issue.find(1).project)
1435 1435 assert ! user.allowed_to?(action, Issue.find(6).project)
1436 1436 post :bulk_update, :ids => [1, 6], :notes => 'Bulk should fail',
1437 1437 :issue => {:priority_id => 7,
1438 1438 :assigned_to_id => '',
1439 1439 :custom_field_values => {'2' => ''}}
1440 1440 assert_response 403
1441 1441 assert_not_equal "Bulk should fail", Journal.last.notes
1442 1442 end
1443 1443
1444 1444 def test_bullk_update_should_send_a_notification
1445 1445 @request.session[:user_id] = 2
1446 1446 ActionMailer::Base.deliveries.clear
1447 1447 post(:bulk_update,
1448 1448 {
1449 1449 :ids => [1, 2],
1450 1450 :notes => 'Bulk editing',
1451 1451 :issue => {
1452 1452 :priority_id => 7,
1453 1453 :assigned_to_id => '',
1454 1454 :custom_field_values => {'2' => ''}
1455 1455 }
1456 1456 })
1457 1457
1458 1458 assert_response 302
1459 1459 assert_equal 2, ActionMailer::Base.deliveries.size
1460 1460 end
1461 1461
1462 1462 def test_bulk_update_status
1463 1463 @request.session[:user_id] = 2
1464 1464 # update issues priority
1465 1465 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing status',
1466 1466 :issue => {:priority_id => '',
1467 1467 :assigned_to_id => '',
1468 1468 :status_id => '5'}
1469 1469
1470 1470 assert_response 302
1471 1471 issue = Issue.find(1)
1472 1472 assert issue.closed?
1473 1473 end
1474 1474
1475 1475 def test_bulk_update_parent_id
1476 1476 @request.session[:user_id] = 2
1477 1477 post :bulk_update, :ids => [1, 3],
1478 1478 :notes => 'Bulk editing parent',
1479 1479 :issue => {:priority_id => '', :assigned_to_id => '', :status_id => '', :parent_issue_id => '2'}
1480 1480
1481 1481 assert_response 302
1482 1482 parent = Issue.find(2)
1483 1483 assert_equal parent.id, Issue.find(1).parent_id
1484 1484 assert_equal parent.id, Issue.find(3).parent_id
1485 1485 assert_equal [1, 3], parent.children.collect(&:id).sort
1486 1486 end
1487 1487
1488 1488 def test_bulk_update_custom_field
1489 1489 @request.session[:user_id] = 2
1490 1490 # update issues priority
1491 1491 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing custom field',
1492 1492 :issue => {:priority_id => '',
1493 1493 :assigned_to_id => '',
1494 1494 :custom_field_values => {'2' => '777'}}
1495 1495
1496 1496 assert_response 302
1497 1497
1498 1498 issue = Issue.find(1)
1499 1499 journal = issue.journals.find(:first, :order => 'created_on DESC')
1500 1500 assert_equal '777', issue.custom_value_for(2).value
1501 1501 assert_equal 1, journal.details.size
1502 1502 assert_equal '125', journal.details.first.old_value
1503 1503 assert_equal '777', journal.details.first.value
1504 1504 end
1505 1505
1506 1506 def test_bulk_update_unassign
1507 1507 assert_not_nil Issue.find(2).assigned_to
1508 1508 @request.session[:user_id] = 2
1509 1509 # unassign issues
1510 1510 post :bulk_update, :ids => [1, 2], :notes => 'Bulk unassigning', :issue => {:assigned_to_id => 'none'}
1511 1511 assert_response 302
1512 1512 # check that the issues were updated
1513 1513 assert_nil Issue.find(2).assigned_to
1514 1514 end
1515 1515
1516 1516 def test_post_bulk_update_should_allow_fixed_version_to_be_set_to_a_subproject
1517 1517 @request.session[:user_id] = 2
1518 1518
1519 1519 post :bulk_update, :ids => [1,2], :issue => {:fixed_version_id => 4}
1520 1520
1521 1521 assert_response :redirect
1522 1522 issues = Issue.find([1,2])
1523 1523 issues.each do |issue|
1524 1524 assert_equal 4, issue.fixed_version_id
1525 1525 assert_not_equal issue.project_id, issue.fixed_version.project_id
1526 1526 end
1527 1527 end
1528 1528
1529 1529 def test_post_bulk_update_should_redirect_back_using_the_back_url_parameter
1530 1530 @request.session[:user_id] = 2
1531 1531 post :bulk_update, :ids => [1,2], :back_url => '/issues'
1532 1532
1533 1533 assert_response :redirect
1534 1534 assert_redirected_to '/issues'
1535 1535 end
1536 1536
1537 1537 def test_post_bulk_update_should_not_redirect_back_using_the_back_url_parameter_off_the_host
1538 1538 @request.session[:user_id] = 2
1539 1539 post :bulk_update, :ids => [1,2], :back_url => 'http://google.com'
1540 1540
1541 1541 assert_response :redirect
1542 1542 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => Project.find(1).identifier
1543 1543 end
1544 1544
1545 1545 def test_destroy_issue_with_no_time_entries
1546 1546 assert_nil TimeEntry.find_by_issue_id(2)
1547 1547 @request.session[:user_id] = 2
1548 1548 post :destroy, :id => 2
1549 1549 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
1550 1550 assert_nil Issue.find_by_id(2)
1551 1551 end
1552 1552
1553 1553 def test_destroy_issues_with_time_entries
1554 1554 @request.session[:user_id] = 2
1555 1555 post :destroy, :ids => [1, 3]
1556 1556 assert_response :success
1557 1557 assert_template 'destroy'
1558 1558 assert_not_nil assigns(:hours)
1559 1559 assert Issue.find_by_id(1) && Issue.find_by_id(3)
1560 1560 end
1561 1561
1562 1562 def test_destroy_issues_and_destroy_time_entries
1563 1563 @request.session[:user_id] = 2
1564 1564 post :destroy, :ids => [1, 3], :todo => 'destroy'
1565 1565 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
1566 1566 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
1567 1567 assert_nil TimeEntry.find_by_id([1, 2])
1568 1568 end
1569 1569
1570 1570 def test_destroy_issues_and_assign_time_entries_to_project
1571 1571 @request.session[:user_id] = 2
1572 1572 post :destroy, :ids => [1, 3], :todo => 'nullify'
1573 1573 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
1574 1574 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
1575 1575 assert_nil TimeEntry.find(1).issue_id
1576 1576 assert_nil TimeEntry.find(2).issue_id
1577 1577 end
1578 1578
1579 1579 def test_destroy_issues_and_reassign_time_entries_to_another_issue
1580 1580 @request.session[:user_id] = 2
1581 1581 post :destroy, :ids => [1, 3], :todo => 'reassign', :reassign_to_id => 2
1582 1582 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
1583 1583 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
1584 1584 assert_equal 2, TimeEntry.find(1).issue_id
1585 1585 assert_equal 2, TimeEntry.find(2).issue_id
1586 1586 end
1587 1587
1588 1588 def test_destroy_issues_from_different_projects
1589 1589 @request.session[:user_id] = 2
1590 1590 post :destroy, :ids => [1, 2, 6], :todo => 'destroy'
1591 1591 assert_redirected_to :controller => 'issues', :action => 'index'
1592 1592 assert !(Issue.find_by_id(1) || Issue.find_by_id(2) || Issue.find_by_id(6))
1593 1593 end
1594 1594
1595 1595 def test_destroy_parent_and_child_issues
1596 1596 parent = Issue.generate!(:project_id => 1, :tracker_id => 1)
1597 1597 child = Issue.generate!(:project_id => 1, :tracker_id => 1, :parent_issue_id => parent.id)
1598 1598 assert child.is_descendant_of?(parent.reload)
1599 1599
1600 1600 @request.session[:user_id] = 2
1601 1601 assert_difference 'Issue.count', -2 do
1602 1602 post :destroy, :ids => [parent.id, child.id], :todo => 'destroy'
1603 1603 end
1604 1604 assert_response 302
1605 1605 end
1606 1606
1607 1607 def test_default_search_scope
1608 1608 get :index
1609 1609 assert_tag :div, :attributes => {:id => 'quick-search'},
1610 1610 :child => {:tag => 'form',
1611 1611 :child => {:tag => 'input', :attributes => {:name => 'issues', :type => 'hidden', :value => '1'}}}
1612 1612 end
1613 1613 end
General Comments 0
You need to be logged in to leave comments. Login now