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