##// END OF EJS Templates
Move more routing tests into the routing integration test....
Eric Davis -
r3572:0fc884cf4223
parent child
Show More
@@ -1,146 +1,139
1 1 # redMine - project management software
2 2 # Copyright (C) 2006-2007 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.dirname(__FILE__) + '/../test_helper'
19 19 require 'admin_controller'
20 20
21 21 # Re-raise errors caught by the controller.
22 22 class AdminController; def rescue_action(e) raise e end; end
23 23
24 24 class AdminControllerTest < ActionController::TestCase
25 25 fixtures :projects, :users, :roles
26 26
27 27 def setup
28 28 @controller = AdminController.new
29 29 @request = ActionController::TestRequest.new
30 30 @response = ActionController::TestResponse.new
31 31 User.current = nil
32 32 @request.session[:user_id] = 1 # admin
33 33 end
34 34
35 35 def test_index
36 36 get :index
37 37 assert_no_tag :tag => 'div',
38 38 :attributes => { :class => /nodata/ }
39 39 end
40 40
41 def test_projects_routing
42 assert_routing(
43 {:method => :get, :path => '/admin/projects'},
44 :controller => 'admin', :action => 'projects'
45 )
46 end
47
48 41 def test_index_with_no_configuration_data
49 42 delete_configuration_data
50 43 get :index
51 44 assert_tag :tag => 'div',
52 45 :attributes => { :class => /nodata/ }
53 46 end
54 47
55 48 def test_projects
56 49 get :projects
57 50 assert_response :success
58 51 assert_template 'projects'
59 52 assert_not_nil assigns(:projects)
60 53 # active projects only
61 54 assert_nil assigns(:projects).detect {|u| !u.active?}
62 55 end
63 56
64 57 def test_projects_with_name_filter
65 58 get :projects, :name => 'store', :status => ''
66 59 assert_response :success
67 60 assert_template 'projects'
68 61 projects = assigns(:projects)
69 62 assert_not_nil projects
70 63 assert_equal 1, projects.size
71 64 assert_equal 'OnlineStore', projects.first.name
72 65 end
73 66
74 67 def test_load_default_configuration_data
75 68 delete_configuration_data
76 69 post :default_configuration, :lang => 'fr'
77 70 assert IssueStatus.find_by_name('Nouveau')
78 71 end
79 72
80 73 def test_test_email
81 74 get :test_email
82 75 assert_redirected_to '/settings/edit?tab=notifications'
83 76 mail = ActionMailer::Base.deliveries.last
84 77 assert_kind_of TMail::Mail, mail
85 78 user = User.find(1)
86 79 assert_equal [user.mail], mail.bcc
87 80 end
88 81
89 82 def test_no_plugins
90 83 Redmine::Plugin.clear
91 84
92 85 get :plugins
93 86 assert_response :success
94 87 assert_template 'plugins'
95 88 end
96 89
97 90 def test_plugins
98 91 # Register a few plugins
99 92 Redmine::Plugin.register :foo do
100 93 name 'Foo plugin'
101 94 author 'John Smith'
102 95 description 'This is a test plugin'
103 96 version '0.0.1'
104 97 settings :default => {'sample_setting' => 'value', 'foo'=>'bar'}, :partial => 'foo/settings'
105 98 end
106 99 Redmine::Plugin.register :bar do
107 100 end
108 101
109 102 get :plugins
110 103 assert_response :success
111 104 assert_template 'plugins'
112 105
113 106 assert_tag :td, :child => { :tag => 'span', :content => 'Foo plugin' }
114 107 assert_tag :td, :child => { :tag => 'span', :content => 'Bar' }
115 108 end
116 109
117 110 def test_info
118 111 get :info
119 112 assert_response :success
120 113 assert_template 'info'
121 114 end
122 115
123 116 def test_admin_menu_plugin_extension
124 117 Redmine::MenuManager.map :admin_menu do |menu|
125 118 menu.push :test_admin_menu_plugin_extension, '/foo/bar', :caption => 'Test'
126 119 end
127 120
128 121 get :index
129 122 assert_response :success
130 123 assert_tag :a, :attributes => { :href => '/foo/bar' },
131 124 :content => 'Test'
132 125
133 126 Redmine::MenuManager.map :admin_menu do |menu|
134 127 menu.delete :test_admin_menu_plugin_extension
135 128 end
136 129 end
137 130
138 131 private
139 132
140 133 def delete_configuration_data
141 134 Role.delete_all('builtin = 0')
142 135 Tracker.delete_all
143 136 IssueStatus.delete_all
144 137 Enumeration.delete_all
145 138 end
146 139 end
@@ -1,1368 +1,1354
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2008 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.dirname(__FILE__) + '/../test_helper'
19 19 require 'issues_controller'
20 20
21 21 # Re-raise errors caught by the controller.
22 22 class IssuesController; def rescue_action(e) raise e end; end
23 23
24 24 class IssuesControllerTest < ActionController::TestCase
25 25 fixtures :projects,
26 26 :users,
27 27 :roles,
28 28 :members,
29 29 :member_roles,
30 30 :issues,
31 31 :issue_statuses,
32 32 :versions,
33 33 :trackers,
34 34 :projects_trackers,
35 35 :issue_categories,
36 36 :enabled_modules,
37 37 :enumerations,
38 38 :attachments,
39 39 :workflows,
40 40 :custom_fields,
41 41 :custom_values,
42 42 :custom_fields_projects,
43 43 :custom_fields_trackers,
44 44 :time_entries,
45 45 :journals,
46 46 :journal_details,
47 47 :queries
48 48
49 49 def setup
50 50 @controller = IssuesController.new
51 51 @request = ActionController::TestRequest.new
52 52 @response = ActionController::TestResponse.new
53 53 User.current = nil
54 54 end
55 55
56 56 def test_index
57 57 Setting.default_language = 'en'
58 58
59 59 get :index
60 60 assert_response :success
61 61 assert_template 'index.rhtml'
62 62 assert_not_nil assigns(:issues)
63 63 assert_nil assigns(:project)
64 64 assert_tag :tag => 'a', :content => /Can't print recipes/
65 65 assert_tag :tag => 'a', :content => /Subproject issue/
66 66 # private projects hidden
67 67 assert_no_tag :tag => 'a', :content => /Issue of a private subproject/
68 68 assert_no_tag :tag => 'a', :content => /Issue on project 2/
69 69 # project column
70 70 assert_tag :tag => 'th', :content => /Project/
71 71 end
72 72
73 73 def test_index_should_not_list_issues_when_module_disabled
74 74 EnabledModule.delete_all("name = 'issue_tracking' AND project_id = 1")
75 75 get :index
76 76 assert_response :success
77 77 assert_template 'index.rhtml'
78 78 assert_not_nil assigns(:issues)
79 79 assert_nil assigns(:project)
80 80 assert_no_tag :tag => 'a', :content => /Can't print recipes/
81 81 assert_tag :tag => 'a', :content => /Subproject issue/
82 82 end
83 83
84 84 def test_index_should_not_list_issues_when_module_disabled
85 85 EnabledModule.delete_all("name = 'issue_tracking' AND project_id = 1")
86 86 get :index
87 87 assert_response :success
88 88 assert_template 'index.rhtml'
89 89 assert_not_nil assigns(:issues)
90 90 assert_nil assigns(:project)
91 91 assert_no_tag :tag => 'a', :content => /Can't print recipes/
92 92 assert_tag :tag => 'a', :content => /Subproject issue/
93 93 end
94 94
95 95 def test_index_with_project
96 96 Setting.display_subprojects_issues = 0
97 97 get :index, :project_id => 1
98 98 assert_response :success
99 99 assert_template 'index.rhtml'
100 100 assert_not_nil assigns(:issues)
101 101 assert_tag :tag => 'a', :content => /Can't print recipes/
102 102 assert_no_tag :tag => 'a', :content => /Subproject issue/
103 103 end
104 104
105 105 def test_index_with_project_and_subprojects
106 106 Setting.display_subprojects_issues = 1
107 107 get :index, :project_id => 1
108 108 assert_response :success
109 109 assert_template 'index.rhtml'
110 110 assert_not_nil assigns(:issues)
111 111 assert_tag :tag => 'a', :content => /Can't print recipes/
112 112 assert_tag :tag => 'a', :content => /Subproject issue/
113 113 assert_no_tag :tag => 'a', :content => /Issue of a private subproject/
114 114 end
115 115
116 116 def test_index_with_project_and_subprojects_should_show_private_subprojects
117 117 @request.session[:user_id] = 2
118 118 Setting.display_subprojects_issues = 1
119 119 get :index, :project_id => 1
120 120 assert_response :success
121 121 assert_template 'index.rhtml'
122 122 assert_not_nil assigns(:issues)
123 123 assert_tag :tag => 'a', :content => /Can't print recipes/
124 124 assert_tag :tag => 'a', :content => /Subproject issue/
125 125 assert_tag :tag => 'a', :content => /Issue of a private subproject/
126 126 end
127 127
128 128 def test_index_with_project_and_filter
129 129 get :index, :project_id => 1, :set_filter => 1
130 130 assert_response :success
131 131 assert_template 'index.rhtml'
132 132 assert_not_nil assigns(:issues)
133 133 end
134 134
135 135 def test_index_with_query
136 136 get :index, :project_id => 1, :query_id => 5
137 137 assert_response :success
138 138 assert_template 'index.rhtml'
139 139 assert_not_nil assigns(:issues)
140 140 assert_nil assigns(:issue_count_by_group)
141 141 end
142 142
143 143 def test_index_with_query_grouped_by_tracker
144 144 get :index, :project_id => 1, :query_id => 6
145 145 assert_response :success
146 146 assert_template 'index.rhtml'
147 147 assert_not_nil assigns(:issues)
148 148 assert_not_nil assigns(:issue_count_by_group)
149 149 end
150 150
151 151 def test_index_with_query_grouped_by_list_custom_field
152 152 get :index, :project_id => 1, :query_id => 9
153 153 assert_response :success
154 154 assert_template 'index.rhtml'
155 155 assert_not_nil assigns(:issues)
156 156 assert_not_nil assigns(:issue_count_by_group)
157 157 end
158 158
159 159 def test_index_sort_by_field_not_included_in_columns
160 160 Setting.issue_list_default_columns = %w(subject author)
161 161 get :index, :sort => 'tracker'
162 162 end
163 163
164 164 def test_index_csv_with_project
165 165 Setting.default_language = 'en'
166 166
167 167 get :index, :format => 'csv'
168 168 assert_response :success
169 169 assert_not_nil assigns(:issues)
170 170 assert_equal 'text/csv', @response.content_type
171 171 assert @response.body.starts_with?("#,")
172 172
173 173 get :index, :project_id => 1, :format => 'csv'
174 174 assert_response :success
175 175 assert_not_nil assigns(:issues)
176 176 assert_equal 'text/csv', @response.content_type
177 177 end
178 178
179 179 def test_index_pdf
180 180 get :index, :format => 'pdf'
181 181 assert_response :success
182 182 assert_not_nil assigns(:issues)
183 183 assert_equal 'application/pdf', @response.content_type
184 184
185 185 get :index, :project_id => 1, :format => 'pdf'
186 186 assert_response :success
187 187 assert_not_nil assigns(:issues)
188 188 assert_equal 'application/pdf', @response.content_type
189 189
190 190 get :index, :project_id => 1, :query_id => 6, :format => 'pdf'
191 191 assert_response :success
192 192 assert_not_nil assigns(:issues)
193 193 assert_equal 'application/pdf', @response.content_type
194 194 end
195 195
196 196 def test_index_pdf_with_query_grouped_by_list_custom_field
197 197 get :index, :project_id => 1, :query_id => 9, :format => 'pdf'
198 198 assert_response :success
199 199 assert_not_nil assigns(:issues)
200 200 assert_not_nil assigns(:issue_count_by_group)
201 201 assert_equal 'application/pdf', @response.content_type
202 202 end
203 203
204 204 def test_index_sort
205 205 get :index, :sort => 'tracker,id:desc'
206 206 assert_response :success
207 207
208 208 sort_params = @request.session['issues_index_sort']
209 209 assert sort_params.is_a?(String)
210 210 assert_equal 'tracker,id:desc', sort_params
211 211
212 212 issues = assigns(:issues)
213 213 assert_not_nil issues
214 214 assert !issues.empty?
215 215 assert_equal issues.sort {|a,b| a.tracker == b.tracker ? b.id <=> a.id : a.tracker <=> b.tracker }.collect(&:id), issues.collect(&:id)
216 216 end
217 217
218 218 def test_index_with_columns
219 219 columns = ['tracker', 'subject', 'assigned_to']
220 220 get :index, :set_filter => 1, :query => { 'column_names' => columns}
221 221 assert_response :success
222 222
223 223 # query should use specified columns
224 224 query = assigns(:query)
225 225 assert_kind_of Query, query
226 226 assert_equal columns, query.column_names.map(&:to_s)
227 227
228 228 # columns should be stored in session
229 229 assert_kind_of Hash, session[:query]
230 230 assert_kind_of Array, session[:query][:column_names]
231 231 assert_equal columns, session[:query][:column_names].map(&:to_s)
232 232 end
233 233
234 234 def test_gantt
235 235 get :gantt, :project_id => 1
236 236 assert_response :success
237 237 assert_template 'gantt.rhtml'
238 238 assert_not_nil assigns(:gantt)
239 239 events = assigns(:gantt).events
240 240 assert_not_nil events
241 241 # Issue with start and due dates
242 242 i = Issue.find(1)
243 243 assert_not_nil i.due_date
244 244 assert events.include?(Issue.find(1))
245 245 # Issue with without due date but targeted to a version with date
246 246 i = Issue.find(2)
247 247 assert_nil i.due_date
248 248 assert events.include?(i)
249 249 end
250 250
251 251 def test_cross_project_gantt
252 252 get :gantt
253 253 assert_response :success
254 254 assert_template 'gantt.rhtml'
255 255 assert_not_nil assigns(:gantt)
256 256 events = assigns(:gantt).events
257 257 assert_not_nil events
258 258 end
259 259
260 260 def test_gantt_export_to_pdf
261 261 get :gantt, :project_id => 1, :format => 'pdf'
262 262 assert_response :success
263 263 assert_equal 'application/pdf', @response.content_type
264 264 assert @response.body.starts_with?('%PDF')
265 265 assert_not_nil assigns(:gantt)
266 266 end
267 267
268 268 def test_cross_project_gantt_export_to_pdf
269 269 get :gantt, :format => 'pdf'
270 270 assert_response :success
271 271 assert_equal 'application/pdf', @response.content_type
272 272 assert @response.body.starts_with?('%PDF')
273 273 assert_not_nil assigns(:gantt)
274 274 end
275 275
276 276 if Object.const_defined?(:Magick)
277 277 def test_gantt_image
278 278 get :gantt, :project_id => 1, :format => 'png'
279 279 assert_response :success
280 280 assert_equal 'image/png', @response.content_type
281 281 end
282 282 else
283 283 puts "RMagick not installed. Skipping tests !!!"
284 284 end
285 285
286 286 def test_calendar
287 287 get :calendar, :project_id => 1
288 288 assert_response :success
289 289 assert_template 'calendar'
290 290 assert_not_nil assigns(:calendar)
291 291 end
292 292
293 293 def test_cross_project_calendar
294 294 get :calendar
295 295 assert_response :success
296 296 assert_template 'calendar'
297 297 assert_not_nil assigns(:calendar)
298 298 end
299 299
300 300 def test_changes
301 301 get :changes, :project_id => 1
302 302 assert_response :success
303 303 assert_not_nil assigns(:journals)
304 304 assert_equal 'application/atom+xml', @response.content_type
305 305 end
306 306
307 307 def test_show_by_anonymous
308 308 get :show, :id => 1
309 309 assert_response :success
310 310 assert_template 'show.rhtml'
311 311 assert_not_nil assigns(:issue)
312 312 assert_equal Issue.find(1), assigns(:issue)
313 313
314 314 # anonymous role is allowed to add a note
315 315 assert_tag :tag => 'form',
316 316 :descendant => { :tag => 'fieldset',
317 317 :child => { :tag => 'legend',
318 318 :content => /Notes/ } }
319 319 end
320 320
321 321 def test_show_by_manager
322 322 @request.session[:user_id] = 2
323 323 get :show, :id => 1
324 324 assert_response :success
325 325
326 326 assert_tag :tag => 'form',
327 327 :descendant => { :tag => 'fieldset',
328 328 :child => { :tag => 'legend',
329 329 :content => /Change properties/ } },
330 330 :descendant => { :tag => 'fieldset',
331 331 :child => { :tag => 'legend',
332 332 :content => /Log time/ } },
333 333 :descendant => { :tag => 'fieldset',
334 334 :child => { :tag => 'legend',
335 335 :content => /Notes/ } }
336 336 end
337 337
338 338 def test_show_should_deny_anonymous_access_without_permission
339 339 Role.anonymous.remove_permission!(:view_issues)
340 340 get :show, :id => 1
341 341 assert_response :redirect
342 342 end
343 343
344 344 def test_show_should_deny_non_member_access_without_permission
345 345 Role.non_member.remove_permission!(:view_issues)
346 346 @request.session[:user_id] = 9
347 347 get :show, :id => 1
348 348 assert_response 403
349 349 end
350 350
351 351 def test_show_should_deny_member_access_without_permission
352 352 Role.find(1).remove_permission!(:view_issues)
353 353 @request.session[:user_id] = 2
354 354 get :show, :id => 1
355 355 assert_response 403
356 356 end
357 357
358 358 def test_show_should_not_disclose_relations_to_invisible_issues
359 359 Setting.cross_project_issue_relations = '1'
360 360 IssueRelation.create!(:issue_from => Issue.find(1), :issue_to => Issue.find(2), :relation_type => 'relates')
361 361 # Relation to a private project issue
362 362 IssueRelation.create!(:issue_from => Issue.find(1), :issue_to => Issue.find(4), :relation_type => 'relates')
363 363
364 364 get :show, :id => 1
365 365 assert_response :success
366 366
367 367 assert_tag :div, :attributes => { :id => 'relations' },
368 368 :descendant => { :tag => 'a', :content => /#2$/ }
369 369 assert_no_tag :div, :attributes => { :id => 'relations' },
370 370 :descendant => { :tag => 'a', :content => /#4$/ }
371 371 end
372 372
373 373 def test_show_atom
374 374 get :show, :id => 2, :format => 'atom'
375 375 assert_response :success
376 376 assert_template 'changes.rxml'
377 377 # Inline image
378 378 assert_select 'content', :text => Regexp.new(Regexp.quote('http://test.host/attachments/download/10'))
379 379 end
380 380
381 381 def test_show_export_to_pdf
382 382 get :show, :id => 3, :format => 'pdf'
383 383 assert_response :success
384 384 assert_equal 'application/pdf', @response.content_type
385 385 assert @response.body.starts_with?('%PDF')
386 386 assert_not_nil assigns(:issue)
387 387 end
388 388
389 389 def test_get_new
390 390 @request.session[:user_id] = 2
391 391 get :new, :project_id => 1, :tracker_id => 1
392 392 assert_response :success
393 393 assert_template 'new'
394 394
395 395 assert_tag :tag => 'input', :attributes => { :name => 'issue[custom_field_values][2]',
396 396 :value => 'Default string' }
397 397 end
398 398
399 399 def test_get_new_without_tracker_id
400 400 @request.session[:user_id] = 2
401 401 get :new, :project_id => 1
402 402 assert_response :success
403 403 assert_template 'new'
404 404
405 405 issue = assigns(:issue)
406 406 assert_not_nil issue
407 407 assert_equal Project.find(1).trackers.first, issue.tracker
408 408 end
409 409
410 410 def test_get_new_with_no_default_status_should_display_an_error
411 411 @request.session[:user_id] = 2
412 412 IssueStatus.delete_all
413 413
414 414 get :new, :project_id => 1
415 415 assert_response 500
416 416 assert_not_nil flash[:error]
417 417 assert_tag :tag => 'div', :attributes => { :class => /error/ },
418 418 :content => /No default issue/
419 419 end
420 420
421 421 def test_get_new_with_no_tracker_should_display_an_error
422 422 @request.session[:user_id] = 2
423 423 Tracker.delete_all
424 424
425 425 get :new, :project_id => 1
426 426 assert_response 500
427 427 assert_not_nil flash[:error]
428 428 assert_tag :tag => 'div', :attributes => { :class => /error/ },
429 429 :content => /No tracker/
430 430 end
431 431
432 432 def test_update_new_form
433 433 @request.session[:user_id] = 2
434 434 xhr :post, :update_form, :project_id => 1,
435 435 :issue => {:tracker_id => 2,
436 436 :subject => 'This is the test_new issue',
437 437 :description => 'This is the description',
438 438 :priority_id => 5}
439 439 assert_response :success
440 440 assert_template 'attributes'
441 441
442 442 issue = assigns(:issue)
443 443 assert_kind_of Issue, issue
444 444 assert_equal 1, issue.project_id
445 445 assert_equal 2, issue.tracker_id
446 446 assert_equal 'This is the test_new issue', issue.subject
447 447 end
448 448
449 449 def test_post_new
450 450 @request.session[:user_id] = 2
451 451 assert_difference 'Issue.count' do
452 452 post :new, :project_id => 1,
453 453 :issue => {:tracker_id => 3,
454 454 :status_id => 2,
455 455 :subject => 'This is the test_new issue',
456 456 :description => 'This is the description',
457 457 :priority_id => 5,
458 458 :estimated_hours => '',
459 459 :custom_field_values => {'2' => 'Value for field 2'}}
460 460 end
461 461 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
462 462
463 463 issue = Issue.find_by_subject('This is the test_new issue')
464 464 assert_not_nil issue
465 465 assert_equal 2, issue.author_id
466 466 assert_equal 3, issue.tracker_id
467 467 assert_equal 2, issue.status_id
468 468 assert_nil issue.estimated_hours
469 469 v = issue.custom_values.find(:first, :conditions => {:custom_field_id => 2})
470 470 assert_not_nil v
471 471 assert_equal 'Value for field 2', v.value
472 472 end
473 473
474 474 def test_post_new_and_continue
475 475 @request.session[:user_id] = 2
476 476 post :new, :project_id => 1,
477 477 :issue => {:tracker_id => 3,
478 478 :subject => 'This is first issue',
479 479 :priority_id => 5},
480 480 :continue => ''
481 481 assert_redirected_to :controller => 'issues', :action => 'new', :issue => {:tracker_id => 3}
482 482 end
483 483
484 484 def test_post_new_without_custom_fields_param
485 485 @request.session[:user_id] = 2
486 486 assert_difference 'Issue.count' do
487 487 post :new, :project_id => 1,
488 488 :issue => {:tracker_id => 1,
489 489 :subject => 'This is the test_new issue',
490 490 :description => 'This is the description',
491 491 :priority_id => 5}
492 492 end
493 493 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
494 494 end
495 495
496 496 def test_post_new_with_required_custom_field_and_without_custom_fields_param
497 497 field = IssueCustomField.find_by_name('Database')
498 498 field.update_attribute(:is_required, true)
499 499
500 500 @request.session[:user_id] = 2
501 501 post :new, :project_id => 1,
502 502 :issue => {:tracker_id => 1,
503 503 :subject => 'This is the test_new issue',
504 504 :description => 'This is the description',
505 505 :priority_id => 5}
506 506 assert_response :success
507 507 assert_template 'new'
508 508 issue = assigns(:issue)
509 509 assert_not_nil issue
510 510 assert_equal I18n.translate('activerecord.errors.messages.invalid'), issue.errors.on(:custom_values)
511 511 end
512 512
513 513 def test_post_new_with_watchers
514 514 @request.session[:user_id] = 2
515 515 ActionMailer::Base.deliveries.clear
516 516
517 517 assert_difference 'Watcher.count', 2 do
518 518 post :new, :project_id => 1,
519 519 :issue => {:tracker_id => 1,
520 520 :subject => 'This is a new issue with watchers',
521 521 :description => 'This is the description',
522 522 :priority_id => 5,
523 523 :watcher_user_ids => ['2', '3']}
524 524 end
525 525 issue = Issue.find_by_subject('This is a new issue with watchers')
526 526 assert_not_nil issue
527 527 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue
528 528
529 529 # Watchers added
530 530 assert_equal [2, 3], issue.watcher_user_ids.sort
531 531 assert issue.watched_by?(User.find(3))
532 532 # Watchers notified
533 533 mail = ActionMailer::Base.deliveries.last
534 534 assert_kind_of TMail::Mail, mail
535 535 assert [mail.bcc, mail.cc].flatten.include?(User.find(3).mail)
536 536 end
537 537
538 538 def test_post_new_subissue
539 539 @request.session[:user_id] = 2
540 540
541 541 assert_difference 'Issue.count' do
542 542 post :new, :project_id => 1,
543 543 :issue => {:tracker_id => 1,
544 544 :subject => 'This is a child issue',
545 545 :parent_issue_id => 2}
546 546 end
547 547 issue = Issue.find_by_subject('This is a child issue')
548 548 assert_not_nil issue
549 549 assert_equal Issue.find(2), issue.parent
550 550 end
551 551
552 552 def test_post_new_should_send_a_notification
553 553 ActionMailer::Base.deliveries.clear
554 554 @request.session[:user_id] = 2
555 555 assert_difference 'Issue.count' do
556 556 post :new, :project_id => 1,
557 557 :issue => {:tracker_id => 3,
558 558 :subject => 'This is the test_new issue',
559 559 :description => 'This is the description',
560 560 :priority_id => 5,
561 561 :estimated_hours => '',
562 562 :custom_field_values => {'2' => 'Value for field 2'}}
563 563 end
564 564 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
565 565
566 566 assert_equal 1, ActionMailer::Base.deliveries.size
567 567 end
568 568
569 569 def test_post_should_preserve_fields_values_on_validation_failure
570 570 @request.session[:user_id] = 2
571 571 post :new, :project_id => 1,
572 572 :issue => {:tracker_id => 1,
573 573 # empty subject
574 574 :subject => '',
575 575 :description => 'This is a description',
576 576 :priority_id => 6,
577 577 :custom_field_values => {'1' => 'Oracle', '2' => 'Value for field 2'}}
578 578 assert_response :success
579 579 assert_template 'new'
580 580
581 581 assert_tag :textarea, :attributes => { :name => 'issue[description]' },
582 582 :content => 'This is a description'
583 583 assert_tag :select, :attributes => { :name => 'issue[priority_id]' },
584 584 :child => { :tag => 'option', :attributes => { :selected => 'selected',
585 585 :value => '6' },
586 586 :content => 'High' }
587 587 # Custom fields
588 588 assert_tag :select, :attributes => { :name => 'issue[custom_field_values][1]' },
589 589 :child => { :tag => 'option', :attributes => { :selected => 'selected',
590 590 :value => 'Oracle' },
591 591 :content => 'Oracle' }
592 592 assert_tag :input, :attributes => { :name => 'issue[custom_field_values][2]',
593 593 :value => 'Value for field 2'}
594 594 end
595 595
596 596 def test_post_new_should_ignore_non_safe_attributes
597 597 @request.session[:user_id] = 2
598 598 assert_nothing_raised do
599 599 post :new, :project_id => 1, :issue => { :tracker => "A param can not be a Tracker" }
600 600 end
601 601 end
602 602
603 603 context "without workflow privilege" do
604 604 setup do
605 605 Workflow.delete_all(["role_id = ?", Role.anonymous.id])
606 606 Role.anonymous.add_permission! :add_issues
607 607 end
608 608
609 609 context "#new" do
610 610 should "propose default status only" do
611 611 get :new, :project_id => 1
612 612 assert_response :success
613 613 assert_template 'new'
614 614 assert_tag :tag => 'select',
615 615 :attributes => {:name => 'issue[status_id]'},
616 616 :children => {:count => 1},
617 617 :child => {:tag => 'option', :attributes => {:value => IssueStatus.default.id.to_s}}
618 618 end
619 619
620 620 should "accept default status" do
621 621 assert_difference 'Issue.count' do
622 622 post :new, :project_id => 1,
623 623 :issue => {:tracker_id => 1,
624 624 :subject => 'This is an issue',
625 625 :status_id => 1}
626 626 end
627 627 issue = Issue.last(:order => 'id')
628 628 assert_equal IssueStatus.default, issue.status
629 629 end
630 630
631 631 should "ignore unauthorized status" do
632 632 assert_difference 'Issue.count' do
633 633 post :new, :project_id => 1,
634 634 :issue => {:tracker_id => 1,
635 635 :subject => 'This is an issue',
636 636 :status_id => 3}
637 637 end
638 638 issue = Issue.last(:order => 'id')
639 639 assert_equal IssueStatus.default, issue.status
640 640 end
641 641 end
642 642 end
643 643
644 644 def test_copy_issue
645 645 @request.session[:user_id] = 2
646 646 get :new, :project_id => 1, :copy_from => 1
647 647 assert_template 'new'
648 648 assert_not_nil assigns(:issue)
649 649 orig = Issue.find(1)
650 650 assert_equal orig.subject, assigns(:issue).subject
651 651 end
652 652
653 653 def test_get_edit
654 654 @request.session[:user_id] = 2
655 655 get :edit, :id => 1
656 656 assert_response :success
657 657 assert_template 'edit'
658 658 assert_not_nil assigns(:issue)
659 659 assert_equal Issue.find(1), assigns(:issue)
660 660 end
661 661
662 662 def test_get_edit_with_params
663 663 @request.session[:user_id] = 2
664 664 get :edit, :id => 1, :issue => { :status_id => 5, :priority_id => 7 }
665 665 assert_response :success
666 666 assert_template 'edit'
667 667
668 668 issue = assigns(:issue)
669 669 assert_not_nil issue
670 670
671 671 assert_equal 5, issue.status_id
672 672 assert_tag :select, :attributes => { :name => 'issue[status_id]' },
673 673 :child => { :tag => 'option',
674 674 :content => 'Closed',
675 675 :attributes => { :selected => 'selected' } }
676 676
677 677 assert_equal 7, issue.priority_id
678 678 assert_tag :select, :attributes => { :name => 'issue[priority_id]' },
679 679 :child => { :tag => 'option',
680 680 :content => 'Urgent',
681 681 :attributes => { :selected => 'selected' } }
682 682 end
683 683
684 684 def test_update_edit_form
685 685 @request.session[:user_id] = 2
686 686 xhr :post, :update_form, :project_id => 1,
687 687 :id => 1,
688 688 :issue => {:tracker_id => 2,
689 689 :subject => 'This is the test_new issue',
690 690 :description => 'This is the description',
691 691 :priority_id => 5}
692 692 assert_response :success
693 693 assert_template 'attributes'
694 694
695 695 issue = assigns(:issue)
696 696 assert_kind_of Issue, issue
697 697 assert_equal 1, issue.id
698 698 assert_equal 1, issue.project_id
699 699 assert_equal 2, issue.tracker_id
700 700 assert_equal 'This is the test_new issue', issue.subject
701 701 end
702 702
703 703 def test_reply_to_issue
704 704 @request.session[:user_id] = 2
705 705 get :reply, :id => 1
706 706 assert_response :success
707 707 assert_select_rjs :show, "update"
708 708 end
709 709
710 710 def test_reply_to_note
711 711 @request.session[:user_id] = 2
712 712 get :reply, :id => 1, :journal_id => 2
713 713 assert_response :success
714 714 assert_select_rjs :show, "update"
715 715 end
716 716
717 717 def test_update_using_invalid_http_verbs
718 718 @request.session[:user_id] = 2
719 719 subject = 'Updated by an invalid http verb'
720 720
721 721 get :update, :id => 1, :issue => {:subject => subject}
722 722 assert_not_equal subject, Issue.find(1).subject
723 723
724 724 post :update, :id => 1, :issue => {:subject => subject}
725 725 assert_not_equal subject, Issue.find(1).subject
726 726
727 727 delete :update, :id => 1, :issue => {:subject => subject}
728 728 assert_not_equal subject, Issue.find(1).subject
729 729 end
730 730
731 731 def test_put_update_without_custom_fields_param
732 732 @request.session[:user_id] = 2
733 733 ActionMailer::Base.deliveries.clear
734 734
735 735 issue = Issue.find(1)
736 736 assert_equal '125', issue.custom_value_for(2).value
737 737 old_subject = issue.subject
738 738 new_subject = 'Subject modified by IssuesControllerTest#test_post_edit'
739 739
740 740 assert_difference('Journal.count') do
741 741 assert_difference('JournalDetail.count', 2) do
742 742 put :update, :id => 1, :issue => {:subject => new_subject,
743 743 :priority_id => '6',
744 744 :category_id => '1' # no change
745 745 }
746 746 end
747 747 end
748 748 assert_redirected_to :action => 'show', :id => '1'
749 749 issue.reload
750 750 assert_equal new_subject, issue.subject
751 751 # Make sure custom fields were not cleared
752 752 assert_equal '125', issue.custom_value_for(2).value
753 753
754 754 mail = ActionMailer::Base.deliveries.last
755 755 assert_kind_of TMail::Mail, mail
756 756 assert mail.subject.starts_with?("[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}]")
757 757 assert mail.body.include?("Subject changed from #{old_subject} to #{new_subject}")
758 758 end
759 759
760 760 def test_put_update_with_custom_field_change
761 761 @request.session[:user_id] = 2
762 762 issue = Issue.find(1)
763 763 assert_equal '125', issue.custom_value_for(2).value
764 764
765 765 assert_difference('Journal.count') do
766 766 assert_difference('JournalDetail.count', 3) do
767 767 put :update, :id => 1, :issue => {:subject => 'Custom field change',
768 768 :priority_id => '6',
769 769 :category_id => '1', # no change
770 770 :custom_field_values => { '2' => 'New custom value' }
771 771 }
772 772 end
773 773 end
774 774 assert_redirected_to :action => 'show', :id => '1'
775 775 issue.reload
776 776 assert_equal 'New custom value', issue.custom_value_for(2).value
777 777
778 778 mail = ActionMailer::Base.deliveries.last
779 779 assert_kind_of TMail::Mail, mail
780 780 assert mail.body.include?("Searchable field changed from 125 to New custom value")
781 781 end
782 782
783 783 def test_put_update_with_status_and_assignee_change
784 784 issue = Issue.find(1)
785 785 assert_equal 1, issue.status_id
786 786 @request.session[:user_id] = 2
787 787 assert_difference('TimeEntry.count', 0) do
788 788 put :update,
789 789 :id => 1,
790 790 :issue => { :status_id => 2, :assigned_to_id => 3 },
791 791 :notes => 'Assigned to dlopper',
792 792 :time_entry => { :hours => '', :comments => '', :activity_id => TimeEntryActivity.first }
793 793 end
794 794 assert_redirected_to :action => 'show', :id => '1'
795 795 issue.reload
796 796 assert_equal 2, issue.status_id
797 797 j = Journal.find(:first, :order => 'id DESC')
798 798 assert_equal 'Assigned to dlopper', j.notes
799 799 assert_equal 2, j.details.size
800 800
801 801 mail = ActionMailer::Base.deliveries.last
802 802 assert mail.body.include?("Status changed from New to Assigned")
803 803 # subject should contain the new status
804 804 assert mail.subject.include?("(#{ IssueStatus.find(2).name })")
805 805 end
806 806
807 807 def test_put_update_with_note_only
808 808 notes = 'Note added by IssuesControllerTest#test_update_with_note_only'
809 809 # anonymous user
810 810 put :update,
811 811 :id => 1,
812 812 :notes => notes
813 813 assert_redirected_to :action => 'show', :id => '1'
814 814 j = Journal.find(:first, :order => 'id DESC')
815 815 assert_equal notes, j.notes
816 816 assert_equal 0, j.details.size
817 817 assert_equal User.anonymous, j.user
818 818
819 819 mail = ActionMailer::Base.deliveries.last
820 820 assert mail.body.include?(notes)
821 821 end
822 822
823 823 def test_put_update_with_note_and_spent_time
824 824 @request.session[:user_id] = 2
825 825 spent_hours_before = Issue.find(1).spent_hours
826 826 assert_difference('TimeEntry.count') do
827 827 put :update,
828 828 :id => 1,
829 829 :notes => '2.5 hours added',
830 830 :time_entry => { :hours => '2.5', :comments => 'test_put_update_with_note_and_spent_time', :activity_id => TimeEntryActivity.first }
831 831 end
832 832 assert_redirected_to :action => 'show', :id => '1'
833 833
834 834 issue = Issue.find(1)
835 835
836 836 j = Journal.find(:first, :order => 'id DESC')
837 837 assert_equal '2.5 hours added', j.notes
838 838 assert_equal 0, j.details.size
839 839
840 840 t = issue.time_entries.find_by_comments('test_put_update_with_note_and_spent_time')
841 841 assert_not_nil t
842 842 assert_equal 2.5, t.hours
843 843 assert_equal spent_hours_before + 2.5, issue.spent_hours
844 844 end
845 845
846 846 def test_put_update_with_attachment_only
847 847 set_tmp_attachments_directory
848 848
849 849 # Delete all fixtured journals, a race condition can occur causing the wrong
850 850 # journal to get fetched in the next find.
851 851 Journal.delete_all
852 852
853 853 # anonymous user
854 854 put :update,
855 855 :id => 1,
856 856 :notes => '',
857 857 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
858 858 assert_redirected_to :action => 'show', :id => '1'
859 859 j = Issue.find(1).journals.find(:first, :order => 'id DESC')
860 860 assert j.notes.blank?
861 861 assert_equal 1, j.details.size
862 862 assert_equal 'testfile.txt', j.details.first.value
863 863 assert_equal User.anonymous, j.user
864 864
865 865 mail = ActionMailer::Base.deliveries.last
866 866 assert mail.body.include?('testfile.txt')
867 867 end
868 868
869 869 def test_put_update_with_attachment_that_fails_to_save
870 870 set_tmp_attachments_directory
871 871
872 872 # Delete all fixtured journals, a race condition can occur causing the wrong
873 873 # journal to get fetched in the next find.
874 874 Journal.delete_all
875 875
876 876 # Mock out the unsaved attachment
877 877 Attachment.any_instance.stubs(:create).returns(Attachment.new)
878 878
879 879 # anonymous user
880 880 put :update,
881 881 :id => 1,
882 882 :notes => '',
883 883 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
884 884 assert_redirected_to :action => 'show', :id => '1'
885 885 assert_equal '1 file(s) could not be saved.', flash[:warning]
886 886
887 887 end if Object.const_defined?(:Mocha)
888 888
889 889 def test_put_update_with_no_change
890 890 issue = Issue.find(1)
891 891 issue.journals.clear
892 892 ActionMailer::Base.deliveries.clear
893 893
894 894 put :update,
895 895 :id => 1,
896 896 :notes => ''
897 897 assert_redirected_to :action => 'show', :id => '1'
898 898
899 899 issue.reload
900 900 assert issue.journals.empty?
901 901 # No email should be sent
902 902 assert ActionMailer::Base.deliveries.empty?
903 903 end
904 904
905 905 def test_put_update_should_send_a_notification
906 906 @request.session[:user_id] = 2
907 907 ActionMailer::Base.deliveries.clear
908 908 issue = Issue.find(1)
909 909 old_subject = issue.subject
910 910 new_subject = 'Subject modified by IssuesControllerTest#test_post_edit'
911 911
912 912 put :update, :id => 1, :issue => {:subject => new_subject,
913 913 :priority_id => '6',
914 914 :category_id => '1' # no change
915 915 }
916 916 assert_equal 1, ActionMailer::Base.deliveries.size
917 917 end
918 918
919 919 def test_put_update_with_invalid_spent_time
920 920 @request.session[:user_id] = 2
921 921 notes = 'Note added by IssuesControllerTest#test_post_edit_with_invalid_spent_time'
922 922
923 923 assert_no_difference('Journal.count') do
924 924 put :update,
925 925 :id => 1,
926 926 :notes => notes,
927 927 :time_entry => {"comments"=>"", "activity_id"=>"", "hours"=>"2z"}
928 928 end
929 929 assert_response :success
930 930 assert_template 'edit'
931 931
932 932 assert_tag :textarea, :attributes => { :name => 'notes' },
933 933 :content => notes
934 934 assert_tag :input, :attributes => { :name => 'time_entry[hours]', :value => "2z" }
935 935 end
936 936
937 937 def test_put_update_should_allow_fixed_version_to_be_set_to_a_subproject
938 938 issue = Issue.find(2)
939 939 @request.session[:user_id] = 2
940 940
941 941 put :update,
942 942 :id => issue.id,
943 943 :issue => {
944 944 :fixed_version_id => 4
945 945 }
946 946
947 947 assert_response :redirect
948 948 issue.reload
949 949 assert_equal 4, issue.fixed_version_id
950 950 assert_not_equal issue.project_id, issue.fixed_version.project_id
951 951 end
952 952
953 953 def test_put_update_should_redirect_back_using_the_back_url_parameter
954 954 issue = Issue.find(2)
955 955 @request.session[:user_id] = 2
956 956
957 957 put :update,
958 958 :id => issue.id,
959 959 :issue => {
960 960 :fixed_version_id => 4
961 961 },
962 962 :back_url => '/issues'
963 963
964 964 assert_response :redirect
965 965 assert_redirected_to '/issues'
966 966 end
967 967
968 968 def test_put_update_should_not_redirect_back_using_the_back_url_parameter_off_the_host
969 969 issue = Issue.find(2)
970 970 @request.session[:user_id] = 2
971 971
972 972 put :update,
973 973 :id => issue.id,
974 974 :issue => {
975 975 :fixed_version_id => 4
976 976 },
977 977 :back_url => 'http://google.com'
978 978
979 979 assert_response :redirect
980 980 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue.id
981 981 end
982 982
983 983 def test_get_bulk_edit
984 984 @request.session[:user_id] = 2
985 985 get :bulk_edit, :ids => [1, 2]
986 986 assert_response :success
987 987 assert_template 'bulk_edit'
988 988
989 989 # Project specific custom field, date type
990 990 field = CustomField.find(9)
991 991 assert !field.is_for_all?
992 992 assert_equal 'date', field.field_format
993 993 assert_tag :input, :attributes => {:name => 'issue[custom_field_values][9]'}
994 994
995 995 # System wide custom field
996 996 assert CustomField.find(1).is_for_all?
997 997 assert_tag :select, :attributes => {:name => 'issue[custom_field_values][1]'}
998 998 end
999 999
1000 1000 def test_bulk_edit
1001 1001 @request.session[:user_id] = 2
1002 1002 # update issues priority
1003 1003 post :bulk_edit, :ids => [1, 2], :notes => 'Bulk editing',
1004 1004 :issue => {:priority_id => 7,
1005 1005 :assigned_to_id => '',
1006 1006 :custom_field_values => {'2' => ''}}
1007 1007
1008 1008 assert_response 302
1009 1009 # check that the issues were updated
1010 1010 assert_equal [7, 7], Issue.find_all_by_id([1, 2]).collect {|i| i.priority.id}
1011 1011
1012 1012 issue = Issue.find(1)
1013 1013 journal = issue.journals.find(:first, :order => 'created_on DESC')
1014 1014 assert_equal '125', issue.custom_value_for(2).value
1015 1015 assert_equal 'Bulk editing', journal.notes
1016 1016 assert_equal 1, journal.details.size
1017 1017 end
1018 1018
1019 1019 def test_bullk_edit_should_send_a_notification
1020 1020 @request.session[:user_id] = 2
1021 1021 ActionMailer::Base.deliveries.clear
1022 1022 post(:bulk_edit,
1023 1023 {
1024 1024 :ids => [1, 2],
1025 1025 :notes => 'Bulk editing',
1026 1026 :issue => {
1027 1027 :priority_id => 7,
1028 1028 :assigned_to_id => '',
1029 1029 :custom_field_values => {'2' => ''}
1030 1030 }
1031 1031 })
1032 1032
1033 1033 assert_response 302
1034 1034 assert_equal 2, ActionMailer::Base.deliveries.size
1035 1035 end
1036 1036
1037 1037 def test_bulk_edit_status
1038 1038 @request.session[:user_id] = 2
1039 1039 # update issues priority
1040 1040 post :bulk_edit, :ids => [1, 2], :notes => 'Bulk editing status',
1041 1041 :issue => {:priority_id => '',
1042 1042 :assigned_to_id => '',
1043 1043 :status_id => '5'}
1044 1044
1045 1045 assert_response 302
1046 1046 issue = Issue.find(1)
1047 1047 assert issue.closed?
1048 1048 end
1049 1049
1050 1050 def test_bulk_edit_custom_field
1051 1051 @request.session[:user_id] = 2
1052 1052 # update issues priority
1053 1053 post :bulk_edit, :ids => [1, 2], :notes => 'Bulk editing custom field',
1054 1054 :issue => {:priority_id => '',
1055 1055 :assigned_to_id => '',
1056 1056 :custom_field_values => {'2' => '777'}}
1057 1057
1058 1058 assert_response 302
1059 1059
1060 1060 issue = Issue.find(1)
1061 1061 journal = issue.journals.find(:first, :order => 'created_on DESC')
1062 1062 assert_equal '777', issue.custom_value_for(2).value
1063 1063 assert_equal 1, journal.details.size
1064 1064 assert_equal '125', journal.details.first.old_value
1065 1065 assert_equal '777', journal.details.first.value
1066 1066 end
1067 1067
1068 1068 def test_bulk_unassign
1069 1069 assert_not_nil Issue.find(2).assigned_to
1070 1070 @request.session[:user_id] = 2
1071 1071 # unassign issues
1072 1072 post :bulk_edit, :ids => [1, 2], :notes => 'Bulk unassigning', :issue => {:assigned_to_id => 'none'}
1073 1073 assert_response 302
1074 1074 # check that the issues were updated
1075 1075 assert_nil Issue.find(2).assigned_to
1076 1076 end
1077 1077
1078 1078 def test_post_bulk_edit_should_allow_fixed_version_to_be_set_to_a_subproject
1079 1079 @request.session[:user_id] = 2
1080 1080
1081 1081 post :bulk_edit, :ids => [1,2], :issue => {:fixed_version_id => 4}
1082 1082
1083 1083 assert_response :redirect
1084 1084 issues = Issue.find([1,2])
1085 1085 issues.each do |issue|
1086 1086 assert_equal 4, issue.fixed_version_id
1087 1087 assert_not_equal issue.project_id, issue.fixed_version.project_id
1088 1088 end
1089 1089 end
1090 1090
1091 1091 def test_post_bulk_edit_should_redirect_back_using_the_back_url_parameter
1092 1092 @request.session[:user_id] = 2
1093 1093 post :bulk_edit, :ids => [1,2], :back_url => '/issues'
1094 1094
1095 1095 assert_response :redirect
1096 1096 assert_redirected_to '/issues'
1097 1097 end
1098 1098
1099 1099 def test_post_bulk_edit_should_not_redirect_back_using_the_back_url_parameter_off_the_host
1100 1100 @request.session[:user_id] = 2
1101 1101 post :bulk_edit, :ids => [1,2], :back_url => 'http://google.com'
1102 1102
1103 1103 assert_response :redirect
1104 1104 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => Project.find(1).identifier
1105 1105 end
1106 1106
1107 1107 def test_move_one_issue_to_another_project
1108 1108 @request.session[:user_id] = 2
1109 1109 post :move, :id => 1, :new_project_id => 2, :tracker_id => '', :assigned_to_id => '', :status_id => '', :start_date => '', :due_date => ''
1110 1110 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
1111 1111 assert_equal 2, Issue.find(1).project_id
1112 1112 end
1113 1113
1114 1114 def test_move_one_issue_to_another_project_should_follow_when_needed
1115 1115 @request.session[:user_id] = 2
1116 1116 post :move, :id => 1, :new_project_id => 2, :follow => '1'
1117 1117 assert_redirected_to '/issues/1'
1118 1118 end
1119 1119
1120 1120 def test_bulk_move_to_another_project
1121 1121 @request.session[:user_id] = 2
1122 1122 post :move, :ids => [1, 2], :new_project_id => 2
1123 1123 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
1124 1124 # Issues moved to project 2
1125 1125 assert_equal 2, Issue.find(1).project_id
1126 1126 assert_equal 2, Issue.find(2).project_id
1127 1127 # No tracker change
1128 1128 assert_equal 1, Issue.find(1).tracker_id
1129 1129 assert_equal 2, Issue.find(2).tracker_id
1130 1130 end
1131 1131
1132 1132 def test_bulk_move_to_another_tracker
1133 1133 @request.session[:user_id] = 2
1134 1134 post :move, :ids => [1, 2], :new_tracker_id => 2
1135 1135 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
1136 1136 assert_equal 2, Issue.find(1).tracker_id
1137 1137 assert_equal 2, Issue.find(2).tracker_id
1138 1138 end
1139 1139
1140 1140 def test_bulk_copy_to_another_project
1141 1141 @request.session[:user_id] = 2
1142 1142 assert_difference 'Issue.count', 2 do
1143 1143 assert_no_difference 'Project.find(1).issues.count' do
1144 1144 post :move, :ids => [1, 2], :new_project_id => 2, :copy_options => {:copy => '1'}
1145 1145 end
1146 1146 end
1147 1147 assert_redirected_to 'projects/ecookbook/issues'
1148 1148 end
1149 1149
1150 1150 context "#move via bulk copy" do
1151 1151 should "allow not changing the issue's attributes" do
1152 1152 @request.session[:user_id] = 2
1153 1153 issue_before_move = Issue.find(1)
1154 1154 assert_difference 'Issue.count', 1 do
1155 1155 assert_no_difference 'Project.find(1).issues.count' do
1156 1156 post :move, :ids => [1], :new_project_id => 2, :copy_options => {:copy => '1'}, :new_tracker_id => '', :assigned_to_id => '', :status_id => '', :start_date => '', :due_date => ''
1157 1157 end
1158 1158 end
1159 1159 issue_after_move = Issue.first(:order => 'id desc', :conditions => {:project_id => 2})
1160 1160 assert_equal issue_before_move.tracker_id, issue_after_move.tracker_id
1161 1161 assert_equal issue_before_move.status_id, issue_after_move.status_id
1162 1162 assert_equal issue_before_move.assigned_to_id, issue_after_move.assigned_to_id
1163 1163 end
1164 1164
1165 1165 should "allow changing the issue's attributes" do
1166 1166 @request.session[:user_id] = 2
1167 1167 assert_difference 'Issue.count', 2 do
1168 1168 assert_no_difference 'Project.find(1).issues.count' do
1169 1169 post :move, :ids => [1, 2], :new_project_id => 2, :copy_options => {:copy => '1'}, :new_tracker_id => '', :assigned_to_id => 4, :status_id => 3, :start_date => '2009-12-01', :due_date => '2009-12-31'
1170 1170 end
1171 1171 end
1172 1172
1173 1173 copied_issues = Issue.all(:limit => 2, :order => 'id desc', :conditions => {:project_id => 2})
1174 1174 assert_equal 2, copied_issues.size
1175 1175 copied_issues.each do |issue|
1176 1176 assert_equal 2, issue.project_id, "Project is incorrect"
1177 1177 assert_equal 4, issue.assigned_to_id, "Assigned to is incorrect"
1178 1178 assert_equal 3, issue.status_id, "Status is incorrect"
1179 1179 assert_equal '2009-12-01', issue.start_date.to_s, "Start date is incorrect"
1180 1180 assert_equal '2009-12-31', issue.due_date.to_s, "Due date is incorrect"
1181 1181 end
1182 1182 end
1183 1183 end
1184 1184
1185 1185 def test_copy_to_another_project_should_follow_when_needed
1186 1186 @request.session[:user_id] = 2
1187 1187 post :move, :ids => [1], :new_project_id => 2, :copy_options => {:copy => '1'}, :follow => '1'
1188 1188 issue = Issue.first(:order => 'id DESC')
1189 1189 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue
1190 1190 end
1191 1191
1192 1192 def test_context_menu_one_issue
1193 1193 @request.session[:user_id] = 2
1194 1194 get :context_menu, :ids => [1]
1195 1195 assert_response :success
1196 1196 assert_template 'context_menu'
1197 1197 assert_tag :tag => 'a', :content => 'Edit',
1198 1198 :attributes => { :href => '/issues/1/edit',
1199 1199 :class => 'icon-edit' }
1200 1200 assert_tag :tag => 'a', :content => 'Closed',
1201 1201 :attributes => { :href => '/issues/1/edit?issue%5Bstatus_id%5D=5',
1202 1202 :class => '' }
1203 1203 assert_tag :tag => 'a', :content => 'Immediate',
1204 1204 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;issue%5Bpriority_id%5D=8',
1205 1205 :class => '' }
1206 1206 # Versions
1207 1207 assert_tag :tag => 'a', :content => '2.0',
1208 1208 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;issue%5Bfixed_version_id%5D=3',
1209 1209 :class => '' }
1210 1210 assert_tag :tag => 'a', :content => 'eCookbook Subproject 1 - 2.0',
1211 1211 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;issue%5Bfixed_version_id%5D=4',
1212 1212 :class => '' }
1213 1213
1214 1214 assert_tag :tag => 'a', :content => 'Dave Lopper',
1215 1215 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;issue%5Bassigned_to_id%5D=3',
1216 1216 :class => '' }
1217 1217 assert_tag :tag => 'a', :content => 'Duplicate',
1218 1218 :attributes => { :href => '/projects/ecookbook/issues/1/copy',
1219 1219 :class => 'icon-duplicate' }
1220 1220 assert_tag :tag => 'a', :content => 'Copy',
1221 1221 :attributes => { :href => '/issues/move?copy_options%5Bcopy%5D=t&amp;ids%5B%5D=1',
1222 1222 :class => 'icon-copy' }
1223 1223 assert_tag :tag => 'a', :content => 'Move',
1224 1224 :attributes => { :href => '/issues/move?ids%5B%5D=1',
1225 1225 :class => 'icon-move' }
1226 1226 assert_tag :tag => 'a', :content => 'Delete',
1227 1227 :attributes => { :href => '/issues/destroy?ids%5B%5D=1',
1228 1228 :class => 'icon-del' }
1229 1229 end
1230 1230
1231 1231 def test_context_menu_one_issue_by_anonymous
1232 1232 get :context_menu, :ids => [1]
1233 1233 assert_response :success
1234 1234 assert_template 'context_menu'
1235 1235 assert_tag :tag => 'a', :content => 'Delete',
1236 1236 :attributes => { :href => '#',
1237 1237 :class => 'icon-del disabled' }
1238 1238 end
1239 1239
1240 1240 def test_context_menu_multiple_issues_of_same_project
1241 1241 @request.session[:user_id] = 2
1242 1242 get :context_menu, :ids => [1, 2]
1243 1243 assert_response :success
1244 1244 assert_template 'context_menu'
1245 1245 assert_tag :tag => 'a', :content => 'Edit',
1246 1246 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;ids%5B%5D=2',
1247 1247 :class => 'icon-edit' }
1248 1248 assert_tag :tag => 'a', :content => 'Immediate',
1249 1249 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;ids%5B%5D=2&amp;issue%5Bpriority_id%5D=8',
1250 1250 :class => '' }
1251 1251 assert_tag :tag => 'a', :content => 'Dave Lopper',
1252 1252 :attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&amp;ids%5B%5D=2&amp;issue%5Bassigned_to_id%5D=3',
1253 1253 :class => '' }
1254 1254 assert_tag :tag => 'a', :content => 'Copy',
1255 1255 :attributes => { :href => '/issues/move?copy_options%5Bcopy%5D=t&amp;ids%5B%5D=1&amp;ids%5B%5D=2',
1256 1256 :class => 'icon-copy' }
1257 1257 assert_tag :tag => 'a', :content => 'Move',
1258 1258 :attributes => { :href => '/issues/move?ids%5B%5D=1&amp;ids%5B%5D=2',
1259 1259 :class => 'icon-move' }
1260 1260 assert_tag :tag => 'a', :content => 'Delete',
1261 1261 :attributes => { :href => '/issues/destroy?ids%5B%5D=1&amp;ids%5B%5D=2',
1262 1262 :class => 'icon-del' }
1263 1263 end
1264 1264
1265 1265 def test_context_menu_multiple_issues_of_different_project
1266 1266 @request.session[:user_id] = 2
1267 1267 get :context_menu, :ids => [1, 2, 4]
1268 1268 assert_response :success
1269 1269 assert_template 'context_menu'
1270 1270 assert_tag :tag => 'a', :content => 'Delete',
1271 1271 :attributes => { :href => '#',
1272 1272 :class => 'icon-del disabled' }
1273 1273 end
1274 1274
1275 1275 def test_preview_new_issue
1276 1276 @request.session[:user_id] = 2
1277 1277 post :preview, :project_id => '1', :issue => {:description => 'Foo'}
1278 1278 assert_response :success
1279 1279 assert_template 'preview'
1280 1280 assert_not_nil assigns(:description)
1281 1281 end
1282 1282
1283 1283 def test_preview_notes
1284 1284 @request.session[:user_id] = 2
1285 1285 post :preview, :project_id => '1', :id => 1, :issue => {:description => Issue.find(1).description}, :notes => 'Foo'
1286 1286 assert_response :success
1287 1287 assert_template 'preview'
1288 1288 assert_not_nil assigns(:notes)
1289 1289 end
1290 1290
1291 def test_auto_complete_routing
1292 assert_routing(
1293 {:method => :get, :path => '/issues/auto_complete'},
1294 :controller => 'issues', :action => 'auto_complete'
1295 )
1296 end
1297
1298 1291 def test_auto_complete_should_not_be_case_sensitive
1299 1292 get :auto_complete, :project_id => 'ecookbook', :q => 'ReCiPe'
1300 1293 assert_response :success
1301 1294 assert_not_nil assigns(:issues)
1302 1295 assert assigns(:issues).detect {|issue| issue.subject.match /recipe/}
1303 1296 end
1304 1297
1305 1298 def test_auto_complete_should_return_issue_with_given_id
1306 1299 get :auto_complete, :project_id => 'subproject1', :q => '13'
1307 1300 assert_response :success
1308 1301 assert_not_nil assigns(:issues)
1309 1302 assert assigns(:issues).include?(Issue.find(13))
1310 1303 end
1311 1304
1312 def test_destroy_routing
1313 assert_recognizes( #TODO: use DELETE on issue URI (need to change forms)
1314 {:controller => 'issues', :action => 'destroy', :id => '1'},
1315 {:method => :post, :path => '/issues/1/destroy'}
1316 )
1317 end
1318
1319 1305 def test_destroy_issue_with_no_time_entries
1320 1306 assert_nil TimeEntry.find_by_issue_id(2)
1321 1307 @request.session[:user_id] = 2
1322 1308 post :destroy, :id => 2
1323 1309 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
1324 1310 assert_nil Issue.find_by_id(2)
1325 1311 end
1326 1312
1327 1313 def test_destroy_issues_with_time_entries
1328 1314 @request.session[:user_id] = 2
1329 1315 post :destroy, :ids => [1, 3]
1330 1316 assert_response :success
1331 1317 assert_template 'destroy'
1332 1318 assert_not_nil assigns(:hours)
1333 1319 assert Issue.find_by_id(1) && Issue.find_by_id(3)
1334 1320 end
1335 1321
1336 1322 def test_destroy_issues_and_destroy_time_entries
1337 1323 @request.session[:user_id] = 2
1338 1324 post :destroy, :ids => [1, 3], :todo => 'destroy'
1339 1325 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
1340 1326 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
1341 1327 assert_nil TimeEntry.find_by_id([1, 2])
1342 1328 end
1343 1329
1344 1330 def test_destroy_issues_and_assign_time_entries_to_project
1345 1331 @request.session[:user_id] = 2
1346 1332 post :destroy, :ids => [1, 3], :todo => 'nullify'
1347 1333 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
1348 1334 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
1349 1335 assert_nil TimeEntry.find(1).issue_id
1350 1336 assert_nil TimeEntry.find(2).issue_id
1351 1337 end
1352 1338
1353 1339 def test_destroy_issues_and_reassign_time_entries_to_another_issue
1354 1340 @request.session[:user_id] = 2
1355 1341 post :destroy, :ids => [1, 3], :todo => 'reassign', :reassign_to_id => 2
1356 1342 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
1357 1343 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
1358 1344 assert_equal 2, TimeEntry.find(1).issue_id
1359 1345 assert_equal 2, TimeEntry.find(2).issue_id
1360 1346 end
1361 1347
1362 1348 def test_default_search_scope
1363 1349 get :index
1364 1350 assert_tag :div, :attributes => {:id => 'quick-search'},
1365 1351 :child => {:tag => 'form',
1366 1352 :child => {:tag => 'input', :attributes => {:name => 'issues', :type => 'hidden', :value => '1'}}}
1367 1353 end
1368 1354 end
@@ -1,229 +1,149
1 1 # redMine - project management software
2 2 # Copyright (C) 2006-2007 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.dirname(__FILE__) + '/../test_helper'
19 19 require 'users_controller'
20 20
21 21 # Re-raise errors caught by the controller.
22 22 class UsersController; def rescue_action(e) raise e end; end
23 23
24 24 class UsersControllerTest < ActionController::TestCase
25 25 include Redmine::I18n
26 26
27 27 fixtures :users, :projects, :members, :member_roles, :roles
28 28
29 29 def setup
30 30 @controller = UsersController.new
31 31 @request = ActionController::TestRequest.new
32 32 @response = ActionController::TestResponse.new
33 33 User.current = nil
34 34 @request.session[:user_id] = 1 # admin
35 35 end
36 36
37 def test_index_routing
38 assert_generates(
39 '/users',
40 :controller => 'users', :action => 'index'
41 )
42 assert_routing(
43 {:method => :get, :path => '/users'},
44 :controller => 'users', :action => 'index'
45 )
46 assert_recognizes(
47 {:controller => 'users', :action => 'index'},
48 {:method => :get, :path => '/users'}
49 )
50 end
51
52 37 def test_index
53 38 get :index
54 39 assert_response :success
55 40 assert_template 'index'
56 41 end
57 42
58 43 def test_index
59 44 get :index
60 45 assert_response :success
61 46 assert_template 'index'
62 47 assert_not_nil assigns(:users)
63 48 # active users only
64 49 assert_nil assigns(:users).detect {|u| !u.active?}
65 50 end
66 51
67 52 def test_index_with_name_filter
68 53 get :index, :name => 'john'
69 54 assert_response :success
70 55 assert_template 'index'
71 56 users = assigns(:users)
72 57 assert_not_nil users
73 58 assert_equal 1, users.size
74 59 assert_equal 'John', users.first.firstname
75 60 end
76 61
77 def test_show_routing
78 assert_routing(
79 {:method => :get, :path => '/users/44'},
80 :controller => 'users', :action => 'show', :id => '44'
81 )
82 assert_recognizes(
83 {:controller => 'users', :action => 'show', :id => '44'},
84 {:method => :get, :path => '/users/44'}
85 )
86 end
87
88 62 def test_show
89 63 @request.session[:user_id] = nil
90 64 get :show, :id => 2
91 65 assert_response :success
92 66 assert_template 'show'
93 67 assert_not_nil assigns(:user)
94 68 end
95 69
96 70 def test_show_should_not_fail_when_custom_values_are_nil
97 71 user = User.find(2)
98 72
99 73 # Create a custom field to illustrate the issue
100 74 custom_field = CustomField.create!(:name => 'Testing', :field_format => 'text')
101 75 custom_value = user.custom_values.build(:custom_field => custom_field).save!
102 76
103 77 get :show, :id => 2
104 78 assert_response :success
105 79 end
106 80
107 81 def test_show_inactive
108 82 @request.session[:user_id] = nil
109 83 get :show, :id => 5
110 84 assert_response 404
111 85 end
112 86
113 87 def test_show_should_not_reveal_users_with_no_visible_activity_or_project
114 88 @request.session[:user_id] = nil
115 89 get :show, :id => 9
116 90 assert_response 404
117 91 end
118 92
119 93 def test_show_inactive_by_admin
120 94 @request.session[:user_id] = 1
121 95 get :show, :id => 5
122 96 assert_response 200
123 97 assert_not_nil assigns(:user)
124 98 end
125 99
126 def test_add_routing
127 assert_routing(
128 {:method => :get, :path => '/users/new'},
129 :controller => 'users', :action => 'add'
130 )
131 assert_recognizes(
132 #TODO: remove this and replace with POST to collection, need to modify form
133 {:controller => 'users', :action => 'add'},
134 {:method => :post, :path => '/users/new'}
135 )
136 assert_recognizes(
137 {:controller => 'users', :action => 'add'},
138 {:method => :post, :path => '/users'}
139 )
140 end
141
142 def test_edit_routing
143 assert_routing(
144 {:method => :get, :path => '/users/444/edit'},
145 :controller => 'users', :action => 'edit', :id => '444'
146 )
147 assert_routing(
148 {:method => :get, :path => '/users/222/edit/membership'},
149 :controller => 'users', :action => 'edit', :id => '222', :tab => 'membership'
150 )
151 assert_recognizes(
152 #TODO: use PUT on user_path, modify form
153 {:controller => 'users', :action => 'edit', :id => '444'},
154 {:method => :post, :path => '/users/444/edit'}
155 )
156 end
157
158 100 def test_edit
159 101 ActionMailer::Base.deliveries.clear
160 102 post :edit, :id => 2, :user => {:firstname => 'Changed'}
161 103 assert_equal 'Changed', User.find(2).firstname
162 104 assert ActionMailer::Base.deliveries.empty?
163 105 end
164 106
165 107 def test_edit_with_activation_should_send_a_notification
166 108 u = User.new(:firstname => 'Foo', :lastname => 'Bar', :mail => 'foo.bar@somenet.foo', :language => 'fr')
167 109 u.login = 'foo'
168 110 u.status = User::STATUS_REGISTERED
169 111 u.save!
170 112 ActionMailer::Base.deliveries.clear
171 113 Setting.bcc_recipients = '1'
172 114
173 115 post :edit, :id => u.id, :user => {:status => User::STATUS_ACTIVE}
174 116 assert u.reload.active?
175 117 mail = ActionMailer::Base.deliveries.last
176 118 assert_not_nil mail
177 119 assert_equal ['foo.bar@somenet.foo'], mail.bcc
178 120 assert mail.body.include?(ll('fr', :notice_account_activated))
179 121 end
180 122
181 123 def test_edit_with_password_change_should_send_a_notification
182 124 ActionMailer::Base.deliveries.clear
183 125 Setting.bcc_recipients = '1'
184 126
185 127 u = User.find(2)
186 128 post :edit, :id => u.id, :user => {}, :password => 'newpass', :password_confirmation => 'newpass', :send_information => '1'
187 129 assert_equal User.hash_password('newpass'), u.reload.hashed_password
188 130
189 131 mail = ActionMailer::Base.deliveries.last
190 132 assert_not_nil mail
191 133 assert_equal [u.mail], mail.bcc
192 134 assert mail.body.include?('newpass')
193 135 end
194 136
195 def test_add_membership_routing
196 assert_routing(
197 {:method => :post, :path => '/users/123/memberships'},
198 :controller => 'users', :action => 'edit_membership', :id => '123'
199 )
200 end
201
202 def test_edit_membership_routing
203 assert_routing(
204 {:method => :post, :path => '/users/123/memberships/55'},
205 :controller => 'users', :action => 'edit_membership', :id => '123', :membership_id => '55'
206 )
207 end
208
209 137 def test_edit_membership
210 138 post :edit_membership, :id => 2, :membership_id => 1,
211 139 :membership => { :role_ids => [2]}
212 140 assert_redirected_to :action => 'edit', :id => '2', :tab => 'memberships'
213 141 assert_equal [2], Member.find(1).role_ids
214 142 end
215 143
216 144 def test_destroy_membership
217 assert_routing(
218 #TODO: use DELETE method on user_membership_path, modify form
219 {:method => :post, :path => '/users/567/memberships/12/destroy'},
220 :controller => 'users', :action => 'destroy_membership', :id => '567', :membership_id => '12'
221 )
222 end
223
224 def test_destroy_membership
225 145 post :destroy_membership, :id => 2, :membership_id => 1
226 146 assert_redirected_to :action => 'edit', :id => '2', :tab => 'memberships'
227 147 assert_nil Member.find_by_id(1)
228 148 end
229 149 end
@@ -1,115 +1,104
1 1 # redMine - project management software
2 2 # Copyright (C) 2006-2007 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.dirname(__FILE__) + '/../test_helper'
19 19 require 'versions_controller'
20 20
21 21 # Re-raise errors caught by the controller.
22 22 class VersionsController; def rescue_action(e) raise e end; end
23 23
24 24 class VersionsControllerTest < ActionController::TestCase
25 25 fixtures :projects, :versions, :issues, :users, :roles, :members, :member_roles, :enabled_modules
26 26
27 27 def setup
28 28 @controller = VersionsController.new
29 29 @request = ActionController::TestRequest.new
30 30 @response = ActionController::TestResponse.new
31 31 User.current = nil
32 32 end
33 33
34 34 def test_show
35 35 get :show, :id => 2
36 36 assert_response :success
37 37 assert_template 'show'
38 38 assert_not_nil assigns(:version)
39 39
40 40 assert_tag :tag => 'h2', :content => /1.0/
41 41 end
42 42
43 def test_new_routing
44 assert_routing(
45 {:method => :get, :path => 'projects/foo/versions/new'},
46 :controller => 'versions', :action => 'new', :project_id => 'foo'
47 )
48 assert_routing(
49 {:method => :post, :path => 'projects/foo/versions/new'},
50 :controller => 'versions', :action => 'new', :project_id => 'foo'
51 )
52 end
53
54 43 def test_new
55 44 @request.session[:user_id] = 2 # manager
56 45 assert_difference 'Version.count' do
57 46 post :new, :project_id => '1', :version => {:name => 'test_add_version'}
58 47 end
59 48 assert_redirected_to '/projects/ecookbook/settings/versions'
60 49 version = Version.find_by_name('test_add_version')
61 50 assert_not_nil version
62 51 assert_equal 1, version.project_id
63 52 end
64 53
65 54 def test_new_from_issue_form
66 55 @request.session[:user_id] = 2 # manager
67 56 assert_difference 'Version.count' do
68 57 xhr :post, :new, :project_id => '1', :version => {:name => 'test_add_version_from_issue_form'}
69 58 end
70 59 assert_response :success
71 60 assert_select_rjs :replace, 'issue_fixed_version_id'
72 61 version = Version.find_by_name('test_add_version_from_issue_form')
73 62 assert_not_nil version
74 63 assert_equal 1, version.project_id
75 64 end
76 65
77 66 def test_get_edit
78 67 @request.session[:user_id] = 2
79 68 get :edit, :id => 2
80 69 assert_response :success
81 70 assert_template 'edit'
82 71 end
83 72
84 73 def test_close_completed
85 74 Version.update_all("status = 'open'")
86 75 @request.session[:user_id] = 2
87 76 post :close_completed, :project_id => 'ecookbook'
88 77 assert_redirected_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => 'ecookbook'
89 78 assert_not_nil Version.find_by_status('closed')
90 79 end
91 80
92 81 def test_post_edit
93 82 @request.session[:user_id] = 2
94 83 post :edit, :id => 2,
95 84 :version => { :name => 'New version name',
96 85 :effective_date => Date.today.strftime("%Y-%m-%d")}
97 86 assert_redirected_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => 'ecookbook'
98 87 version = Version.find(2)
99 88 assert_equal 'New version name', version.name
100 89 assert_equal Date.today, version.effective_date
101 90 end
102 91
103 92 def test_destroy
104 93 @request.session[:user_id] = 2
105 94 post :destroy, :id => 3
106 95 assert_redirected_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => 'ecookbook'
107 96 assert_nil Version.find_by_id(3)
108 97 end
109 98
110 99 def test_issue_status_by
111 100 xhr :get, :status_by, :id => 2
112 101 assert_response :success
113 102 assert_template '_issue_counts'
114 103 end
115 104 end
@@ -1,425 +1,325
1 1 # redMine - project management software
2 2 # Copyright (C) 2006-2007 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.dirname(__FILE__) + '/../test_helper'
19 19 require 'wiki_controller'
20 20
21 21 # Re-raise errors caught by the controller.
22 22 class WikiController; def rescue_action(e) raise e end; end
23 23
24 24 class WikiControllerTest < ActionController::TestCase
25 25 fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :wikis, :wiki_pages, :wiki_contents, :wiki_content_versions, :attachments
26 26
27 27 def setup
28 28 @controller = WikiController.new
29 29 @request = ActionController::TestRequest.new
30 30 @response = ActionController::TestResponse.new
31 31 User.current = nil
32 32 end
33 33
34 def test_index_routing
35 assert_routing(
36 {:method => :get, :path => '/projects/567/wiki'},
37 :controller => 'wiki', :action => 'index', :id => '567'
38 )
39 assert_routing(
40 {:method => :get, :path => '/projects/567/wiki/lalala'},
41 :controller => 'wiki', :action => 'index', :id => '567', :page => 'lalala'
42 )
43 assert_generates(
44 '/projects/567/wiki',
45 :controller => 'wiki', :action => 'index', :id => '567', :page => nil
46 )
47 end
48
49 34 def test_show_start_page
50 35 get :index, :id => 'ecookbook'
51 36 assert_response :success
52 37 assert_template 'show'
53 38 assert_tag :tag => 'h1', :content => /CookBook documentation/
54 39
55 40 # child_pages macro
56 41 assert_tag :ul, :attributes => { :class => 'pages-hierarchy' },
57 42 :child => { :tag => 'li',
58 43 :child => { :tag => 'a', :attributes => { :href => '/projects/ecookbook/wiki/Page_with_an_inline_image' },
59 44 :content => 'Page with an inline image' } }
60 45 end
61 46
62 47 def test_show_page_with_name
63 48 get :index, :id => 1, :page => 'Another_page'
64 49 assert_response :success
65 50 assert_template 'show'
66 51 assert_tag :tag => 'h1', :content => /Another page/
67 52 # Included page with an inline image
68 53 assert_tag :tag => 'p', :content => /This is an inline image/
69 54 assert_tag :tag => 'img', :attributes => { :src => '/attachments/download/3',
70 55 :alt => 'This is a logo' }
71 56 end
72 57
73 58 def test_show_with_sidebar
74 59 page = Project.find(1).wiki.pages.new(:title => 'Sidebar')
75 60 page.content = WikiContent.new(:text => 'Side bar content for test_show_with_sidebar')
76 61 page.save!
77 62
78 63 get :index, :id => 1, :page => 'Another_page'
79 64 assert_response :success
80 65 assert_tag :tag => 'div', :attributes => {:id => 'sidebar'},
81 66 :content => /Side bar content for test_show_with_sidebar/
82 67 end
83 68
84 69 def test_show_unexistent_page_without_edit_right
85 70 get :index, :id => 1, :page => 'Unexistent page'
86 71 assert_response 404
87 72 end
88 73
89 74 def test_show_unexistent_page_with_edit_right
90 75 @request.session[:user_id] = 2
91 76 get :index, :id => 1, :page => 'Unexistent page'
92 77 assert_response :success
93 78 assert_template 'edit'
94 79 end
95 80
96 def test_edit_routing
97 assert_routing(
98 {:method => :get, :path => '/projects/567/wiki/my_page/edit'},
99 :controller => 'wiki', :action => 'edit', :id => '567', :page => 'my_page'
100 )
101 assert_recognizes(#TODO: use PUT to page path, adjust forms accordingly
102 {:controller => 'wiki', :action => 'edit', :id => '567', :page => 'my_page'},
103 {:method => :post, :path => '/projects/567/wiki/my_page/edit'}
104 )
105 end
106
107 81 def test_create_page
108 82 @request.session[:user_id] = 2
109 83 post :edit, :id => 1,
110 84 :page => 'New page',
111 85 :content => {:comments => 'Created the page',
112 86 :text => "h1. New page\n\nThis is a new page",
113 87 :version => 0}
114 88 assert_redirected_to :action => 'index', :id => 'ecookbook', :page => 'New_page'
115 89 page = Project.find(1).wiki.find_page('New page')
116 90 assert !page.new_record?
117 91 assert_not_nil page.content
118 92 assert_equal 'Created the page', page.content.comments
119 93 end
120 94
121 95 def test_create_page_with_attachments
122 96 @request.session[:user_id] = 2
123 97 assert_difference 'WikiPage.count' do
124 98 assert_difference 'Attachment.count' do
125 99 post :edit, :id => 1,
126 100 :page => 'New page',
127 101 :content => {:comments => 'Created the page',
128 102 :text => "h1. New page\n\nThis is a new page",
129 103 :version => 0},
130 104 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
131 105 end
132 106 end
133 107 page = Project.find(1).wiki.find_page('New page')
134 108 assert_equal 1, page.attachments.count
135 109 assert_equal 'testfile.txt', page.attachments.first.filename
136 110 end
137 111
138 def test_preview_routing
139 assert_routing(
140 {:method => :post, :path => '/projects/567/wiki/CookBook_documentation/preview'},
141 :controller => 'wiki', :action => 'preview', :id => '567', :page => 'CookBook_documentation'
142 )
143 end
144
145 112 def test_preview
146 113 @request.session[:user_id] = 2
147 114 xhr :post, :preview, :id => 1, :page => 'CookBook_documentation',
148 115 :content => { :comments => '',
149 116 :text => 'this is a *previewed text*',
150 117 :version => 3 }
151 118 assert_response :success
152 119 assert_template 'common/_preview'
153 120 assert_tag :tag => 'strong', :content => /previewed text/
154 121 end
155 122
156 123 def test_preview_new_page
157 124 @request.session[:user_id] = 2
158 125 xhr :post, :preview, :id => 1, :page => 'New page',
159 126 :content => { :text => 'h1. New page',
160 127 :comments => '',
161 128 :version => 0 }
162 129 assert_response :success
163 130 assert_template 'common/_preview'
164 131 assert_tag :tag => 'h1', :content => /New page/
165 132 end
166 133
167 def test_history_routing
168 assert_routing(
169 {:method => :get, :path => '/projects/1/wiki/CookBook_documentation/history'},
170 :controller => 'wiki', :action => 'history', :id => '1', :page => 'CookBook_documentation'
171 )
172 end
173
174 134 def test_history
175 135 get :history, :id => 1, :page => 'CookBook_documentation'
176 136 assert_response :success
177 137 assert_template 'history'
178 138 assert_not_nil assigns(:versions)
179 139 assert_equal 3, assigns(:versions).size
180 140 assert_select "input[type=submit][name=commit]"
181 141 end
182 142
183 143 def test_history_with_one_version
184 144 get :history, :id => 1, :page => 'Another_page'
185 145 assert_response :success
186 146 assert_template 'history'
187 147 assert_not_nil assigns(:versions)
188 148 assert_equal 1, assigns(:versions).size
189 149 assert_select "input[type=submit][name=commit]", false
190 150 end
191 151
192 def test_diff_routing
193 assert_routing(
194 {:method => :get, :path => '/projects/1/wiki/CookBook_documentation/diff/2/vs/1'},
195 :controller => 'wiki', :action => 'diff', :id => '1', :page => 'CookBook_documentation', :version => '2', :version_from => '1'
196 )
197 end
198
199 152 def test_diff
200 153 get :diff, :id => 1, :page => 'CookBook_documentation', :version => 2, :version_from => 1
201 154 assert_response :success
202 155 assert_template 'diff'
203 156 assert_tag :tag => 'span', :attributes => { :class => 'diff_in'},
204 157 :content => /updated/
205 158 end
206 159
207 def test_annotate_routing
208 assert_routing(
209 {:method => :get, :path => '/projects/1/wiki/CookBook_documentation/annotate/2'},
210 :controller => 'wiki', :action => 'annotate', :id => '1', :page => 'CookBook_documentation', :version => '2'
211 )
212 end
213
214 160 def test_annotate
215 161 get :annotate, :id => 1, :page => 'CookBook_documentation', :version => 2
216 162 assert_response :success
217 163 assert_template 'annotate'
218 164 # Line 1
219 165 assert_tag :tag => 'tr', :child => { :tag => 'th', :attributes => {:class => 'line-num'}, :content => '1' },
220 166 :child => { :tag => 'td', :attributes => {:class => 'author'}, :content => /John Smith/ },
221 167 :child => { :tag => 'td', :content => /h1\. CookBook documentation/ }
222 168 # Line 2
223 169 assert_tag :tag => 'tr', :child => { :tag => 'th', :attributes => {:class => 'line-num'}, :content => '2' },
224 170 :child => { :tag => 'td', :attributes => {:class => 'author'}, :content => /redMine Admin/ },
225 171 :child => { :tag => 'td', :content => /Some updated \[\[documentation\]\] here/ }
226 172 end
227 173
228 def test_rename_routing
229 assert_routing(
230 {:method => :get, :path => '/projects/22/wiki/ladida/rename'},
231 :controller => 'wiki', :action => 'rename', :id => '22', :page => 'ladida'
232 )
233 assert_recognizes(
234 #TODO: should be moved into a update action and use a PUT to the page URI
235 {:controller => 'wiki', :action => 'rename', :id => '22', :page => 'ladida'},
236 {:method => :post, :path => '/projects/22/wiki/ladida/rename'}
237 )
238 end
239
240 174 def test_rename_with_redirect
241 175 @request.session[:user_id] = 2
242 176 post :rename, :id => 1, :page => 'Another_page',
243 177 :wiki_page => { :title => 'Another renamed page',
244 178 :redirect_existing_links => 1 }
245 179 assert_redirected_to :action => 'index', :id => 'ecookbook', :page => 'Another_renamed_page'
246 180 wiki = Project.find(1).wiki
247 181 # Check redirects
248 182 assert_not_nil wiki.find_page('Another page')
249 183 assert_nil wiki.find_page('Another page', :with_redirect => false)
250 184 end
251 185
252 186 def test_rename_without_redirect
253 187 @request.session[:user_id] = 2
254 188 post :rename, :id => 1, :page => 'Another_page',
255 189 :wiki_page => { :title => 'Another renamed page',
256 190 :redirect_existing_links => "0" }
257 191 assert_redirected_to :action => 'index', :id => 'ecookbook', :page => 'Another_renamed_page'
258 192 wiki = Project.find(1).wiki
259 193 # Check that there's no redirects
260 194 assert_nil wiki.find_page('Another page')
261 195 end
262 196
263 def test_destroy_routing
264 assert_recognizes(
265 #TODO: should use DELETE on page URI
266 {:controller => 'wiki', :action => 'destroy', :id => '22', :page => 'ladida'},
267 {:method => :post, :path => 'projects/22/wiki/ladida/destroy'}
268 )
269 end
270
271 197 def test_destroy_child
272 198 @request.session[:user_id] = 2
273 199 post :destroy, :id => 1, :page => 'Child_1'
274 200 assert_redirected_to :action => 'special', :id => 'ecookbook', :page => 'Page_index'
275 201 end
276 202
277 203 def test_destroy_parent
278 204 @request.session[:user_id] = 2
279 205 assert_no_difference('WikiPage.count') do
280 206 post :destroy, :id => 1, :page => 'Another_page'
281 207 end
282 208 assert_response :success
283 209 assert_template 'destroy'
284 210 end
285 211
286 212 def test_destroy_parent_with_nullify
287 213 @request.session[:user_id] = 2
288 214 assert_difference('WikiPage.count', -1) do
289 215 post :destroy, :id => 1, :page => 'Another_page', :todo => 'nullify'
290 216 end
291 217 assert_redirected_to :action => 'special', :id => 'ecookbook', :page => 'Page_index'
292 218 assert_nil WikiPage.find_by_id(2)
293 219 end
294 220
295 221 def test_destroy_parent_with_cascade
296 222 @request.session[:user_id] = 2
297 223 assert_difference('WikiPage.count', -3) do
298 224 post :destroy, :id => 1, :page => 'Another_page', :todo => 'destroy'
299 225 end
300 226 assert_redirected_to :action => 'special', :id => 'ecookbook', :page => 'Page_index'
301 227 assert_nil WikiPage.find_by_id(2)
302 228 assert_nil WikiPage.find_by_id(5)
303 229 end
304 230
305 231 def test_destroy_parent_with_reassign
306 232 @request.session[:user_id] = 2
307 233 assert_difference('WikiPage.count', -1) do
308 234 post :destroy, :id => 1, :page => 'Another_page', :todo => 'reassign', :reassign_to_id => 1
309 235 end
310 236 assert_redirected_to :action => 'special', :id => 'ecookbook', :page => 'Page_index'
311 237 assert_nil WikiPage.find_by_id(2)
312 238 assert_equal WikiPage.find(1), WikiPage.find_by_id(5).parent
313 239 end
314 240
315 def test_special_routing
316 assert_routing(
317 {:method => :get, :path => '/projects/567/wiki/page_index'},
318 :controller => 'wiki', :action => 'special', :id => '567', :page => 'page_index'
319 )
320 assert_routing(
321 {:method => :get, :path => '/projects/567/wiki/Page_Index'},
322 :controller => 'wiki', :action => 'special', :id => '567', :page => 'Page_Index'
323 )
324 assert_routing(
325 {:method => :get, :path => '/projects/567/wiki/date_index'},
326 :controller => 'wiki', :action => 'special', :id => '567', :page => 'date_index'
327 )
328 assert_routing(
329 {:method => :get, :path => '/projects/567/wiki/export'},
330 :controller => 'wiki', :action => 'special', :id => '567', :page => 'export'
331 )
332 end
333
334 241 def test_page_index
335 242 get :special, :id => 'ecookbook', :page => 'Page_index'
336 243 assert_response :success
337 244 assert_template 'special_page_index'
338 245 pages = assigns(:pages)
339 246 assert_not_nil pages
340 247 assert_equal Project.find(1).wiki.pages.size, pages.size
341 248
342 249 assert_tag :ul, :attributes => { :class => 'pages-hierarchy' },
343 250 :child => { :tag => 'li', :child => { :tag => 'a', :attributes => { :href => '/projects/ecookbook/wiki/CookBook_documentation' },
344 251 :content => 'CookBook documentation' },
345 252 :child => { :tag => 'ul',
346 253 :child => { :tag => 'li',
347 254 :child => { :tag => 'a', :attributes => { :href => '/projects/ecookbook/wiki/Page_with_an_inline_image' },
348 255 :content => 'Page with an inline image' } } } },
349 256 :child => { :tag => 'li', :child => { :tag => 'a', :attributes => { :href => '/projects/ecookbook/wiki/Another_page' },
350 257 :content => 'Another page' } }
351 258 end
352 259
353 260 def test_not_found
354 261 get :index, :id => 999
355 262 assert_response 404
356 263 end
357 264
358 def test_protect_routing
359 assert_routing(
360 {:method => :post, :path => 'projects/22/wiki/ladida/protect'},
361 {:controller => 'wiki', :action => 'protect', :id => '22', :page => 'ladida'}
362 )
363 end
364
365 265 def test_protect_page
366 266 page = WikiPage.find_by_wiki_id_and_title(1, 'Another_page')
367 267 assert !page.protected?
368 268 @request.session[:user_id] = 2
369 269 post :protect, :id => 1, :page => page.title, :protected => '1'
370 270 assert_redirected_to :action => 'index', :id => 'ecookbook', :page => 'Another_page'
371 271 assert page.reload.protected?
372 272 end
373 273
374 274 def test_unprotect_page
375 275 page = WikiPage.find_by_wiki_id_and_title(1, 'CookBook_documentation')
376 276 assert page.protected?
377 277 @request.session[:user_id] = 2
378 278 post :protect, :id => 1, :page => page.title, :protected => '0'
379 279 assert_redirected_to :action => 'index', :id => 'ecookbook', :page => 'CookBook_documentation'
380 280 assert !page.reload.protected?
381 281 end
382 282
383 283 def test_show_page_with_edit_link
384 284 @request.session[:user_id] = 2
385 285 get :index, :id => 1
386 286 assert_response :success
387 287 assert_template 'show'
388 288 assert_tag :tag => 'a', :attributes => { :href => '/projects/1/wiki/CookBook_documentation/edit' }
389 289 end
390 290
391 291 def test_show_page_without_edit_link
392 292 @request.session[:user_id] = 4
393 293 get :index, :id => 1
394 294 assert_response :success
395 295 assert_template 'show'
396 296 assert_no_tag :tag => 'a', :attributes => { :href => '/projects/1/wiki/CookBook_documentation/edit' }
397 297 end
398 298
399 299 def test_edit_unprotected_page
400 300 # Non members can edit unprotected wiki pages
401 301 @request.session[:user_id] = 4
402 302 get :edit, :id => 1, :page => 'Another_page'
403 303 assert_response :success
404 304 assert_template 'edit'
405 305 end
406 306
407 307 def test_edit_protected_page_by_nonmember
408 308 # Non members can't edit protected wiki pages
409 309 @request.session[:user_id] = 4
410 310 get :edit, :id => 1, :page => 'CookBook_documentation'
411 311 assert_response 403
412 312 end
413 313
414 314 def test_edit_protected_page_by_member
415 315 @request.session[:user_id] = 2
416 316 get :edit, :id => 1, :page => 'CookBook_documentation'
417 317 assert_response :success
418 318 assert_template 'edit'
419 319 end
420 320
421 321 def test_history_of_non_existing_page_should_return_404
422 322 get :history, :id => 1, :page => 'Unknown_page'
423 323 assert_response 404
424 324 end
425 325 end
@@ -1,68 +1,114
1 1 # redMine - project management software
2 2 # Copyright (C) 2006-2010 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.dirname(__FILE__)}/../test_helper"
19 19
20 20 class RoutingTest < ActionController::IntegrationTest
21 21 context "issues" do
22 22 # REST actions
23 23 should_route :get, "/issues", :controller => 'issues', :action => 'index'
24 24 should_route :get, "/issues.pdf", :controller => 'issues', :action => 'index', :format => 'pdf'
25 25 should_route :get, "/issues.atom", :controller => 'issues', :action => 'index', :format => 'atom'
26 26 should_route :get, "/issues.xml", :controller => 'issues', :action => 'index', :format => 'xml'
27 27 should_route :get, "/projects/23/issues", :controller => 'issues', :action => 'index', :project_id => '23'
28 28 should_route :get, "/projects/23/issues.pdf", :controller => 'issues', :action => 'index', :project_id => '23', :format => 'pdf'
29 29 should_route :get, "/projects/23/issues.atom", :controller => 'issues', :action => 'index', :project_id => '23', :format => 'atom'
30 30 should_route :get, "/projects/23/issues.xml", :controller => 'issues', :action => 'index', :project_id => '23', :format => 'xml'
31 31 should_route :get, "/issues/64", :controller => 'issues', :action => 'show', :id => '64'
32 32 should_route :get, "/issues/64.pdf", :controller => 'issues', :action => 'show', :id => '64', :format => 'pdf'
33 33 should_route :get, "/issues/64.atom", :controller => 'issues', :action => 'show', :id => '64', :format => 'atom'
34 34 should_route :get, "/issues/64.xml", :controller => 'issues', :action => 'show', :id => '64', :format => 'xml'
35 35
36 36 should_route :get, "/projects/23/issues/new", :controller => 'issues', :action => 'new', :project_id => '23'
37 37
38 38 should_route :get, "/issues/64/edit", :controller => 'issues', :action => 'edit', :id => '64'
39 39 # TODO: Should use PUT
40 40 should_route :post, "/issues/64/edit", :controller => 'issues', :action => 'edit', :id => '64'
41 41
42 42 # TODO: Should use DELETE
43 43 should_route :post, "/issues/64/destroy", :controller => 'issues', :action => 'destroy', :id => '64'
44 44
45 45 # Extra actions
46 46 should_route :get, "/projects/23/issues/64/copy", :controller => 'issues', :action => 'new', :project_id => '23', :copy_from => '64'
47 47
48 48 should_route :get, "/issues/1/move", :controller => 'issues', :action => 'move', :id => '1'
49 49 should_route :post, "/issues/1/move", :controller => 'issues', :action => 'move', :id => '1'
50 50
51 51 should_route :post, "/issues/1/quoted", :controller => 'issues', :action => 'reply', :id => '1'
52 52
53 53 should_route :get, "/issues/calendar", :controller => 'issues', :action => 'calendar'
54 54 should_route :post, "/issues/calendar", :controller => 'issues', :action => 'calendar'
55 55 should_route :get, "/projects/project-name/issues/calendar", :controller => 'issues', :action => 'calendar', :project_id => 'project-name'
56 56 should_route :post, "/projects/project-name/issues/calendar", :controller => 'issues', :action => 'calendar', :project_id => 'project-name'
57 57
58 58 should_route :get, "/issues/gantt", :controller => 'issues', :action => 'gantt'
59 59 should_route :post, "/issues/gantt", :controller => 'issues', :action => 'gantt'
60 60 should_route :get, "/projects/project-name/issues/gantt", :controller => 'issues', :action => 'gantt', :project_id => 'project-name'
61 61 should_route :post, "/projects/project-name/issues/gantt", :controller => 'issues', :action => 'gantt', :project_id => 'project-name'
62
63 should_route :get, "/issues/auto_complete", :controller => 'issues', :action => 'auto_complete'
62 64 end
63 65
64 66 context "issue reports" do
65 67 should_route :get, "/projects/567/issues/report", :controller => 'reports', :action => 'issue_report', :id => '567'
66 68 should_route :get, "/projects/567/issues/report/assigned_to", :controller => 'reports', :action => 'issue_report_details', :id => '567', :detail => 'assigned_to'
67 69 end
70
71 context "users" do
72 should_route :get, "/users", :controller => 'users', :action => 'index'
73 should_route :get, "/users/44", :controller => 'users', :action => 'show', :id => '44'
74 should_route :get, "/users/new", :controller => 'users', :action => 'add'
75 should_route :get, "/users/444/edit", :controller => 'users', :action => 'edit', :id => '444'
76 should_route :get, "/users/222/edit/membership", :controller => 'users', :action => 'edit', :id => '222', :tab => 'membership'
77
78 should_route :post, "/users/new", :controller => 'users', :action => 'add'
79 should_route :post, "/users/444/edit", :controller => 'users', :action => 'edit', :id => '444'
80 should_route :post, "/users/123/memberships", :controller => 'users', :action => 'edit_membership', :id => '123'
81 should_route :post, "/users/123/memberships/55", :controller => 'users', :action => 'edit_membership', :id => '123', :membership_id => '55'
82 should_route :post, "/users/567/memberships/12/destroy", :controller => 'users', :action => 'destroy_membership', :id => '567', :membership_id => '12'
83 end
84
85 context "versions" do
86 should_route :get, "/projects/foo/versions/new", :controller => 'versions', :action => 'new', :project_id => 'foo'
87
88 should_route :post, "/projects/foo/versions/new", :controller => 'versions', :action => 'new', :project_id => 'foo'
89 end
90
91 context "wikis" do
92 should_route :get, "/projects/567/wiki", :controller => 'wiki', :action => 'index', :id => '567'
93 should_route :get, "/projects/567/wiki/lalala", :controller => 'wiki', :action => 'index', :id => '567', :page => 'lalala'
94 should_route :get, "/projects/567/wiki/my_page/edit", :controller => 'wiki', :action => 'edit', :id => '567', :page => 'my_page'
95 should_route :get, "/projects/1/wiki/CookBook_documentation/history", :controller => 'wiki', :action => 'history', :id => '1', :page => 'CookBook_documentation'
96 should_route :get, "/projects/1/wiki/CookBook_documentation/diff/2/vs/1", :controller => 'wiki', :action => 'diff', :id => '1', :page => 'CookBook_documentation', :version => '2', :version_from => '1'
97 should_route :get, "/projects/1/wiki/CookBook_documentation/annotate/2", :controller => 'wiki', :action => 'annotate', :id => '1', :page => 'CookBook_documentation', :version => '2'
98 should_route :get, "/projects/22/wiki/ladida/rename", :controller => 'wiki', :action => 'rename', :id => '22', :page => 'ladida'
99 should_route :get, "/projects/567/wiki/page_index", :controller => 'wiki', :action => 'special', :id => '567', :page => 'page_index'
100 should_route :get, "/projects/567/wiki/Page_Index", :controller => 'wiki', :action => 'special', :id => '567', :page => 'Page_Index'
101 should_route :get, "/projects/567/wiki/date_index", :controller => 'wiki', :action => 'special', :id => '567', :page => 'date_index'
102 should_route :get, "/projects/567/wiki/export", :controller => 'wiki', :action => 'special', :id => '567', :page => 'export'
103
104 should_route :post, "/projects/567/wiki/my_page/edit", :controller => 'wiki', :action => 'edit', :id => '567', :page => 'my_page'
105 should_route :post, "/projects/567/wiki/CookBook_documentation/preview", :controller => 'wiki', :action => 'preview', :id => '567', :page => 'CookBook_documentation'
106 should_route :post, "/projects/22/wiki/ladida/rename", :controller => 'wiki', :action => 'rename', :id => '22', :page => 'ladida'
107 should_route :post, "/projects/22/wiki/ladida/destroy", :controller => 'wiki', :action => 'destroy', :id => '22', :page => 'ladida'
108 should_route :post, "/projects/22/wiki/ladida/protect", :controller => 'wiki', :action => 'protect', :id => '22', :page => 'ladida'
109 end
110
111 context "administration panel" do
112 should_route :get, "/admin/projects", :controller => 'admin', :action => 'projects'
113 end
68 114 end
General Comments 0
You need to be logged in to leave comments. Login now