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