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