##// END OF EJS Templates
Rails4: replace deprecated find_all_by_* at IssuesControllerTest...
Toshi MARUYAMA -
r12352:8c595df5954c
parent child
Show More
@@ -1,3974 +1,3974
1 # Redmine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2013 Jean-Philippe Lang
2 # Copyright (C) 2006-2013 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
19
20 class IssuesControllerTest < ActionController::TestCase
20 class IssuesControllerTest < ActionController::TestCase
21 fixtures :projects,
21 fixtures :projects,
22 :users,
22 :users,
23 :roles,
23 :roles,
24 :members,
24 :members,
25 :member_roles,
25 :member_roles,
26 :issues,
26 :issues,
27 :issue_statuses,
27 :issue_statuses,
28 :versions,
28 :versions,
29 :trackers,
29 :trackers,
30 :projects_trackers,
30 :projects_trackers,
31 :issue_categories,
31 :issue_categories,
32 :enabled_modules,
32 :enabled_modules,
33 :enumerations,
33 :enumerations,
34 :attachments,
34 :attachments,
35 :workflows,
35 :workflows,
36 :custom_fields,
36 :custom_fields,
37 :custom_values,
37 :custom_values,
38 :custom_fields_projects,
38 :custom_fields_projects,
39 :custom_fields_trackers,
39 :custom_fields_trackers,
40 :time_entries,
40 :time_entries,
41 :journals,
41 :journals,
42 :journal_details,
42 :journal_details,
43 :queries,
43 :queries,
44 :repositories,
44 :repositories,
45 :changesets
45 :changesets
46
46
47 include Redmine::I18n
47 include Redmine::I18n
48
48
49 def setup
49 def setup
50 User.current = nil
50 User.current = nil
51 end
51 end
52
52
53 def test_index
53 def test_index
54 with_settings :default_language => "en" do
54 with_settings :default_language => "en" do
55 get :index
55 get :index
56 assert_response :success
56 assert_response :success
57 assert_template 'index'
57 assert_template 'index'
58 assert_not_nil assigns(:issues)
58 assert_not_nil assigns(:issues)
59 assert_nil assigns(:project)
59 assert_nil assigns(:project)
60
60
61 # links to visible issues
61 # links to visible issues
62 assert_select 'a[href=/issues/1]', :text => /Can&#x27;t print recipes/
62 assert_select 'a[href=/issues/1]', :text => /Can&#x27;t print recipes/
63 assert_select 'a[href=/issues/5]', :text => /Subproject issue/
63 assert_select 'a[href=/issues/5]', :text => /Subproject issue/
64 # private projects hidden
64 # private projects hidden
65 assert_select 'a[href=/issues/6]', 0
65 assert_select 'a[href=/issues/6]', 0
66 assert_select 'a[href=/issues/4]', 0
66 assert_select 'a[href=/issues/4]', 0
67 # project column
67 # project column
68 assert_select 'th', :text => /Project/
68 assert_select 'th', :text => /Project/
69 end
69 end
70 end
70 end
71
71
72 def test_index_should_not_list_issues_when_module_disabled
72 def test_index_should_not_list_issues_when_module_disabled
73 EnabledModule.delete_all("name = 'issue_tracking' AND project_id = 1")
73 EnabledModule.delete_all("name = 'issue_tracking' AND project_id = 1")
74 get :index
74 get :index
75 assert_response :success
75 assert_response :success
76 assert_template 'index'
76 assert_template 'index'
77 assert_not_nil assigns(:issues)
77 assert_not_nil assigns(:issues)
78 assert_nil assigns(:project)
78 assert_nil assigns(:project)
79
79
80 assert_select 'a[href=/issues/1]', 0
80 assert_select 'a[href=/issues/1]', 0
81 assert_select 'a[href=/issues/5]', :text => /Subproject issue/
81 assert_select 'a[href=/issues/5]', :text => /Subproject issue/
82 end
82 end
83
83
84 def test_index_should_list_visible_issues_only
84 def test_index_should_list_visible_issues_only
85 get :index, :per_page => 100
85 get :index, :per_page => 100
86 assert_response :success
86 assert_response :success
87 assert_not_nil assigns(:issues)
87 assert_not_nil assigns(:issues)
88 assert_nil assigns(:issues).detect {|issue| !issue.visible?}
88 assert_nil assigns(:issues).detect {|issue| !issue.visible?}
89 end
89 end
90
90
91 def test_index_with_project
91 def test_index_with_project
92 Setting.display_subprojects_issues = 0
92 Setting.display_subprojects_issues = 0
93 get :index, :project_id => 1
93 get :index, :project_id => 1
94 assert_response :success
94 assert_response :success
95 assert_template 'index'
95 assert_template 'index'
96 assert_not_nil assigns(:issues)
96 assert_not_nil assigns(:issues)
97
97
98 assert_select 'a[href=/issues/1]', :text => /Can&#x27;t print recipes/
98 assert_select 'a[href=/issues/1]', :text => /Can&#x27;t print recipes/
99 assert_select 'a[href=/issues/5]', 0
99 assert_select 'a[href=/issues/5]', 0
100 end
100 end
101
101
102 def test_index_with_project_and_subprojects
102 def test_index_with_project_and_subprojects
103 Setting.display_subprojects_issues = 1
103 Setting.display_subprojects_issues = 1
104 get :index, :project_id => 1
104 get :index, :project_id => 1
105 assert_response :success
105 assert_response :success
106 assert_template 'index'
106 assert_template 'index'
107 assert_not_nil assigns(:issues)
107 assert_not_nil assigns(:issues)
108
108
109 assert_select 'a[href=/issues/1]', :text => /Can&#x27;t print recipes/
109 assert_select 'a[href=/issues/1]', :text => /Can&#x27;t print recipes/
110 assert_select 'a[href=/issues/5]', :text => /Subproject issue/
110 assert_select 'a[href=/issues/5]', :text => /Subproject issue/
111 assert_select 'a[href=/issues/6]', 0
111 assert_select 'a[href=/issues/6]', 0
112 end
112 end
113
113
114 def test_index_with_project_and_subprojects_should_show_private_subprojects_with_permission
114 def test_index_with_project_and_subprojects_should_show_private_subprojects_with_permission
115 @request.session[:user_id] = 2
115 @request.session[:user_id] = 2
116 Setting.display_subprojects_issues = 1
116 Setting.display_subprojects_issues = 1
117 get :index, :project_id => 1
117 get :index, :project_id => 1
118 assert_response :success
118 assert_response :success
119 assert_template 'index'
119 assert_template 'index'
120 assert_not_nil assigns(:issues)
120 assert_not_nil assigns(:issues)
121
121
122 assert_select 'a[href=/issues/1]', :text => /Can&#x27;t print recipes/
122 assert_select 'a[href=/issues/1]', :text => /Can&#x27;t print recipes/
123 assert_select 'a[href=/issues/5]', :text => /Subproject issue/
123 assert_select 'a[href=/issues/5]', :text => /Subproject issue/
124 assert_select 'a[href=/issues/6]', :text => /Issue of a private subproject/
124 assert_select 'a[href=/issues/6]', :text => /Issue of a private subproject/
125 end
125 end
126
126
127 def test_index_with_project_and_default_filter
127 def test_index_with_project_and_default_filter
128 get :index, :project_id => 1, :set_filter => 1
128 get :index, :project_id => 1, :set_filter => 1
129 assert_response :success
129 assert_response :success
130 assert_template 'index'
130 assert_template 'index'
131 assert_not_nil assigns(:issues)
131 assert_not_nil assigns(:issues)
132
132
133 query = assigns(:query)
133 query = assigns(:query)
134 assert_not_nil query
134 assert_not_nil query
135 # default filter
135 # default filter
136 assert_equal({'status_id' => {:operator => 'o', :values => ['']}}, query.filters)
136 assert_equal({'status_id' => {:operator => 'o', :values => ['']}}, query.filters)
137 end
137 end
138
138
139 def test_index_with_project_and_filter
139 def test_index_with_project_and_filter
140 get :index, :project_id => 1, :set_filter => 1,
140 get :index, :project_id => 1, :set_filter => 1,
141 :f => ['tracker_id'],
141 :f => ['tracker_id'],
142 :op => {'tracker_id' => '='},
142 :op => {'tracker_id' => '='},
143 :v => {'tracker_id' => ['1']}
143 :v => {'tracker_id' => ['1']}
144 assert_response :success
144 assert_response :success
145 assert_template 'index'
145 assert_template 'index'
146 assert_not_nil assigns(:issues)
146 assert_not_nil assigns(:issues)
147
147
148 query = assigns(:query)
148 query = assigns(:query)
149 assert_not_nil query
149 assert_not_nil query
150 assert_equal({'tracker_id' => {:operator => '=', :values => ['1']}}, query.filters)
150 assert_equal({'tracker_id' => {:operator => '=', :values => ['1']}}, query.filters)
151 end
151 end
152
152
153 def test_index_with_short_filters
153 def test_index_with_short_filters
154 to_test = {
154 to_test = {
155 'status_id' => {
155 'status_id' => {
156 'o' => { :op => 'o', :values => [''] },
156 'o' => { :op => 'o', :values => [''] },
157 'c' => { :op => 'c', :values => [''] },
157 'c' => { :op => 'c', :values => [''] },
158 '7' => { :op => '=', :values => ['7'] },
158 '7' => { :op => '=', :values => ['7'] },
159 '7|3|4' => { :op => '=', :values => ['7', '3', '4'] },
159 '7|3|4' => { :op => '=', :values => ['7', '3', '4'] },
160 '=7' => { :op => '=', :values => ['7'] },
160 '=7' => { :op => '=', :values => ['7'] },
161 '!3' => { :op => '!', :values => ['3'] },
161 '!3' => { :op => '!', :values => ['3'] },
162 '!7|3|4' => { :op => '!', :values => ['7', '3', '4'] }},
162 '!7|3|4' => { :op => '!', :values => ['7', '3', '4'] }},
163 'subject' => {
163 'subject' => {
164 'This is a subject' => { :op => '=', :values => ['This is a subject'] },
164 'This is a subject' => { :op => '=', :values => ['This is a subject'] },
165 'o' => { :op => '=', :values => ['o'] },
165 'o' => { :op => '=', :values => ['o'] },
166 '~This is part of a subject' => { :op => '~', :values => ['This is part of a subject'] },
166 '~This is part of a subject' => { :op => '~', :values => ['This is part of a subject'] },
167 '!~This is part of a subject' => { :op => '!~', :values => ['This is part of a subject'] }},
167 '!~This is part of a subject' => { :op => '!~', :values => ['This is part of a subject'] }},
168 'tracker_id' => {
168 'tracker_id' => {
169 '3' => { :op => '=', :values => ['3'] },
169 '3' => { :op => '=', :values => ['3'] },
170 '=3' => { :op => '=', :values => ['3'] }},
170 '=3' => { :op => '=', :values => ['3'] }},
171 'start_date' => {
171 'start_date' => {
172 '2011-10-12' => { :op => '=', :values => ['2011-10-12'] },
172 '2011-10-12' => { :op => '=', :values => ['2011-10-12'] },
173 '=2011-10-12' => { :op => '=', :values => ['2011-10-12'] },
173 '=2011-10-12' => { :op => '=', :values => ['2011-10-12'] },
174 '>=2011-10-12' => { :op => '>=', :values => ['2011-10-12'] },
174 '>=2011-10-12' => { :op => '>=', :values => ['2011-10-12'] },
175 '<=2011-10-12' => { :op => '<=', :values => ['2011-10-12'] },
175 '<=2011-10-12' => { :op => '<=', :values => ['2011-10-12'] },
176 '><2011-10-01|2011-10-30' => { :op => '><', :values => ['2011-10-01', '2011-10-30'] },
176 '><2011-10-01|2011-10-30' => { :op => '><', :values => ['2011-10-01', '2011-10-30'] },
177 '<t+2' => { :op => '<t+', :values => ['2'] },
177 '<t+2' => { :op => '<t+', :values => ['2'] },
178 '>t+2' => { :op => '>t+', :values => ['2'] },
178 '>t+2' => { :op => '>t+', :values => ['2'] },
179 't+2' => { :op => 't+', :values => ['2'] },
179 't+2' => { :op => 't+', :values => ['2'] },
180 't' => { :op => 't', :values => [''] },
180 't' => { :op => 't', :values => [''] },
181 'w' => { :op => 'w', :values => [''] },
181 'w' => { :op => 'w', :values => [''] },
182 '>t-2' => { :op => '>t-', :values => ['2'] },
182 '>t-2' => { :op => '>t-', :values => ['2'] },
183 '<t-2' => { :op => '<t-', :values => ['2'] },
183 '<t-2' => { :op => '<t-', :values => ['2'] },
184 't-2' => { :op => 't-', :values => ['2'] }},
184 't-2' => { :op => 't-', :values => ['2'] }},
185 'created_on' => {
185 'created_on' => {
186 '>=2011-10-12' => { :op => '>=', :values => ['2011-10-12'] },
186 '>=2011-10-12' => { :op => '>=', :values => ['2011-10-12'] },
187 '<t-2' => { :op => '<t-', :values => ['2'] },
187 '<t-2' => { :op => '<t-', :values => ['2'] },
188 '>t-2' => { :op => '>t-', :values => ['2'] },
188 '>t-2' => { :op => '>t-', :values => ['2'] },
189 't-2' => { :op => 't-', :values => ['2'] }},
189 't-2' => { :op => 't-', :values => ['2'] }},
190 'cf_1' => {
190 'cf_1' => {
191 'c' => { :op => '=', :values => ['c'] },
191 'c' => { :op => '=', :values => ['c'] },
192 '!c' => { :op => '!', :values => ['c'] },
192 '!c' => { :op => '!', :values => ['c'] },
193 '!*' => { :op => '!*', :values => [''] },
193 '!*' => { :op => '!*', :values => [''] },
194 '*' => { :op => '*', :values => [''] }},
194 '*' => { :op => '*', :values => [''] }},
195 'estimated_hours' => {
195 'estimated_hours' => {
196 '=13.4' => { :op => '=', :values => ['13.4'] },
196 '=13.4' => { :op => '=', :values => ['13.4'] },
197 '>=45' => { :op => '>=', :values => ['45'] },
197 '>=45' => { :op => '>=', :values => ['45'] },
198 '<=125' => { :op => '<=', :values => ['125'] },
198 '<=125' => { :op => '<=', :values => ['125'] },
199 '><10.5|20.5' => { :op => '><', :values => ['10.5', '20.5'] },
199 '><10.5|20.5' => { :op => '><', :values => ['10.5', '20.5'] },
200 '!*' => { :op => '!*', :values => [''] },
200 '!*' => { :op => '!*', :values => [''] },
201 '*' => { :op => '*', :values => [''] }}
201 '*' => { :op => '*', :values => [''] }}
202 }
202 }
203
203
204 default_filter = { 'status_id' => {:operator => 'o', :values => [''] }}
204 default_filter = { 'status_id' => {:operator => 'o', :values => [''] }}
205
205
206 to_test.each do |field, expression_and_expected|
206 to_test.each do |field, expression_and_expected|
207 expression_and_expected.each do |filter_expression, expected|
207 expression_and_expected.each do |filter_expression, expected|
208
208
209 get :index, :set_filter => 1, field => filter_expression
209 get :index, :set_filter => 1, field => filter_expression
210
210
211 assert_response :success
211 assert_response :success
212 assert_template 'index'
212 assert_template 'index'
213 assert_not_nil assigns(:issues)
213 assert_not_nil assigns(:issues)
214
214
215 query = assigns(:query)
215 query = assigns(:query)
216 assert_not_nil query
216 assert_not_nil query
217 assert query.has_filter?(field)
217 assert query.has_filter?(field)
218 assert_equal(default_filter.merge({field => {:operator => expected[:op], :values => expected[:values]}}), query.filters)
218 assert_equal(default_filter.merge({field => {:operator => expected[:op], :values => expected[:values]}}), query.filters)
219 end
219 end
220 end
220 end
221 end
221 end
222
222
223 def test_index_with_project_and_empty_filters
223 def test_index_with_project_and_empty_filters
224 get :index, :project_id => 1, :set_filter => 1, :fields => ['']
224 get :index, :project_id => 1, :set_filter => 1, :fields => ['']
225 assert_response :success
225 assert_response :success
226 assert_template 'index'
226 assert_template 'index'
227 assert_not_nil assigns(:issues)
227 assert_not_nil assigns(:issues)
228
228
229 query = assigns(:query)
229 query = assigns(:query)
230 assert_not_nil query
230 assert_not_nil query
231 # no filter
231 # no filter
232 assert_equal({}, query.filters)
232 assert_equal({}, query.filters)
233 end
233 end
234
234
235 def test_index_with_project_custom_field_filter
235 def test_index_with_project_custom_field_filter
236 field = ProjectCustomField.create!(:name => 'Client', :is_filter => true, :field_format => 'string')
236 field = ProjectCustomField.create!(:name => 'Client', :is_filter => true, :field_format => 'string')
237 CustomValue.create!(:custom_field => field, :customized => Project.find(3), :value => 'Foo')
237 CustomValue.create!(:custom_field => field, :customized => Project.find(3), :value => 'Foo')
238 CustomValue.create!(:custom_field => field, :customized => Project.find(5), :value => 'Foo')
238 CustomValue.create!(:custom_field => field, :customized => Project.find(5), :value => 'Foo')
239 filter_name = "project.cf_#{field.id}"
239 filter_name = "project.cf_#{field.id}"
240 @request.session[:user_id] = 1
240 @request.session[:user_id] = 1
241
241
242 get :index, :set_filter => 1,
242 get :index, :set_filter => 1,
243 :f => [filter_name],
243 :f => [filter_name],
244 :op => {filter_name => '='},
244 :op => {filter_name => '='},
245 :v => {filter_name => ['Foo']}
245 :v => {filter_name => ['Foo']}
246 assert_response :success
246 assert_response :success
247 assert_template 'index'
247 assert_template 'index'
248 assert_equal [3, 5], assigns(:issues).map(&:project_id).uniq.sort
248 assert_equal [3, 5], assigns(:issues).map(&:project_id).uniq.sort
249 end
249 end
250
250
251 def test_index_with_query
251 def test_index_with_query
252 get :index, :project_id => 1, :query_id => 5
252 get :index, :project_id => 1, :query_id => 5
253 assert_response :success
253 assert_response :success
254 assert_template 'index'
254 assert_template 'index'
255 assert_not_nil assigns(:issues)
255 assert_not_nil assigns(:issues)
256 assert_nil assigns(:issue_count_by_group)
256 assert_nil assigns(:issue_count_by_group)
257 end
257 end
258
258
259 def test_index_with_query_grouped_by_tracker
259 def test_index_with_query_grouped_by_tracker
260 get :index, :project_id => 1, :query_id => 6
260 get :index, :project_id => 1, :query_id => 6
261 assert_response :success
261 assert_response :success
262 assert_template 'index'
262 assert_template 'index'
263 assert_not_nil assigns(:issues)
263 assert_not_nil assigns(:issues)
264 assert_not_nil assigns(:issue_count_by_group)
264 assert_not_nil assigns(:issue_count_by_group)
265 end
265 end
266
266
267 def test_index_with_query_grouped_by_list_custom_field
267 def test_index_with_query_grouped_by_list_custom_field
268 get :index, :project_id => 1, :query_id => 9
268 get :index, :project_id => 1, :query_id => 9
269 assert_response :success
269 assert_response :success
270 assert_template 'index'
270 assert_template 'index'
271 assert_not_nil assigns(:issues)
271 assert_not_nil assigns(:issues)
272 assert_not_nil assigns(:issue_count_by_group)
272 assert_not_nil assigns(:issue_count_by_group)
273 end
273 end
274
274
275 def test_index_with_query_grouped_by_user_custom_field
275 def test_index_with_query_grouped_by_user_custom_field
276 cf = IssueCustomField.create!(:name => 'User', :is_for_all => true, :tracker_ids => [1,2,3], :field_format => 'user')
276 cf = IssueCustomField.create!(:name => 'User', :is_for_all => true, :tracker_ids => [1,2,3], :field_format => 'user')
277 CustomValue.create!(:custom_field => cf, :customized => Issue.find(1), :value => '2')
277 CustomValue.create!(:custom_field => cf, :customized => Issue.find(1), :value => '2')
278 CustomValue.create!(:custom_field => cf, :customized => Issue.find(2), :value => '3')
278 CustomValue.create!(:custom_field => cf, :customized => Issue.find(2), :value => '3')
279 CustomValue.create!(:custom_field => cf, :customized => Issue.find(3), :value => '3')
279 CustomValue.create!(:custom_field => cf, :customized => Issue.find(3), :value => '3')
280 CustomValue.create!(:custom_field => cf, :customized => Issue.find(5), :value => '')
280 CustomValue.create!(:custom_field => cf, :customized => Issue.find(5), :value => '')
281
281
282 get :index, :project_id => 1, :set_filter => 1, :group_by => "cf_#{cf.id}"
282 get :index, :project_id => 1, :set_filter => 1, :group_by => "cf_#{cf.id}"
283 assert_response :success
283 assert_response :success
284
284
285 assert_select 'tr.group', 3
285 assert_select 'tr.group', 3
286 assert_select 'tr.group' do
286 assert_select 'tr.group' do
287 assert_select 'a', :text => 'John Smith'
287 assert_select 'a', :text => 'John Smith'
288 assert_select 'span.count', :text => '1'
288 assert_select 'span.count', :text => '1'
289 end
289 end
290 assert_select 'tr.group' do
290 assert_select 'tr.group' do
291 assert_select 'a', :text => 'Dave Lopper'
291 assert_select 'a', :text => 'Dave Lopper'
292 assert_select 'span.count', :text => '2'
292 assert_select 'span.count', :text => '2'
293 end
293 end
294 end
294 end
295
295
296 def test_index_with_query_grouped_by_tracker_in_normal_order
296 def test_index_with_query_grouped_by_tracker_in_normal_order
297 3.times {|i| Issue.generate!(:tracker_id => (i + 1))}
297 3.times {|i| Issue.generate!(:tracker_id => (i + 1))}
298
298
299 get :index, :set_filter => 1, :group_by => 'tracker', :sort => 'id:desc'
299 get :index, :set_filter => 1, :group_by => 'tracker', :sort => 'id:desc'
300 assert_response :success
300 assert_response :success
301
301
302 trackers = assigns(:issues).map(&:tracker).uniq
302 trackers = assigns(:issues).map(&:tracker).uniq
303 assert_equal [1, 2, 3], trackers.map(&:id)
303 assert_equal [1, 2, 3], trackers.map(&:id)
304 end
304 end
305
305
306 def test_index_with_query_grouped_by_tracker_in_reverse_order
306 def test_index_with_query_grouped_by_tracker_in_reverse_order
307 3.times {|i| Issue.generate!(:tracker_id => (i + 1))}
307 3.times {|i| Issue.generate!(:tracker_id => (i + 1))}
308
308
309 get :index, :set_filter => 1, :group_by => 'tracker', :sort => 'id:desc,tracker:desc'
309 get :index, :set_filter => 1, :group_by => 'tracker', :sort => 'id:desc,tracker:desc'
310 assert_response :success
310 assert_response :success
311
311
312 trackers = assigns(:issues).map(&:tracker).uniq
312 trackers = assigns(:issues).map(&:tracker).uniq
313 assert_equal [3, 2, 1], trackers.map(&:id)
313 assert_equal [3, 2, 1], trackers.map(&:id)
314 end
314 end
315
315
316 def test_index_with_query_id_and_project_id_should_set_session_query
316 def test_index_with_query_id_and_project_id_should_set_session_query
317 get :index, :project_id => 1, :query_id => 4
317 get :index, :project_id => 1, :query_id => 4
318 assert_response :success
318 assert_response :success
319 assert_kind_of Hash, session[:query]
319 assert_kind_of Hash, session[:query]
320 assert_equal 4, session[:query][:id]
320 assert_equal 4, session[:query][:id]
321 assert_equal 1, session[:query][:project_id]
321 assert_equal 1, session[:query][:project_id]
322 end
322 end
323
323
324 def test_index_with_invalid_query_id_should_respond_404
324 def test_index_with_invalid_query_id_should_respond_404
325 get :index, :project_id => 1, :query_id => 999
325 get :index, :project_id => 1, :query_id => 999
326 assert_response 404
326 assert_response 404
327 end
327 end
328
328
329 def test_index_with_cross_project_query_in_session_should_show_project_issues
329 def test_index_with_cross_project_query_in_session_should_show_project_issues
330 q = IssueQuery.create!(:name => "test", :user_id => 2, :visibility => IssueQuery::VISIBILITY_PRIVATE, :project => nil)
330 q = IssueQuery.create!(:name => "test", :user_id => 2, :visibility => IssueQuery::VISIBILITY_PRIVATE, :project => nil)
331 @request.session[:query] = {:id => q.id, :project_id => 1}
331 @request.session[:query] = {:id => q.id, :project_id => 1}
332
332
333 with_settings :display_subprojects_issues => '0' do
333 with_settings :display_subprojects_issues => '0' do
334 get :index, :project_id => 1
334 get :index, :project_id => 1
335 end
335 end
336 assert_response :success
336 assert_response :success
337 assert_not_nil assigns(:query)
337 assert_not_nil assigns(:query)
338 assert_equal q.id, assigns(:query).id
338 assert_equal q.id, assigns(:query).id
339 assert_equal 1, assigns(:query).project_id
339 assert_equal 1, assigns(:query).project_id
340 assert_equal [1], assigns(:issues).map(&:project_id).uniq
340 assert_equal [1], assigns(:issues).map(&:project_id).uniq
341 end
341 end
342
342
343 def test_private_query_should_not_be_available_to_other_users
343 def test_private_query_should_not_be_available_to_other_users
344 q = IssueQuery.create!(:name => "private", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PRIVATE, :project => nil)
344 q = IssueQuery.create!(:name => "private", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PRIVATE, :project => nil)
345 @request.session[:user_id] = 3
345 @request.session[:user_id] = 3
346
346
347 get :index, :query_id => q.id
347 get :index, :query_id => q.id
348 assert_response 403
348 assert_response 403
349 end
349 end
350
350
351 def test_private_query_should_be_available_to_its_user
351 def test_private_query_should_be_available_to_its_user
352 q = IssueQuery.create!(:name => "private", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PRIVATE, :project => nil)
352 q = IssueQuery.create!(:name => "private", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PRIVATE, :project => nil)
353 @request.session[:user_id] = 2
353 @request.session[:user_id] = 2
354
354
355 get :index, :query_id => q.id
355 get :index, :query_id => q.id
356 assert_response :success
356 assert_response :success
357 end
357 end
358
358
359 def test_public_query_should_be_available_to_other_users
359 def test_public_query_should_be_available_to_other_users
360 q = IssueQuery.create!(:name => "private", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => nil)
360 q = IssueQuery.create!(:name => "private", :user => User.find(2), :visibility => IssueQuery::VISIBILITY_PUBLIC, :project => nil)
361 @request.session[:user_id] = 3
361 @request.session[:user_id] = 3
362
362
363 get :index, :query_id => q.id
363 get :index, :query_id => q.id
364 assert_response :success
364 assert_response :success
365 end
365 end
366
366
367 def test_index_should_omit_page_param_in_export_links
367 def test_index_should_omit_page_param_in_export_links
368 get :index, :page => 2
368 get :index, :page => 2
369 assert_response :success
369 assert_response :success
370 assert_select 'a.atom[href=/issues.atom]'
370 assert_select 'a.atom[href=/issues.atom]'
371 assert_select 'a.csv[href=/issues.csv]'
371 assert_select 'a.csv[href=/issues.csv]'
372 assert_select 'a.pdf[href=/issues.pdf]'
372 assert_select 'a.pdf[href=/issues.pdf]'
373 assert_select 'form#csv-export-form[action=/issues.csv]'
373 assert_select 'form#csv-export-form[action=/issues.csv]'
374 end
374 end
375
375
376 def test_index_csv
376 def test_index_csv
377 get :index, :format => 'csv'
377 get :index, :format => 'csv'
378 assert_response :success
378 assert_response :success
379 assert_not_nil assigns(:issues)
379 assert_not_nil assigns(:issues)
380 assert_equal 'text/csv; header=present', @response.content_type
380 assert_equal 'text/csv; header=present', @response.content_type
381 assert @response.body.starts_with?("#,")
381 assert @response.body.starts_with?("#,")
382 lines = @response.body.chomp.split("\n")
382 lines = @response.body.chomp.split("\n")
383 assert_equal assigns(:query).columns.size, lines[0].split(',').size
383 assert_equal assigns(:query).columns.size, lines[0].split(',').size
384 end
384 end
385
385
386 def test_index_csv_with_project
386 def test_index_csv_with_project
387 get :index, :project_id => 1, :format => 'csv'
387 get :index, :project_id => 1, :format => 'csv'
388 assert_response :success
388 assert_response :success
389 assert_not_nil assigns(:issues)
389 assert_not_nil assigns(:issues)
390 assert_equal 'text/csv; header=present', @response.content_type
390 assert_equal 'text/csv; header=present', @response.content_type
391 end
391 end
392
392
393 def test_index_csv_with_description
393 def test_index_csv_with_description
394 Issue.generate!(:description => 'test_index_csv_with_description')
394 Issue.generate!(:description => 'test_index_csv_with_description')
395
395
396 with_settings :default_language => 'en' do
396 with_settings :default_language => 'en' do
397 get :index, :format => 'csv', :description => '1'
397 get :index, :format => 'csv', :description => '1'
398 assert_response :success
398 assert_response :success
399 assert_not_nil assigns(:issues)
399 assert_not_nil assigns(:issues)
400 end
400 end
401
401
402 assert_equal 'text/csv; header=present', response.content_type
402 assert_equal 'text/csv; header=present', response.content_type
403 headers = response.body.chomp.split("\n").first.split(',')
403 headers = response.body.chomp.split("\n").first.split(',')
404 assert_include 'Description', headers
404 assert_include 'Description', headers
405 assert_include 'test_index_csv_with_description', response.body
405 assert_include 'test_index_csv_with_description', response.body
406 end
406 end
407
407
408 def test_index_csv_with_spent_time_column
408 def test_index_csv_with_spent_time_column
409 issue = Issue.create!(:project_id => 1, :tracker_id => 1, :subject => 'test_index_csv_with_spent_time_column', :author_id => 2)
409 issue = Issue.create!(:project_id => 1, :tracker_id => 1, :subject => 'test_index_csv_with_spent_time_column', :author_id => 2)
410 TimeEntry.create!(:project => issue.project, :issue => issue, :hours => 7.33, :user => User.find(2), :spent_on => Date.today)
410 TimeEntry.create!(:project => issue.project, :issue => issue, :hours => 7.33, :user => User.find(2), :spent_on => Date.today)
411
411
412 get :index, :format => 'csv', :set_filter => '1', :c => %w(subject spent_hours)
412 get :index, :format => 'csv', :set_filter => '1', :c => %w(subject spent_hours)
413 assert_response :success
413 assert_response :success
414 assert_equal 'text/csv; header=present', @response.content_type
414 assert_equal 'text/csv; header=present', @response.content_type
415 lines = @response.body.chomp.split("\n")
415 lines = @response.body.chomp.split("\n")
416 assert_include "#{issue.id},#{issue.subject},7.33", lines
416 assert_include "#{issue.id},#{issue.subject},7.33", lines
417 end
417 end
418
418
419 def test_index_csv_with_all_columns
419 def test_index_csv_with_all_columns
420 get :index, :format => 'csv', :columns => 'all'
420 get :index, :format => 'csv', :columns => 'all'
421 assert_response :success
421 assert_response :success
422 assert_not_nil assigns(:issues)
422 assert_not_nil assigns(:issues)
423 assert_equal 'text/csv; header=present', @response.content_type
423 assert_equal 'text/csv; header=present', @response.content_type
424 assert_match /\A#,/, response.body
424 assert_match /\A#,/, response.body
425 lines = response.body.chomp.split("\n")
425 lines = response.body.chomp.split("\n")
426 assert_equal assigns(:query).available_inline_columns.size, lines[0].split(',').size
426 assert_equal assigns(:query).available_inline_columns.size, lines[0].split(',').size
427 end
427 end
428
428
429 def test_index_csv_with_multi_column_field
429 def test_index_csv_with_multi_column_field
430 CustomField.find(1).update_attribute :multiple, true
430 CustomField.find(1).update_attribute :multiple, true
431 issue = Issue.find(1)
431 issue = Issue.find(1)
432 issue.custom_field_values = {1 => ['MySQL', 'Oracle']}
432 issue.custom_field_values = {1 => ['MySQL', 'Oracle']}
433 issue.save!
433 issue.save!
434
434
435 get :index, :format => 'csv', :columns => 'all'
435 get :index, :format => 'csv', :columns => 'all'
436 assert_response :success
436 assert_response :success
437 lines = @response.body.chomp.split("\n")
437 lines = @response.body.chomp.split("\n")
438 assert lines.detect {|line| line.include?('"MySQL, Oracle"')}
438 assert lines.detect {|line| line.include?('"MySQL, Oracle"')}
439 end
439 end
440
440
441 def test_index_csv_should_format_float_custom_fields_with_csv_decimal_separator
441 def test_index_csv_should_format_float_custom_fields_with_csv_decimal_separator
442 field = IssueCustomField.create!(:name => 'Float', :is_for_all => true, :tracker_ids => [1], :field_format => 'float')
442 field = IssueCustomField.create!(:name => 'Float', :is_for_all => true, :tracker_ids => [1], :field_format => 'float')
443 issue = Issue.generate!(:project_id => 1, :tracker_id => 1, :custom_field_values => {field.id => '185.6'})
443 issue = Issue.generate!(:project_id => 1, :tracker_id => 1, :custom_field_values => {field.id => '185.6'})
444
444
445 with_settings :default_language => 'fr' do
445 with_settings :default_language => 'fr' do
446 get :index, :format => 'csv', :columns => 'all'
446 get :index, :format => 'csv', :columns => 'all'
447 assert_response :success
447 assert_response :success
448 issue_line = response.body.chomp.split("\n").map {|line| line.split(';')}.detect {|line| line[0]==issue.id.to_s}
448 issue_line = response.body.chomp.split("\n").map {|line| line.split(';')}.detect {|line| line[0]==issue.id.to_s}
449 assert_include '185,60', issue_line
449 assert_include '185,60', issue_line
450 end
450 end
451
451
452 with_settings :default_language => 'en' do
452 with_settings :default_language => 'en' do
453 get :index, :format => 'csv', :columns => 'all'
453 get :index, :format => 'csv', :columns => 'all'
454 assert_response :success
454 assert_response :success
455 issue_line = response.body.chomp.split("\n").map {|line| line.split(',')}.detect {|line| line[0]==issue.id.to_s}
455 issue_line = response.body.chomp.split("\n").map {|line| line.split(',')}.detect {|line| line[0]==issue.id.to_s}
456 assert_include '185.60', issue_line
456 assert_include '185.60', issue_line
457 end
457 end
458 end
458 end
459
459
460 def test_index_csv_big_5
460 def test_index_csv_big_5
461 with_settings :default_language => "zh-TW" do
461 with_settings :default_language => "zh-TW" do
462 str_utf8 = "\xe4\xb8\x80\xe6\x9c\x88"
462 str_utf8 = "\xe4\xb8\x80\xe6\x9c\x88"
463 str_big5 = "\xa4@\xa4\xeb"
463 str_big5 = "\xa4@\xa4\xeb"
464 if str_utf8.respond_to?(:force_encoding)
464 if str_utf8.respond_to?(:force_encoding)
465 str_utf8.force_encoding('UTF-8')
465 str_utf8.force_encoding('UTF-8')
466 str_big5.force_encoding('Big5')
466 str_big5.force_encoding('Big5')
467 end
467 end
468 issue = Issue.generate!(:subject => str_utf8)
468 issue = Issue.generate!(:subject => str_utf8)
469
469
470 get :index, :project_id => 1,
470 get :index, :project_id => 1,
471 :f => ['subject'],
471 :f => ['subject'],
472 :op => '=', :values => [str_utf8],
472 :op => '=', :values => [str_utf8],
473 :format => 'csv'
473 :format => 'csv'
474 assert_equal 'text/csv; header=present', @response.content_type
474 assert_equal 'text/csv; header=present', @response.content_type
475 lines = @response.body.chomp.split("\n")
475 lines = @response.body.chomp.split("\n")
476 s1 = "\xaa\xac\xbaA"
476 s1 = "\xaa\xac\xbaA"
477 if str_utf8.respond_to?(:force_encoding)
477 if str_utf8.respond_to?(:force_encoding)
478 s1.force_encoding('Big5')
478 s1.force_encoding('Big5')
479 end
479 end
480 assert_include s1, lines[0]
480 assert_include s1, lines[0]
481 assert_include str_big5, lines[1]
481 assert_include str_big5, lines[1]
482 end
482 end
483 end
483 end
484
484
485 def test_index_csv_cannot_convert_should_be_replaced_big_5
485 def test_index_csv_cannot_convert_should_be_replaced_big_5
486 with_settings :default_language => "zh-TW" do
486 with_settings :default_language => "zh-TW" do
487 str_utf8 = "\xe4\xbb\xa5\xe5\x86\x85"
487 str_utf8 = "\xe4\xbb\xa5\xe5\x86\x85"
488 if str_utf8.respond_to?(:force_encoding)
488 if str_utf8.respond_to?(:force_encoding)
489 str_utf8.force_encoding('UTF-8')
489 str_utf8.force_encoding('UTF-8')
490 end
490 end
491 issue = Issue.generate!(:subject => str_utf8)
491 issue = Issue.generate!(:subject => str_utf8)
492
492
493 get :index, :project_id => 1,
493 get :index, :project_id => 1,
494 :f => ['subject'],
494 :f => ['subject'],
495 :op => '=', :values => [str_utf8],
495 :op => '=', :values => [str_utf8],
496 :c => ['status', 'subject'],
496 :c => ['status', 'subject'],
497 :format => 'csv',
497 :format => 'csv',
498 :set_filter => 1
498 :set_filter => 1
499 assert_equal 'text/csv; header=present', @response.content_type
499 assert_equal 'text/csv; header=present', @response.content_type
500 lines = @response.body.chomp.split("\n")
500 lines = @response.body.chomp.split("\n")
501 s1 = "\xaa\xac\xbaA" # status
501 s1 = "\xaa\xac\xbaA" # status
502 if str_utf8.respond_to?(:force_encoding)
502 if str_utf8.respond_to?(:force_encoding)
503 s1.force_encoding('Big5')
503 s1.force_encoding('Big5')
504 end
504 end
505 assert lines[0].include?(s1)
505 assert lines[0].include?(s1)
506 s2 = lines[1].split(",")[2]
506 s2 = lines[1].split(",")[2]
507 if s1.respond_to?(:force_encoding)
507 if s1.respond_to?(:force_encoding)
508 s3 = "\xa5H?" # subject
508 s3 = "\xa5H?" # subject
509 s3.force_encoding('Big5')
509 s3.force_encoding('Big5')
510 assert_equal s3, s2
510 assert_equal s3, s2
511 elsif RUBY_PLATFORM == 'java'
511 elsif RUBY_PLATFORM == 'java'
512 assert_equal "??", s2
512 assert_equal "??", s2
513 else
513 else
514 assert_equal "\xa5H???", s2
514 assert_equal "\xa5H???", s2
515 end
515 end
516 end
516 end
517 end
517 end
518
518
519 def test_index_csv_tw
519 def test_index_csv_tw
520 with_settings :default_language => "zh-TW" do
520 with_settings :default_language => "zh-TW" do
521 str1 = "test_index_csv_tw"
521 str1 = "test_index_csv_tw"
522 issue = Issue.generate!(:subject => str1, :estimated_hours => '1234.5')
522 issue = Issue.generate!(:subject => str1, :estimated_hours => '1234.5')
523
523
524 get :index, :project_id => 1,
524 get :index, :project_id => 1,
525 :f => ['subject'],
525 :f => ['subject'],
526 :op => '=', :values => [str1],
526 :op => '=', :values => [str1],
527 :c => ['estimated_hours', 'subject'],
527 :c => ['estimated_hours', 'subject'],
528 :format => 'csv',
528 :format => 'csv',
529 :set_filter => 1
529 :set_filter => 1
530 assert_equal 'text/csv; header=present', @response.content_type
530 assert_equal 'text/csv; header=present', @response.content_type
531 lines = @response.body.chomp.split("\n")
531 lines = @response.body.chomp.split("\n")
532 assert_equal "#{issue.id},1234.50,#{str1}", lines[1]
532 assert_equal "#{issue.id},1234.50,#{str1}", lines[1]
533 end
533 end
534 end
534 end
535
535
536 def test_index_csv_fr
536 def test_index_csv_fr
537 with_settings :default_language => "fr" do
537 with_settings :default_language => "fr" do
538 str1 = "test_index_csv_fr"
538 str1 = "test_index_csv_fr"
539 issue = Issue.generate!(:subject => str1, :estimated_hours => '1234.5')
539 issue = Issue.generate!(:subject => str1, :estimated_hours => '1234.5')
540
540
541 get :index, :project_id => 1,
541 get :index, :project_id => 1,
542 :f => ['subject'],
542 :f => ['subject'],
543 :op => '=', :values => [str1],
543 :op => '=', :values => [str1],
544 :c => ['estimated_hours', 'subject'],
544 :c => ['estimated_hours', 'subject'],
545 :format => 'csv',
545 :format => 'csv',
546 :set_filter => 1
546 :set_filter => 1
547 assert_equal 'text/csv; header=present', @response.content_type
547 assert_equal 'text/csv; header=present', @response.content_type
548 lines = @response.body.chomp.split("\n")
548 lines = @response.body.chomp.split("\n")
549 assert_equal "#{issue.id};1234,50;#{str1}", lines[1]
549 assert_equal "#{issue.id};1234,50;#{str1}", lines[1]
550 end
550 end
551 end
551 end
552
552
553 def test_index_pdf
553 def test_index_pdf
554 ["en", "zh", "zh-TW", "ja", "ko"].each do |lang|
554 ["en", "zh", "zh-TW", "ja", "ko"].each do |lang|
555 with_settings :default_language => lang do
555 with_settings :default_language => lang do
556
556
557 get :index
557 get :index
558 assert_response :success
558 assert_response :success
559 assert_template 'index'
559 assert_template 'index'
560
560
561 if lang == "ja"
561 if lang == "ja"
562 if RUBY_PLATFORM != 'java'
562 if RUBY_PLATFORM != 'java'
563 assert_equal "CP932", l(:general_pdf_encoding)
563 assert_equal "CP932", l(:general_pdf_encoding)
564 end
564 end
565 if RUBY_PLATFORM == 'java' && l(:general_pdf_encoding) == "CP932"
565 if RUBY_PLATFORM == 'java' && l(:general_pdf_encoding) == "CP932"
566 next
566 next
567 end
567 end
568 end
568 end
569
569
570 get :index, :format => 'pdf'
570 get :index, :format => 'pdf'
571 assert_response :success
571 assert_response :success
572 assert_not_nil assigns(:issues)
572 assert_not_nil assigns(:issues)
573 assert_equal 'application/pdf', @response.content_type
573 assert_equal 'application/pdf', @response.content_type
574
574
575 get :index, :project_id => 1, :format => 'pdf'
575 get :index, :project_id => 1, :format => 'pdf'
576 assert_response :success
576 assert_response :success
577 assert_not_nil assigns(:issues)
577 assert_not_nil assigns(:issues)
578 assert_equal 'application/pdf', @response.content_type
578 assert_equal 'application/pdf', @response.content_type
579
579
580 get :index, :project_id => 1, :query_id => 6, :format => 'pdf'
580 get :index, :project_id => 1, :query_id => 6, :format => 'pdf'
581 assert_response :success
581 assert_response :success
582 assert_not_nil assigns(:issues)
582 assert_not_nil assigns(:issues)
583 assert_equal 'application/pdf', @response.content_type
583 assert_equal 'application/pdf', @response.content_type
584 end
584 end
585 end
585 end
586 end
586 end
587
587
588 def test_index_pdf_with_query_grouped_by_list_custom_field
588 def test_index_pdf_with_query_grouped_by_list_custom_field
589 get :index, :project_id => 1, :query_id => 9, :format => 'pdf'
589 get :index, :project_id => 1, :query_id => 9, :format => 'pdf'
590 assert_response :success
590 assert_response :success
591 assert_not_nil assigns(:issues)
591 assert_not_nil assigns(:issues)
592 assert_not_nil assigns(:issue_count_by_group)
592 assert_not_nil assigns(:issue_count_by_group)
593 assert_equal 'application/pdf', @response.content_type
593 assert_equal 'application/pdf', @response.content_type
594 end
594 end
595
595
596 def test_index_atom
596 def test_index_atom
597 get :index, :project_id => 'ecookbook', :format => 'atom'
597 get :index, :project_id => 'ecookbook', :format => 'atom'
598 assert_response :success
598 assert_response :success
599 assert_template 'common/feed'
599 assert_template 'common/feed'
600 assert_equal 'application/atom+xml', response.content_type
600 assert_equal 'application/atom+xml', response.content_type
601
601
602 assert_select 'feed' do
602 assert_select 'feed' do
603 assert_select 'link[rel=self][href=?]', 'http://test.host/projects/ecookbook/issues.atom'
603 assert_select 'link[rel=self][href=?]', 'http://test.host/projects/ecookbook/issues.atom'
604 assert_select 'link[rel=alternate][href=?]', 'http://test.host/projects/ecookbook/issues'
604 assert_select 'link[rel=alternate][href=?]', 'http://test.host/projects/ecookbook/issues'
605 assert_select 'entry link[href=?]', 'http://test.host/issues/1'
605 assert_select 'entry link[href=?]', 'http://test.host/issues/1'
606 end
606 end
607 end
607 end
608
608
609 def test_index_sort
609 def test_index_sort
610 get :index, :sort => 'tracker,id:desc'
610 get :index, :sort => 'tracker,id:desc'
611 assert_response :success
611 assert_response :success
612
612
613 sort_params = @request.session['issues_index_sort']
613 sort_params = @request.session['issues_index_sort']
614 assert sort_params.is_a?(String)
614 assert sort_params.is_a?(String)
615 assert_equal 'tracker,id:desc', sort_params
615 assert_equal 'tracker,id:desc', sort_params
616
616
617 issues = assigns(:issues)
617 issues = assigns(:issues)
618 assert_not_nil issues
618 assert_not_nil issues
619 assert !issues.empty?
619 assert !issues.empty?
620 assert_equal issues.sort {|a,b| a.tracker == b.tracker ? b.id <=> a.id : a.tracker <=> b.tracker }.collect(&:id), issues.collect(&:id)
620 assert_equal issues.sort {|a,b| a.tracker == b.tracker ? b.id <=> a.id : a.tracker <=> b.tracker }.collect(&:id), issues.collect(&:id)
621 end
621 end
622
622
623 def test_index_sort_by_field_not_included_in_columns
623 def test_index_sort_by_field_not_included_in_columns
624 Setting.issue_list_default_columns = %w(subject author)
624 Setting.issue_list_default_columns = %w(subject author)
625 get :index, :sort => 'tracker'
625 get :index, :sort => 'tracker'
626 end
626 end
627
627
628 def test_index_sort_by_assigned_to
628 def test_index_sort_by_assigned_to
629 get :index, :sort => 'assigned_to'
629 get :index, :sort => 'assigned_to'
630 assert_response :success
630 assert_response :success
631 assignees = assigns(:issues).collect(&:assigned_to).compact
631 assignees = assigns(:issues).collect(&:assigned_to).compact
632 assert_equal assignees.sort, assignees
632 assert_equal assignees.sort, assignees
633 end
633 end
634
634
635 def test_index_sort_by_assigned_to_desc
635 def test_index_sort_by_assigned_to_desc
636 get :index, :sort => 'assigned_to:desc'
636 get :index, :sort => 'assigned_to:desc'
637 assert_response :success
637 assert_response :success
638 assignees = assigns(:issues).collect(&:assigned_to).compact
638 assignees = assigns(:issues).collect(&:assigned_to).compact
639 assert_equal assignees.sort.reverse, assignees
639 assert_equal assignees.sort.reverse, assignees
640 end
640 end
641
641
642 def test_index_group_by_assigned_to
642 def test_index_group_by_assigned_to
643 get :index, :group_by => 'assigned_to', :sort => 'priority'
643 get :index, :group_by => 'assigned_to', :sort => 'priority'
644 assert_response :success
644 assert_response :success
645 end
645 end
646
646
647 def test_index_sort_by_author
647 def test_index_sort_by_author
648 get :index, :sort => 'author'
648 get :index, :sort => 'author'
649 assert_response :success
649 assert_response :success
650 authors = assigns(:issues).collect(&:author)
650 authors = assigns(:issues).collect(&:author)
651 assert_equal authors.sort, authors
651 assert_equal authors.sort, authors
652 end
652 end
653
653
654 def test_index_sort_by_author_desc
654 def test_index_sort_by_author_desc
655 get :index, :sort => 'author:desc'
655 get :index, :sort => 'author:desc'
656 assert_response :success
656 assert_response :success
657 authors = assigns(:issues).collect(&:author)
657 authors = assigns(:issues).collect(&:author)
658 assert_equal authors.sort.reverse, authors
658 assert_equal authors.sort.reverse, authors
659 end
659 end
660
660
661 def test_index_group_by_author
661 def test_index_group_by_author
662 get :index, :group_by => 'author', :sort => 'priority'
662 get :index, :group_by => 'author', :sort => 'priority'
663 assert_response :success
663 assert_response :success
664 end
664 end
665
665
666 def test_index_sort_by_spent_hours
666 def test_index_sort_by_spent_hours
667 get :index, :sort => 'spent_hours:desc'
667 get :index, :sort => 'spent_hours:desc'
668 assert_response :success
668 assert_response :success
669 hours = assigns(:issues).collect(&:spent_hours)
669 hours = assigns(:issues).collect(&:spent_hours)
670 assert_equal hours.sort.reverse, hours
670 assert_equal hours.sort.reverse, hours
671 end
671 end
672
672
673 def test_index_sort_by_user_custom_field
673 def test_index_sort_by_user_custom_field
674 cf = IssueCustomField.create!(:name => 'User', :is_for_all => true, :tracker_ids => [1,2,3], :field_format => 'user')
674 cf = IssueCustomField.create!(:name => 'User', :is_for_all => true, :tracker_ids => [1,2,3], :field_format => 'user')
675 CustomValue.create!(:custom_field => cf, :customized => Issue.find(1), :value => '2')
675 CustomValue.create!(:custom_field => cf, :customized => Issue.find(1), :value => '2')
676 CustomValue.create!(:custom_field => cf, :customized => Issue.find(2), :value => '3')
676 CustomValue.create!(:custom_field => cf, :customized => Issue.find(2), :value => '3')
677 CustomValue.create!(:custom_field => cf, :customized => Issue.find(3), :value => '3')
677 CustomValue.create!(:custom_field => cf, :customized => Issue.find(3), :value => '3')
678 CustomValue.create!(:custom_field => cf, :customized => Issue.find(5), :value => '')
678 CustomValue.create!(:custom_field => cf, :customized => Issue.find(5), :value => '')
679
679
680 get :index, :project_id => 1, :set_filter => 1, :sort => "cf_#{cf.id},id"
680 get :index, :project_id => 1, :set_filter => 1, :sort => "cf_#{cf.id},id"
681 assert_response :success
681 assert_response :success
682
682
683 assert_equal [2, 3, 1], assigns(:issues).select {|issue| issue.custom_field_value(cf).present?}.map(&:id)
683 assert_equal [2, 3, 1], assigns(:issues).select {|issue| issue.custom_field_value(cf).present?}.map(&:id)
684 end
684 end
685
685
686 def test_index_with_columns
686 def test_index_with_columns
687 columns = ['tracker', 'subject', 'assigned_to']
687 columns = ['tracker', 'subject', 'assigned_to']
688 get :index, :set_filter => 1, :c => columns
688 get :index, :set_filter => 1, :c => columns
689 assert_response :success
689 assert_response :success
690
690
691 # query should use specified columns
691 # query should use specified columns
692 query = assigns(:query)
692 query = assigns(:query)
693 assert_kind_of IssueQuery, query
693 assert_kind_of IssueQuery, query
694 assert_equal columns, query.column_names.map(&:to_s)
694 assert_equal columns, query.column_names.map(&:to_s)
695
695
696 # columns should be stored in session
696 # columns should be stored in session
697 assert_kind_of Hash, session[:query]
697 assert_kind_of Hash, session[:query]
698 assert_kind_of Array, session[:query][:column_names]
698 assert_kind_of Array, session[:query][:column_names]
699 assert_equal columns, session[:query][:column_names].map(&:to_s)
699 assert_equal columns, session[:query][:column_names].map(&:to_s)
700
700
701 # ensure only these columns are kept in the selected columns list
701 # ensure only these columns are kept in the selected columns list
702 assert_select 'select#selected_columns option' do
702 assert_select 'select#selected_columns option' do
703 assert_select 'option', 3
703 assert_select 'option', 3
704 assert_select 'option[value=tracker]'
704 assert_select 'option[value=tracker]'
705 assert_select 'option[value=project]', 0
705 assert_select 'option[value=project]', 0
706 end
706 end
707 end
707 end
708
708
709 def test_index_without_project_should_implicitly_add_project_column_to_default_columns
709 def test_index_without_project_should_implicitly_add_project_column_to_default_columns
710 Setting.issue_list_default_columns = ['tracker', 'subject', 'assigned_to']
710 Setting.issue_list_default_columns = ['tracker', 'subject', 'assigned_to']
711 get :index, :set_filter => 1
711 get :index, :set_filter => 1
712
712
713 # query should use specified columns
713 # query should use specified columns
714 query = assigns(:query)
714 query = assigns(:query)
715 assert_kind_of IssueQuery, query
715 assert_kind_of IssueQuery, query
716 assert_equal [:id, :project, :tracker, :subject, :assigned_to], query.columns.map(&:name)
716 assert_equal [:id, :project, :tracker, :subject, :assigned_to], query.columns.map(&:name)
717 end
717 end
718
718
719 def test_index_without_project_and_explicit_default_columns_should_not_add_project_column
719 def test_index_without_project_and_explicit_default_columns_should_not_add_project_column
720 Setting.issue_list_default_columns = ['tracker', 'subject', 'assigned_to']
720 Setting.issue_list_default_columns = ['tracker', 'subject', 'assigned_to']
721 columns = ['id', 'tracker', 'subject', 'assigned_to']
721 columns = ['id', 'tracker', 'subject', 'assigned_to']
722 get :index, :set_filter => 1, :c => columns
722 get :index, :set_filter => 1, :c => columns
723
723
724 # query should use specified columns
724 # query should use specified columns
725 query = assigns(:query)
725 query = assigns(:query)
726 assert_kind_of IssueQuery, query
726 assert_kind_of IssueQuery, query
727 assert_equal columns.map(&:to_sym), query.columns.map(&:name)
727 assert_equal columns.map(&:to_sym), query.columns.map(&:name)
728 end
728 end
729
729
730 def test_index_with_custom_field_column
730 def test_index_with_custom_field_column
731 columns = %w(tracker subject cf_2)
731 columns = %w(tracker subject cf_2)
732 get :index, :set_filter => 1, :c => columns
732 get :index, :set_filter => 1, :c => columns
733 assert_response :success
733 assert_response :success
734
734
735 # query should use specified columns
735 # query should use specified columns
736 query = assigns(:query)
736 query = assigns(:query)
737 assert_kind_of IssueQuery, query
737 assert_kind_of IssueQuery, query
738 assert_equal columns, query.column_names.map(&:to_s)
738 assert_equal columns, query.column_names.map(&:to_s)
739
739
740 assert_select 'table.issues td.cf_2.string'
740 assert_select 'table.issues td.cf_2.string'
741 end
741 end
742
742
743 def test_index_with_multi_custom_field_column
743 def test_index_with_multi_custom_field_column
744 field = CustomField.find(1)
744 field = CustomField.find(1)
745 field.update_attribute :multiple, true
745 field.update_attribute :multiple, true
746 issue = Issue.find(1)
746 issue = Issue.find(1)
747 issue.custom_field_values = {1 => ['MySQL', 'Oracle']}
747 issue.custom_field_values = {1 => ['MySQL', 'Oracle']}
748 issue.save!
748 issue.save!
749
749
750 get :index, :set_filter => 1, :c => %w(tracker subject cf_1)
750 get :index, :set_filter => 1, :c => %w(tracker subject cf_1)
751 assert_response :success
751 assert_response :success
752
752
753 assert_select 'table.issues td.cf_1', :text => 'MySQL, Oracle'
753 assert_select 'table.issues td.cf_1', :text => 'MySQL, Oracle'
754 end
754 end
755
755
756 def test_index_with_multi_user_custom_field_column
756 def test_index_with_multi_user_custom_field_column
757 field = IssueCustomField.create!(:name => 'Multi user', :field_format => 'user', :multiple => true,
757 field = IssueCustomField.create!(:name => 'Multi user', :field_format => 'user', :multiple => true,
758 :tracker_ids => [1], :is_for_all => true)
758 :tracker_ids => [1], :is_for_all => true)
759 issue = Issue.find(1)
759 issue = Issue.find(1)
760 issue.custom_field_values = {field.id => ['2', '3']}
760 issue.custom_field_values = {field.id => ['2', '3']}
761 issue.save!
761 issue.save!
762
762
763 get :index, :set_filter => 1, :c => ['tracker', 'subject', "cf_#{field.id}"]
763 get :index, :set_filter => 1, :c => ['tracker', 'subject', "cf_#{field.id}"]
764 assert_response :success
764 assert_response :success
765
765
766 assert_select "table.issues td.cf_#{field.id}" do
766 assert_select "table.issues td.cf_#{field.id}" do
767 assert_select 'a', 2
767 assert_select 'a', 2
768 assert_select 'a[href=?]', '/users/2', :text => 'John Smith'
768 assert_select 'a[href=?]', '/users/2', :text => 'John Smith'
769 assert_select 'a[href=?]', '/users/3', :text => 'Dave Lopper'
769 assert_select 'a[href=?]', '/users/3', :text => 'Dave Lopper'
770 end
770 end
771 end
771 end
772
772
773 def test_index_with_date_column
773 def test_index_with_date_column
774 with_settings :date_format => '%d/%m/%Y' do
774 with_settings :date_format => '%d/%m/%Y' do
775 Issue.find(1).update_attribute :start_date, '1987-08-24'
775 Issue.find(1).update_attribute :start_date, '1987-08-24'
776 get :index, :set_filter => 1, :c => %w(start_date)
776 get :index, :set_filter => 1, :c => %w(start_date)
777 assert_select "table.issues td.start_date", :text => '24/08/1987'
777 assert_select "table.issues td.start_date", :text => '24/08/1987'
778 end
778 end
779 end
779 end
780
780
781 def test_index_with_done_ratio_column
781 def test_index_with_done_ratio_column
782 Issue.find(1).update_attribute :done_ratio, 40
782 Issue.find(1).update_attribute :done_ratio, 40
783 get :index, :set_filter => 1, :c => %w(done_ratio)
783 get :index, :set_filter => 1, :c => %w(done_ratio)
784 assert_select 'table.issues td.done_ratio' do
784 assert_select 'table.issues td.done_ratio' do
785 assert_select 'table.progress' do
785 assert_select 'table.progress' do
786 assert_select 'td.closed[style=?]', 'width: 40%;'
786 assert_select 'td.closed[style=?]', 'width: 40%;'
787 end
787 end
788 end
788 end
789 end
789 end
790
790
791 def test_index_with_spent_hours_column
791 def test_index_with_spent_hours_column
792 get :index, :set_filter => 1, :c => %w(subject spent_hours)
792 get :index, :set_filter => 1, :c => %w(subject spent_hours)
793 assert_select 'table.issues tr#issue-3 td.spent_hours', :text => '1.00'
793 assert_select 'table.issues tr#issue-3 td.spent_hours', :text => '1.00'
794 end
794 end
795
795
796 def test_index_should_not_show_spent_hours_column_without_permission
796 def test_index_should_not_show_spent_hours_column_without_permission
797 Role.anonymous.remove_permission! :view_time_entries
797 Role.anonymous.remove_permission! :view_time_entries
798 get :index, :set_filter => 1, :c => %w(subject spent_hours)
798 get :index, :set_filter => 1, :c => %w(subject spent_hours)
799 assert_select 'td.spent_hours', 0
799 assert_select 'td.spent_hours', 0
800 end
800 end
801
801
802 def test_index_with_fixed_version_column
802 def test_index_with_fixed_version_column
803 get :index, :set_filter => 1, :c => %w(fixed_version)
803 get :index, :set_filter => 1, :c => %w(fixed_version)
804 assert_select 'table.issues td.fixed_version' do
804 assert_select 'table.issues td.fixed_version' do
805 assert_select 'a[href=?]', '/versions/2', :text => '1.0'
805 assert_select 'a[href=?]', '/versions/2', :text => '1.0'
806 end
806 end
807 end
807 end
808
808
809 def test_index_with_relations_column
809 def test_index_with_relations_column
810 IssueRelation.delete_all
810 IssueRelation.delete_all
811 IssueRelation.create!(:relation_type => "relates", :issue_from => Issue.find(1), :issue_to => Issue.find(7))
811 IssueRelation.create!(:relation_type => "relates", :issue_from => Issue.find(1), :issue_to => Issue.find(7))
812 IssueRelation.create!(:relation_type => "relates", :issue_from => Issue.find(8), :issue_to => Issue.find(1))
812 IssueRelation.create!(:relation_type => "relates", :issue_from => Issue.find(8), :issue_to => Issue.find(1))
813 IssueRelation.create!(:relation_type => "blocks", :issue_from => Issue.find(1), :issue_to => Issue.find(11))
813 IssueRelation.create!(:relation_type => "blocks", :issue_from => Issue.find(1), :issue_to => Issue.find(11))
814 IssueRelation.create!(:relation_type => "blocks", :issue_from => Issue.find(12), :issue_to => Issue.find(2))
814 IssueRelation.create!(:relation_type => "blocks", :issue_from => Issue.find(12), :issue_to => Issue.find(2))
815
815
816 get :index, :set_filter => 1, :c => %w(subject relations)
816 get :index, :set_filter => 1, :c => %w(subject relations)
817 assert_response :success
817 assert_response :success
818 assert_select "tr#issue-1 td.relations" do
818 assert_select "tr#issue-1 td.relations" do
819 assert_select "span", 3
819 assert_select "span", 3
820 assert_select "span", :text => "Related to #7"
820 assert_select "span", :text => "Related to #7"
821 assert_select "span", :text => "Related to #8"
821 assert_select "span", :text => "Related to #8"
822 assert_select "span", :text => "Blocks #11"
822 assert_select "span", :text => "Blocks #11"
823 end
823 end
824 assert_select "tr#issue-2 td.relations" do
824 assert_select "tr#issue-2 td.relations" do
825 assert_select "span", 1
825 assert_select "span", 1
826 assert_select "span", :text => "Blocked by #12"
826 assert_select "span", :text => "Blocked by #12"
827 end
827 end
828 assert_select "tr#issue-3 td.relations" do
828 assert_select "tr#issue-3 td.relations" do
829 assert_select "span", 0
829 assert_select "span", 0
830 end
830 end
831
831
832 get :index, :set_filter => 1, :c => %w(relations), :format => 'csv'
832 get :index, :set_filter => 1, :c => %w(relations), :format => 'csv'
833 assert_response :success
833 assert_response :success
834 assert_equal 'text/csv; header=present', response.content_type
834 assert_equal 'text/csv; header=present', response.content_type
835 lines = response.body.chomp.split("\n")
835 lines = response.body.chomp.split("\n")
836 assert_include '1,"Related to #7, Related to #8, Blocks #11"', lines
836 assert_include '1,"Related to #7, Related to #8, Blocks #11"', lines
837 assert_include '2,Blocked by #12', lines
837 assert_include '2,Blocked by #12', lines
838 assert_include '3,""', lines
838 assert_include '3,""', lines
839
839
840 get :index, :set_filter => 1, :c => %w(subject relations), :format => 'pdf'
840 get :index, :set_filter => 1, :c => %w(subject relations), :format => 'pdf'
841 assert_response :success
841 assert_response :success
842 assert_equal 'application/pdf', response.content_type
842 assert_equal 'application/pdf', response.content_type
843 end
843 end
844
844
845 def test_index_with_description_column
845 def test_index_with_description_column
846 get :index, :set_filter => 1, :c => %w(subject description)
846 get :index, :set_filter => 1, :c => %w(subject description)
847
847
848 assert_select 'table.issues thead th', 3 # columns: chekbox + id + subject
848 assert_select 'table.issues thead th', 3 # columns: chekbox + id + subject
849 assert_select 'td.description[colspan=3]', :text => 'Unable to print recipes'
849 assert_select 'td.description[colspan=3]', :text => 'Unable to print recipes'
850
850
851 get :index, :set_filter => 1, :c => %w(subject description), :format => 'pdf'
851 get :index, :set_filter => 1, :c => %w(subject description), :format => 'pdf'
852 assert_response :success
852 assert_response :success
853 assert_equal 'application/pdf', response.content_type
853 assert_equal 'application/pdf', response.content_type
854 end
854 end
855
855
856 def test_index_send_html_if_query_is_invalid
856 def test_index_send_html_if_query_is_invalid
857 get :index, :f => ['start_date'], :op => {:start_date => '='}
857 get :index, :f => ['start_date'], :op => {:start_date => '='}
858 assert_equal 'text/html', @response.content_type
858 assert_equal 'text/html', @response.content_type
859 assert_template 'index'
859 assert_template 'index'
860 end
860 end
861
861
862 def test_index_send_nothing_if_query_is_invalid
862 def test_index_send_nothing_if_query_is_invalid
863 get :index, :f => ['start_date'], :op => {:start_date => '='}, :format => 'csv'
863 get :index, :f => ['start_date'], :op => {:start_date => '='}, :format => 'csv'
864 assert_equal 'text/csv', @response.content_type
864 assert_equal 'text/csv', @response.content_type
865 assert @response.body.blank?
865 assert @response.body.blank?
866 end
866 end
867
867
868 def test_show_by_anonymous
868 def test_show_by_anonymous
869 get :show, :id => 1
869 get :show, :id => 1
870 assert_response :success
870 assert_response :success
871 assert_template 'show'
871 assert_template 'show'
872 assert_equal Issue.find(1), assigns(:issue)
872 assert_equal Issue.find(1), assigns(:issue)
873 assert_select 'div.issue div.description', :text => /Unable to print recipes/
873 assert_select 'div.issue div.description', :text => /Unable to print recipes/
874 # anonymous role is allowed to add a note
874 # anonymous role is allowed to add a note
875 assert_select 'form#issue-form' do
875 assert_select 'form#issue-form' do
876 assert_select 'fieldset' do
876 assert_select 'fieldset' do
877 assert_select 'legend', :text => 'Notes'
877 assert_select 'legend', :text => 'Notes'
878 assert_select 'textarea[name=?]', 'issue[notes]'
878 assert_select 'textarea[name=?]', 'issue[notes]'
879 end
879 end
880 end
880 end
881 assert_select 'title', :text => "Bug #1: Can&#x27;t print recipes - eCookbook - Redmine"
881 assert_select 'title', :text => "Bug #1: Can&#x27;t print recipes - eCookbook - Redmine"
882 end
882 end
883
883
884 def test_show_by_manager
884 def test_show_by_manager
885 @request.session[:user_id] = 2
885 @request.session[:user_id] = 2
886 get :show, :id => 1
886 get :show, :id => 1
887 assert_response :success
887 assert_response :success
888 assert_select 'a', :text => /Quote/
888 assert_select 'a', :text => /Quote/
889 assert_select 'form#issue-form' do
889 assert_select 'form#issue-form' do
890 assert_select 'fieldset' do
890 assert_select 'fieldset' do
891 assert_select 'legend', :text => 'Change properties'
891 assert_select 'legend', :text => 'Change properties'
892 assert_select 'input[name=?]', 'issue[subject]'
892 assert_select 'input[name=?]', 'issue[subject]'
893 end
893 end
894 assert_select 'fieldset' do
894 assert_select 'fieldset' do
895 assert_select 'legend', :text => 'Log time'
895 assert_select 'legend', :text => 'Log time'
896 assert_select 'input[name=?]', 'time_entry[hours]'
896 assert_select 'input[name=?]', 'time_entry[hours]'
897 end
897 end
898 assert_select 'fieldset' do
898 assert_select 'fieldset' do
899 assert_select 'legend', :text => 'Notes'
899 assert_select 'legend', :text => 'Notes'
900 assert_select 'textarea[name=?]', 'issue[notes]'
900 assert_select 'textarea[name=?]', 'issue[notes]'
901 end
901 end
902 end
902 end
903 end
903 end
904
904
905 def test_show_should_display_update_form
905 def test_show_should_display_update_form
906 @request.session[:user_id] = 2
906 @request.session[:user_id] = 2
907 get :show, :id => 1
907 get :show, :id => 1
908 assert_response :success
908 assert_response :success
909
909
910 assert_select 'form#issue-form' do
910 assert_select 'form#issue-form' do
911 assert_select 'input[name=?]', 'issue[is_private]'
911 assert_select 'input[name=?]', 'issue[is_private]'
912 assert_select 'select[name=?]', 'issue[project_id]'
912 assert_select 'select[name=?]', 'issue[project_id]'
913 assert_select 'select[name=?]', 'issue[tracker_id]'
913 assert_select 'select[name=?]', 'issue[tracker_id]'
914 assert_select 'input[name=?]', 'issue[subject]'
914 assert_select 'input[name=?]', 'issue[subject]'
915 assert_select 'textarea[name=?]', 'issue[description]'
915 assert_select 'textarea[name=?]', 'issue[description]'
916 assert_select 'select[name=?]', 'issue[status_id]'
916 assert_select 'select[name=?]', 'issue[status_id]'
917 assert_select 'select[name=?]', 'issue[priority_id]'
917 assert_select 'select[name=?]', 'issue[priority_id]'
918 assert_select 'select[name=?]', 'issue[assigned_to_id]'
918 assert_select 'select[name=?]', 'issue[assigned_to_id]'
919 assert_select 'select[name=?]', 'issue[category_id]'
919 assert_select 'select[name=?]', 'issue[category_id]'
920 assert_select 'select[name=?]', 'issue[fixed_version_id]'
920 assert_select 'select[name=?]', 'issue[fixed_version_id]'
921 assert_select 'input[name=?]', 'issue[parent_issue_id]'
921 assert_select 'input[name=?]', 'issue[parent_issue_id]'
922 assert_select 'input[name=?]', 'issue[start_date]'
922 assert_select 'input[name=?]', 'issue[start_date]'
923 assert_select 'input[name=?]', 'issue[due_date]'
923 assert_select 'input[name=?]', 'issue[due_date]'
924 assert_select 'select[name=?]', 'issue[done_ratio]'
924 assert_select 'select[name=?]', 'issue[done_ratio]'
925 assert_select 'input[name=?]', 'issue[custom_field_values][2]'
925 assert_select 'input[name=?]', 'issue[custom_field_values][2]'
926 assert_select 'input[name=?]', 'issue[watcher_user_ids][]', 0
926 assert_select 'input[name=?]', 'issue[watcher_user_ids][]', 0
927 assert_select 'textarea[name=?]', 'issue[notes]'
927 assert_select 'textarea[name=?]', 'issue[notes]'
928 end
928 end
929 end
929 end
930
930
931 def test_show_should_display_update_form_with_minimal_permissions
931 def test_show_should_display_update_form_with_minimal_permissions
932 Role.find(1).update_attribute :permissions, [:view_issues, :add_issue_notes]
932 Role.find(1).update_attribute :permissions, [:view_issues, :add_issue_notes]
933 WorkflowTransition.delete_all :role_id => 1
933 WorkflowTransition.delete_all :role_id => 1
934
934
935 @request.session[:user_id] = 2
935 @request.session[:user_id] = 2
936 get :show, :id => 1
936 get :show, :id => 1
937 assert_response :success
937 assert_response :success
938
938
939 assert_select 'form#issue-form' do
939 assert_select 'form#issue-form' do
940 assert_select 'input[name=?]', 'issue[is_private]', 0
940 assert_select 'input[name=?]', 'issue[is_private]', 0
941 assert_select 'select[name=?]', 'issue[project_id]', 0
941 assert_select 'select[name=?]', 'issue[project_id]', 0
942 assert_select 'select[name=?]', 'issue[tracker_id]', 0
942 assert_select 'select[name=?]', 'issue[tracker_id]', 0
943 assert_select 'input[name=?]', 'issue[subject]', 0
943 assert_select 'input[name=?]', 'issue[subject]', 0
944 assert_select 'textarea[name=?]', 'issue[description]', 0
944 assert_select 'textarea[name=?]', 'issue[description]', 0
945 assert_select 'select[name=?]', 'issue[status_id]', 0
945 assert_select 'select[name=?]', 'issue[status_id]', 0
946 assert_select 'select[name=?]', 'issue[priority_id]', 0
946 assert_select 'select[name=?]', 'issue[priority_id]', 0
947 assert_select 'select[name=?]', 'issue[assigned_to_id]', 0
947 assert_select 'select[name=?]', 'issue[assigned_to_id]', 0
948 assert_select 'select[name=?]', 'issue[category_id]', 0
948 assert_select 'select[name=?]', 'issue[category_id]', 0
949 assert_select 'select[name=?]', 'issue[fixed_version_id]', 0
949 assert_select 'select[name=?]', 'issue[fixed_version_id]', 0
950 assert_select 'input[name=?]', 'issue[parent_issue_id]', 0
950 assert_select 'input[name=?]', 'issue[parent_issue_id]', 0
951 assert_select 'input[name=?]', 'issue[start_date]', 0
951 assert_select 'input[name=?]', 'issue[start_date]', 0
952 assert_select 'input[name=?]', 'issue[due_date]', 0
952 assert_select 'input[name=?]', 'issue[due_date]', 0
953 assert_select 'select[name=?]', 'issue[done_ratio]', 0
953 assert_select 'select[name=?]', 'issue[done_ratio]', 0
954 assert_select 'input[name=?]', 'issue[custom_field_values][2]', 0
954 assert_select 'input[name=?]', 'issue[custom_field_values][2]', 0
955 assert_select 'input[name=?]', 'issue[watcher_user_ids][]', 0
955 assert_select 'input[name=?]', 'issue[watcher_user_ids][]', 0
956 assert_select 'textarea[name=?]', 'issue[notes]'
956 assert_select 'textarea[name=?]', 'issue[notes]'
957 end
957 end
958 end
958 end
959
959
960 def test_show_should_display_update_form_with_workflow_permissions
960 def test_show_should_display_update_form_with_workflow_permissions
961 Role.find(1).update_attribute :permissions, [:view_issues, :add_issue_notes]
961 Role.find(1).update_attribute :permissions, [:view_issues, :add_issue_notes]
962
962
963 @request.session[:user_id] = 2
963 @request.session[:user_id] = 2
964 get :show, :id => 1
964 get :show, :id => 1
965 assert_response :success
965 assert_response :success
966
966
967 assert_select 'form#issue-form' do
967 assert_select 'form#issue-form' do
968 assert_select 'input[name=?]', 'issue[is_private]', 0
968 assert_select 'input[name=?]', 'issue[is_private]', 0
969 assert_select 'select[name=?]', 'issue[project_id]', 0
969 assert_select 'select[name=?]', 'issue[project_id]', 0
970 assert_select 'select[name=?]', 'issue[tracker_id]', 0
970 assert_select 'select[name=?]', 'issue[tracker_id]', 0
971 assert_select 'input[name=?]', 'issue[subject]', 0
971 assert_select 'input[name=?]', 'issue[subject]', 0
972 assert_select 'textarea[name=?]', 'issue[description]', 0
972 assert_select 'textarea[name=?]', 'issue[description]', 0
973 assert_select 'select[name=?]', 'issue[status_id]'
973 assert_select 'select[name=?]', 'issue[status_id]'
974 assert_select 'select[name=?]', 'issue[priority_id]', 0
974 assert_select 'select[name=?]', 'issue[priority_id]', 0
975 assert_select 'select[name=?]', 'issue[assigned_to_id]'
975 assert_select 'select[name=?]', 'issue[assigned_to_id]'
976 assert_select 'select[name=?]', 'issue[category_id]', 0
976 assert_select 'select[name=?]', 'issue[category_id]', 0
977 assert_select 'select[name=?]', 'issue[fixed_version_id]'
977 assert_select 'select[name=?]', 'issue[fixed_version_id]'
978 assert_select 'input[name=?]', 'issue[parent_issue_id]', 0
978 assert_select 'input[name=?]', 'issue[parent_issue_id]', 0
979 assert_select 'input[name=?]', 'issue[start_date]', 0
979 assert_select 'input[name=?]', 'issue[start_date]', 0
980 assert_select 'input[name=?]', 'issue[due_date]', 0
980 assert_select 'input[name=?]', 'issue[due_date]', 0
981 assert_select 'select[name=?]', 'issue[done_ratio]'
981 assert_select 'select[name=?]', 'issue[done_ratio]'
982 assert_select 'input[name=?]', 'issue[custom_field_values][2]', 0
982 assert_select 'input[name=?]', 'issue[custom_field_values][2]', 0
983 assert_select 'input[name=?]', 'issue[watcher_user_ids][]', 0
983 assert_select 'input[name=?]', 'issue[watcher_user_ids][]', 0
984 assert_select 'textarea[name=?]', 'issue[notes]'
984 assert_select 'textarea[name=?]', 'issue[notes]'
985 end
985 end
986 end
986 end
987
987
988 def test_show_should_not_display_update_form_without_permissions
988 def test_show_should_not_display_update_form_without_permissions
989 Role.find(1).update_attribute :permissions, [:view_issues]
989 Role.find(1).update_attribute :permissions, [:view_issues]
990
990
991 @request.session[:user_id] = 2
991 @request.session[:user_id] = 2
992 get :show, :id => 1
992 get :show, :id => 1
993 assert_response :success
993 assert_response :success
994
994
995 assert_select 'form#issue-form', 0
995 assert_select 'form#issue-form', 0
996 end
996 end
997
997
998 def test_update_form_should_not_display_inactive_enumerations
998 def test_update_form_should_not_display_inactive_enumerations
999 assert !IssuePriority.find(15).active?
999 assert !IssuePriority.find(15).active?
1000
1000
1001 @request.session[:user_id] = 2
1001 @request.session[:user_id] = 2
1002 get :show, :id => 1
1002 get :show, :id => 1
1003 assert_response :success
1003 assert_response :success
1004
1004
1005 assert_select 'form#issue-form' do
1005 assert_select 'form#issue-form' do
1006 assert_select 'select[name=?]', 'issue[priority_id]' do
1006 assert_select 'select[name=?]', 'issue[priority_id]' do
1007 assert_select 'option[value=4]'
1007 assert_select 'option[value=4]'
1008 assert_select 'option[value=15]', 0
1008 assert_select 'option[value=15]', 0
1009 end
1009 end
1010 end
1010 end
1011 end
1011 end
1012
1012
1013 def test_update_form_should_allow_attachment_upload
1013 def test_update_form_should_allow_attachment_upload
1014 @request.session[:user_id] = 2
1014 @request.session[:user_id] = 2
1015 get :show, :id => 1
1015 get :show, :id => 1
1016
1016
1017 assert_select 'form#issue-form[method=post][enctype=multipart/form-data]' do
1017 assert_select 'form#issue-form[method=post][enctype=multipart/form-data]' do
1018 assert_select 'input[type=file][name=?]', 'attachments[dummy][file]'
1018 assert_select 'input[type=file][name=?]', 'attachments[dummy][file]'
1019 end
1019 end
1020 end
1020 end
1021
1021
1022 def test_show_should_deny_anonymous_access_without_permission
1022 def test_show_should_deny_anonymous_access_without_permission
1023 Role.anonymous.remove_permission!(:view_issues)
1023 Role.anonymous.remove_permission!(:view_issues)
1024 get :show, :id => 1
1024 get :show, :id => 1
1025 assert_response :redirect
1025 assert_response :redirect
1026 end
1026 end
1027
1027
1028 def test_show_should_deny_anonymous_access_to_private_issue
1028 def test_show_should_deny_anonymous_access_to_private_issue
1029 Issue.where(:id => 1).update_all(["is_private = ?", true])
1029 Issue.where(:id => 1).update_all(["is_private = ?", true])
1030 get :show, :id => 1
1030 get :show, :id => 1
1031 assert_response :redirect
1031 assert_response :redirect
1032 end
1032 end
1033
1033
1034 def test_show_should_deny_non_member_access_without_permission
1034 def test_show_should_deny_non_member_access_without_permission
1035 Role.non_member.remove_permission!(:view_issues)
1035 Role.non_member.remove_permission!(:view_issues)
1036 @request.session[:user_id] = 9
1036 @request.session[:user_id] = 9
1037 get :show, :id => 1
1037 get :show, :id => 1
1038 assert_response 403
1038 assert_response 403
1039 end
1039 end
1040
1040
1041 def test_show_should_deny_non_member_access_to_private_issue
1041 def test_show_should_deny_non_member_access_to_private_issue
1042 Issue.where(:id => 1).update_all(["is_private = ?", true])
1042 Issue.where(:id => 1).update_all(["is_private = ?", true])
1043 @request.session[:user_id] = 9
1043 @request.session[:user_id] = 9
1044 get :show, :id => 1
1044 get :show, :id => 1
1045 assert_response 403
1045 assert_response 403
1046 end
1046 end
1047
1047
1048 def test_show_should_deny_member_access_without_permission
1048 def test_show_should_deny_member_access_without_permission
1049 Role.find(1).remove_permission!(:view_issues)
1049 Role.find(1).remove_permission!(:view_issues)
1050 @request.session[:user_id] = 2
1050 @request.session[:user_id] = 2
1051 get :show, :id => 1
1051 get :show, :id => 1
1052 assert_response 403
1052 assert_response 403
1053 end
1053 end
1054
1054
1055 def test_show_should_deny_member_access_to_private_issue_without_permission
1055 def test_show_should_deny_member_access_to_private_issue_without_permission
1056 Issue.where(:id => 1).update_all(["is_private = ?", true])
1056 Issue.where(:id => 1).update_all(["is_private = ?", true])
1057 @request.session[:user_id] = 3
1057 @request.session[:user_id] = 3
1058 get :show, :id => 1
1058 get :show, :id => 1
1059 assert_response 403
1059 assert_response 403
1060 end
1060 end
1061
1061
1062 def test_show_should_allow_author_access_to_private_issue
1062 def test_show_should_allow_author_access_to_private_issue
1063 Issue.where(:id => 1).update_all(["is_private = ?, author_id = 3", true])
1063 Issue.where(:id => 1).update_all(["is_private = ?, author_id = 3", true])
1064 @request.session[:user_id] = 3
1064 @request.session[:user_id] = 3
1065 get :show, :id => 1
1065 get :show, :id => 1
1066 assert_response :success
1066 assert_response :success
1067 end
1067 end
1068
1068
1069 def test_show_should_allow_assignee_access_to_private_issue
1069 def test_show_should_allow_assignee_access_to_private_issue
1070 Issue.where(:id => 1).update_all(["is_private = ?, assigned_to_id = 3", true])
1070 Issue.where(:id => 1).update_all(["is_private = ?, assigned_to_id = 3", true])
1071 @request.session[:user_id] = 3
1071 @request.session[:user_id] = 3
1072 get :show, :id => 1
1072 get :show, :id => 1
1073 assert_response :success
1073 assert_response :success
1074 end
1074 end
1075
1075
1076 def test_show_should_allow_member_access_to_private_issue_with_permission
1076 def test_show_should_allow_member_access_to_private_issue_with_permission
1077 Issue.where(:id => 1).update_all(["is_private = ?", true])
1077 Issue.where(:id => 1).update_all(["is_private = ?", true])
1078 User.find(3).roles_for_project(Project.find(1)).first.update_attribute :issues_visibility, 'all'
1078 User.find(3).roles_for_project(Project.find(1)).first.update_attribute :issues_visibility, 'all'
1079 @request.session[:user_id] = 3
1079 @request.session[:user_id] = 3
1080 get :show, :id => 1
1080 get :show, :id => 1
1081 assert_response :success
1081 assert_response :success
1082 end
1082 end
1083
1083
1084 def test_show_should_not_disclose_relations_to_invisible_issues
1084 def test_show_should_not_disclose_relations_to_invisible_issues
1085 Setting.cross_project_issue_relations = '1'
1085 Setting.cross_project_issue_relations = '1'
1086 IssueRelation.create!(:issue_from => Issue.find(1), :issue_to => Issue.find(2), :relation_type => 'relates')
1086 IssueRelation.create!(:issue_from => Issue.find(1), :issue_to => Issue.find(2), :relation_type => 'relates')
1087 # Relation to a private project issue
1087 # Relation to a private project issue
1088 IssueRelation.create!(:issue_from => Issue.find(1), :issue_to => Issue.find(4), :relation_type => 'relates')
1088 IssueRelation.create!(:issue_from => Issue.find(1), :issue_to => Issue.find(4), :relation_type => 'relates')
1089
1089
1090 get :show, :id => 1
1090 get :show, :id => 1
1091 assert_response :success
1091 assert_response :success
1092
1092
1093 assert_select 'div#relations' do
1093 assert_select 'div#relations' do
1094 assert_select 'a', :text => /#2$/
1094 assert_select 'a', :text => /#2$/
1095 assert_select 'a', :text => /#4$/, :count => 0
1095 assert_select 'a', :text => /#4$/, :count => 0
1096 end
1096 end
1097 end
1097 end
1098
1098
1099 def test_show_should_list_subtasks
1099 def test_show_should_list_subtasks
1100 Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :parent_issue_id => 1, :subject => 'Child Issue')
1100 Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :parent_issue_id => 1, :subject => 'Child Issue')
1101
1101
1102 get :show, :id => 1
1102 get :show, :id => 1
1103 assert_response :success
1103 assert_response :success
1104
1104
1105 assert_select 'div#issue_tree' do
1105 assert_select 'div#issue_tree' do
1106 assert_select 'td.subject', :text => /Child Issue/
1106 assert_select 'td.subject', :text => /Child Issue/
1107 end
1107 end
1108 end
1108 end
1109
1109
1110 def test_show_should_list_parents
1110 def test_show_should_list_parents
1111 issue = Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :parent_issue_id => 1, :subject => 'Child Issue')
1111 issue = Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :parent_issue_id => 1, :subject => 'Child Issue')
1112
1112
1113 get :show, :id => issue.id
1113 get :show, :id => issue.id
1114 assert_response :success
1114 assert_response :success
1115
1115
1116 assert_select 'div.subject' do
1116 assert_select 'div.subject' do
1117 assert_select 'h3', 'Child Issue'
1117 assert_select 'h3', 'Child Issue'
1118 assert_select 'a[href=/issues/1]'
1118 assert_select 'a[href=/issues/1]'
1119 end
1119 end
1120 end
1120 end
1121
1121
1122 def test_show_should_not_display_prev_next_links_without_query_in_session
1122 def test_show_should_not_display_prev_next_links_without_query_in_session
1123 get :show, :id => 1
1123 get :show, :id => 1
1124 assert_response :success
1124 assert_response :success
1125 assert_nil assigns(:prev_issue_id)
1125 assert_nil assigns(:prev_issue_id)
1126 assert_nil assigns(:next_issue_id)
1126 assert_nil assigns(:next_issue_id)
1127
1127
1128 assert_select 'div.next-prev-links', 0
1128 assert_select 'div.next-prev-links', 0
1129 end
1129 end
1130
1130
1131 def test_show_should_display_prev_next_links_with_query_in_session
1131 def test_show_should_display_prev_next_links_with_query_in_session
1132 @request.session[:query] = {:filters => {'status_id' => {:values => [''], :operator => 'o'}}, :project_id => nil}
1132 @request.session[:query] = {:filters => {'status_id' => {:values => [''], :operator => 'o'}}, :project_id => nil}
1133 @request.session['issues_index_sort'] = 'id'
1133 @request.session['issues_index_sort'] = 'id'
1134
1134
1135 with_settings :display_subprojects_issues => '0' do
1135 with_settings :display_subprojects_issues => '0' do
1136 get :show, :id => 3
1136 get :show, :id => 3
1137 end
1137 end
1138
1138
1139 assert_response :success
1139 assert_response :success
1140 # Previous and next issues for all projects
1140 # Previous and next issues for all projects
1141 assert_equal 2, assigns(:prev_issue_id)
1141 assert_equal 2, assigns(:prev_issue_id)
1142 assert_equal 5, assigns(:next_issue_id)
1142 assert_equal 5, assigns(:next_issue_id)
1143
1143
1144 count = Issue.open.visible.count
1144 count = Issue.open.visible.count
1145
1145
1146 assert_select 'div.next-prev-links' do
1146 assert_select 'div.next-prev-links' do
1147 assert_select 'a[href=/issues/2]', :text => /Previous/
1147 assert_select 'a[href=/issues/2]', :text => /Previous/
1148 assert_select 'a[href=/issues/5]', :text => /Next/
1148 assert_select 'a[href=/issues/5]', :text => /Next/
1149 assert_select 'span.position', :text => "3 of #{count}"
1149 assert_select 'span.position', :text => "3 of #{count}"
1150 end
1150 end
1151 end
1151 end
1152
1152
1153 def test_show_should_display_prev_next_links_with_saved_query_in_session
1153 def test_show_should_display_prev_next_links_with_saved_query_in_session
1154 query = IssueQuery.create!(:name => 'test', :visibility => IssueQuery::VISIBILITY_PUBLIC, :user_id => 1,
1154 query = IssueQuery.create!(:name => 'test', :visibility => IssueQuery::VISIBILITY_PUBLIC, :user_id => 1,
1155 :filters => {'status_id' => {:values => ['5'], :operator => '='}},
1155 :filters => {'status_id' => {:values => ['5'], :operator => '='}},
1156 :sort_criteria => [['id', 'asc']])
1156 :sort_criteria => [['id', 'asc']])
1157 @request.session[:query] = {:id => query.id, :project_id => nil}
1157 @request.session[:query] = {:id => query.id, :project_id => nil}
1158
1158
1159 get :show, :id => 11
1159 get :show, :id => 11
1160
1160
1161 assert_response :success
1161 assert_response :success
1162 assert_equal query, assigns(:query)
1162 assert_equal query, assigns(:query)
1163 # Previous and next issues for all projects
1163 # Previous and next issues for all projects
1164 assert_equal 8, assigns(:prev_issue_id)
1164 assert_equal 8, assigns(:prev_issue_id)
1165 assert_equal 12, assigns(:next_issue_id)
1165 assert_equal 12, assigns(:next_issue_id)
1166
1166
1167 assert_select 'div.next-prev-links' do
1167 assert_select 'div.next-prev-links' do
1168 assert_select 'a[href=/issues/8]', :text => /Previous/
1168 assert_select 'a[href=/issues/8]', :text => /Previous/
1169 assert_select 'a[href=/issues/12]', :text => /Next/
1169 assert_select 'a[href=/issues/12]', :text => /Next/
1170 end
1170 end
1171 end
1171 end
1172
1172
1173 def test_show_should_display_prev_next_links_with_query_and_sort_on_association
1173 def test_show_should_display_prev_next_links_with_query_and_sort_on_association
1174 @request.session[:query] = {:filters => {'status_id' => {:values => [''], :operator => 'o'}}, :project_id => nil}
1174 @request.session[:query] = {:filters => {'status_id' => {:values => [''], :operator => 'o'}}, :project_id => nil}
1175
1175
1176 %w(project tracker status priority author assigned_to category fixed_version).each do |assoc_sort|
1176 %w(project tracker status priority author assigned_to category fixed_version).each do |assoc_sort|
1177 @request.session['issues_index_sort'] = assoc_sort
1177 @request.session['issues_index_sort'] = assoc_sort
1178
1178
1179 get :show, :id => 3
1179 get :show, :id => 3
1180 assert_response :success, "Wrong response status for #{assoc_sort} sort"
1180 assert_response :success, "Wrong response status for #{assoc_sort} sort"
1181
1181
1182 assert_select 'div.next-prev-links' do
1182 assert_select 'div.next-prev-links' do
1183 assert_select 'a', :text => /(Previous|Next)/
1183 assert_select 'a', :text => /(Previous|Next)/
1184 end
1184 end
1185 end
1185 end
1186 end
1186 end
1187
1187
1188 def test_show_should_display_prev_next_links_with_project_query_in_session
1188 def test_show_should_display_prev_next_links_with_project_query_in_session
1189 @request.session[:query] = {:filters => {'status_id' => {:values => [''], :operator => 'o'}}, :project_id => 1}
1189 @request.session[:query] = {:filters => {'status_id' => {:values => [''], :operator => 'o'}}, :project_id => 1}
1190 @request.session['issues_index_sort'] = 'id'
1190 @request.session['issues_index_sort'] = 'id'
1191
1191
1192 with_settings :display_subprojects_issues => '0' do
1192 with_settings :display_subprojects_issues => '0' do
1193 get :show, :id => 3
1193 get :show, :id => 3
1194 end
1194 end
1195
1195
1196 assert_response :success
1196 assert_response :success
1197 # Previous and next issues inside project
1197 # Previous and next issues inside project
1198 assert_equal 2, assigns(:prev_issue_id)
1198 assert_equal 2, assigns(:prev_issue_id)
1199 assert_equal 7, assigns(:next_issue_id)
1199 assert_equal 7, assigns(:next_issue_id)
1200
1200
1201 assert_select 'div.next-prev-links' do
1201 assert_select 'div.next-prev-links' do
1202 assert_select 'a[href=/issues/2]', :text => /Previous/
1202 assert_select 'a[href=/issues/2]', :text => /Previous/
1203 assert_select 'a[href=/issues/7]', :text => /Next/
1203 assert_select 'a[href=/issues/7]', :text => /Next/
1204 end
1204 end
1205 end
1205 end
1206
1206
1207 def test_show_should_not_display_prev_link_for_first_issue
1207 def test_show_should_not_display_prev_link_for_first_issue
1208 @request.session[:query] = {:filters => {'status_id' => {:values => [''], :operator => 'o'}}, :project_id => 1}
1208 @request.session[:query] = {:filters => {'status_id' => {:values => [''], :operator => 'o'}}, :project_id => 1}
1209 @request.session['issues_index_sort'] = 'id'
1209 @request.session['issues_index_sort'] = 'id'
1210
1210
1211 with_settings :display_subprojects_issues => '0' do
1211 with_settings :display_subprojects_issues => '0' do
1212 get :show, :id => 1
1212 get :show, :id => 1
1213 end
1213 end
1214
1214
1215 assert_response :success
1215 assert_response :success
1216 assert_nil assigns(:prev_issue_id)
1216 assert_nil assigns(:prev_issue_id)
1217 assert_equal 2, assigns(:next_issue_id)
1217 assert_equal 2, assigns(:next_issue_id)
1218
1218
1219 assert_select 'div.next-prev-links' do
1219 assert_select 'div.next-prev-links' do
1220 assert_select 'a', :text => /Previous/, :count => 0
1220 assert_select 'a', :text => /Previous/, :count => 0
1221 assert_select 'a[href=/issues/2]', :text => /Next/
1221 assert_select 'a[href=/issues/2]', :text => /Next/
1222 end
1222 end
1223 end
1223 end
1224
1224
1225 def test_show_should_not_display_prev_next_links_for_issue_not_in_query_results
1225 def test_show_should_not_display_prev_next_links_for_issue_not_in_query_results
1226 @request.session[:query] = {:filters => {'status_id' => {:values => [''], :operator => 'c'}}, :project_id => 1}
1226 @request.session[:query] = {:filters => {'status_id' => {:values => [''], :operator => 'c'}}, :project_id => 1}
1227 @request.session['issues_index_sort'] = 'id'
1227 @request.session['issues_index_sort'] = 'id'
1228
1228
1229 get :show, :id => 1
1229 get :show, :id => 1
1230
1230
1231 assert_response :success
1231 assert_response :success
1232 assert_nil assigns(:prev_issue_id)
1232 assert_nil assigns(:prev_issue_id)
1233 assert_nil assigns(:next_issue_id)
1233 assert_nil assigns(:next_issue_id)
1234
1234
1235 assert_select 'a', :text => /Previous/, :count => 0
1235 assert_select 'a', :text => /Previous/, :count => 0
1236 assert_select 'a', :text => /Next/, :count => 0
1236 assert_select 'a', :text => /Next/, :count => 0
1237 end
1237 end
1238
1238
1239 def test_show_show_should_display_prev_next_links_with_query_sort_by_user_custom_field
1239 def test_show_show_should_display_prev_next_links_with_query_sort_by_user_custom_field
1240 cf = IssueCustomField.create!(:name => 'User', :is_for_all => true, :tracker_ids => [1,2,3], :field_format => 'user')
1240 cf = IssueCustomField.create!(:name => 'User', :is_for_all => true, :tracker_ids => [1,2,3], :field_format => 'user')
1241 CustomValue.create!(:custom_field => cf, :customized => Issue.find(1), :value => '2')
1241 CustomValue.create!(:custom_field => cf, :customized => Issue.find(1), :value => '2')
1242 CustomValue.create!(:custom_field => cf, :customized => Issue.find(2), :value => '3')
1242 CustomValue.create!(:custom_field => cf, :customized => Issue.find(2), :value => '3')
1243 CustomValue.create!(:custom_field => cf, :customized => Issue.find(3), :value => '3')
1243 CustomValue.create!(:custom_field => cf, :customized => Issue.find(3), :value => '3')
1244 CustomValue.create!(:custom_field => cf, :customized => Issue.find(5), :value => '')
1244 CustomValue.create!(:custom_field => cf, :customized => Issue.find(5), :value => '')
1245
1245
1246 query = IssueQuery.create!(:name => 'test', :visibility => IssueQuery::VISIBILITY_PUBLIC, :user_id => 1, :filters => {},
1246 query = IssueQuery.create!(:name => 'test', :visibility => IssueQuery::VISIBILITY_PUBLIC, :user_id => 1, :filters => {},
1247 :sort_criteria => [["cf_#{cf.id}", 'asc'], ['id', 'asc']])
1247 :sort_criteria => [["cf_#{cf.id}", 'asc'], ['id', 'asc']])
1248 @request.session[:query] = {:id => query.id, :project_id => nil}
1248 @request.session[:query] = {:id => query.id, :project_id => nil}
1249
1249
1250 get :show, :id => 3
1250 get :show, :id => 3
1251 assert_response :success
1251 assert_response :success
1252
1252
1253 assert_equal 2, assigns(:prev_issue_id)
1253 assert_equal 2, assigns(:prev_issue_id)
1254 assert_equal 1, assigns(:next_issue_id)
1254 assert_equal 1, assigns(:next_issue_id)
1255
1255
1256 assert_select 'div.next-prev-links' do
1256 assert_select 'div.next-prev-links' do
1257 assert_select 'a[href=/issues/2]', :text => /Previous/
1257 assert_select 'a[href=/issues/2]', :text => /Previous/
1258 assert_select 'a[href=/issues/1]', :text => /Next/
1258 assert_select 'a[href=/issues/1]', :text => /Next/
1259 end
1259 end
1260 end
1260 end
1261
1261
1262 def test_show_should_display_link_to_the_assignee
1262 def test_show_should_display_link_to_the_assignee
1263 get :show, :id => 2
1263 get :show, :id => 2
1264 assert_response :success
1264 assert_response :success
1265 assert_select '.assigned-to' do
1265 assert_select '.assigned-to' do
1266 assert_select 'a[href=/users/3]'
1266 assert_select 'a[href=/users/3]'
1267 end
1267 end
1268 end
1268 end
1269
1269
1270 def test_show_should_display_visible_changesets_from_other_projects
1270 def test_show_should_display_visible_changesets_from_other_projects
1271 project = Project.find(2)
1271 project = Project.find(2)
1272 issue = project.issues.first
1272 issue = project.issues.first
1273 issue.changeset_ids = [102]
1273 issue.changeset_ids = [102]
1274 issue.save!
1274 issue.save!
1275 # changesets from other projects should be displayed even if repository
1275 # changesets from other projects should be displayed even if repository
1276 # is disabled on issue's project
1276 # is disabled on issue's project
1277 project.disable_module! :repository
1277 project.disable_module! :repository
1278
1278
1279 @request.session[:user_id] = 2
1279 @request.session[:user_id] = 2
1280 get :show, :id => issue.id
1280 get :show, :id => issue.id
1281
1281
1282 assert_select 'a[href=?]', '/projects/ecookbook/repository/revisions/3'
1282 assert_select 'a[href=?]', '/projects/ecookbook/repository/revisions/3'
1283 end
1283 end
1284
1284
1285 def test_show_should_display_watchers
1285 def test_show_should_display_watchers
1286 @request.session[:user_id] = 2
1286 @request.session[:user_id] = 2
1287 Issue.find(1).add_watcher User.find(2)
1287 Issue.find(1).add_watcher User.find(2)
1288
1288
1289 get :show, :id => 1
1289 get :show, :id => 1
1290 assert_select 'div#watchers ul' do
1290 assert_select 'div#watchers ul' do
1291 assert_select 'li' do
1291 assert_select 'li' do
1292 assert_select 'a[href=/users/2]'
1292 assert_select 'a[href=/users/2]'
1293 assert_select 'a img[alt=Delete]'
1293 assert_select 'a img[alt=Delete]'
1294 end
1294 end
1295 end
1295 end
1296 end
1296 end
1297
1297
1298 def test_show_should_display_watchers_with_gravatars
1298 def test_show_should_display_watchers_with_gravatars
1299 @request.session[:user_id] = 2
1299 @request.session[:user_id] = 2
1300 Issue.find(1).add_watcher User.find(2)
1300 Issue.find(1).add_watcher User.find(2)
1301
1301
1302 with_settings :gravatar_enabled => '1' do
1302 with_settings :gravatar_enabled => '1' do
1303 get :show, :id => 1
1303 get :show, :id => 1
1304 end
1304 end
1305
1305
1306 assert_select 'div#watchers ul' do
1306 assert_select 'div#watchers ul' do
1307 assert_select 'li' do
1307 assert_select 'li' do
1308 assert_select 'img.gravatar'
1308 assert_select 'img.gravatar'
1309 assert_select 'a[href=/users/2]'
1309 assert_select 'a[href=/users/2]'
1310 assert_select 'a img[alt=Delete]'
1310 assert_select 'a img[alt=Delete]'
1311 end
1311 end
1312 end
1312 end
1313 end
1313 end
1314
1314
1315 def test_show_with_thumbnails_enabled_should_display_thumbnails
1315 def test_show_with_thumbnails_enabled_should_display_thumbnails
1316 @request.session[:user_id] = 2
1316 @request.session[:user_id] = 2
1317
1317
1318 with_settings :thumbnails_enabled => '1' do
1318 with_settings :thumbnails_enabled => '1' do
1319 get :show, :id => 14
1319 get :show, :id => 14
1320 assert_response :success
1320 assert_response :success
1321 end
1321 end
1322
1322
1323 assert_select 'div.thumbnails' do
1323 assert_select 'div.thumbnails' do
1324 assert_select 'a[href=/attachments/16/testfile.png]' do
1324 assert_select 'a[href=/attachments/16/testfile.png]' do
1325 assert_select 'img[src=/attachments/thumbnail/16]'
1325 assert_select 'img[src=/attachments/thumbnail/16]'
1326 end
1326 end
1327 end
1327 end
1328 end
1328 end
1329
1329
1330 def test_show_with_thumbnails_disabled_should_not_display_thumbnails
1330 def test_show_with_thumbnails_disabled_should_not_display_thumbnails
1331 @request.session[:user_id] = 2
1331 @request.session[:user_id] = 2
1332
1332
1333 with_settings :thumbnails_enabled => '0' do
1333 with_settings :thumbnails_enabled => '0' do
1334 get :show, :id => 14
1334 get :show, :id => 14
1335 assert_response :success
1335 assert_response :success
1336 end
1336 end
1337
1337
1338 assert_select 'div.thumbnails', 0
1338 assert_select 'div.thumbnails', 0
1339 end
1339 end
1340
1340
1341 def test_show_with_multi_custom_field
1341 def test_show_with_multi_custom_field
1342 field = CustomField.find(1)
1342 field = CustomField.find(1)
1343 field.update_attribute :multiple, true
1343 field.update_attribute :multiple, true
1344 issue = Issue.find(1)
1344 issue = Issue.find(1)
1345 issue.custom_field_values = {1 => ['MySQL', 'Oracle']}
1345 issue.custom_field_values = {1 => ['MySQL', 'Oracle']}
1346 issue.save!
1346 issue.save!
1347
1347
1348 get :show, :id => 1
1348 get :show, :id => 1
1349 assert_response :success
1349 assert_response :success
1350
1350
1351 assert_select 'td', :text => 'MySQL, Oracle'
1351 assert_select 'td', :text => 'MySQL, Oracle'
1352 end
1352 end
1353
1353
1354 def test_show_with_multi_user_custom_field
1354 def test_show_with_multi_user_custom_field
1355 field = IssueCustomField.create!(:name => 'Multi user', :field_format => 'user', :multiple => true,
1355 field = IssueCustomField.create!(:name => 'Multi user', :field_format => 'user', :multiple => true,
1356 :tracker_ids => [1], :is_for_all => true)
1356 :tracker_ids => [1], :is_for_all => true)
1357 issue = Issue.find(1)
1357 issue = Issue.find(1)
1358 issue.custom_field_values = {field.id => ['2', '3']}
1358 issue.custom_field_values = {field.id => ['2', '3']}
1359 issue.save!
1359 issue.save!
1360
1360
1361 get :show, :id => 1
1361 get :show, :id => 1
1362 assert_response :success
1362 assert_response :success
1363
1363
1364 assert_select "td.cf_#{field.id}", :text => 'Dave Lopper, John Smith' do
1364 assert_select "td.cf_#{field.id}", :text => 'Dave Lopper, John Smith' do
1365 assert_select 'a', :text => 'Dave Lopper'
1365 assert_select 'a', :text => 'Dave Lopper'
1366 assert_select 'a', :text => 'John Smith'
1366 assert_select 'a', :text => 'John Smith'
1367 end
1367 end
1368 end
1368 end
1369
1369
1370 def test_show_should_display_private_notes_with_permission_only
1370 def test_show_should_display_private_notes_with_permission_only
1371 journal = Journal.create!(:journalized => Issue.find(2), :notes => 'Privates notes', :private_notes => true, :user_id => 1)
1371 journal = Journal.create!(:journalized => Issue.find(2), :notes => 'Privates notes', :private_notes => true, :user_id => 1)
1372 @request.session[:user_id] = 2
1372 @request.session[:user_id] = 2
1373
1373
1374 get :show, :id => 2
1374 get :show, :id => 2
1375 assert_response :success
1375 assert_response :success
1376 assert_include journal, assigns(:journals)
1376 assert_include journal, assigns(:journals)
1377
1377
1378 Role.find(1).remove_permission! :view_private_notes
1378 Role.find(1).remove_permission! :view_private_notes
1379 get :show, :id => 2
1379 get :show, :id => 2
1380 assert_response :success
1380 assert_response :success
1381 assert_not_include journal, assigns(:journals)
1381 assert_not_include journal, assigns(:journals)
1382 end
1382 end
1383
1383
1384 def test_show_atom
1384 def test_show_atom
1385 get :show, :id => 2, :format => 'atom'
1385 get :show, :id => 2, :format => 'atom'
1386 assert_response :success
1386 assert_response :success
1387 assert_template 'journals/index'
1387 assert_template 'journals/index'
1388 # Inline image
1388 # Inline image
1389 assert_select 'content', :text => Regexp.new(Regexp.quote('http://test.host/attachments/download/10'))
1389 assert_select 'content', :text => Regexp.new(Regexp.quote('http://test.host/attachments/download/10'))
1390 end
1390 end
1391
1391
1392 def test_show_export_to_pdf
1392 def test_show_export_to_pdf
1393 get :show, :id => 3, :format => 'pdf'
1393 get :show, :id => 3, :format => 'pdf'
1394 assert_response :success
1394 assert_response :success
1395 assert_equal 'application/pdf', @response.content_type
1395 assert_equal 'application/pdf', @response.content_type
1396 assert @response.body.starts_with?('%PDF')
1396 assert @response.body.starts_with?('%PDF')
1397 assert_not_nil assigns(:issue)
1397 assert_not_nil assigns(:issue)
1398 end
1398 end
1399
1399
1400 def test_show_export_to_pdf_with_ancestors
1400 def test_show_export_to_pdf_with_ancestors
1401 issue = Issue.generate!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'child', :parent_issue_id => 1)
1401 issue = Issue.generate!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'child', :parent_issue_id => 1)
1402
1402
1403 get :show, :id => issue.id, :format => 'pdf'
1403 get :show, :id => issue.id, :format => 'pdf'
1404 assert_response :success
1404 assert_response :success
1405 assert_equal 'application/pdf', @response.content_type
1405 assert_equal 'application/pdf', @response.content_type
1406 assert @response.body.starts_with?('%PDF')
1406 assert @response.body.starts_with?('%PDF')
1407 end
1407 end
1408
1408
1409 def test_show_export_to_pdf_with_descendants
1409 def test_show_export_to_pdf_with_descendants
1410 c1 = Issue.generate!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'child', :parent_issue_id => 1)
1410 c1 = Issue.generate!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'child', :parent_issue_id => 1)
1411 c2 = Issue.generate!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'child', :parent_issue_id => 1)
1411 c2 = Issue.generate!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'child', :parent_issue_id => 1)
1412 c3 = Issue.generate!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'child', :parent_issue_id => c1.id)
1412 c3 = Issue.generate!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'child', :parent_issue_id => c1.id)
1413
1413
1414 get :show, :id => 1, :format => 'pdf'
1414 get :show, :id => 1, :format => 'pdf'
1415 assert_response :success
1415 assert_response :success
1416 assert_equal 'application/pdf', @response.content_type
1416 assert_equal 'application/pdf', @response.content_type
1417 assert @response.body.starts_with?('%PDF')
1417 assert @response.body.starts_with?('%PDF')
1418 end
1418 end
1419
1419
1420 def test_show_export_to_pdf_with_journals
1420 def test_show_export_to_pdf_with_journals
1421 get :show, :id => 1, :format => 'pdf'
1421 get :show, :id => 1, :format => 'pdf'
1422 assert_response :success
1422 assert_response :success
1423 assert_equal 'application/pdf', @response.content_type
1423 assert_equal 'application/pdf', @response.content_type
1424 assert @response.body.starts_with?('%PDF')
1424 assert @response.body.starts_with?('%PDF')
1425 end
1425 end
1426
1426
1427 def test_show_export_to_pdf_with_changesets
1427 def test_show_export_to_pdf_with_changesets
1428 [[100], [100, 101], [100, 101, 102]].each do |cs|
1428 [[100], [100, 101], [100, 101, 102]].each do |cs|
1429 issue1 = Issue.find(3)
1429 issue1 = Issue.find(3)
1430 issue1.changesets = Changeset.find(cs)
1430 issue1.changesets = Changeset.find(cs)
1431 issue1.save!
1431 issue1.save!
1432 issue = Issue.find(3)
1432 issue = Issue.find(3)
1433 assert_equal issue.changesets.count, cs.size
1433 assert_equal issue.changesets.count, cs.size
1434 get :show, :id => 3, :format => 'pdf'
1434 get :show, :id => 3, :format => 'pdf'
1435 assert_response :success
1435 assert_response :success
1436 assert_equal 'application/pdf', @response.content_type
1436 assert_equal 'application/pdf', @response.content_type
1437 assert @response.body.starts_with?('%PDF')
1437 assert @response.body.starts_with?('%PDF')
1438 end
1438 end
1439 end
1439 end
1440
1440
1441 def test_show_invalid_should_respond_with_404
1441 def test_show_invalid_should_respond_with_404
1442 get :show, :id => 999
1442 get :show, :id => 999
1443 assert_response 404
1443 assert_response 404
1444 end
1444 end
1445
1445
1446 def test_get_new
1446 def test_get_new
1447 @request.session[:user_id] = 2
1447 @request.session[:user_id] = 2
1448 get :new, :project_id => 1, :tracker_id => 1
1448 get :new, :project_id => 1, :tracker_id => 1
1449 assert_response :success
1449 assert_response :success
1450 assert_template 'new'
1450 assert_template 'new'
1451
1451
1452 assert_select 'form#issue-form' do
1452 assert_select 'form#issue-form' do
1453 assert_select 'input[name=?]', 'issue[is_private]'
1453 assert_select 'input[name=?]', 'issue[is_private]'
1454 assert_select 'select[name=?]', 'issue[project_id]', 0
1454 assert_select 'select[name=?]', 'issue[project_id]', 0
1455 assert_select 'select[name=?]', 'issue[tracker_id]'
1455 assert_select 'select[name=?]', 'issue[tracker_id]'
1456 assert_select 'input[name=?]', 'issue[subject]'
1456 assert_select 'input[name=?]', 'issue[subject]'
1457 assert_select 'textarea[name=?]', 'issue[description]'
1457 assert_select 'textarea[name=?]', 'issue[description]'
1458 assert_select 'select[name=?]', 'issue[status_id]'
1458 assert_select 'select[name=?]', 'issue[status_id]'
1459 assert_select 'select[name=?]', 'issue[priority_id]'
1459 assert_select 'select[name=?]', 'issue[priority_id]'
1460 assert_select 'select[name=?]', 'issue[assigned_to_id]'
1460 assert_select 'select[name=?]', 'issue[assigned_to_id]'
1461 assert_select 'select[name=?]', 'issue[category_id]'
1461 assert_select 'select[name=?]', 'issue[category_id]'
1462 assert_select 'select[name=?]', 'issue[fixed_version_id]'
1462 assert_select 'select[name=?]', 'issue[fixed_version_id]'
1463 assert_select 'input[name=?]', 'issue[parent_issue_id]'
1463 assert_select 'input[name=?]', 'issue[parent_issue_id]'
1464 assert_select 'input[name=?]', 'issue[start_date]'
1464 assert_select 'input[name=?]', 'issue[start_date]'
1465 assert_select 'input[name=?]', 'issue[due_date]'
1465 assert_select 'input[name=?]', 'issue[due_date]'
1466 assert_select 'select[name=?]', 'issue[done_ratio]'
1466 assert_select 'select[name=?]', 'issue[done_ratio]'
1467 assert_select 'input[name=?][value=?]', 'issue[custom_field_values][2]', 'Default string'
1467 assert_select 'input[name=?][value=?]', 'issue[custom_field_values][2]', 'Default string'
1468 assert_select 'input[name=?]', 'issue[watcher_user_ids][]'
1468 assert_select 'input[name=?]', 'issue[watcher_user_ids][]'
1469 end
1469 end
1470
1470
1471 # Be sure we don't display inactive IssuePriorities
1471 # Be sure we don't display inactive IssuePriorities
1472 assert ! IssuePriority.find(15).active?
1472 assert ! IssuePriority.find(15).active?
1473 assert_select 'select[name=?]', 'issue[priority_id]' do
1473 assert_select 'select[name=?]', 'issue[priority_id]' do
1474 assert_select 'option[value=15]', 0
1474 assert_select 'option[value=15]', 0
1475 end
1475 end
1476 end
1476 end
1477
1477
1478 def test_get_new_with_minimal_permissions
1478 def test_get_new_with_minimal_permissions
1479 Role.find(1).update_attribute :permissions, [:add_issues]
1479 Role.find(1).update_attribute :permissions, [:add_issues]
1480 WorkflowTransition.delete_all :role_id => 1
1480 WorkflowTransition.delete_all :role_id => 1
1481
1481
1482 @request.session[:user_id] = 2
1482 @request.session[:user_id] = 2
1483 get :new, :project_id => 1, :tracker_id => 1
1483 get :new, :project_id => 1, :tracker_id => 1
1484 assert_response :success
1484 assert_response :success
1485 assert_template 'new'
1485 assert_template 'new'
1486
1486
1487 assert_select 'form#issue-form' do
1487 assert_select 'form#issue-form' do
1488 assert_select 'input[name=?]', 'issue[is_private]', 0
1488 assert_select 'input[name=?]', 'issue[is_private]', 0
1489 assert_select 'select[name=?]', 'issue[project_id]', 0
1489 assert_select 'select[name=?]', 'issue[project_id]', 0
1490 assert_select 'select[name=?]', 'issue[tracker_id]'
1490 assert_select 'select[name=?]', 'issue[tracker_id]'
1491 assert_select 'input[name=?]', 'issue[subject]'
1491 assert_select 'input[name=?]', 'issue[subject]'
1492 assert_select 'textarea[name=?]', 'issue[description]'
1492 assert_select 'textarea[name=?]', 'issue[description]'
1493 assert_select 'select[name=?]', 'issue[status_id]'
1493 assert_select 'select[name=?]', 'issue[status_id]'
1494 assert_select 'select[name=?]', 'issue[priority_id]'
1494 assert_select 'select[name=?]', 'issue[priority_id]'
1495 assert_select 'select[name=?]', 'issue[assigned_to_id]'
1495 assert_select 'select[name=?]', 'issue[assigned_to_id]'
1496 assert_select 'select[name=?]', 'issue[category_id]'
1496 assert_select 'select[name=?]', 'issue[category_id]'
1497 assert_select 'select[name=?]', 'issue[fixed_version_id]'
1497 assert_select 'select[name=?]', 'issue[fixed_version_id]'
1498 assert_select 'input[name=?]', 'issue[parent_issue_id]', 0
1498 assert_select 'input[name=?]', 'issue[parent_issue_id]', 0
1499 assert_select 'input[name=?]', 'issue[start_date]'
1499 assert_select 'input[name=?]', 'issue[start_date]'
1500 assert_select 'input[name=?]', 'issue[due_date]'
1500 assert_select 'input[name=?]', 'issue[due_date]'
1501 assert_select 'select[name=?]', 'issue[done_ratio]'
1501 assert_select 'select[name=?]', 'issue[done_ratio]'
1502 assert_select 'input[name=?][value=?]', 'issue[custom_field_values][2]', 'Default string'
1502 assert_select 'input[name=?][value=?]', 'issue[custom_field_values][2]', 'Default string'
1503 assert_select 'input[name=?]', 'issue[watcher_user_ids][]', 0
1503 assert_select 'input[name=?]', 'issue[watcher_user_ids][]', 0
1504 end
1504 end
1505 end
1505 end
1506
1506
1507 def test_get_new_with_list_custom_field
1507 def test_get_new_with_list_custom_field
1508 @request.session[:user_id] = 2
1508 @request.session[:user_id] = 2
1509 get :new, :project_id => 1, :tracker_id => 1
1509 get :new, :project_id => 1, :tracker_id => 1
1510 assert_response :success
1510 assert_response :success
1511 assert_template 'new'
1511 assert_template 'new'
1512
1512
1513 assert_select 'select.list_cf[name=?]', 'issue[custom_field_values][1]' do
1513 assert_select 'select.list_cf[name=?]', 'issue[custom_field_values][1]' do
1514 assert_select 'option', 4
1514 assert_select 'option', 4
1515 assert_select 'option[value=MySQL]', :text => 'MySQL'
1515 assert_select 'option[value=MySQL]', :text => 'MySQL'
1516 end
1516 end
1517 end
1517 end
1518
1518
1519 def test_get_new_with_multi_custom_field
1519 def test_get_new_with_multi_custom_field
1520 field = IssueCustomField.find(1)
1520 field = IssueCustomField.find(1)
1521 field.update_attribute :multiple, true
1521 field.update_attribute :multiple, true
1522
1522
1523 @request.session[:user_id] = 2
1523 @request.session[:user_id] = 2
1524 get :new, :project_id => 1, :tracker_id => 1
1524 get :new, :project_id => 1, :tracker_id => 1
1525 assert_response :success
1525 assert_response :success
1526 assert_template 'new'
1526 assert_template 'new'
1527
1527
1528 assert_select 'select[name=?][multiple=multiple]', 'issue[custom_field_values][1][]' do
1528 assert_select 'select[name=?][multiple=multiple]', 'issue[custom_field_values][1][]' do
1529 assert_select 'option', 3
1529 assert_select 'option', 3
1530 assert_select 'option[value=MySQL]', :text => 'MySQL'
1530 assert_select 'option[value=MySQL]', :text => 'MySQL'
1531 end
1531 end
1532 assert_select 'input[name=?][type=hidden][value=?]', 'issue[custom_field_values][1][]', ''
1532 assert_select 'input[name=?][type=hidden][value=?]', 'issue[custom_field_values][1][]', ''
1533 end
1533 end
1534
1534
1535 def test_get_new_with_multi_user_custom_field
1535 def test_get_new_with_multi_user_custom_field
1536 field = IssueCustomField.create!(:name => 'Multi user', :field_format => 'user', :multiple => true,
1536 field = IssueCustomField.create!(:name => 'Multi user', :field_format => 'user', :multiple => true,
1537 :tracker_ids => [1], :is_for_all => true)
1537 :tracker_ids => [1], :is_for_all => true)
1538
1538
1539 @request.session[:user_id] = 2
1539 @request.session[:user_id] = 2
1540 get :new, :project_id => 1, :tracker_id => 1
1540 get :new, :project_id => 1, :tracker_id => 1
1541 assert_response :success
1541 assert_response :success
1542 assert_template 'new'
1542 assert_template 'new'
1543
1543
1544 assert_select 'select[name=?][multiple=multiple]', "issue[custom_field_values][#{field.id}][]" do
1544 assert_select 'select[name=?][multiple=multiple]', "issue[custom_field_values][#{field.id}][]" do
1545 assert_select 'option', Project.find(1).users.count
1545 assert_select 'option', Project.find(1).users.count
1546 assert_select 'option[value=2]', :text => 'John Smith'
1546 assert_select 'option[value=2]', :text => 'John Smith'
1547 end
1547 end
1548 assert_select 'input[name=?][type=hidden][value=?]', "issue[custom_field_values][#{field.id}][]", ''
1548 assert_select 'input[name=?][type=hidden][value=?]', "issue[custom_field_values][#{field.id}][]", ''
1549 end
1549 end
1550
1550
1551 def test_get_new_with_date_custom_field
1551 def test_get_new_with_date_custom_field
1552 field = IssueCustomField.create!(:name => 'Date', :field_format => 'date', :tracker_ids => [1], :is_for_all => true)
1552 field = IssueCustomField.create!(:name => 'Date', :field_format => 'date', :tracker_ids => [1], :is_for_all => true)
1553
1553
1554 @request.session[:user_id] = 2
1554 @request.session[:user_id] = 2
1555 get :new, :project_id => 1, :tracker_id => 1
1555 get :new, :project_id => 1, :tracker_id => 1
1556 assert_response :success
1556 assert_response :success
1557
1557
1558 assert_select 'input[name=?]', "issue[custom_field_values][#{field.id}]"
1558 assert_select 'input[name=?]', "issue[custom_field_values][#{field.id}]"
1559 end
1559 end
1560
1560
1561 def test_get_new_with_text_custom_field
1561 def test_get_new_with_text_custom_field
1562 field = IssueCustomField.create!(:name => 'Text', :field_format => 'text', :tracker_ids => [1], :is_for_all => true)
1562 field = IssueCustomField.create!(:name => 'Text', :field_format => 'text', :tracker_ids => [1], :is_for_all => true)
1563
1563
1564 @request.session[:user_id] = 2
1564 @request.session[:user_id] = 2
1565 get :new, :project_id => 1, :tracker_id => 1
1565 get :new, :project_id => 1, :tracker_id => 1
1566 assert_response :success
1566 assert_response :success
1567
1567
1568 assert_select 'textarea[name=?]', "issue[custom_field_values][#{field.id}]"
1568 assert_select 'textarea[name=?]', "issue[custom_field_values][#{field.id}]"
1569 end
1569 end
1570
1570
1571 def test_get_new_without_default_start_date_is_creation_date
1571 def test_get_new_without_default_start_date_is_creation_date
1572 with_settings :default_issue_start_date_to_creation_date => 0 do
1572 with_settings :default_issue_start_date_to_creation_date => 0 do
1573 @request.session[:user_id] = 2
1573 @request.session[:user_id] = 2
1574 get :new, :project_id => 1, :tracker_id => 1
1574 get :new, :project_id => 1, :tracker_id => 1
1575 assert_response :success
1575 assert_response :success
1576 assert_template 'new'
1576 assert_template 'new'
1577 assert_select 'input[name=?]', 'issue[start_date]'
1577 assert_select 'input[name=?]', 'issue[start_date]'
1578 assert_select 'input[name=?][value]', 'issue[start_date]', 0
1578 assert_select 'input[name=?][value]', 'issue[start_date]', 0
1579 end
1579 end
1580 end
1580 end
1581
1581
1582 def test_get_new_with_default_start_date_is_creation_date
1582 def test_get_new_with_default_start_date_is_creation_date
1583 with_settings :default_issue_start_date_to_creation_date => 1 do
1583 with_settings :default_issue_start_date_to_creation_date => 1 do
1584 @request.session[:user_id] = 2
1584 @request.session[:user_id] = 2
1585 get :new, :project_id => 1, :tracker_id => 1
1585 get :new, :project_id => 1, :tracker_id => 1
1586 assert_response :success
1586 assert_response :success
1587 assert_template 'new'
1587 assert_template 'new'
1588 assert_select 'input[name=?][value=?]', 'issue[start_date]',
1588 assert_select 'input[name=?][value=?]', 'issue[start_date]',
1589 Date.today.to_s
1589 Date.today.to_s
1590 end
1590 end
1591 end
1591 end
1592
1592
1593 def test_get_new_form_should_allow_attachment_upload
1593 def test_get_new_form_should_allow_attachment_upload
1594 @request.session[:user_id] = 2
1594 @request.session[:user_id] = 2
1595 get :new, :project_id => 1, :tracker_id => 1
1595 get :new, :project_id => 1, :tracker_id => 1
1596
1596
1597 assert_select 'form[id=issue-form][method=post][enctype=multipart/form-data]' do
1597 assert_select 'form[id=issue-form][method=post][enctype=multipart/form-data]' do
1598 assert_select 'input[name=?][type=file]', 'attachments[dummy][file]'
1598 assert_select 'input[name=?][type=file]', 'attachments[dummy][file]'
1599 end
1599 end
1600 end
1600 end
1601
1601
1602 def test_get_new_should_prefill_the_form_from_params
1602 def test_get_new_should_prefill_the_form_from_params
1603 @request.session[:user_id] = 2
1603 @request.session[:user_id] = 2
1604 get :new, :project_id => 1,
1604 get :new, :project_id => 1,
1605 :issue => {:tracker_id => 3, :description => 'Prefilled', :custom_field_values => {'2' => 'Custom field value'}}
1605 :issue => {:tracker_id => 3, :description => 'Prefilled', :custom_field_values => {'2' => 'Custom field value'}}
1606
1606
1607 issue = assigns(:issue)
1607 issue = assigns(:issue)
1608 assert_equal 3, issue.tracker_id
1608 assert_equal 3, issue.tracker_id
1609 assert_equal 'Prefilled', issue.description
1609 assert_equal 'Prefilled', issue.description
1610 assert_equal 'Custom field value', issue.custom_field_value(2)
1610 assert_equal 'Custom field value', issue.custom_field_value(2)
1611
1611
1612 assert_select 'select[name=?]', 'issue[tracker_id]' do
1612 assert_select 'select[name=?]', 'issue[tracker_id]' do
1613 assert_select 'option[value=3][selected=selected]'
1613 assert_select 'option[value=3][selected=selected]'
1614 end
1614 end
1615 assert_select 'textarea[name=?]', 'issue[description]', :text => /Prefilled/
1615 assert_select 'textarea[name=?]', 'issue[description]', :text => /Prefilled/
1616 assert_select 'input[name=?][value=?]', 'issue[custom_field_values][2]', 'Custom field value'
1616 assert_select 'input[name=?][value=?]', 'issue[custom_field_values][2]', 'Custom field value'
1617 end
1617 end
1618
1618
1619 def test_get_new_should_mark_required_fields
1619 def test_get_new_should_mark_required_fields
1620 cf1 = IssueCustomField.create!(:name => 'Foo', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
1620 cf1 = IssueCustomField.create!(:name => 'Foo', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
1621 cf2 = IssueCustomField.create!(:name => 'Bar', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
1621 cf2 = IssueCustomField.create!(:name => 'Bar', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
1622 WorkflowPermission.delete_all
1622 WorkflowPermission.delete_all
1623 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1, :role_id => 1, :field_name => 'due_date', :rule => 'required')
1623 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1, :role_id => 1, :field_name => 'due_date', :rule => 'required')
1624 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1, :role_id => 1, :field_name => cf2.id.to_s, :rule => 'required')
1624 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1, :role_id => 1, :field_name => cf2.id.to_s, :rule => 'required')
1625 @request.session[:user_id] = 2
1625 @request.session[:user_id] = 2
1626
1626
1627 get :new, :project_id => 1
1627 get :new, :project_id => 1
1628 assert_response :success
1628 assert_response :success
1629 assert_template 'new'
1629 assert_template 'new'
1630
1630
1631 assert_select 'label[for=issue_start_date]' do
1631 assert_select 'label[for=issue_start_date]' do
1632 assert_select 'span[class=required]', 0
1632 assert_select 'span[class=required]', 0
1633 end
1633 end
1634 assert_select 'label[for=issue_due_date]' do
1634 assert_select 'label[for=issue_due_date]' do
1635 assert_select 'span[class=required]'
1635 assert_select 'span[class=required]'
1636 end
1636 end
1637 assert_select 'label[for=?]', "issue_custom_field_values_#{cf1.id}" do
1637 assert_select 'label[for=?]', "issue_custom_field_values_#{cf1.id}" do
1638 assert_select 'span[class=required]', 0
1638 assert_select 'span[class=required]', 0
1639 end
1639 end
1640 assert_select 'label[for=?]', "issue_custom_field_values_#{cf2.id}" do
1640 assert_select 'label[for=?]', "issue_custom_field_values_#{cf2.id}" do
1641 assert_select 'span[class=required]'
1641 assert_select 'span[class=required]'
1642 end
1642 end
1643 end
1643 end
1644
1644
1645 def test_get_new_should_not_display_readonly_fields
1645 def test_get_new_should_not_display_readonly_fields
1646 cf1 = IssueCustomField.create!(:name => 'Foo', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
1646 cf1 = IssueCustomField.create!(:name => 'Foo', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
1647 cf2 = IssueCustomField.create!(:name => 'Bar', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
1647 cf2 = IssueCustomField.create!(:name => 'Bar', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
1648 WorkflowPermission.delete_all
1648 WorkflowPermission.delete_all
1649 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1, :role_id => 1, :field_name => 'due_date', :rule => 'readonly')
1649 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1, :role_id => 1, :field_name => 'due_date', :rule => 'readonly')
1650 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1, :role_id => 1, :field_name => cf2.id.to_s, :rule => 'readonly')
1650 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1, :role_id => 1, :field_name => cf2.id.to_s, :rule => 'readonly')
1651 @request.session[:user_id] = 2
1651 @request.session[:user_id] = 2
1652
1652
1653 get :new, :project_id => 1
1653 get :new, :project_id => 1
1654 assert_response :success
1654 assert_response :success
1655 assert_template 'new'
1655 assert_template 'new'
1656
1656
1657 assert_select 'input[name=?]', 'issue[start_date]'
1657 assert_select 'input[name=?]', 'issue[start_date]'
1658 assert_select 'input[name=?]', 'issue[due_date]', 0
1658 assert_select 'input[name=?]', 'issue[due_date]', 0
1659 assert_select 'input[name=?]', "issue[custom_field_values][#{cf1.id}]"
1659 assert_select 'input[name=?]', "issue[custom_field_values][#{cf1.id}]"
1660 assert_select 'input[name=?]', "issue[custom_field_values][#{cf2.id}]", 0
1660 assert_select 'input[name=?]', "issue[custom_field_values][#{cf2.id}]", 0
1661 end
1661 end
1662
1662
1663 def test_get_new_without_tracker_id
1663 def test_get_new_without_tracker_id
1664 @request.session[:user_id] = 2
1664 @request.session[:user_id] = 2
1665 get :new, :project_id => 1
1665 get :new, :project_id => 1
1666 assert_response :success
1666 assert_response :success
1667 assert_template 'new'
1667 assert_template 'new'
1668
1668
1669 issue = assigns(:issue)
1669 issue = assigns(:issue)
1670 assert_not_nil issue
1670 assert_not_nil issue
1671 assert_equal Project.find(1).trackers.first, issue.tracker
1671 assert_equal Project.find(1).trackers.first, issue.tracker
1672 end
1672 end
1673
1673
1674 def test_get_new_with_no_default_status_should_display_an_error
1674 def test_get_new_with_no_default_status_should_display_an_error
1675 @request.session[:user_id] = 2
1675 @request.session[:user_id] = 2
1676 IssueStatus.delete_all
1676 IssueStatus.delete_all
1677
1677
1678 get :new, :project_id => 1
1678 get :new, :project_id => 1
1679 assert_response 500
1679 assert_response 500
1680 assert_error_tag :content => /No default issue/
1680 assert_error_tag :content => /No default issue/
1681 end
1681 end
1682
1682
1683 def test_get_new_with_no_tracker_should_display_an_error
1683 def test_get_new_with_no_tracker_should_display_an_error
1684 @request.session[:user_id] = 2
1684 @request.session[:user_id] = 2
1685 Tracker.delete_all
1685 Tracker.delete_all
1686
1686
1687 get :new, :project_id => 1
1687 get :new, :project_id => 1
1688 assert_response 500
1688 assert_response 500
1689 assert_error_tag :content => /No tracker/
1689 assert_error_tag :content => /No tracker/
1690 end
1690 end
1691
1691
1692 def test_update_form_for_new_issue
1692 def test_update_form_for_new_issue
1693 @request.session[:user_id] = 2
1693 @request.session[:user_id] = 2
1694 xhr :post, :update_form, :project_id => 1,
1694 xhr :post, :update_form, :project_id => 1,
1695 :issue => {:tracker_id => 2,
1695 :issue => {:tracker_id => 2,
1696 :subject => 'This is the test_new issue',
1696 :subject => 'This is the test_new issue',
1697 :description => 'This is the description',
1697 :description => 'This is the description',
1698 :priority_id => 5}
1698 :priority_id => 5}
1699 assert_response :success
1699 assert_response :success
1700 assert_template 'update_form'
1700 assert_template 'update_form'
1701 assert_template 'form'
1701 assert_template 'form'
1702 assert_equal 'text/javascript', response.content_type
1702 assert_equal 'text/javascript', response.content_type
1703
1703
1704 issue = assigns(:issue)
1704 issue = assigns(:issue)
1705 assert_kind_of Issue, issue
1705 assert_kind_of Issue, issue
1706 assert_equal 1, issue.project_id
1706 assert_equal 1, issue.project_id
1707 assert_equal 2, issue.tracker_id
1707 assert_equal 2, issue.tracker_id
1708 assert_equal 'This is the test_new issue', issue.subject
1708 assert_equal 'This is the test_new issue', issue.subject
1709 end
1709 end
1710
1710
1711 def test_update_form_for_new_issue_should_propose_transitions_based_on_initial_status
1711 def test_update_form_for_new_issue_should_propose_transitions_based_on_initial_status
1712 @request.session[:user_id] = 2
1712 @request.session[:user_id] = 2
1713 WorkflowTransition.delete_all
1713 WorkflowTransition.delete_all
1714 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 2)
1714 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 2)
1715 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 5)
1715 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 5)
1716 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 5, :new_status_id => 4)
1716 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 5, :new_status_id => 4)
1717
1717
1718 xhr :post, :update_form, :project_id => 1,
1718 xhr :post, :update_form, :project_id => 1,
1719 :issue => {:tracker_id => 1,
1719 :issue => {:tracker_id => 1,
1720 :status_id => 5,
1720 :status_id => 5,
1721 :subject => 'This is an issue'}
1721 :subject => 'This is an issue'}
1722
1722
1723 assert_equal 5, assigns(:issue).status_id
1723 assert_equal 5, assigns(:issue).status_id
1724 assert_equal [1,2,5], assigns(:allowed_statuses).map(&:id).sort
1724 assert_equal [1,2,5], assigns(:allowed_statuses).map(&:id).sort
1725 end
1725 end
1726
1726
1727 def test_post_create
1727 def test_post_create
1728 @request.session[:user_id] = 2
1728 @request.session[:user_id] = 2
1729 assert_difference 'Issue.count' do
1729 assert_difference 'Issue.count' do
1730 post :create, :project_id => 1,
1730 post :create, :project_id => 1,
1731 :issue => {:tracker_id => 3,
1731 :issue => {:tracker_id => 3,
1732 :status_id => 2,
1732 :status_id => 2,
1733 :subject => 'This is the test_new issue',
1733 :subject => 'This is the test_new issue',
1734 :description => 'This is the description',
1734 :description => 'This is the description',
1735 :priority_id => 5,
1735 :priority_id => 5,
1736 :start_date => '2010-11-07',
1736 :start_date => '2010-11-07',
1737 :estimated_hours => '',
1737 :estimated_hours => '',
1738 :custom_field_values => {'2' => 'Value for field 2'}}
1738 :custom_field_values => {'2' => 'Value for field 2'}}
1739 end
1739 end
1740 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
1740 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
1741
1741
1742 issue = Issue.find_by_subject('This is the test_new issue')
1742 issue = Issue.find_by_subject('This is the test_new issue')
1743 assert_not_nil issue
1743 assert_not_nil issue
1744 assert_equal 2, issue.author_id
1744 assert_equal 2, issue.author_id
1745 assert_equal 3, issue.tracker_id
1745 assert_equal 3, issue.tracker_id
1746 assert_equal 2, issue.status_id
1746 assert_equal 2, issue.status_id
1747 assert_equal Date.parse('2010-11-07'), issue.start_date
1747 assert_equal Date.parse('2010-11-07'), issue.start_date
1748 assert_nil issue.estimated_hours
1748 assert_nil issue.estimated_hours
1749 v = issue.custom_values.where(:custom_field_id => 2).first
1749 v = issue.custom_values.where(:custom_field_id => 2).first
1750 assert_not_nil v
1750 assert_not_nil v
1751 assert_equal 'Value for field 2', v.value
1751 assert_equal 'Value for field 2', v.value
1752 end
1752 end
1753
1753
1754 def test_post_new_with_group_assignment
1754 def test_post_new_with_group_assignment
1755 group = Group.find(11)
1755 group = Group.find(11)
1756 project = Project.find(1)
1756 project = Project.find(1)
1757 project.members << Member.new(:principal => group, :roles => [Role.givable.first])
1757 project.members << Member.new(:principal => group, :roles => [Role.givable.first])
1758
1758
1759 with_settings :issue_group_assignment => '1' do
1759 with_settings :issue_group_assignment => '1' do
1760 @request.session[:user_id] = 2
1760 @request.session[:user_id] = 2
1761 assert_difference 'Issue.count' do
1761 assert_difference 'Issue.count' do
1762 post :create, :project_id => project.id,
1762 post :create, :project_id => project.id,
1763 :issue => {:tracker_id => 3,
1763 :issue => {:tracker_id => 3,
1764 :status_id => 1,
1764 :status_id => 1,
1765 :subject => 'This is the test_new_with_group_assignment issue',
1765 :subject => 'This is the test_new_with_group_assignment issue',
1766 :assigned_to_id => group.id}
1766 :assigned_to_id => group.id}
1767 end
1767 end
1768 end
1768 end
1769 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
1769 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
1770
1770
1771 issue = Issue.find_by_subject('This is the test_new_with_group_assignment issue')
1771 issue = Issue.find_by_subject('This is the test_new_with_group_assignment issue')
1772 assert_not_nil issue
1772 assert_not_nil issue
1773 assert_equal group, issue.assigned_to
1773 assert_equal group, issue.assigned_to
1774 end
1774 end
1775
1775
1776 def test_post_create_without_start_date_and_default_start_date_is_not_creation_date
1776 def test_post_create_without_start_date_and_default_start_date_is_not_creation_date
1777 with_settings :default_issue_start_date_to_creation_date => 0 do
1777 with_settings :default_issue_start_date_to_creation_date => 0 do
1778 @request.session[:user_id] = 2
1778 @request.session[:user_id] = 2
1779 assert_difference 'Issue.count' do
1779 assert_difference 'Issue.count' do
1780 post :create, :project_id => 1,
1780 post :create, :project_id => 1,
1781 :issue => {:tracker_id => 3,
1781 :issue => {:tracker_id => 3,
1782 :status_id => 2,
1782 :status_id => 2,
1783 :subject => 'This is the test_new issue',
1783 :subject => 'This is the test_new issue',
1784 :description => 'This is the description',
1784 :description => 'This is the description',
1785 :priority_id => 5,
1785 :priority_id => 5,
1786 :estimated_hours => '',
1786 :estimated_hours => '',
1787 :custom_field_values => {'2' => 'Value for field 2'}}
1787 :custom_field_values => {'2' => 'Value for field 2'}}
1788 end
1788 end
1789 assert_redirected_to :controller => 'issues', :action => 'show',
1789 assert_redirected_to :controller => 'issues', :action => 'show',
1790 :id => Issue.last.id
1790 :id => Issue.last.id
1791 issue = Issue.find_by_subject('This is the test_new issue')
1791 issue = Issue.find_by_subject('This is the test_new issue')
1792 assert_not_nil issue
1792 assert_not_nil issue
1793 assert_nil issue.start_date
1793 assert_nil issue.start_date
1794 end
1794 end
1795 end
1795 end
1796
1796
1797 def test_post_create_without_start_date_and_default_start_date_is_creation_date
1797 def test_post_create_without_start_date_and_default_start_date_is_creation_date
1798 with_settings :default_issue_start_date_to_creation_date => 1 do
1798 with_settings :default_issue_start_date_to_creation_date => 1 do
1799 @request.session[:user_id] = 2
1799 @request.session[:user_id] = 2
1800 assert_difference 'Issue.count' do
1800 assert_difference 'Issue.count' do
1801 post :create, :project_id => 1,
1801 post :create, :project_id => 1,
1802 :issue => {:tracker_id => 3,
1802 :issue => {:tracker_id => 3,
1803 :status_id => 2,
1803 :status_id => 2,
1804 :subject => 'This is the test_new issue',
1804 :subject => 'This is the test_new issue',
1805 :description => 'This is the description',
1805 :description => 'This is the description',
1806 :priority_id => 5,
1806 :priority_id => 5,
1807 :estimated_hours => '',
1807 :estimated_hours => '',
1808 :custom_field_values => {'2' => 'Value for field 2'}}
1808 :custom_field_values => {'2' => 'Value for field 2'}}
1809 end
1809 end
1810 assert_redirected_to :controller => 'issues', :action => 'show',
1810 assert_redirected_to :controller => 'issues', :action => 'show',
1811 :id => Issue.last.id
1811 :id => Issue.last.id
1812 issue = Issue.find_by_subject('This is the test_new issue')
1812 issue = Issue.find_by_subject('This is the test_new issue')
1813 assert_not_nil issue
1813 assert_not_nil issue
1814 assert_equal Date.today, issue.start_date
1814 assert_equal Date.today, issue.start_date
1815 end
1815 end
1816 end
1816 end
1817
1817
1818 def test_post_create_and_continue
1818 def test_post_create_and_continue
1819 @request.session[:user_id] = 2
1819 @request.session[:user_id] = 2
1820 assert_difference 'Issue.count' do
1820 assert_difference 'Issue.count' do
1821 post :create, :project_id => 1,
1821 post :create, :project_id => 1,
1822 :issue => {:tracker_id => 3, :subject => 'This is first issue', :priority_id => 5},
1822 :issue => {:tracker_id => 3, :subject => 'This is first issue', :priority_id => 5},
1823 :continue => ''
1823 :continue => ''
1824 end
1824 end
1825
1825
1826 issue = Issue.order('id DESC').first
1826 issue = Issue.order('id DESC').first
1827 assert_redirected_to :controller => 'issues', :action => 'new', :project_id => 'ecookbook', :issue => {:tracker_id => 3}
1827 assert_redirected_to :controller => 'issues', :action => 'new', :project_id => 'ecookbook', :issue => {:tracker_id => 3}
1828 assert_not_nil flash[:notice], "flash was not set"
1828 assert_not_nil flash[:notice], "flash was not set"
1829 assert_include %|<a href="/issues/#{issue.id}" title="This is first issue">##{issue.id}</a>|, flash[:notice], "issue link not found in the flash message"
1829 assert_include %|<a href="/issues/#{issue.id}" title="This is first issue">##{issue.id}</a>|, flash[:notice], "issue link not found in the flash message"
1830 end
1830 end
1831
1831
1832 def test_post_create_without_custom_fields_param
1832 def test_post_create_without_custom_fields_param
1833 @request.session[:user_id] = 2
1833 @request.session[:user_id] = 2
1834 assert_difference 'Issue.count' do
1834 assert_difference 'Issue.count' do
1835 post :create, :project_id => 1,
1835 post :create, :project_id => 1,
1836 :issue => {:tracker_id => 1,
1836 :issue => {:tracker_id => 1,
1837 :subject => 'This is the test_new issue',
1837 :subject => 'This is the test_new issue',
1838 :description => 'This is the description',
1838 :description => 'This is the description',
1839 :priority_id => 5}
1839 :priority_id => 5}
1840 end
1840 end
1841 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
1841 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
1842 end
1842 end
1843
1843
1844 def test_post_create_with_multi_custom_field
1844 def test_post_create_with_multi_custom_field
1845 field = IssueCustomField.find_by_name('Database')
1845 field = IssueCustomField.find_by_name('Database')
1846 field.update_attribute(:multiple, true)
1846 field.update_attribute(:multiple, true)
1847
1847
1848 @request.session[:user_id] = 2
1848 @request.session[:user_id] = 2
1849 assert_difference 'Issue.count' do
1849 assert_difference 'Issue.count' do
1850 post :create, :project_id => 1,
1850 post :create, :project_id => 1,
1851 :issue => {:tracker_id => 1,
1851 :issue => {:tracker_id => 1,
1852 :subject => 'This is the test_new issue',
1852 :subject => 'This is the test_new issue',
1853 :description => 'This is the description',
1853 :description => 'This is the description',
1854 :priority_id => 5,
1854 :priority_id => 5,
1855 :custom_field_values => {'1' => ['', 'MySQL', 'Oracle']}}
1855 :custom_field_values => {'1' => ['', 'MySQL', 'Oracle']}}
1856 end
1856 end
1857 assert_response 302
1857 assert_response 302
1858 issue = Issue.order('id DESC').first
1858 issue = Issue.order('id DESC').first
1859 assert_equal ['MySQL', 'Oracle'], issue.custom_field_value(1).sort
1859 assert_equal ['MySQL', 'Oracle'], issue.custom_field_value(1).sort
1860 end
1860 end
1861
1861
1862 def test_post_create_with_empty_multi_custom_field
1862 def test_post_create_with_empty_multi_custom_field
1863 field = IssueCustomField.find_by_name('Database')
1863 field = IssueCustomField.find_by_name('Database')
1864 field.update_attribute(:multiple, true)
1864 field.update_attribute(:multiple, true)
1865
1865
1866 @request.session[:user_id] = 2
1866 @request.session[:user_id] = 2
1867 assert_difference 'Issue.count' do
1867 assert_difference 'Issue.count' do
1868 post :create, :project_id => 1,
1868 post :create, :project_id => 1,
1869 :issue => {:tracker_id => 1,
1869 :issue => {:tracker_id => 1,
1870 :subject => 'This is the test_new issue',
1870 :subject => 'This is the test_new issue',
1871 :description => 'This is the description',
1871 :description => 'This is the description',
1872 :priority_id => 5,
1872 :priority_id => 5,
1873 :custom_field_values => {'1' => ['']}}
1873 :custom_field_values => {'1' => ['']}}
1874 end
1874 end
1875 assert_response 302
1875 assert_response 302
1876 issue = Issue.order('id DESC').first
1876 issue = Issue.order('id DESC').first
1877 assert_equal [''], issue.custom_field_value(1).sort
1877 assert_equal [''], issue.custom_field_value(1).sort
1878 end
1878 end
1879
1879
1880 def test_post_create_with_multi_user_custom_field
1880 def test_post_create_with_multi_user_custom_field
1881 field = IssueCustomField.create!(:name => 'Multi user', :field_format => 'user', :multiple => true,
1881 field = IssueCustomField.create!(:name => 'Multi user', :field_format => 'user', :multiple => true,
1882 :tracker_ids => [1], :is_for_all => true)
1882 :tracker_ids => [1], :is_for_all => true)
1883
1883
1884 @request.session[:user_id] = 2
1884 @request.session[:user_id] = 2
1885 assert_difference 'Issue.count' do
1885 assert_difference 'Issue.count' do
1886 post :create, :project_id => 1,
1886 post :create, :project_id => 1,
1887 :issue => {:tracker_id => 1,
1887 :issue => {:tracker_id => 1,
1888 :subject => 'This is the test_new issue',
1888 :subject => 'This is the test_new issue',
1889 :description => 'This is the description',
1889 :description => 'This is the description',
1890 :priority_id => 5,
1890 :priority_id => 5,
1891 :custom_field_values => {field.id.to_s => ['', '2', '3']}}
1891 :custom_field_values => {field.id.to_s => ['', '2', '3']}}
1892 end
1892 end
1893 assert_response 302
1893 assert_response 302
1894 issue = Issue.order('id DESC').first
1894 issue = Issue.order('id DESC').first
1895 assert_equal ['2', '3'], issue.custom_field_value(field).sort
1895 assert_equal ['2', '3'], issue.custom_field_value(field).sort
1896 end
1896 end
1897
1897
1898 def test_post_create_with_required_custom_field_and_without_custom_fields_param
1898 def test_post_create_with_required_custom_field_and_without_custom_fields_param
1899 field = IssueCustomField.find_by_name('Database')
1899 field = IssueCustomField.find_by_name('Database')
1900 field.update_attribute(:is_required, true)
1900 field.update_attribute(:is_required, true)
1901
1901
1902 @request.session[:user_id] = 2
1902 @request.session[:user_id] = 2
1903 assert_no_difference 'Issue.count' do
1903 assert_no_difference 'Issue.count' do
1904 post :create, :project_id => 1,
1904 post :create, :project_id => 1,
1905 :issue => {:tracker_id => 1,
1905 :issue => {:tracker_id => 1,
1906 :subject => 'This is the test_new issue',
1906 :subject => 'This is the test_new issue',
1907 :description => 'This is the description',
1907 :description => 'This is the description',
1908 :priority_id => 5}
1908 :priority_id => 5}
1909 end
1909 end
1910 assert_response :success
1910 assert_response :success
1911 assert_template 'new'
1911 assert_template 'new'
1912 issue = assigns(:issue)
1912 issue = assigns(:issue)
1913 assert_not_nil issue
1913 assert_not_nil issue
1914 assert_error_tag :content => /Database can&#x27;t be blank/
1914 assert_error_tag :content => /Database can&#x27;t be blank/
1915 end
1915 end
1916
1916
1917 def test_create_should_validate_required_fields
1917 def test_create_should_validate_required_fields
1918 cf1 = IssueCustomField.create!(:name => 'Foo', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
1918 cf1 = IssueCustomField.create!(:name => 'Foo', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
1919 cf2 = IssueCustomField.create!(:name => 'Bar', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
1919 cf2 = IssueCustomField.create!(:name => 'Bar', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
1920 WorkflowPermission.delete_all
1920 WorkflowPermission.delete_all
1921 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 2, :role_id => 1, :field_name => 'due_date', :rule => 'required')
1921 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 2, :role_id => 1, :field_name => 'due_date', :rule => 'required')
1922 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 2, :role_id => 1, :field_name => cf2.id.to_s, :rule => 'required')
1922 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 2, :role_id => 1, :field_name => cf2.id.to_s, :rule => 'required')
1923 @request.session[:user_id] = 2
1923 @request.session[:user_id] = 2
1924
1924
1925 assert_no_difference 'Issue.count' do
1925 assert_no_difference 'Issue.count' do
1926 post :create, :project_id => 1, :issue => {
1926 post :create, :project_id => 1, :issue => {
1927 :tracker_id => 2,
1927 :tracker_id => 2,
1928 :status_id => 1,
1928 :status_id => 1,
1929 :subject => 'Test',
1929 :subject => 'Test',
1930 :start_date => '',
1930 :start_date => '',
1931 :due_date => '',
1931 :due_date => '',
1932 :custom_field_values => {cf1.id.to_s => '', cf2.id.to_s => ''}
1932 :custom_field_values => {cf1.id.to_s => '', cf2.id.to_s => ''}
1933 }
1933 }
1934 assert_response :success
1934 assert_response :success
1935 assert_template 'new'
1935 assert_template 'new'
1936 end
1936 end
1937
1937
1938 assert_error_tag :content => /Due date can&#x27;t be blank/i
1938 assert_error_tag :content => /Due date can&#x27;t be blank/i
1939 assert_error_tag :content => /Bar can&#x27;t be blank/i
1939 assert_error_tag :content => /Bar can&#x27;t be blank/i
1940 end
1940 end
1941
1941
1942 def test_create_should_ignore_readonly_fields
1942 def test_create_should_ignore_readonly_fields
1943 cf1 = IssueCustomField.create!(:name => 'Foo', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
1943 cf1 = IssueCustomField.create!(:name => 'Foo', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
1944 cf2 = IssueCustomField.create!(:name => 'Bar', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
1944 cf2 = IssueCustomField.create!(:name => 'Bar', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2])
1945 WorkflowPermission.delete_all
1945 WorkflowPermission.delete_all
1946 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 2, :role_id => 1, :field_name => 'due_date', :rule => 'readonly')
1946 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 2, :role_id => 1, :field_name => 'due_date', :rule => 'readonly')
1947 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 2, :role_id => 1, :field_name => cf2.id.to_s, :rule => 'readonly')
1947 WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 2, :role_id => 1, :field_name => cf2.id.to_s, :rule => 'readonly')
1948 @request.session[:user_id] = 2
1948 @request.session[:user_id] = 2
1949
1949
1950 assert_difference 'Issue.count' do
1950 assert_difference 'Issue.count' do
1951 post :create, :project_id => 1, :issue => {
1951 post :create, :project_id => 1, :issue => {
1952 :tracker_id => 2,
1952 :tracker_id => 2,
1953 :status_id => 1,
1953 :status_id => 1,
1954 :subject => 'Test',
1954 :subject => 'Test',
1955 :start_date => '2012-07-14',
1955 :start_date => '2012-07-14',
1956 :due_date => '2012-07-16',
1956 :due_date => '2012-07-16',
1957 :custom_field_values => {cf1.id.to_s => 'value1', cf2.id.to_s => 'value2'}
1957 :custom_field_values => {cf1.id.to_s => 'value1', cf2.id.to_s => 'value2'}
1958 }
1958 }
1959 assert_response 302
1959 assert_response 302
1960 end
1960 end
1961
1961
1962 issue = Issue.order('id DESC').first
1962 issue = Issue.order('id DESC').first
1963 assert_equal Date.parse('2012-07-14'), issue.start_date
1963 assert_equal Date.parse('2012-07-14'), issue.start_date
1964 assert_nil issue.due_date
1964 assert_nil issue.due_date
1965 assert_equal 'value1', issue.custom_field_value(cf1)
1965 assert_equal 'value1', issue.custom_field_value(cf1)
1966 assert_nil issue.custom_field_value(cf2)
1966 assert_nil issue.custom_field_value(cf2)
1967 end
1967 end
1968
1968
1969 def test_post_create_with_watchers
1969 def test_post_create_with_watchers
1970 @request.session[:user_id] = 2
1970 @request.session[:user_id] = 2
1971 ActionMailer::Base.deliveries.clear
1971 ActionMailer::Base.deliveries.clear
1972
1972
1973 assert_difference 'Watcher.count', 2 do
1973 assert_difference 'Watcher.count', 2 do
1974 post :create, :project_id => 1,
1974 post :create, :project_id => 1,
1975 :issue => {:tracker_id => 1,
1975 :issue => {:tracker_id => 1,
1976 :subject => 'This is a new issue with watchers',
1976 :subject => 'This is a new issue with watchers',
1977 :description => 'This is the description',
1977 :description => 'This is the description',
1978 :priority_id => 5,
1978 :priority_id => 5,
1979 :watcher_user_ids => ['2', '3']}
1979 :watcher_user_ids => ['2', '3']}
1980 end
1980 end
1981 issue = Issue.find_by_subject('This is a new issue with watchers')
1981 issue = Issue.find_by_subject('This is a new issue with watchers')
1982 assert_not_nil issue
1982 assert_not_nil issue
1983 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue
1983 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue
1984
1984
1985 # Watchers added
1985 # Watchers added
1986 assert_equal [2, 3], issue.watcher_user_ids.sort
1986 assert_equal [2, 3], issue.watcher_user_ids.sort
1987 assert issue.watched_by?(User.find(3))
1987 assert issue.watched_by?(User.find(3))
1988 # Watchers notified
1988 # Watchers notified
1989 mail = ActionMailer::Base.deliveries.last
1989 mail = ActionMailer::Base.deliveries.last
1990 assert_not_nil mail
1990 assert_not_nil mail
1991 assert [mail.bcc, mail.cc].flatten.include?(User.find(3).mail)
1991 assert [mail.bcc, mail.cc].flatten.include?(User.find(3).mail)
1992 end
1992 end
1993
1993
1994 def test_post_create_subissue
1994 def test_post_create_subissue
1995 @request.session[:user_id] = 2
1995 @request.session[:user_id] = 2
1996
1996
1997 assert_difference 'Issue.count' do
1997 assert_difference 'Issue.count' do
1998 post :create, :project_id => 1,
1998 post :create, :project_id => 1,
1999 :issue => {:tracker_id => 1,
1999 :issue => {:tracker_id => 1,
2000 :subject => 'This is a child issue',
2000 :subject => 'This is a child issue',
2001 :parent_issue_id => '2'}
2001 :parent_issue_id => '2'}
2002 assert_response 302
2002 assert_response 302
2003 end
2003 end
2004 issue = Issue.order('id DESC').first
2004 issue = Issue.order('id DESC').first
2005 assert_equal Issue.find(2), issue.parent
2005 assert_equal Issue.find(2), issue.parent
2006 end
2006 end
2007
2007
2008 def test_post_create_subissue_with_sharp_parent_id
2008 def test_post_create_subissue_with_sharp_parent_id
2009 @request.session[:user_id] = 2
2009 @request.session[:user_id] = 2
2010
2010
2011 assert_difference 'Issue.count' do
2011 assert_difference 'Issue.count' do
2012 post :create, :project_id => 1,
2012 post :create, :project_id => 1,
2013 :issue => {:tracker_id => 1,
2013 :issue => {:tracker_id => 1,
2014 :subject => 'This is a child issue',
2014 :subject => 'This is a child issue',
2015 :parent_issue_id => '#2'}
2015 :parent_issue_id => '#2'}
2016 assert_response 302
2016 assert_response 302
2017 end
2017 end
2018 issue = Issue.order('id DESC').first
2018 issue = Issue.order('id DESC').first
2019 assert_equal Issue.find(2), issue.parent
2019 assert_equal Issue.find(2), issue.parent
2020 end
2020 end
2021
2021
2022 def test_post_create_subissue_with_non_visible_parent_id_should_not_validate
2022 def test_post_create_subissue_with_non_visible_parent_id_should_not_validate
2023 @request.session[:user_id] = 2
2023 @request.session[:user_id] = 2
2024
2024
2025 assert_no_difference 'Issue.count' do
2025 assert_no_difference 'Issue.count' do
2026 post :create, :project_id => 1,
2026 post :create, :project_id => 1,
2027 :issue => {:tracker_id => 1,
2027 :issue => {:tracker_id => 1,
2028 :subject => 'This is a child issue',
2028 :subject => 'This is a child issue',
2029 :parent_issue_id => '4'}
2029 :parent_issue_id => '4'}
2030
2030
2031 assert_response :success
2031 assert_response :success
2032 assert_select 'input[name=?][value=?]', 'issue[parent_issue_id]', '4'
2032 assert_select 'input[name=?][value=?]', 'issue[parent_issue_id]', '4'
2033 assert_error_tag :content => /Parent task is invalid/i
2033 assert_error_tag :content => /Parent task is invalid/i
2034 end
2034 end
2035 end
2035 end
2036
2036
2037 def test_post_create_subissue_with_non_numeric_parent_id_should_not_validate
2037 def test_post_create_subissue_with_non_numeric_parent_id_should_not_validate
2038 @request.session[:user_id] = 2
2038 @request.session[:user_id] = 2
2039
2039
2040 assert_no_difference 'Issue.count' do
2040 assert_no_difference 'Issue.count' do
2041 post :create, :project_id => 1,
2041 post :create, :project_id => 1,
2042 :issue => {:tracker_id => 1,
2042 :issue => {:tracker_id => 1,
2043 :subject => 'This is a child issue',
2043 :subject => 'This is a child issue',
2044 :parent_issue_id => '01ABC'}
2044 :parent_issue_id => '01ABC'}
2045
2045
2046 assert_response :success
2046 assert_response :success
2047 assert_select 'input[name=?][value=?]', 'issue[parent_issue_id]', '01ABC'
2047 assert_select 'input[name=?][value=?]', 'issue[parent_issue_id]', '01ABC'
2048 assert_error_tag :content => /Parent task is invalid/i
2048 assert_error_tag :content => /Parent task is invalid/i
2049 end
2049 end
2050 end
2050 end
2051
2051
2052 def test_post_create_private
2052 def test_post_create_private
2053 @request.session[:user_id] = 2
2053 @request.session[:user_id] = 2
2054
2054
2055 assert_difference 'Issue.count' do
2055 assert_difference 'Issue.count' do
2056 post :create, :project_id => 1,
2056 post :create, :project_id => 1,
2057 :issue => {:tracker_id => 1,
2057 :issue => {:tracker_id => 1,
2058 :subject => 'This is a private issue',
2058 :subject => 'This is a private issue',
2059 :is_private => '1'}
2059 :is_private => '1'}
2060 end
2060 end
2061 issue = Issue.order('id DESC').first
2061 issue = Issue.order('id DESC').first
2062 assert issue.is_private?
2062 assert issue.is_private?
2063 end
2063 end
2064
2064
2065 def test_post_create_private_with_set_own_issues_private_permission
2065 def test_post_create_private_with_set_own_issues_private_permission
2066 role = Role.find(1)
2066 role = Role.find(1)
2067 role.remove_permission! :set_issues_private
2067 role.remove_permission! :set_issues_private
2068 role.add_permission! :set_own_issues_private
2068 role.add_permission! :set_own_issues_private
2069
2069
2070 @request.session[:user_id] = 2
2070 @request.session[:user_id] = 2
2071
2071
2072 assert_difference 'Issue.count' do
2072 assert_difference 'Issue.count' do
2073 post :create, :project_id => 1,
2073 post :create, :project_id => 1,
2074 :issue => {:tracker_id => 1,
2074 :issue => {:tracker_id => 1,
2075 :subject => 'This is a private issue',
2075 :subject => 'This is a private issue',
2076 :is_private => '1'}
2076 :is_private => '1'}
2077 end
2077 end
2078 issue = Issue.order('id DESC').first
2078 issue = Issue.order('id DESC').first
2079 assert issue.is_private?
2079 assert issue.is_private?
2080 end
2080 end
2081
2081
2082 def test_post_create_should_send_a_notification
2082 def test_post_create_should_send_a_notification
2083 ActionMailer::Base.deliveries.clear
2083 ActionMailer::Base.deliveries.clear
2084 @request.session[:user_id] = 2
2084 @request.session[:user_id] = 2
2085 assert_difference 'Issue.count' do
2085 assert_difference 'Issue.count' do
2086 post :create, :project_id => 1,
2086 post :create, :project_id => 1,
2087 :issue => {:tracker_id => 3,
2087 :issue => {:tracker_id => 3,
2088 :subject => 'This is the test_new issue',
2088 :subject => 'This is the test_new issue',
2089 :description => 'This is the description',
2089 :description => 'This is the description',
2090 :priority_id => 5,
2090 :priority_id => 5,
2091 :estimated_hours => '',
2091 :estimated_hours => '',
2092 :custom_field_values => {'2' => 'Value for field 2'}}
2092 :custom_field_values => {'2' => 'Value for field 2'}}
2093 end
2093 end
2094 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
2094 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
2095
2095
2096 assert_equal 1, ActionMailer::Base.deliveries.size
2096 assert_equal 1, ActionMailer::Base.deliveries.size
2097 end
2097 end
2098
2098
2099 def test_post_create_should_preserve_fields_values_on_validation_failure
2099 def test_post_create_should_preserve_fields_values_on_validation_failure
2100 @request.session[:user_id] = 2
2100 @request.session[:user_id] = 2
2101 post :create, :project_id => 1,
2101 post :create, :project_id => 1,
2102 :issue => {:tracker_id => 1,
2102 :issue => {:tracker_id => 1,
2103 # empty subject
2103 # empty subject
2104 :subject => '',
2104 :subject => '',
2105 :description => 'This is a description',
2105 :description => 'This is a description',
2106 :priority_id => 6,
2106 :priority_id => 6,
2107 :custom_field_values => {'1' => 'Oracle', '2' => 'Value for field 2'}}
2107 :custom_field_values => {'1' => 'Oracle', '2' => 'Value for field 2'}}
2108 assert_response :success
2108 assert_response :success
2109 assert_template 'new'
2109 assert_template 'new'
2110
2110
2111 assert_select 'textarea[name=?]', 'issue[description]', :text => 'This is a description'
2111 assert_select 'textarea[name=?]', 'issue[description]', :text => 'This is a description'
2112 assert_select 'select[name=?]', 'issue[priority_id]' do
2112 assert_select 'select[name=?]', 'issue[priority_id]' do
2113 assert_select 'option[value=6][selected=selected]', :text => 'High'
2113 assert_select 'option[value=6][selected=selected]', :text => 'High'
2114 end
2114 end
2115 # Custom fields
2115 # Custom fields
2116 assert_select 'select[name=?]', 'issue[custom_field_values][1]' do
2116 assert_select 'select[name=?]', 'issue[custom_field_values][1]' do
2117 assert_select 'option[value=Oracle][selected=selected]', :text => 'Oracle'
2117 assert_select 'option[value=Oracle][selected=selected]', :text => 'Oracle'
2118 end
2118 end
2119 assert_select 'input[name=?][value=?]', 'issue[custom_field_values][2]', 'Value for field 2'
2119 assert_select 'input[name=?][value=?]', 'issue[custom_field_values][2]', 'Value for field 2'
2120 end
2120 end
2121
2121
2122 def test_post_create_with_failure_should_preserve_watchers
2122 def test_post_create_with_failure_should_preserve_watchers
2123 assert !User.find(8).member_of?(Project.find(1))
2123 assert !User.find(8).member_of?(Project.find(1))
2124
2124
2125 @request.session[:user_id] = 2
2125 @request.session[:user_id] = 2
2126 post :create, :project_id => 1,
2126 post :create, :project_id => 1,
2127 :issue => {:tracker_id => 1,
2127 :issue => {:tracker_id => 1,
2128 :watcher_user_ids => ['3', '8']}
2128 :watcher_user_ids => ['3', '8']}
2129 assert_response :success
2129 assert_response :success
2130 assert_template 'new'
2130 assert_template 'new'
2131
2131
2132 assert_select 'input[name=?][value=2]:not(checked)', 'issue[watcher_user_ids][]'
2132 assert_select 'input[name=?][value=2]:not(checked)', 'issue[watcher_user_ids][]'
2133 assert_select 'input[name=?][value=3][checked=checked]', 'issue[watcher_user_ids][]'
2133 assert_select 'input[name=?][value=3][checked=checked]', 'issue[watcher_user_ids][]'
2134 assert_select 'input[name=?][value=8][checked=checked]', 'issue[watcher_user_ids][]'
2134 assert_select 'input[name=?][value=8][checked=checked]', 'issue[watcher_user_ids][]'
2135 end
2135 end
2136
2136
2137 def test_post_create_should_ignore_non_safe_attributes
2137 def test_post_create_should_ignore_non_safe_attributes
2138 @request.session[:user_id] = 2
2138 @request.session[:user_id] = 2
2139 assert_nothing_raised do
2139 assert_nothing_raised do
2140 post :create, :project_id => 1, :issue => { :tracker => "A param can not be a Tracker" }
2140 post :create, :project_id => 1, :issue => { :tracker => "A param can not be a Tracker" }
2141 end
2141 end
2142 end
2142 end
2143
2143
2144 def test_post_create_with_attachment
2144 def test_post_create_with_attachment
2145 set_tmp_attachments_directory
2145 set_tmp_attachments_directory
2146 @request.session[:user_id] = 2
2146 @request.session[:user_id] = 2
2147
2147
2148 assert_difference 'Issue.count' do
2148 assert_difference 'Issue.count' do
2149 assert_difference 'Attachment.count' do
2149 assert_difference 'Attachment.count' do
2150 post :create, :project_id => 1,
2150 post :create, :project_id => 1,
2151 :issue => { :tracker_id => '1', :subject => 'With attachment' },
2151 :issue => { :tracker_id => '1', :subject => 'With attachment' },
2152 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}}
2152 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}}
2153 end
2153 end
2154 end
2154 end
2155
2155
2156 issue = Issue.order('id DESC').first
2156 issue = Issue.order('id DESC').first
2157 attachment = Attachment.order('id DESC').first
2157 attachment = Attachment.order('id DESC').first
2158
2158
2159 assert_equal issue, attachment.container
2159 assert_equal issue, attachment.container
2160 assert_equal 2, attachment.author_id
2160 assert_equal 2, attachment.author_id
2161 assert_equal 'testfile.txt', attachment.filename
2161 assert_equal 'testfile.txt', attachment.filename
2162 assert_equal 'text/plain', attachment.content_type
2162 assert_equal 'text/plain', attachment.content_type
2163 assert_equal 'test file', attachment.description
2163 assert_equal 'test file', attachment.description
2164 assert_equal 59, attachment.filesize
2164 assert_equal 59, attachment.filesize
2165 assert File.exists?(attachment.diskfile)
2165 assert File.exists?(attachment.diskfile)
2166 assert_equal 59, File.size(attachment.diskfile)
2166 assert_equal 59, File.size(attachment.diskfile)
2167 end
2167 end
2168
2168
2169 def test_post_create_with_attachment_should_notify_with_attachments
2169 def test_post_create_with_attachment_should_notify_with_attachments
2170 ActionMailer::Base.deliveries.clear
2170 ActionMailer::Base.deliveries.clear
2171 set_tmp_attachments_directory
2171 set_tmp_attachments_directory
2172 @request.session[:user_id] = 2
2172 @request.session[:user_id] = 2
2173
2173
2174 with_settings :host_name => 'mydomain.foo', :protocol => 'http' do
2174 with_settings :host_name => 'mydomain.foo', :protocol => 'http' do
2175 assert_difference 'Issue.count' do
2175 assert_difference 'Issue.count' do
2176 post :create, :project_id => 1,
2176 post :create, :project_id => 1,
2177 :issue => { :tracker_id => '1', :subject => 'With attachment' },
2177 :issue => { :tracker_id => '1', :subject => 'With attachment' },
2178 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}}
2178 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}}
2179 end
2179 end
2180 end
2180 end
2181
2181
2182 assert_not_nil ActionMailer::Base.deliveries.last
2182 assert_not_nil ActionMailer::Base.deliveries.last
2183 assert_select_email do
2183 assert_select_email do
2184 assert_select 'a[href^=?]', 'http://mydomain.foo/attachments/download', 'testfile.txt'
2184 assert_select 'a[href^=?]', 'http://mydomain.foo/attachments/download', 'testfile.txt'
2185 end
2185 end
2186 end
2186 end
2187
2187
2188 def test_post_create_with_failure_should_save_attachments
2188 def test_post_create_with_failure_should_save_attachments
2189 set_tmp_attachments_directory
2189 set_tmp_attachments_directory
2190 @request.session[:user_id] = 2
2190 @request.session[:user_id] = 2
2191
2191
2192 assert_no_difference 'Issue.count' do
2192 assert_no_difference 'Issue.count' do
2193 assert_difference 'Attachment.count' do
2193 assert_difference 'Attachment.count' do
2194 post :create, :project_id => 1,
2194 post :create, :project_id => 1,
2195 :issue => { :tracker_id => '1', :subject => '' },
2195 :issue => { :tracker_id => '1', :subject => '' },
2196 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}}
2196 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}}
2197 assert_response :success
2197 assert_response :success
2198 assert_template 'new'
2198 assert_template 'new'
2199 end
2199 end
2200 end
2200 end
2201
2201
2202 attachment = Attachment.order('id DESC').first
2202 attachment = Attachment.order('id DESC').first
2203 assert_equal 'testfile.txt', attachment.filename
2203 assert_equal 'testfile.txt', attachment.filename
2204 assert File.exists?(attachment.diskfile)
2204 assert File.exists?(attachment.diskfile)
2205 assert_nil attachment.container
2205 assert_nil attachment.container
2206
2206
2207 assert_select 'input[name=?][value=?]', 'attachments[p0][token]', attachment.token
2207 assert_select 'input[name=?][value=?]', 'attachments[p0][token]', attachment.token
2208 assert_select 'input[name=?][value=?]', 'attachments[p0][filename]', 'testfile.txt'
2208 assert_select 'input[name=?][value=?]', 'attachments[p0][filename]', 'testfile.txt'
2209 end
2209 end
2210
2210
2211 def test_post_create_with_failure_should_keep_saved_attachments
2211 def test_post_create_with_failure_should_keep_saved_attachments
2212 set_tmp_attachments_directory
2212 set_tmp_attachments_directory
2213 attachment = Attachment.create!(:file => uploaded_test_file("testfile.txt", "text/plain"), :author_id => 2)
2213 attachment = Attachment.create!(:file => uploaded_test_file("testfile.txt", "text/plain"), :author_id => 2)
2214 @request.session[:user_id] = 2
2214 @request.session[:user_id] = 2
2215
2215
2216 assert_no_difference 'Issue.count' do
2216 assert_no_difference 'Issue.count' do
2217 assert_no_difference 'Attachment.count' do
2217 assert_no_difference 'Attachment.count' do
2218 post :create, :project_id => 1,
2218 post :create, :project_id => 1,
2219 :issue => { :tracker_id => '1', :subject => '' },
2219 :issue => { :tracker_id => '1', :subject => '' },
2220 :attachments => {'p0' => {'token' => attachment.token}}
2220 :attachments => {'p0' => {'token' => attachment.token}}
2221 assert_response :success
2221 assert_response :success
2222 assert_template 'new'
2222 assert_template 'new'
2223 end
2223 end
2224 end
2224 end
2225
2225
2226 assert_select 'input[name=?][value=?]', 'attachments[p0][token]', attachment.token
2226 assert_select 'input[name=?][value=?]', 'attachments[p0][token]', attachment.token
2227 assert_select 'input[name=?][value=?]', 'attachments[p0][filename]', 'testfile.txt'
2227 assert_select 'input[name=?][value=?]', 'attachments[p0][filename]', 'testfile.txt'
2228 end
2228 end
2229
2229
2230 def test_post_create_should_attach_saved_attachments
2230 def test_post_create_should_attach_saved_attachments
2231 set_tmp_attachments_directory
2231 set_tmp_attachments_directory
2232 attachment = Attachment.create!(:file => uploaded_test_file("testfile.txt", "text/plain"), :author_id => 2)
2232 attachment = Attachment.create!(:file => uploaded_test_file("testfile.txt", "text/plain"), :author_id => 2)
2233 @request.session[:user_id] = 2
2233 @request.session[:user_id] = 2
2234
2234
2235 assert_difference 'Issue.count' do
2235 assert_difference 'Issue.count' do
2236 assert_no_difference 'Attachment.count' do
2236 assert_no_difference 'Attachment.count' do
2237 post :create, :project_id => 1,
2237 post :create, :project_id => 1,
2238 :issue => { :tracker_id => '1', :subject => 'Saved attachments' },
2238 :issue => { :tracker_id => '1', :subject => 'Saved attachments' },
2239 :attachments => {'p0' => {'token' => attachment.token}}
2239 :attachments => {'p0' => {'token' => attachment.token}}
2240 assert_response 302
2240 assert_response 302
2241 end
2241 end
2242 end
2242 end
2243
2243
2244 issue = Issue.order('id DESC').first
2244 issue = Issue.order('id DESC').first
2245 assert_equal 1, issue.attachments.count
2245 assert_equal 1, issue.attachments.count
2246
2246
2247 attachment.reload
2247 attachment.reload
2248 assert_equal issue, attachment.container
2248 assert_equal issue, attachment.container
2249 end
2249 end
2250
2250
2251 context "without workflow privilege" do
2251 context "without workflow privilege" do
2252 setup do
2252 setup do
2253 WorkflowTransition.delete_all(["role_id = ?", Role.anonymous.id])
2253 WorkflowTransition.delete_all(["role_id = ?", Role.anonymous.id])
2254 Role.anonymous.add_permission! :add_issues, :add_issue_notes
2254 Role.anonymous.add_permission! :add_issues, :add_issue_notes
2255 end
2255 end
2256
2256
2257 context "#new" do
2257 context "#new" do
2258 should "propose default status only" do
2258 should "propose default status only" do
2259 get :new, :project_id => 1
2259 get :new, :project_id => 1
2260 assert_response :success
2260 assert_response :success
2261 assert_template 'new'
2261 assert_template 'new'
2262 assert_select 'select[name=?]', 'issue[status_id]' do
2262 assert_select 'select[name=?]', 'issue[status_id]' do
2263 assert_select 'option', 1
2263 assert_select 'option', 1
2264 assert_select 'option[value=?]', IssueStatus.default.id.to_s
2264 assert_select 'option[value=?]', IssueStatus.default.id.to_s
2265 end
2265 end
2266 end
2266 end
2267
2267
2268 should "accept default status" do
2268 should "accept default status" do
2269 assert_difference 'Issue.count' do
2269 assert_difference 'Issue.count' do
2270 post :create, :project_id => 1,
2270 post :create, :project_id => 1,
2271 :issue => {:tracker_id => 1,
2271 :issue => {:tracker_id => 1,
2272 :subject => 'This is an issue',
2272 :subject => 'This is an issue',
2273 :status_id => 1}
2273 :status_id => 1}
2274 end
2274 end
2275 issue = Issue.order('id').last
2275 issue = Issue.order('id').last
2276 assert_equal IssueStatus.default, issue.status
2276 assert_equal IssueStatus.default, issue.status
2277 end
2277 end
2278
2278
2279 should "ignore unauthorized status" do
2279 should "ignore unauthorized status" do
2280 assert_difference 'Issue.count' do
2280 assert_difference 'Issue.count' do
2281 post :create, :project_id => 1,
2281 post :create, :project_id => 1,
2282 :issue => {:tracker_id => 1,
2282 :issue => {:tracker_id => 1,
2283 :subject => 'This is an issue',
2283 :subject => 'This is an issue',
2284 :status_id => 3}
2284 :status_id => 3}
2285 end
2285 end
2286 issue = Issue.order('id').last
2286 issue = Issue.order('id').last
2287 assert_equal IssueStatus.default, issue.status
2287 assert_equal IssueStatus.default, issue.status
2288 end
2288 end
2289 end
2289 end
2290
2290
2291 context "#update" do
2291 context "#update" do
2292 should "ignore status change" do
2292 should "ignore status change" do
2293 assert_difference 'Journal.count' do
2293 assert_difference 'Journal.count' do
2294 put :update, :id => 1, :issue => {:status_id => 3, :notes => 'just trying'}
2294 put :update, :id => 1, :issue => {:status_id => 3, :notes => 'just trying'}
2295 end
2295 end
2296 assert_equal 1, Issue.find(1).status_id
2296 assert_equal 1, Issue.find(1).status_id
2297 end
2297 end
2298
2298
2299 should "ignore attributes changes" do
2299 should "ignore attributes changes" do
2300 assert_difference 'Journal.count' do
2300 assert_difference 'Journal.count' do
2301 put :update, :id => 1, :issue => {:subject => 'changed', :assigned_to_id => 2, :notes => 'just trying'}
2301 put :update, :id => 1, :issue => {:subject => 'changed', :assigned_to_id => 2, :notes => 'just trying'}
2302 end
2302 end
2303 issue = Issue.find(1)
2303 issue = Issue.find(1)
2304 assert_equal "Can't print recipes", issue.subject
2304 assert_equal "Can't print recipes", issue.subject
2305 assert_nil issue.assigned_to
2305 assert_nil issue.assigned_to
2306 end
2306 end
2307 end
2307 end
2308 end
2308 end
2309
2309
2310 context "with workflow privilege" do
2310 context "with workflow privilege" do
2311 setup do
2311 setup do
2312 WorkflowTransition.delete_all(["role_id = ?", Role.anonymous.id])
2312 WorkflowTransition.delete_all(["role_id = ?", Role.anonymous.id])
2313 WorkflowTransition.create!(:role => Role.anonymous, :tracker_id => 1, :old_status_id => 1, :new_status_id => 3)
2313 WorkflowTransition.create!(:role => Role.anonymous, :tracker_id => 1, :old_status_id => 1, :new_status_id => 3)
2314 WorkflowTransition.create!(:role => Role.anonymous, :tracker_id => 1, :old_status_id => 1, :new_status_id => 4)
2314 WorkflowTransition.create!(:role => Role.anonymous, :tracker_id => 1, :old_status_id => 1, :new_status_id => 4)
2315 Role.anonymous.add_permission! :add_issues, :add_issue_notes
2315 Role.anonymous.add_permission! :add_issues, :add_issue_notes
2316 end
2316 end
2317
2317
2318 context "#update" do
2318 context "#update" do
2319 should "accept authorized status" do
2319 should "accept authorized status" do
2320 assert_difference 'Journal.count' do
2320 assert_difference 'Journal.count' do
2321 put :update, :id => 1, :issue => {:status_id => 3, :notes => 'just trying'}
2321 put :update, :id => 1, :issue => {:status_id => 3, :notes => 'just trying'}
2322 end
2322 end
2323 assert_equal 3, Issue.find(1).status_id
2323 assert_equal 3, Issue.find(1).status_id
2324 end
2324 end
2325
2325
2326 should "ignore unauthorized status" do
2326 should "ignore unauthorized status" do
2327 assert_difference 'Journal.count' do
2327 assert_difference 'Journal.count' do
2328 put :update, :id => 1, :issue => {:status_id => 2, :notes => 'just trying'}
2328 put :update, :id => 1, :issue => {:status_id => 2, :notes => 'just trying'}
2329 end
2329 end
2330 assert_equal 1, Issue.find(1).status_id
2330 assert_equal 1, Issue.find(1).status_id
2331 end
2331 end
2332
2332
2333 should "accept authorized attributes changes" do
2333 should "accept authorized attributes changes" do
2334 assert_difference 'Journal.count' do
2334 assert_difference 'Journal.count' do
2335 put :update, :id => 1, :issue => {:assigned_to_id => 2, :notes => 'just trying'}
2335 put :update, :id => 1, :issue => {:assigned_to_id => 2, :notes => 'just trying'}
2336 end
2336 end
2337 issue = Issue.find(1)
2337 issue = Issue.find(1)
2338 assert_equal 2, issue.assigned_to_id
2338 assert_equal 2, issue.assigned_to_id
2339 end
2339 end
2340
2340
2341 should "ignore unauthorized attributes changes" do
2341 should "ignore unauthorized attributes changes" do
2342 assert_difference 'Journal.count' do
2342 assert_difference 'Journal.count' do
2343 put :update, :id => 1, :issue => {:subject => 'changed', :notes => 'just trying'}
2343 put :update, :id => 1, :issue => {:subject => 'changed', :notes => 'just trying'}
2344 end
2344 end
2345 issue = Issue.find(1)
2345 issue = Issue.find(1)
2346 assert_equal "Can't print recipes", issue.subject
2346 assert_equal "Can't print recipes", issue.subject
2347 end
2347 end
2348 end
2348 end
2349
2349
2350 context "and :edit_issues permission" do
2350 context "and :edit_issues permission" do
2351 setup do
2351 setup do
2352 Role.anonymous.add_permission! :add_issues, :edit_issues
2352 Role.anonymous.add_permission! :add_issues, :edit_issues
2353 end
2353 end
2354
2354
2355 should "accept authorized status" do
2355 should "accept authorized status" do
2356 assert_difference 'Journal.count' do
2356 assert_difference 'Journal.count' do
2357 put :update, :id => 1, :issue => {:status_id => 3, :notes => 'just trying'}
2357 put :update, :id => 1, :issue => {:status_id => 3, :notes => 'just trying'}
2358 end
2358 end
2359 assert_equal 3, Issue.find(1).status_id
2359 assert_equal 3, Issue.find(1).status_id
2360 end
2360 end
2361
2361
2362 should "ignore unauthorized status" do
2362 should "ignore unauthorized status" do
2363 assert_difference 'Journal.count' do
2363 assert_difference 'Journal.count' do
2364 put :update, :id => 1, :issue => {:status_id => 2, :notes => 'just trying'}
2364 put :update, :id => 1, :issue => {:status_id => 2, :notes => 'just trying'}
2365 end
2365 end
2366 assert_equal 1, Issue.find(1).status_id
2366 assert_equal 1, Issue.find(1).status_id
2367 end
2367 end
2368
2368
2369 should "accept authorized attributes changes" do
2369 should "accept authorized attributes changes" do
2370 assert_difference 'Journal.count' do
2370 assert_difference 'Journal.count' do
2371 put :update, :id => 1, :issue => {:subject => 'changed', :assigned_to_id => 2, :notes => 'just trying'}
2371 put :update, :id => 1, :issue => {:subject => 'changed', :assigned_to_id => 2, :notes => 'just trying'}
2372 end
2372 end
2373 issue = Issue.find(1)
2373 issue = Issue.find(1)
2374 assert_equal "changed", issue.subject
2374 assert_equal "changed", issue.subject
2375 assert_equal 2, issue.assigned_to_id
2375 assert_equal 2, issue.assigned_to_id
2376 end
2376 end
2377 end
2377 end
2378 end
2378 end
2379
2379
2380 def test_new_as_copy
2380 def test_new_as_copy
2381 @request.session[:user_id] = 2
2381 @request.session[:user_id] = 2
2382 get :new, :project_id => 1, :copy_from => 1
2382 get :new, :project_id => 1, :copy_from => 1
2383
2383
2384 assert_response :success
2384 assert_response :success
2385 assert_template 'new'
2385 assert_template 'new'
2386
2386
2387 assert_not_nil assigns(:issue)
2387 assert_not_nil assigns(:issue)
2388 orig = Issue.find(1)
2388 orig = Issue.find(1)
2389 assert_equal 1, assigns(:issue).project_id
2389 assert_equal 1, assigns(:issue).project_id
2390 assert_equal orig.subject, assigns(:issue).subject
2390 assert_equal orig.subject, assigns(:issue).subject
2391 assert assigns(:issue).copy?
2391 assert assigns(:issue).copy?
2392
2392
2393 assert_select 'form[id=issue-form][action=/projects/ecookbook/issues]' do
2393 assert_select 'form[id=issue-form][action=/projects/ecookbook/issues]' do
2394 assert_select 'select[name=?]', 'issue[project_id]' do
2394 assert_select 'select[name=?]', 'issue[project_id]' do
2395 assert_select 'option[value=1][selected=selected]', :text => 'eCookbook'
2395 assert_select 'option[value=1][selected=selected]', :text => 'eCookbook'
2396 assert_select 'option[value=2]:not([selected])', :text => 'OnlineStore'
2396 assert_select 'option[value=2]:not([selected])', :text => 'OnlineStore'
2397 end
2397 end
2398 assert_select 'input[name=copy_from][value=1]'
2398 assert_select 'input[name=copy_from][value=1]'
2399 end
2399 end
2400
2400
2401 # "New issue" menu item should not link to copy
2401 # "New issue" menu item should not link to copy
2402 assert_select '#main-menu a.new-issue[href=/projects/ecookbook/issues/new]'
2402 assert_select '#main-menu a.new-issue[href=/projects/ecookbook/issues/new]'
2403 end
2403 end
2404
2404
2405 def test_new_as_copy_with_attachments_should_show_copy_attachments_checkbox
2405 def test_new_as_copy_with_attachments_should_show_copy_attachments_checkbox
2406 @request.session[:user_id] = 2
2406 @request.session[:user_id] = 2
2407 issue = Issue.find(3)
2407 issue = Issue.find(3)
2408 assert issue.attachments.count > 0
2408 assert issue.attachments.count > 0
2409 get :new, :project_id => 1, :copy_from => 3
2409 get :new, :project_id => 1, :copy_from => 3
2410
2410
2411 assert_select 'input[name=copy_attachments][type=checkbox][checked=checked][value=1]'
2411 assert_select 'input[name=copy_attachments][type=checkbox][checked=checked][value=1]'
2412 end
2412 end
2413
2413
2414 def test_new_as_copy_without_attachments_should_not_show_copy_attachments_checkbox
2414 def test_new_as_copy_without_attachments_should_not_show_copy_attachments_checkbox
2415 @request.session[:user_id] = 2
2415 @request.session[:user_id] = 2
2416 issue = Issue.find(3)
2416 issue = Issue.find(3)
2417 issue.attachments.delete_all
2417 issue.attachments.delete_all
2418 get :new, :project_id => 1, :copy_from => 3
2418 get :new, :project_id => 1, :copy_from => 3
2419
2419
2420 assert_select 'input[name=copy_attachments]', 0
2420 assert_select 'input[name=copy_attachments]', 0
2421 end
2421 end
2422
2422
2423 def test_new_as_copy_with_subtasks_should_show_copy_subtasks_checkbox
2423 def test_new_as_copy_with_subtasks_should_show_copy_subtasks_checkbox
2424 @request.session[:user_id] = 2
2424 @request.session[:user_id] = 2
2425 issue = Issue.generate_with_descendants!
2425 issue = Issue.generate_with_descendants!
2426 get :new, :project_id => 1, :copy_from => issue.id
2426 get :new, :project_id => 1, :copy_from => issue.id
2427
2427
2428 assert_select 'input[type=checkbox][name=copy_subtasks][checked=checked][value=1]'
2428 assert_select 'input[type=checkbox][name=copy_subtasks][checked=checked][value=1]'
2429 end
2429 end
2430
2430
2431 def test_new_as_copy_with_invalid_issue_should_respond_with_404
2431 def test_new_as_copy_with_invalid_issue_should_respond_with_404
2432 @request.session[:user_id] = 2
2432 @request.session[:user_id] = 2
2433 get :new, :project_id => 1, :copy_from => 99999
2433 get :new, :project_id => 1, :copy_from => 99999
2434 assert_response 404
2434 assert_response 404
2435 end
2435 end
2436
2436
2437 def test_create_as_copy_on_different_project
2437 def test_create_as_copy_on_different_project
2438 @request.session[:user_id] = 2
2438 @request.session[:user_id] = 2
2439 assert_difference 'Issue.count' do
2439 assert_difference 'Issue.count' do
2440 post :create, :project_id => 1, :copy_from => 1,
2440 post :create, :project_id => 1, :copy_from => 1,
2441 :issue => {:project_id => '2', :tracker_id => '3', :status_id => '1', :subject => 'Copy'}
2441 :issue => {:project_id => '2', :tracker_id => '3', :status_id => '1', :subject => 'Copy'}
2442
2442
2443 assert_not_nil assigns(:issue)
2443 assert_not_nil assigns(:issue)
2444 assert assigns(:issue).copy?
2444 assert assigns(:issue).copy?
2445 end
2445 end
2446 issue = Issue.order('id DESC').first
2446 issue = Issue.order('id DESC').first
2447 assert_redirected_to "/issues/#{issue.id}"
2447 assert_redirected_to "/issues/#{issue.id}"
2448
2448
2449 assert_equal 2, issue.project_id
2449 assert_equal 2, issue.project_id
2450 assert_equal 3, issue.tracker_id
2450 assert_equal 3, issue.tracker_id
2451 assert_equal 'Copy', issue.subject
2451 assert_equal 'Copy', issue.subject
2452 end
2452 end
2453
2453
2454 def test_create_as_copy_should_copy_attachments
2454 def test_create_as_copy_should_copy_attachments
2455 @request.session[:user_id] = 2
2455 @request.session[:user_id] = 2
2456 issue = Issue.find(3)
2456 issue = Issue.find(3)
2457 count = issue.attachments.count
2457 count = issue.attachments.count
2458 assert count > 0
2458 assert count > 0
2459 assert_difference 'Issue.count' do
2459 assert_difference 'Issue.count' do
2460 assert_difference 'Attachment.count', count do
2460 assert_difference 'Attachment.count', count do
2461 assert_difference 'Journal.count', 2 do
2461 assert_difference 'Journal.count', 2 do
2462 post :create, :project_id => 1, :copy_from => 3,
2462 post :create, :project_id => 1, :copy_from => 3,
2463 :issue => {:project_id => '1', :tracker_id => '3',
2463 :issue => {:project_id => '1', :tracker_id => '3',
2464 :status_id => '1', :subject => 'Copy with attachments'},
2464 :status_id => '1', :subject => 'Copy with attachments'},
2465 :copy_attachments => '1'
2465 :copy_attachments => '1'
2466 end
2466 end
2467 end
2467 end
2468 end
2468 end
2469 copy = Issue.order('id DESC').first
2469 copy = Issue.order('id DESC').first
2470 assert_equal count, copy.attachments.count
2470 assert_equal count, copy.attachments.count
2471 assert_equal issue.attachments.map(&:filename).sort, copy.attachments.map(&:filename).sort
2471 assert_equal issue.attachments.map(&:filename).sort, copy.attachments.map(&:filename).sort
2472 end
2472 end
2473
2473
2474 def test_create_as_copy_without_copy_attachments_option_should_not_copy_attachments
2474 def test_create_as_copy_without_copy_attachments_option_should_not_copy_attachments
2475 @request.session[:user_id] = 2
2475 @request.session[:user_id] = 2
2476 issue = Issue.find(3)
2476 issue = Issue.find(3)
2477 count = issue.attachments.count
2477 count = issue.attachments.count
2478 assert count > 0
2478 assert count > 0
2479 assert_difference 'Issue.count' do
2479 assert_difference 'Issue.count' do
2480 assert_no_difference 'Attachment.count' do
2480 assert_no_difference 'Attachment.count' do
2481 assert_difference 'Journal.count', 2 do
2481 assert_difference 'Journal.count', 2 do
2482 post :create, :project_id => 1, :copy_from => 3,
2482 post :create, :project_id => 1, :copy_from => 3,
2483 :issue => {:project_id => '1', :tracker_id => '3',
2483 :issue => {:project_id => '1', :tracker_id => '3',
2484 :status_id => '1', :subject => 'Copy with attachments'}
2484 :status_id => '1', :subject => 'Copy with attachments'}
2485 end
2485 end
2486 end
2486 end
2487 end
2487 end
2488 copy = Issue.order('id DESC').first
2488 copy = Issue.order('id DESC').first
2489 assert_equal 0, copy.attachments.count
2489 assert_equal 0, copy.attachments.count
2490 end
2490 end
2491
2491
2492 def test_create_as_copy_with_attachments_should_add_new_files
2492 def test_create_as_copy_with_attachments_should_add_new_files
2493 @request.session[:user_id] = 2
2493 @request.session[:user_id] = 2
2494 issue = Issue.find(3)
2494 issue = Issue.find(3)
2495 count = issue.attachments.count
2495 count = issue.attachments.count
2496 assert count > 0
2496 assert count > 0
2497 assert_difference 'Issue.count' do
2497 assert_difference 'Issue.count' do
2498 assert_difference 'Attachment.count', count + 1 do
2498 assert_difference 'Attachment.count', count + 1 do
2499 assert_difference 'Journal.count', 2 do
2499 assert_difference 'Journal.count', 2 do
2500 post :create, :project_id => 1, :copy_from => 3,
2500 post :create, :project_id => 1, :copy_from => 3,
2501 :issue => {:project_id => '1', :tracker_id => '3',
2501 :issue => {:project_id => '1', :tracker_id => '3',
2502 :status_id => '1', :subject => 'Copy with attachments'},
2502 :status_id => '1', :subject => 'Copy with attachments'},
2503 :copy_attachments => '1',
2503 :copy_attachments => '1',
2504 :attachments => {'1' =>
2504 :attachments => {'1' =>
2505 {'file' => uploaded_test_file('testfile.txt', 'text/plain'),
2505 {'file' => uploaded_test_file('testfile.txt', 'text/plain'),
2506 'description' => 'test file'}}
2506 'description' => 'test file'}}
2507 end
2507 end
2508 end
2508 end
2509 end
2509 end
2510 copy = Issue.order('id DESC').first
2510 copy = Issue.order('id DESC').first
2511 assert_equal count + 1, copy.attachments.count
2511 assert_equal count + 1, copy.attachments.count
2512 end
2512 end
2513
2513
2514 def test_create_as_copy_should_add_relation_with_copied_issue
2514 def test_create_as_copy_should_add_relation_with_copied_issue
2515 @request.session[:user_id] = 2
2515 @request.session[:user_id] = 2
2516 assert_difference 'Issue.count' do
2516 assert_difference 'Issue.count' do
2517 assert_difference 'IssueRelation.count' do
2517 assert_difference 'IssueRelation.count' do
2518 post :create, :project_id => 1, :copy_from => 1,
2518 post :create, :project_id => 1, :copy_from => 1,
2519 :issue => {:project_id => '1', :tracker_id => '3',
2519 :issue => {:project_id => '1', :tracker_id => '3',
2520 :status_id => '1', :subject => 'Copy'}
2520 :status_id => '1', :subject => 'Copy'}
2521 end
2521 end
2522 end
2522 end
2523 copy = Issue.order('id DESC').first
2523 copy = Issue.order('id DESC').first
2524 assert_equal 1, copy.relations.size
2524 assert_equal 1, copy.relations.size
2525 end
2525 end
2526
2526
2527 def test_create_as_copy_should_copy_subtasks
2527 def test_create_as_copy_should_copy_subtasks
2528 @request.session[:user_id] = 2
2528 @request.session[:user_id] = 2
2529 issue = Issue.generate_with_descendants!
2529 issue = Issue.generate_with_descendants!
2530 count = issue.descendants.count
2530 count = issue.descendants.count
2531 assert_difference 'Issue.count', count + 1 do
2531 assert_difference 'Issue.count', count + 1 do
2532 assert_difference 'Journal.count', (count + 1) * 2 do
2532 assert_difference 'Journal.count', (count + 1) * 2 do
2533 post :create, :project_id => 1, :copy_from => issue.id,
2533 post :create, :project_id => 1, :copy_from => issue.id,
2534 :issue => {:project_id => '1', :tracker_id => '3',
2534 :issue => {:project_id => '1', :tracker_id => '3',
2535 :status_id => '1', :subject => 'Copy with subtasks'},
2535 :status_id => '1', :subject => 'Copy with subtasks'},
2536 :copy_subtasks => '1'
2536 :copy_subtasks => '1'
2537 end
2537 end
2538 end
2538 end
2539 copy = Issue.where(:parent_id => nil).order('id DESC').first
2539 copy = Issue.where(:parent_id => nil).order('id DESC').first
2540 assert_equal count, copy.descendants.count
2540 assert_equal count, copy.descendants.count
2541 assert_equal issue.descendants.map(&:subject).sort, copy.descendants.map(&:subject).sort
2541 assert_equal issue.descendants.map(&:subject).sort, copy.descendants.map(&:subject).sort
2542 end
2542 end
2543
2543
2544 def test_create_as_copy_without_copy_subtasks_option_should_not_copy_subtasks
2544 def test_create_as_copy_without_copy_subtasks_option_should_not_copy_subtasks
2545 @request.session[:user_id] = 2
2545 @request.session[:user_id] = 2
2546 issue = Issue.generate_with_descendants!
2546 issue = Issue.generate_with_descendants!
2547 assert_difference 'Issue.count', 1 do
2547 assert_difference 'Issue.count', 1 do
2548 assert_difference 'Journal.count', 2 do
2548 assert_difference 'Journal.count', 2 do
2549 post :create, :project_id => 1, :copy_from => 3,
2549 post :create, :project_id => 1, :copy_from => 3,
2550 :issue => {:project_id => '1', :tracker_id => '3',
2550 :issue => {:project_id => '1', :tracker_id => '3',
2551 :status_id => '1', :subject => 'Copy with subtasks'}
2551 :status_id => '1', :subject => 'Copy with subtasks'}
2552 end
2552 end
2553 end
2553 end
2554 copy = Issue.where(:parent_id => nil).order('id DESC').first
2554 copy = Issue.where(:parent_id => nil).order('id DESC').first
2555 assert_equal 0, copy.descendants.count
2555 assert_equal 0, copy.descendants.count
2556 end
2556 end
2557
2557
2558 def test_create_as_copy_with_failure
2558 def test_create_as_copy_with_failure
2559 @request.session[:user_id] = 2
2559 @request.session[:user_id] = 2
2560 post :create, :project_id => 1, :copy_from => 1,
2560 post :create, :project_id => 1, :copy_from => 1,
2561 :issue => {:project_id => '2', :tracker_id => '3', :status_id => '1', :subject => ''}
2561 :issue => {:project_id => '2', :tracker_id => '3', :status_id => '1', :subject => ''}
2562
2562
2563 assert_response :success
2563 assert_response :success
2564 assert_template 'new'
2564 assert_template 'new'
2565
2565
2566 assert_not_nil assigns(:issue)
2566 assert_not_nil assigns(:issue)
2567 assert assigns(:issue).copy?
2567 assert assigns(:issue).copy?
2568
2568
2569 assert_select 'form#issue-form[action=/projects/ecookbook/issues]' do
2569 assert_select 'form#issue-form[action=/projects/ecookbook/issues]' do
2570 assert_select 'select[name=?]', 'issue[project_id]' do
2570 assert_select 'select[name=?]', 'issue[project_id]' do
2571 assert_select 'option[value=1]:not([selected])', :text => 'eCookbook'
2571 assert_select 'option[value=1]:not([selected])', :text => 'eCookbook'
2572 assert_select 'option[value=2][selected=selected]', :text => 'OnlineStore'
2572 assert_select 'option[value=2][selected=selected]', :text => 'OnlineStore'
2573 end
2573 end
2574 assert_select 'input[name=copy_from][value=1]'
2574 assert_select 'input[name=copy_from][value=1]'
2575 end
2575 end
2576 end
2576 end
2577
2577
2578 def test_create_as_copy_on_project_without_permission_should_ignore_target_project
2578 def test_create_as_copy_on_project_without_permission_should_ignore_target_project
2579 @request.session[:user_id] = 2
2579 @request.session[:user_id] = 2
2580 assert !User.find(2).member_of?(Project.find(4))
2580 assert !User.find(2).member_of?(Project.find(4))
2581
2581
2582 assert_difference 'Issue.count' do
2582 assert_difference 'Issue.count' do
2583 post :create, :project_id => 1, :copy_from => 1,
2583 post :create, :project_id => 1, :copy_from => 1,
2584 :issue => {:project_id => '4', :tracker_id => '3', :status_id => '1', :subject => 'Copy'}
2584 :issue => {:project_id => '4', :tracker_id => '3', :status_id => '1', :subject => 'Copy'}
2585 end
2585 end
2586 issue = Issue.order('id DESC').first
2586 issue = Issue.order('id DESC').first
2587 assert_equal 1, issue.project_id
2587 assert_equal 1, issue.project_id
2588 end
2588 end
2589
2589
2590 def test_get_edit
2590 def test_get_edit
2591 @request.session[:user_id] = 2
2591 @request.session[:user_id] = 2
2592 get :edit, :id => 1
2592 get :edit, :id => 1
2593 assert_response :success
2593 assert_response :success
2594 assert_template 'edit'
2594 assert_template 'edit'
2595 assert_not_nil assigns(:issue)
2595 assert_not_nil assigns(:issue)
2596 assert_equal Issue.find(1), assigns(:issue)
2596 assert_equal Issue.find(1), assigns(:issue)
2597
2597
2598 # Be sure we don't display inactive IssuePriorities
2598 # Be sure we don't display inactive IssuePriorities
2599 assert ! IssuePriority.find(15).active?
2599 assert ! IssuePriority.find(15).active?
2600 assert_select 'select[name=?]', 'issue[priority_id]' do
2600 assert_select 'select[name=?]', 'issue[priority_id]' do
2601 assert_select 'option[value=15]', 0
2601 assert_select 'option[value=15]', 0
2602 end
2602 end
2603 end
2603 end
2604
2604
2605 def test_get_edit_should_display_the_time_entry_form_with_log_time_permission
2605 def test_get_edit_should_display_the_time_entry_form_with_log_time_permission
2606 @request.session[:user_id] = 2
2606 @request.session[:user_id] = 2
2607 Role.find_by_name('Manager').update_attribute :permissions, [:view_issues, :edit_issues, :log_time]
2607 Role.find_by_name('Manager').update_attribute :permissions, [:view_issues, :edit_issues, :log_time]
2608
2608
2609 get :edit, :id => 1
2609 get :edit, :id => 1
2610 assert_select 'input[name=?]', 'time_entry[hours]'
2610 assert_select 'input[name=?]', 'time_entry[hours]'
2611 end
2611 end
2612
2612
2613 def test_get_edit_should_not_display_the_time_entry_form_without_log_time_permission
2613 def test_get_edit_should_not_display_the_time_entry_form_without_log_time_permission
2614 @request.session[:user_id] = 2
2614 @request.session[:user_id] = 2
2615 Role.find_by_name('Manager').remove_permission! :log_time
2615 Role.find_by_name('Manager').remove_permission! :log_time
2616
2616
2617 get :edit, :id => 1
2617 get :edit, :id => 1
2618 assert_select 'input[name=?]', 'time_entry[hours]', 0
2618 assert_select 'input[name=?]', 'time_entry[hours]', 0
2619 end
2619 end
2620
2620
2621 def test_get_edit_with_params
2621 def test_get_edit_with_params
2622 @request.session[:user_id] = 2
2622 @request.session[:user_id] = 2
2623 get :edit, :id => 1, :issue => { :status_id => 5, :priority_id => 7 },
2623 get :edit, :id => 1, :issue => { :status_id => 5, :priority_id => 7 },
2624 :time_entry => { :hours => '2.5', :comments => 'test_get_edit_with_params', :activity_id => 10 }
2624 :time_entry => { :hours => '2.5', :comments => 'test_get_edit_with_params', :activity_id => 10 }
2625 assert_response :success
2625 assert_response :success
2626 assert_template 'edit'
2626 assert_template 'edit'
2627
2627
2628 issue = assigns(:issue)
2628 issue = assigns(:issue)
2629 assert_not_nil issue
2629 assert_not_nil issue
2630
2630
2631 assert_equal 5, issue.status_id
2631 assert_equal 5, issue.status_id
2632 assert_select 'select[name=?]', 'issue[status_id]' do
2632 assert_select 'select[name=?]', 'issue[status_id]' do
2633 assert_select 'option[value=5][selected=selected]', :text => 'Closed'
2633 assert_select 'option[value=5][selected=selected]', :text => 'Closed'
2634 end
2634 end
2635
2635
2636 assert_equal 7, issue.priority_id
2636 assert_equal 7, issue.priority_id
2637 assert_select 'select[name=?]', 'issue[priority_id]' do
2637 assert_select 'select[name=?]', 'issue[priority_id]' do
2638 assert_select 'option[value=7][selected=selected]', :text => 'Urgent'
2638 assert_select 'option[value=7][selected=selected]', :text => 'Urgent'
2639 end
2639 end
2640
2640
2641 assert_select 'input[name=?][value=2.5]', 'time_entry[hours]'
2641 assert_select 'input[name=?][value=2.5]', 'time_entry[hours]'
2642 assert_select 'select[name=?]', 'time_entry[activity_id]' do
2642 assert_select 'select[name=?]', 'time_entry[activity_id]' do
2643 assert_select 'option[value=10][selected=selected]', :text => 'Development'
2643 assert_select 'option[value=10][selected=selected]', :text => 'Development'
2644 end
2644 end
2645 assert_select 'input[name=?][value=test_get_edit_with_params]', 'time_entry[comments]'
2645 assert_select 'input[name=?][value=test_get_edit_with_params]', 'time_entry[comments]'
2646 end
2646 end
2647
2647
2648 def test_get_edit_with_multi_custom_field
2648 def test_get_edit_with_multi_custom_field
2649 field = CustomField.find(1)
2649 field = CustomField.find(1)
2650 field.update_attribute :multiple, true
2650 field.update_attribute :multiple, true
2651 issue = Issue.find(1)
2651 issue = Issue.find(1)
2652 issue.custom_field_values = {1 => ['MySQL', 'Oracle']}
2652 issue.custom_field_values = {1 => ['MySQL', 'Oracle']}
2653 issue.save!
2653 issue.save!
2654
2654
2655 @request.session[:user_id] = 2
2655 @request.session[:user_id] = 2
2656 get :edit, :id => 1
2656 get :edit, :id => 1
2657 assert_response :success
2657 assert_response :success
2658 assert_template 'edit'
2658 assert_template 'edit'
2659
2659
2660 assert_select 'select[name=?][multiple=multiple]', 'issue[custom_field_values][1][]' do
2660 assert_select 'select[name=?][multiple=multiple]', 'issue[custom_field_values][1][]' do
2661 assert_select 'option', 3
2661 assert_select 'option', 3
2662 assert_select 'option[value=MySQL][selected=selected]'
2662 assert_select 'option[value=MySQL][selected=selected]'
2663 assert_select 'option[value=Oracle][selected=selected]'
2663 assert_select 'option[value=Oracle][selected=selected]'
2664 assert_select 'option[value=PostgreSQL]:not([selected])'
2664 assert_select 'option[value=PostgreSQL]:not([selected])'
2665 end
2665 end
2666 end
2666 end
2667
2667
2668 def test_update_form_for_existing_issue
2668 def test_update_form_for_existing_issue
2669 @request.session[:user_id] = 2
2669 @request.session[:user_id] = 2
2670 xhr :put, :update_form, :project_id => 1,
2670 xhr :put, :update_form, :project_id => 1,
2671 :id => 1,
2671 :id => 1,
2672 :issue => {:tracker_id => 2,
2672 :issue => {:tracker_id => 2,
2673 :subject => 'This is the test_new issue',
2673 :subject => 'This is the test_new issue',
2674 :description => 'This is the description',
2674 :description => 'This is the description',
2675 :priority_id => 5}
2675 :priority_id => 5}
2676 assert_response :success
2676 assert_response :success
2677 assert_equal 'text/javascript', response.content_type
2677 assert_equal 'text/javascript', response.content_type
2678 assert_template 'update_form'
2678 assert_template 'update_form'
2679 assert_template 'form'
2679 assert_template 'form'
2680
2680
2681 issue = assigns(:issue)
2681 issue = assigns(:issue)
2682 assert_kind_of Issue, issue
2682 assert_kind_of Issue, issue
2683 assert_equal 1, issue.id
2683 assert_equal 1, issue.id
2684 assert_equal 1, issue.project_id
2684 assert_equal 1, issue.project_id
2685 assert_equal 2, issue.tracker_id
2685 assert_equal 2, issue.tracker_id
2686 assert_equal 'This is the test_new issue', issue.subject
2686 assert_equal 'This is the test_new issue', issue.subject
2687 end
2687 end
2688
2688
2689 def test_update_form_for_existing_issue_should_keep_issue_author
2689 def test_update_form_for_existing_issue_should_keep_issue_author
2690 @request.session[:user_id] = 3
2690 @request.session[:user_id] = 3
2691 xhr :put, :update_form, :project_id => 1, :id => 1, :issue => {:subject => 'Changed'}
2691 xhr :put, :update_form, :project_id => 1, :id => 1, :issue => {:subject => 'Changed'}
2692 assert_response :success
2692 assert_response :success
2693 assert_equal 'text/javascript', response.content_type
2693 assert_equal 'text/javascript', response.content_type
2694
2694
2695 issue = assigns(:issue)
2695 issue = assigns(:issue)
2696 assert_equal User.find(2), issue.author
2696 assert_equal User.find(2), issue.author
2697 assert_equal 2, issue.author_id
2697 assert_equal 2, issue.author_id
2698 assert_not_equal User.current, issue.author
2698 assert_not_equal User.current, issue.author
2699 end
2699 end
2700
2700
2701 def test_update_form_for_existing_issue_should_propose_transitions_based_on_initial_status
2701 def test_update_form_for_existing_issue_should_propose_transitions_based_on_initial_status
2702 @request.session[:user_id] = 2
2702 @request.session[:user_id] = 2
2703 WorkflowTransition.delete_all
2703 WorkflowTransition.delete_all
2704 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :new_status_id => 1)
2704 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :new_status_id => 1)
2705 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :new_status_id => 5)
2705 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :new_status_id => 5)
2706 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 5, :new_status_id => 4)
2706 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 5, :new_status_id => 4)
2707
2707
2708 xhr :put, :update_form, :project_id => 1,
2708 xhr :put, :update_form, :project_id => 1,
2709 :id => 2,
2709 :id => 2,
2710 :issue => {:tracker_id => 2,
2710 :issue => {:tracker_id => 2,
2711 :status_id => 5,
2711 :status_id => 5,
2712 :subject => 'This is an issue'}
2712 :subject => 'This is an issue'}
2713
2713
2714 assert_equal 5, assigns(:issue).status_id
2714 assert_equal 5, assigns(:issue).status_id
2715 assert_equal [1,2,5], assigns(:allowed_statuses).map(&:id).sort
2715 assert_equal [1,2,5], assigns(:allowed_statuses).map(&:id).sort
2716 end
2716 end
2717
2717
2718 def test_update_form_for_existing_issue_with_project_change
2718 def test_update_form_for_existing_issue_with_project_change
2719 @request.session[:user_id] = 2
2719 @request.session[:user_id] = 2
2720 xhr :put, :update_form, :project_id => 1,
2720 xhr :put, :update_form, :project_id => 1,
2721 :id => 1,
2721 :id => 1,
2722 :issue => {:project_id => 2,
2722 :issue => {:project_id => 2,
2723 :tracker_id => 2,
2723 :tracker_id => 2,
2724 :subject => 'This is the test_new issue',
2724 :subject => 'This is the test_new issue',
2725 :description => 'This is the description',
2725 :description => 'This is the description',
2726 :priority_id => 5}
2726 :priority_id => 5}
2727 assert_response :success
2727 assert_response :success
2728 assert_template 'form'
2728 assert_template 'form'
2729
2729
2730 issue = assigns(:issue)
2730 issue = assigns(:issue)
2731 assert_kind_of Issue, issue
2731 assert_kind_of Issue, issue
2732 assert_equal 1, issue.id
2732 assert_equal 1, issue.id
2733 assert_equal 2, issue.project_id
2733 assert_equal 2, issue.project_id
2734 assert_equal 2, issue.tracker_id
2734 assert_equal 2, issue.tracker_id
2735 assert_equal 'This is the test_new issue', issue.subject
2735 assert_equal 'This is the test_new issue', issue.subject
2736 end
2736 end
2737
2737
2738 def test_update_form_should_propose_default_status_for_existing_issue
2738 def test_update_form_should_propose_default_status_for_existing_issue
2739 @request.session[:user_id] = 2
2739 @request.session[:user_id] = 2
2740 WorkflowTransition.delete_all
2740 WorkflowTransition.delete_all
2741 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :new_status_id => 3)
2741 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :new_status_id => 3)
2742
2742
2743 xhr :put, :update_form, :project_id => 1, :id => 2
2743 xhr :put, :update_form, :project_id => 1, :id => 2
2744 assert_response :success
2744 assert_response :success
2745 assert_equal [2,3], assigns(:allowed_statuses).map(&:id).sort
2745 assert_equal [2,3], assigns(:allowed_statuses).map(&:id).sort
2746 end
2746 end
2747
2747
2748 def test_put_update_without_custom_fields_param
2748 def test_put_update_without_custom_fields_param
2749 @request.session[:user_id] = 2
2749 @request.session[:user_id] = 2
2750 ActionMailer::Base.deliveries.clear
2750 ActionMailer::Base.deliveries.clear
2751
2751
2752 issue = Issue.find(1)
2752 issue = Issue.find(1)
2753 assert_equal '125', issue.custom_value_for(2).value
2753 assert_equal '125', issue.custom_value_for(2).value
2754 old_subject = issue.subject
2754 old_subject = issue.subject
2755 new_subject = 'Subject modified by IssuesControllerTest#test_post_edit'
2755 new_subject = 'Subject modified by IssuesControllerTest#test_post_edit'
2756
2756
2757 assert_difference('Journal.count') do
2757 assert_difference('Journal.count') do
2758 assert_difference('JournalDetail.count', 2) do
2758 assert_difference('JournalDetail.count', 2) do
2759 put :update, :id => 1, :issue => {:subject => new_subject,
2759 put :update, :id => 1, :issue => {:subject => new_subject,
2760 :priority_id => '6',
2760 :priority_id => '6',
2761 :category_id => '1' # no change
2761 :category_id => '1' # no change
2762 }
2762 }
2763 end
2763 end
2764 end
2764 end
2765 assert_redirected_to :action => 'show', :id => '1'
2765 assert_redirected_to :action => 'show', :id => '1'
2766 issue.reload
2766 issue.reload
2767 assert_equal new_subject, issue.subject
2767 assert_equal new_subject, issue.subject
2768 # Make sure custom fields were not cleared
2768 # Make sure custom fields were not cleared
2769 assert_equal '125', issue.custom_value_for(2).value
2769 assert_equal '125', issue.custom_value_for(2).value
2770
2770
2771 mail = ActionMailer::Base.deliveries.last
2771 mail = ActionMailer::Base.deliveries.last
2772 assert_not_nil mail
2772 assert_not_nil mail
2773 assert mail.subject.starts_with?("[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}]")
2773 assert mail.subject.starts_with?("[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}]")
2774 assert_mail_body_match "Subject changed from #{old_subject} to #{new_subject}", mail
2774 assert_mail_body_match "Subject changed from #{old_subject} to #{new_subject}", mail
2775 end
2775 end
2776
2776
2777 def test_put_update_with_project_change
2777 def test_put_update_with_project_change
2778 @request.session[:user_id] = 2
2778 @request.session[:user_id] = 2
2779 ActionMailer::Base.deliveries.clear
2779 ActionMailer::Base.deliveries.clear
2780
2780
2781 assert_difference('Journal.count') do
2781 assert_difference('Journal.count') do
2782 assert_difference('JournalDetail.count', 3) do
2782 assert_difference('JournalDetail.count', 3) do
2783 put :update, :id => 1, :issue => {:project_id => '2',
2783 put :update, :id => 1, :issue => {:project_id => '2',
2784 :tracker_id => '1', # no change
2784 :tracker_id => '1', # no change
2785 :priority_id => '6',
2785 :priority_id => '6',
2786 :category_id => '3'
2786 :category_id => '3'
2787 }
2787 }
2788 end
2788 end
2789 end
2789 end
2790 assert_redirected_to :action => 'show', :id => '1'
2790 assert_redirected_to :action => 'show', :id => '1'
2791 issue = Issue.find(1)
2791 issue = Issue.find(1)
2792 assert_equal 2, issue.project_id
2792 assert_equal 2, issue.project_id
2793 assert_equal 1, issue.tracker_id
2793 assert_equal 1, issue.tracker_id
2794 assert_equal 6, issue.priority_id
2794 assert_equal 6, issue.priority_id
2795 assert_equal 3, issue.category_id
2795 assert_equal 3, issue.category_id
2796
2796
2797 mail = ActionMailer::Base.deliveries.last
2797 mail = ActionMailer::Base.deliveries.last
2798 assert_not_nil mail
2798 assert_not_nil mail
2799 assert mail.subject.starts_with?("[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}]")
2799 assert mail.subject.starts_with?("[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}]")
2800 assert_mail_body_match "Project changed from eCookbook to OnlineStore", mail
2800 assert_mail_body_match "Project changed from eCookbook to OnlineStore", mail
2801 end
2801 end
2802
2802
2803 def test_put_update_with_tracker_change
2803 def test_put_update_with_tracker_change
2804 @request.session[:user_id] = 2
2804 @request.session[:user_id] = 2
2805 ActionMailer::Base.deliveries.clear
2805 ActionMailer::Base.deliveries.clear
2806
2806
2807 assert_difference('Journal.count') do
2807 assert_difference('Journal.count') do
2808 assert_difference('JournalDetail.count', 2) do
2808 assert_difference('JournalDetail.count', 2) do
2809 put :update, :id => 1, :issue => {:project_id => '1',
2809 put :update, :id => 1, :issue => {:project_id => '1',
2810 :tracker_id => '2',
2810 :tracker_id => '2',
2811 :priority_id => '6'
2811 :priority_id => '6'
2812 }
2812 }
2813 end
2813 end
2814 end
2814 end
2815 assert_redirected_to :action => 'show', :id => '1'
2815 assert_redirected_to :action => 'show', :id => '1'
2816 issue = Issue.find(1)
2816 issue = Issue.find(1)
2817 assert_equal 1, issue.project_id
2817 assert_equal 1, issue.project_id
2818 assert_equal 2, issue.tracker_id
2818 assert_equal 2, issue.tracker_id
2819 assert_equal 6, issue.priority_id
2819 assert_equal 6, issue.priority_id
2820 assert_equal 1, issue.category_id
2820 assert_equal 1, issue.category_id
2821
2821
2822 mail = ActionMailer::Base.deliveries.last
2822 mail = ActionMailer::Base.deliveries.last
2823 assert_not_nil mail
2823 assert_not_nil mail
2824 assert mail.subject.starts_with?("[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}]")
2824 assert mail.subject.starts_with?("[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}]")
2825 assert_mail_body_match "Tracker changed from Bug to Feature request", mail
2825 assert_mail_body_match "Tracker changed from Bug to Feature request", mail
2826 end
2826 end
2827
2827
2828 def test_put_update_with_custom_field_change
2828 def test_put_update_with_custom_field_change
2829 @request.session[:user_id] = 2
2829 @request.session[:user_id] = 2
2830 issue = Issue.find(1)
2830 issue = Issue.find(1)
2831 assert_equal '125', issue.custom_value_for(2).value
2831 assert_equal '125', issue.custom_value_for(2).value
2832
2832
2833 assert_difference('Journal.count') do
2833 assert_difference('Journal.count') do
2834 assert_difference('JournalDetail.count', 3) do
2834 assert_difference('JournalDetail.count', 3) do
2835 put :update, :id => 1, :issue => {:subject => 'Custom field change',
2835 put :update, :id => 1, :issue => {:subject => 'Custom field change',
2836 :priority_id => '6',
2836 :priority_id => '6',
2837 :category_id => '1', # no change
2837 :category_id => '1', # no change
2838 :custom_field_values => { '2' => 'New custom value' }
2838 :custom_field_values => { '2' => 'New custom value' }
2839 }
2839 }
2840 end
2840 end
2841 end
2841 end
2842 assert_redirected_to :action => 'show', :id => '1'
2842 assert_redirected_to :action => 'show', :id => '1'
2843 issue.reload
2843 issue.reload
2844 assert_equal 'New custom value', issue.custom_value_for(2).value
2844 assert_equal 'New custom value', issue.custom_value_for(2).value
2845
2845
2846 mail = ActionMailer::Base.deliveries.last
2846 mail = ActionMailer::Base.deliveries.last
2847 assert_not_nil mail
2847 assert_not_nil mail
2848 assert_mail_body_match "Searchable field changed from 125 to New custom value", mail
2848 assert_mail_body_match "Searchable field changed from 125 to New custom value", mail
2849 end
2849 end
2850
2850
2851 def test_put_update_with_multi_custom_field_change
2851 def test_put_update_with_multi_custom_field_change
2852 field = CustomField.find(1)
2852 field = CustomField.find(1)
2853 field.update_attribute :multiple, true
2853 field.update_attribute :multiple, true
2854 issue = Issue.find(1)
2854 issue = Issue.find(1)
2855 issue.custom_field_values = {1 => ['MySQL', 'Oracle']}
2855 issue.custom_field_values = {1 => ['MySQL', 'Oracle']}
2856 issue.save!
2856 issue.save!
2857
2857
2858 @request.session[:user_id] = 2
2858 @request.session[:user_id] = 2
2859 assert_difference('Journal.count') do
2859 assert_difference('Journal.count') do
2860 assert_difference('JournalDetail.count', 3) do
2860 assert_difference('JournalDetail.count', 3) do
2861 put :update, :id => 1,
2861 put :update, :id => 1,
2862 :issue => {
2862 :issue => {
2863 :subject => 'Custom field change',
2863 :subject => 'Custom field change',
2864 :custom_field_values => { '1' => ['', 'Oracle', 'PostgreSQL'] }
2864 :custom_field_values => { '1' => ['', 'Oracle', 'PostgreSQL'] }
2865 }
2865 }
2866 end
2866 end
2867 end
2867 end
2868 assert_redirected_to :action => 'show', :id => '1'
2868 assert_redirected_to :action => 'show', :id => '1'
2869 assert_equal ['Oracle', 'PostgreSQL'], Issue.find(1).custom_field_value(1).sort
2869 assert_equal ['Oracle', 'PostgreSQL'], Issue.find(1).custom_field_value(1).sort
2870 end
2870 end
2871
2871
2872 def test_put_update_with_status_and_assignee_change
2872 def test_put_update_with_status_and_assignee_change
2873 issue = Issue.find(1)
2873 issue = Issue.find(1)
2874 assert_equal 1, issue.status_id
2874 assert_equal 1, issue.status_id
2875 @request.session[:user_id] = 2
2875 @request.session[:user_id] = 2
2876 assert_difference('TimeEntry.count', 0) do
2876 assert_difference('TimeEntry.count', 0) do
2877 put :update,
2877 put :update,
2878 :id => 1,
2878 :id => 1,
2879 :issue => { :status_id => 2, :assigned_to_id => 3, :notes => 'Assigned to dlopper' },
2879 :issue => { :status_id => 2, :assigned_to_id => 3, :notes => 'Assigned to dlopper' },
2880 :time_entry => { :hours => '', :comments => '', :activity_id => TimeEntryActivity.first }
2880 :time_entry => { :hours => '', :comments => '', :activity_id => TimeEntryActivity.first }
2881 end
2881 end
2882 assert_redirected_to :action => 'show', :id => '1'
2882 assert_redirected_to :action => 'show', :id => '1'
2883 issue.reload
2883 issue.reload
2884 assert_equal 2, issue.status_id
2884 assert_equal 2, issue.status_id
2885 j = Journal.order('id DESC').first
2885 j = Journal.order('id DESC').first
2886 assert_equal 'Assigned to dlopper', j.notes
2886 assert_equal 'Assigned to dlopper', j.notes
2887 assert_equal 2, j.details.size
2887 assert_equal 2, j.details.size
2888
2888
2889 mail = ActionMailer::Base.deliveries.last
2889 mail = ActionMailer::Base.deliveries.last
2890 assert_mail_body_match "Status changed from New to Assigned", mail
2890 assert_mail_body_match "Status changed from New to Assigned", mail
2891 # subject should contain the new status
2891 # subject should contain the new status
2892 assert mail.subject.include?("(#{ IssueStatus.find(2).name })")
2892 assert mail.subject.include?("(#{ IssueStatus.find(2).name })")
2893 end
2893 end
2894
2894
2895 def test_put_update_with_note_only
2895 def test_put_update_with_note_only
2896 notes = 'Note added by IssuesControllerTest#test_update_with_note_only'
2896 notes = 'Note added by IssuesControllerTest#test_update_with_note_only'
2897 # anonymous user
2897 # anonymous user
2898 put :update,
2898 put :update,
2899 :id => 1,
2899 :id => 1,
2900 :issue => { :notes => notes }
2900 :issue => { :notes => notes }
2901 assert_redirected_to :action => 'show', :id => '1'
2901 assert_redirected_to :action => 'show', :id => '1'
2902 j = Journal.order('id DESC').first
2902 j = Journal.order('id DESC').first
2903 assert_equal notes, j.notes
2903 assert_equal notes, j.notes
2904 assert_equal 0, j.details.size
2904 assert_equal 0, j.details.size
2905 assert_equal User.anonymous, j.user
2905 assert_equal User.anonymous, j.user
2906
2906
2907 mail = ActionMailer::Base.deliveries.last
2907 mail = ActionMailer::Base.deliveries.last
2908 assert_mail_body_match notes, mail
2908 assert_mail_body_match notes, mail
2909 end
2909 end
2910
2910
2911 def test_put_update_with_private_note_only
2911 def test_put_update_with_private_note_only
2912 notes = 'Private note'
2912 notes = 'Private note'
2913 @request.session[:user_id] = 2
2913 @request.session[:user_id] = 2
2914
2914
2915 assert_difference 'Journal.count' do
2915 assert_difference 'Journal.count' do
2916 put :update, :id => 1, :issue => {:notes => notes, :private_notes => '1'}
2916 put :update, :id => 1, :issue => {:notes => notes, :private_notes => '1'}
2917 assert_redirected_to :action => 'show', :id => '1'
2917 assert_redirected_to :action => 'show', :id => '1'
2918 end
2918 end
2919
2919
2920 j = Journal.order('id DESC').first
2920 j = Journal.order('id DESC').first
2921 assert_equal notes, j.notes
2921 assert_equal notes, j.notes
2922 assert_equal true, j.private_notes
2922 assert_equal true, j.private_notes
2923 end
2923 end
2924
2924
2925 def test_put_update_with_private_note_and_changes
2925 def test_put_update_with_private_note_and_changes
2926 notes = 'Private note'
2926 notes = 'Private note'
2927 @request.session[:user_id] = 2
2927 @request.session[:user_id] = 2
2928
2928
2929 assert_difference 'Journal.count', 2 do
2929 assert_difference 'Journal.count', 2 do
2930 put :update, :id => 1, :issue => {:subject => 'New subject', :notes => notes, :private_notes => '1'}
2930 put :update, :id => 1, :issue => {:subject => 'New subject', :notes => notes, :private_notes => '1'}
2931 assert_redirected_to :action => 'show', :id => '1'
2931 assert_redirected_to :action => 'show', :id => '1'
2932 end
2932 end
2933
2933
2934 j = Journal.order('id DESC').first
2934 j = Journal.order('id DESC').first
2935 assert_equal notes, j.notes
2935 assert_equal notes, j.notes
2936 assert_equal true, j.private_notes
2936 assert_equal true, j.private_notes
2937 assert_equal 0, j.details.count
2937 assert_equal 0, j.details.count
2938
2938
2939 j = Journal.order('id DESC').offset(1).first
2939 j = Journal.order('id DESC').offset(1).first
2940 assert_nil j.notes
2940 assert_nil j.notes
2941 assert_equal false, j.private_notes
2941 assert_equal false, j.private_notes
2942 assert_equal 1, j.details.count
2942 assert_equal 1, j.details.count
2943 end
2943 end
2944
2944
2945 def test_put_update_with_note_and_spent_time
2945 def test_put_update_with_note_and_spent_time
2946 @request.session[:user_id] = 2
2946 @request.session[:user_id] = 2
2947 spent_hours_before = Issue.find(1).spent_hours
2947 spent_hours_before = Issue.find(1).spent_hours
2948 assert_difference('TimeEntry.count') do
2948 assert_difference('TimeEntry.count') do
2949 put :update,
2949 put :update,
2950 :id => 1,
2950 :id => 1,
2951 :issue => { :notes => '2.5 hours added' },
2951 :issue => { :notes => '2.5 hours added' },
2952 :time_entry => { :hours => '2.5', :comments => 'test_put_update_with_note_and_spent_time', :activity_id => TimeEntryActivity.first.id }
2952 :time_entry => { :hours => '2.5', :comments => 'test_put_update_with_note_and_spent_time', :activity_id => TimeEntryActivity.first.id }
2953 end
2953 end
2954 assert_redirected_to :action => 'show', :id => '1'
2954 assert_redirected_to :action => 'show', :id => '1'
2955
2955
2956 issue = Issue.find(1)
2956 issue = Issue.find(1)
2957
2957
2958 j = Journal.order('id DESC').first
2958 j = Journal.order('id DESC').first
2959 assert_equal '2.5 hours added', j.notes
2959 assert_equal '2.5 hours added', j.notes
2960 assert_equal 0, j.details.size
2960 assert_equal 0, j.details.size
2961
2961
2962 t = issue.time_entries.find_by_comments('test_put_update_with_note_and_spent_time')
2962 t = issue.time_entries.find_by_comments('test_put_update_with_note_and_spent_time')
2963 assert_not_nil t
2963 assert_not_nil t
2964 assert_equal 2.5, t.hours
2964 assert_equal 2.5, t.hours
2965 assert_equal spent_hours_before + 2.5, issue.spent_hours
2965 assert_equal spent_hours_before + 2.5, issue.spent_hours
2966 end
2966 end
2967
2967
2968 def test_put_update_should_preserve_parent_issue_even_if_not_visible
2968 def test_put_update_should_preserve_parent_issue_even_if_not_visible
2969 parent = Issue.generate!(:project_id => 1, :is_private => true)
2969 parent = Issue.generate!(:project_id => 1, :is_private => true)
2970 issue = Issue.generate!(:parent_issue_id => parent.id)
2970 issue = Issue.generate!(:parent_issue_id => parent.id)
2971 assert !parent.visible?(User.find(3))
2971 assert !parent.visible?(User.find(3))
2972 @request.session[:user_id] = 3
2972 @request.session[:user_id] = 3
2973
2973
2974 get :edit, :id => issue.id
2974 get :edit, :id => issue.id
2975 assert_select 'input[name=?][value=?]', 'issue[parent_issue_id]', parent.id.to_s
2975 assert_select 'input[name=?][value=?]', 'issue[parent_issue_id]', parent.id.to_s
2976
2976
2977 put :update, :id => issue.id, :issue => {:subject => 'New subject', :parent_issue_id => parent.id.to_s}
2977 put :update, :id => issue.id, :issue => {:subject => 'New subject', :parent_issue_id => parent.id.to_s}
2978 assert_response 302
2978 assert_response 302
2979 assert_equal parent, issue.parent
2979 assert_equal parent, issue.parent
2980 end
2980 end
2981
2981
2982 def test_put_update_with_attachment_only
2982 def test_put_update_with_attachment_only
2983 set_tmp_attachments_directory
2983 set_tmp_attachments_directory
2984
2984
2985 # Delete all fixtured journals, a race condition can occur causing the wrong
2985 # Delete all fixtured journals, a race condition can occur causing the wrong
2986 # journal to get fetched in the next find.
2986 # journal to get fetched in the next find.
2987 Journal.delete_all
2987 Journal.delete_all
2988
2988
2989 # anonymous user
2989 # anonymous user
2990 assert_difference 'Attachment.count' do
2990 assert_difference 'Attachment.count' do
2991 put :update, :id => 1,
2991 put :update, :id => 1,
2992 :issue => {:notes => ''},
2992 :issue => {:notes => ''},
2993 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}}
2993 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}}
2994 end
2994 end
2995
2995
2996 assert_redirected_to :action => 'show', :id => '1'
2996 assert_redirected_to :action => 'show', :id => '1'
2997 j = Issue.find(1).journals.reorder('id DESC').first
2997 j = Issue.find(1).journals.reorder('id DESC').first
2998 assert j.notes.blank?
2998 assert j.notes.blank?
2999 assert_equal 1, j.details.size
2999 assert_equal 1, j.details.size
3000 assert_equal 'testfile.txt', j.details.first.value
3000 assert_equal 'testfile.txt', j.details.first.value
3001 assert_equal User.anonymous, j.user
3001 assert_equal User.anonymous, j.user
3002
3002
3003 attachment = Attachment.order('id DESC').first
3003 attachment = Attachment.order('id DESC').first
3004 assert_equal Issue.find(1), attachment.container
3004 assert_equal Issue.find(1), attachment.container
3005 assert_equal User.anonymous, attachment.author
3005 assert_equal User.anonymous, attachment.author
3006 assert_equal 'testfile.txt', attachment.filename
3006 assert_equal 'testfile.txt', attachment.filename
3007 assert_equal 'text/plain', attachment.content_type
3007 assert_equal 'text/plain', attachment.content_type
3008 assert_equal 'test file', attachment.description
3008 assert_equal 'test file', attachment.description
3009 assert_equal 59, attachment.filesize
3009 assert_equal 59, attachment.filesize
3010 assert File.exists?(attachment.diskfile)
3010 assert File.exists?(attachment.diskfile)
3011 assert_equal 59, File.size(attachment.diskfile)
3011 assert_equal 59, File.size(attachment.diskfile)
3012
3012
3013 mail = ActionMailer::Base.deliveries.last
3013 mail = ActionMailer::Base.deliveries.last
3014 assert_mail_body_match 'testfile.txt', mail
3014 assert_mail_body_match 'testfile.txt', mail
3015 end
3015 end
3016
3016
3017 def test_put_update_with_failure_should_save_attachments
3017 def test_put_update_with_failure_should_save_attachments
3018 set_tmp_attachments_directory
3018 set_tmp_attachments_directory
3019 @request.session[:user_id] = 2
3019 @request.session[:user_id] = 2
3020
3020
3021 assert_no_difference 'Journal.count' do
3021 assert_no_difference 'Journal.count' do
3022 assert_difference 'Attachment.count' do
3022 assert_difference 'Attachment.count' do
3023 put :update, :id => 1,
3023 put :update, :id => 1,
3024 :issue => { :subject => '' },
3024 :issue => { :subject => '' },
3025 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}}
3025 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}}
3026 assert_response :success
3026 assert_response :success
3027 assert_template 'edit'
3027 assert_template 'edit'
3028 end
3028 end
3029 end
3029 end
3030
3030
3031 attachment = Attachment.order('id DESC').first
3031 attachment = Attachment.order('id DESC').first
3032 assert_equal 'testfile.txt', attachment.filename
3032 assert_equal 'testfile.txt', attachment.filename
3033 assert File.exists?(attachment.diskfile)
3033 assert File.exists?(attachment.diskfile)
3034 assert_nil attachment.container
3034 assert_nil attachment.container
3035
3035
3036 assert_select 'input[name=?][value=?]', 'attachments[p0][token]', attachment.token
3036 assert_select 'input[name=?][value=?]', 'attachments[p0][token]', attachment.token
3037 assert_select 'input[name=?][value=?]', 'attachments[p0][filename]', 'testfile.txt'
3037 assert_select 'input[name=?][value=?]', 'attachments[p0][filename]', 'testfile.txt'
3038 end
3038 end
3039
3039
3040 def test_put_update_with_failure_should_keep_saved_attachments
3040 def test_put_update_with_failure_should_keep_saved_attachments
3041 set_tmp_attachments_directory
3041 set_tmp_attachments_directory
3042 attachment = Attachment.create!(:file => uploaded_test_file("testfile.txt", "text/plain"), :author_id => 2)
3042 attachment = Attachment.create!(:file => uploaded_test_file("testfile.txt", "text/plain"), :author_id => 2)
3043 @request.session[:user_id] = 2
3043 @request.session[:user_id] = 2
3044
3044
3045 assert_no_difference 'Journal.count' do
3045 assert_no_difference 'Journal.count' do
3046 assert_no_difference 'Attachment.count' do
3046 assert_no_difference 'Attachment.count' do
3047 put :update, :id => 1,
3047 put :update, :id => 1,
3048 :issue => { :subject => '' },
3048 :issue => { :subject => '' },
3049 :attachments => {'p0' => {'token' => attachment.token}}
3049 :attachments => {'p0' => {'token' => attachment.token}}
3050 assert_response :success
3050 assert_response :success
3051 assert_template 'edit'
3051 assert_template 'edit'
3052 end
3052 end
3053 end
3053 end
3054
3054
3055 assert_select 'input[name=?][value=?]', 'attachments[p0][token]', attachment.token
3055 assert_select 'input[name=?][value=?]', 'attachments[p0][token]', attachment.token
3056 assert_select 'input[name=?][value=?]', 'attachments[p0][filename]', 'testfile.txt'
3056 assert_select 'input[name=?][value=?]', 'attachments[p0][filename]', 'testfile.txt'
3057 end
3057 end
3058
3058
3059 def test_put_update_should_attach_saved_attachments
3059 def test_put_update_should_attach_saved_attachments
3060 set_tmp_attachments_directory
3060 set_tmp_attachments_directory
3061 attachment = Attachment.create!(:file => uploaded_test_file("testfile.txt", "text/plain"), :author_id => 2)
3061 attachment = Attachment.create!(:file => uploaded_test_file("testfile.txt", "text/plain"), :author_id => 2)
3062 @request.session[:user_id] = 2
3062 @request.session[:user_id] = 2
3063
3063
3064 assert_difference 'Journal.count' do
3064 assert_difference 'Journal.count' do
3065 assert_difference 'JournalDetail.count' do
3065 assert_difference 'JournalDetail.count' do
3066 assert_no_difference 'Attachment.count' do
3066 assert_no_difference 'Attachment.count' do
3067 put :update, :id => 1,
3067 put :update, :id => 1,
3068 :issue => {:notes => 'Attachment added'},
3068 :issue => {:notes => 'Attachment added'},
3069 :attachments => {'p0' => {'token' => attachment.token}}
3069 :attachments => {'p0' => {'token' => attachment.token}}
3070 assert_redirected_to '/issues/1'
3070 assert_redirected_to '/issues/1'
3071 end
3071 end
3072 end
3072 end
3073 end
3073 end
3074
3074
3075 attachment.reload
3075 attachment.reload
3076 assert_equal Issue.find(1), attachment.container
3076 assert_equal Issue.find(1), attachment.container
3077
3077
3078 journal = Journal.order('id DESC').first
3078 journal = Journal.order('id DESC').first
3079 assert_equal 1, journal.details.size
3079 assert_equal 1, journal.details.size
3080 assert_equal 'testfile.txt', journal.details.first.value
3080 assert_equal 'testfile.txt', journal.details.first.value
3081 end
3081 end
3082
3082
3083 def test_put_update_with_attachment_that_fails_to_save
3083 def test_put_update_with_attachment_that_fails_to_save
3084 set_tmp_attachments_directory
3084 set_tmp_attachments_directory
3085
3085
3086 # Delete all fixtured journals, a race condition can occur causing the wrong
3086 # Delete all fixtured journals, a race condition can occur causing the wrong
3087 # journal to get fetched in the next find.
3087 # journal to get fetched in the next find.
3088 Journal.delete_all
3088 Journal.delete_all
3089
3089
3090 # Mock out the unsaved attachment
3090 # Mock out the unsaved attachment
3091 Attachment.any_instance.stubs(:create).returns(Attachment.new)
3091 Attachment.any_instance.stubs(:create).returns(Attachment.new)
3092
3092
3093 # anonymous user
3093 # anonymous user
3094 put :update,
3094 put :update,
3095 :id => 1,
3095 :id => 1,
3096 :issue => {:notes => ''},
3096 :issue => {:notes => ''},
3097 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
3097 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
3098 assert_redirected_to :action => 'show', :id => '1'
3098 assert_redirected_to :action => 'show', :id => '1'
3099 assert_equal '1 file(s) could not be saved.', flash[:warning]
3099 assert_equal '1 file(s) could not be saved.', flash[:warning]
3100 end
3100 end
3101
3101
3102 def test_put_update_with_no_change
3102 def test_put_update_with_no_change
3103 issue = Issue.find(1)
3103 issue = Issue.find(1)
3104 issue.journals.clear
3104 issue.journals.clear
3105 ActionMailer::Base.deliveries.clear
3105 ActionMailer::Base.deliveries.clear
3106
3106
3107 put :update,
3107 put :update,
3108 :id => 1,
3108 :id => 1,
3109 :issue => {:notes => ''}
3109 :issue => {:notes => ''}
3110 assert_redirected_to :action => 'show', :id => '1'
3110 assert_redirected_to :action => 'show', :id => '1'
3111
3111
3112 issue.reload
3112 issue.reload
3113 assert issue.journals.empty?
3113 assert issue.journals.empty?
3114 # No email should be sent
3114 # No email should be sent
3115 assert ActionMailer::Base.deliveries.empty?
3115 assert ActionMailer::Base.deliveries.empty?
3116 end
3116 end
3117
3117
3118 def test_put_update_should_send_a_notification
3118 def test_put_update_should_send_a_notification
3119 @request.session[:user_id] = 2
3119 @request.session[:user_id] = 2
3120 ActionMailer::Base.deliveries.clear
3120 ActionMailer::Base.deliveries.clear
3121 issue = Issue.find(1)
3121 issue = Issue.find(1)
3122 old_subject = issue.subject
3122 old_subject = issue.subject
3123 new_subject = 'Subject modified by IssuesControllerTest#test_post_edit'
3123 new_subject = 'Subject modified by IssuesControllerTest#test_post_edit'
3124
3124
3125 put :update, :id => 1, :issue => {:subject => new_subject,
3125 put :update, :id => 1, :issue => {:subject => new_subject,
3126 :priority_id => '6',
3126 :priority_id => '6',
3127 :category_id => '1' # no change
3127 :category_id => '1' # no change
3128 }
3128 }
3129 assert_equal 1, ActionMailer::Base.deliveries.size
3129 assert_equal 1, ActionMailer::Base.deliveries.size
3130 end
3130 end
3131
3131
3132 def test_put_update_with_invalid_spent_time_hours_only
3132 def test_put_update_with_invalid_spent_time_hours_only
3133 @request.session[:user_id] = 2
3133 @request.session[:user_id] = 2
3134 notes = 'Note added by IssuesControllerTest#test_post_edit_with_invalid_spent_time'
3134 notes = 'Note added by IssuesControllerTest#test_post_edit_with_invalid_spent_time'
3135
3135
3136 assert_no_difference('Journal.count') do
3136 assert_no_difference('Journal.count') do
3137 put :update,
3137 put :update,
3138 :id => 1,
3138 :id => 1,
3139 :issue => {:notes => notes},
3139 :issue => {:notes => notes},
3140 :time_entry => {"comments"=>"", "activity_id"=>"", "hours"=>"2z"}
3140 :time_entry => {"comments"=>"", "activity_id"=>"", "hours"=>"2z"}
3141 end
3141 end
3142 assert_response :success
3142 assert_response :success
3143 assert_template 'edit'
3143 assert_template 'edit'
3144
3144
3145 assert_error_tag :descendant => {:content => /Activity can&#x27;t be blank/}
3145 assert_error_tag :descendant => {:content => /Activity can&#x27;t be blank/}
3146 assert_select 'textarea[name=?]', 'issue[notes]', :text => notes
3146 assert_select 'textarea[name=?]', 'issue[notes]', :text => notes
3147 assert_select 'input[name=?][value=?]', 'time_entry[hours]', '2z'
3147 assert_select 'input[name=?][value=?]', 'time_entry[hours]', '2z'
3148 end
3148 end
3149
3149
3150 def test_put_update_with_invalid_spent_time_comments_only
3150 def test_put_update_with_invalid_spent_time_comments_only
3151 @request.session[:user_id] = 2
3151 @request.session[:user_id] = 2
3152 notes = 'Note added by IssuesControllerTest#test_post_edit_with_invalid_spent_time'
3152 notes = 'Note added by IssuesControllerTest#test_post_edit_with_invalid_spent_time'
3153
3153
3154 assert_no_difference('Journal.count') do
3154 assert_no_difference('Journal.count') do
3155 put :update,
3155 put :update,
3156 :id => 1,
3156 :id => 1,
3157 :issue => {:notes => notes},
3157 :issue => {:notes => notes},
3158 :time_entry => {"comments"=>"this is my comment", "activity_id"=>"", "hours"=>""}
3158 :time_entry => {"comments"=>"this is my comment", "activity_id"=>"", "hours"=>""}
3159 end
3159 end
3160 assert_response :success
3160 assert_response :success
3161 assert_template 'edit'
3161 assert_template 'edit'
3162
3162
3163 assert_error_tag :descendant => {:content => /Activity can&#x27;t be blank/}
3163 assert_error_tag :descendant => {:content => /Activity can&#x27;t be blank/}
3164 assert_error_tag :descendant => {:content => /Hours can&#x27;t be blank/}
3164 assert_error_tag :descendant => {:content => /Hours can&#x27;t be blank/}
3165 assert_select 'textarea[name=?]', 'issue[notes]', :text => notes
3165 assert_select 'textarea[name=?]', 'issue[notes]', :text => notes
3166 assert_select 'input[name=?][value=?]', 'time_entry[comments]', 'this is my comment'
3166 assert_select 'input[name=?][value=?]', 'time_entry[comments]', 'this is my comment'
3167 end
3167 end
3168
3168
3169 def test_put_update_should_allow_fixed_version_to_be_set_to_a_subproject
3169 def test_put_update_should_allow_fixed_version_to_be_set_to_a_subproject
3170 issue = Issue.find(2)
3170 issue = Issue.find(2)
3171 @request.session[:user_id] = 2
3171 @request.session[:user_id] = 2
3172
3172
3173 put :update,
3173 put :update,
3174 :id => issue.id,
3174 :id => issue.id,
3175 :issue => {
3175 :issue => {
3176 :fixed_version_id => 4
3176 :fixed_version_id => 4
3177 }
3177 }
3178
3178
3179 assert_response :redirect
3179 assert_response :redirect
3180 issue.reload
3180 issue.reload
3181 assert_equal 4, issue.fixed_version_id
3181 assert_equal 4, issue.fixed_version_id
3182 assert_not_equal issue.project_id, issue.fixed_version.project_id
3182 assert_not_equal issue.project_id, issue.fixed_version.project_id
3183 end
3183 end
3184
3184
3185 def test_put_update_should_redirect_back_using_the_back_url_parameter
3185 def test_put_update_should_redirect_back_using_the_back_url_parameter
3186 issue = Issue.find(2)
3186 issue = Issue.find(2)
3187 @request.session[:user_id] = 2
3187 @request.session[:user_id] = 2
3188
3188
3189 put :update,
3189 put :update,
3190 :id => issue.id,
3190 :id => issue.id,
3191 :issue => {
3191 :issue => {
3192 :fixed_version_id => 4
3192 :fixed_version_id => 4
3193 },
3193 },
3194 :back_url => '/issues'
3194 :back_url => '/issues'
3195
3195
3196 assert_response :redirect
3196 assert_response :redirect
3197 assert_redirected_to '/issues'
3197 assert_redirected_to '/issues'
3198 end
3198 end
3199
3199
3200 def test_put_update_should_not_redirect_back_using_the_back_url_parameter_off_the_host
3200 def test_put_update_should_not_redirect_back_using_the_back_url_parameter_off_the_host
3201 issue = Issue.find(2)
3201 issue = Issue.find(2)
3202 @request.session[:user_id] = 2
3202 @request.session[:user_id] = 2
3203
3203
3204 put :update,
3204 put :update,
3205 :id => issue.id,
3205 :id => issue.id,
3206 :issue => {
3206 :issue => {
3207 :fixed_version_id => 4
3207 :fixed_version_id => 4
3208 },
3208 },
3209 :back_url => 'http://google.com'
3209 :back_url => 'http://google.com'
3210
3210
3211 assert_response :redirect
3211 assert_response :redirect
3212 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue.id
3212 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue.id
3213 end
3213 end
3214
3214
3215 def test_get_bulk_edit
3215 def test_get_bulk_edit
3216 @request.session[:user_id] = 2
3216 @request.session[:user_id] = 2
3217 get :bulk_edit, :ids => [1, 2]
3217 get :bulk_edit, :ids => [1, 2]
3218 assert_response :success
3218 assert_response :success
3219 assert_template 'bulk_edit'
3219 assert_template 'bulk_edit'
3220
3220
3221 assert_select 'ul#bulk-selection' do
3221 assert_select 'ul#bulk-selection' do
3222 assert_select 'li', 2
3222 assert_select 'li', 2
3223 assert_select 'li a', :text => 'Bug #1'
3223 assert_select 'li a', :text => 'Bug #1'
3224 end
3224 end
3225
3225
3226 assert_select 'form#bulk_edit_form[action=?]', '/issues/bulk_update' do
3226 assert_select 'form#bulk_edit_form[action=?]', '/issues/bulk_update' do
3227 assert_select 'input[name=?]', 'ids[]', 2
3227 assert_select 'input[name=?]', 'ids[]', 2
3228 assert_select 'input[name=?][value=1][type=hidden]', 'ids[]'
3228 assert_select 'input[name=?][value=1][type=hidden]', 'ids[]'
3229
3229
3230 assert_select 'select[name=?]', 'issue[project_id]'
3230 assert_select 'select[name=?]', 'issue[project_id]'
3231 assert_select 'input[name=?]', 'issue[parent_issue_id]'
3231 assert_select 'input[name=?]', 'issue[parent_issue_id]'
3232
3232
3233 # Project specific custom field, date type
3233 # Project specific custom field, date type
3234 field = CustomField.find(9)
3234 field = CustomField.find(9)
3235 assert !field.is_for_all?
3235 assert !field.is_for_all?
3236 assert_equal 'date', field.field_format
3236 assert_equal 'date', field.field_format
3237 assert_select 'input[name=?]', 'issue[custom_field_values][9]'
3237 assert_select 'input[name=?]', 'issue[custom_field_values][9]'
3238
3238
3239 # System wide custom field
3239 # System wide custom field
3240 assert CustomField.find(1).is_for_all?
3240 assert CustomField.find(1).is_for_all?
3241 assert_select 'select[name=?]', 'issue[custom_field_values][1]'
3241 assert_select 'select[name=?]', 'issue[custom_field_values][1]'
3242
3242
3243 # Be sure we don't display inactive IssuePriorities
3243 # Be sure we don't display inactive IssuePriorities
3244 assert ! IssuePriority.find(15).active?
3244 assert ! IssuePriority.find(15).active?
3245 assert_select 'select[name=?]', 'issue[priority_id]' do
3245 assert_select 'select[name=?]', 'issue[priority_id]' do
3246 assert_select 'option[value=15]', 0
3246 assert_select 'option[value=15]', 0
3247 end
3247 end
3248 end
3248 end
3249 end
3249 end
3250
3250
3251 def test_get_bulk_edit_on_different_projects
3251 def test_get_bulk_edit_on_different_projects
3252 @request.session[:user_id] = 2
3252 @request.session[:user_id] = 2
3253 get :bulk_edit, :ids => [1, 2, 6]
3253 get :bulk_edit, :ids => [1, 2, 6]
3254 assert_response :success
3254 assert_response :success
3255 assert_template 'bulk_edit'
3255 assert_template 'bulk_edit'
3256
3256
3257 # Can not set issues from different projects as children of an issue
3257 # Can not set issues from different projects as children of an issue
3258 assert_select 'input[name=?]', 'issue[parent_issue_id]', 0
3258 assert_select 'input[name=?]', 'issue[parent_issue_id]', 0
3259
3259
3260 # Project specific custom field, date type
3260 # Project specific custom field, date type
3261 field = CustomField.find(9)
3261 field = CustomField.find(9)
3262 assert !field.is_for_all?
3262 assert !field.is_for_all?
3263 assert !field.project_ids.include?(Issue.find(6).project_id)
3263 assert !field.project_ids.include?(Issue.find(6).project_id)
3264 assert_select 'input[name=?]', 'issue[custom_field_values][9]', 0
3264 assert_select 'input[name=?]', 'issue[custom_field_values][9]', 0
3265 end
3265 end
3266
3266
3267 def test_get_bulk_edit_with_user_custom_field
3267 def test_get_bulk_edit_with_user_custom_field
3268 field = IssueCustomField.create!(:name => 'Tester', :field_format => 'user', :is_for_all => true)
3268 field = IssueCustomField.create!(:name => 'Tester', :field_format => 'user', :is_for_all => true)
3269
3269
3270 @request.session[:user_id] = 2
3270 @request.session[:user_id] = 2
3271 get :bulk_edit, :ids => [1, 2]
3271 get :bulk_edit, :ids => [1, 2]
3272 assert_response :success
3272 assert_response :success
3273 assert_template 'bulk_edit'
3273 assert_template 'bulk_edit'
3274
3274
3275 assert_select 'select.user_cf[name=?]', "issue[custom_field_values][#{field.id}]" do
3275 assert_select 'select.user_cf[name=?]', "issue[custom_field_values][#{field.id}]" do
3276 assert_select 'option', Project.find(1).users.count + 2 # "no change" + "none" options
3276 assert_select 'option', Project.find(1).users.count + 2 # "no change" + "none" options
3277 end
3277 end
3278 end
3278 end
3279
3279
3280 def test_get_bulk_edit_with_version_custom_field
3280 def test_get_bulk_edit_with_version_custom_field
3281 field = IssueCustomField.create!(:name => 'Affected version', :field_format => 'version', :is_for_all => true)
3281 field = IssueCustomField.create!(:name => 'Affected version', :field_format => 'version', :is_for_all => true)
3282
3282
3283 @request.session[:user_id] = 2
3283 @request.session[:user_id] = 2
3284 get :bulk_edit, :ids => [1, 2]
3284 get :bulk_edit, :ids => [1, 2]
3285 assert_response :success
3285 assert_response :success
3286 assert_template 'bulk_edit'
3286 assert_template 'bulk_edit'
3287
3287
3288 assert_select 'select.version_cf[name=?]', "issue[custom_field_values][#{field.id}]" do
3288 assert_select 'select.version_cf[name=?]', "issue[custom_field_values][#{field.id}]" do
3289 assert_select 'option', Project.find(1).shared_versions.count + 2 # "no change" + "none" options
3289 assert_select 'option', Project.find(1).shared_versions.count + 2 # "no change" + "none" options
3290 end
3290 end
3291 end
3291 end
3292
3292
3293 def test_get_bulk_edit_with_multi_custom_field
3293 def test_get_bulk_edit_with_multi_custom_field
3294 field = CustomField.find(1)
3294 field = CustomField.find(1)
3295 field.update_attribute :multiple, true
3295 field.update_attribute :multiple, true
3296
3296
3297 @request.session[:user_id] = 2
3297 @request.session[:user_id] = 2
3298 get :bulk_edit, :ids => [1, 2]
3298 get :bulk_edit, :ids => [1, 2]
3299 assert_response :success
3299 assert_response :success
3300 assert_template 'bulk_edit'
3300 assert_template 'bulk_edit'
3301
3301
3302 assert_select 'select[name=?]', 'issue[custom_field_values][1][]' do
3302 assert_select 'select[name=?]', 'issue[custom_field_values][1][]' do
3303 assert_select 'option', field.possible_values.size + 1 # "none" options
3303 assert_select 'option', field.possible_values.size + 1 # "none" options
3304 end
3304 end
3305 end
3305 end
3306
3306
3307 def test_bulk_edit_should_propose_to_clear_text_custom_fields
3307 def test_bulk_edit_should_propose_to_clear_text_custom_fields
3308 @request.session[:user_id] = 2
3308 @request.session[:user_id] = 2
3309 get :bulk_edit, :ids => [1, 3]
3309 get :bulk_edit, :ids => [1, 3]
3310 assert_select 'input[name=?][value=?]', 'issue[custom_field_values][2]', '__none__'
3310 assert_select 'input[name=?][value=?]', 'issue[custom_field_values][2]', '__none__'
3311 end
3311 end
3312
3312
3313 def test_bulk_edit_should_only_propose_statuses_allowed_for_all_issues
3313 def test_bulk_edit_should_only_propose_statuses_allowed_for_all_issues
3314 WorkflowTransition.delete_all
3314 WorkflowTransition.delete_all
3315 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1,
3315 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1,
3316 :old_status_id => 1, :new_status_id => 1)
3316 :old_status_id => 1, :new_status_id => 1)
3317 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1,
3317 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1,
3318 :old_status_id => 1, :new_status_id => 3)
3318 :old_status_id => 1, :new_status_id => 3)
3319 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1,
3319 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1,
3320 :old_status_id => 1, :new_status_id => 4)
3320 :old_status_id => 1, :new_status_id => 4)
3321 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2,
3321 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2,
3322 :old_status_id => 2, :new_status_id => 1)
3322 :old_status_id => 2, :new_status_id => 1)
3323 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2,
3323 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2,
3324 :old_status_id => 2, :new_status_id => 3)
3324 :old_status_id => 2, :new_status_id => 3)
3325 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2,
3325 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2,
3326 :old_status_id => 2, :new_status_id => 5)
3326 :old_status_id => 2, :new_status_id => 5)
3327 @request.session[:user_id] = 2
3327 @request.session[:user_id] = 2
3328 get :bulk_edit, :ids => [1, 2]
3328 get :bulk_edit, :ids => [1, 2]
3329
3329
3330 assert_response :success
3330 assert_response :success
3331 statuses = assigns(:available_statuses)
3331 statuses = assigns(:available_statuses)
3332 assert_not_nil statuses
3332 assert_not_nil statuses
3333 assert_equal [1, 3], statuses.map(&:id).sort
3333 assert_equal [1, 3], statuses.map(&:id).sort
3334
3334
3335 assert_select 'select[name=?]', 'issue[status_id]' do
3335 assert_select 'select[name=?]', 'issue[status_id]' do
3336 assert_select 'option', 3 # 2 statuses + "no change" option
3336 assert_select 'option', 3 # 2 statuses + "no change" option
3337 end
3337 end
3338 end
3338 end
3339
3339
3340 def test_bulk_edit_should_propose_target_project_open_shared_versions
3340 def test_bulk_edit_should_propose_target_project_open_shared_versions
3341 @request.session[:user_id] = 2
3341 @request.session[:user_id] = 2
3342 post :bulk_edit, :ids => [1, 2, 6], :issue => {:project_id => 1}
3342 post :bulk_edit, :ids => [1, 2, 6], :issue => {:project_id => 1}
3343 assert_response :success
3343 assert_response :success
3344 assert_template 'bulk_edit'
3344 assert_template 'bulk_edit'
3345 assert_equal Project.find(1).shared_versions.open.all.sort, assigns(:versions).sort
3345 assert_equal Project.find(1).shared_versions.open.all.sort, assigns(:versions).sort
3346
3346
3347 assert_select 'select[name=?]', 'issue[fixed_version_id]' do
3347 assert_select 'select[name=?]', 'issue[fixed_version_id]' do
3348 assert_select 'option', :text => '2.0'
3348 assert_select 'option', :text => '2.0'
3349 end
3349 end
3350 end
3350 end
3351
3351
3352 def test_bulk_edit_should_propose_target_project_categories
3352 def test_bulk_edit_should_propose_target_project_categories
3353 @request.session[:user_id] = 2
3353 @request.session[:user_id] = 2
3354 post :bulk_edit, :ids => [1, 2, 6], :issue => {:project_id => 1}
3354 post :bulk_edit, :ids => [1, 2, 6], :issue => {:project_id => 1}
3355 assert_response :success
3355 assert_response :success
3356 assert_template 'bulk_edit'
3356 assert_template 'bulk_edit'
3357 assert_equal Project.find(1).issue_categories.sort, assigns(:categories).sort
3357 assert_equal Project.find(1).issue_categories.sort, assigns(:categories).sort
3358
3358
3359 assert_select 'select[name=?]', 'issue[category_id]' do
3359 assert_select 'select[name=?]', 'issue[category_id]' do
3360 assert_select 'option', :text => 'Recipes'
3360 assert_select 'option', :text => 'Recipes'
3361 end
3361 end
3362 end
3362 end
3363
3363
3364 def test_bulk_update
3364 def test_bulk_update
3365 @request.session[:user_id] = 2
3365 @request.session[:user_id] = 2
3366 # update issues priority
3366 # update issues priority
3367 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing',
3367 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing',
3368 :issue => {:priority_id => 7,
3368 :issue => {:priority_id => 7,
3369 :assigned_to_id => '',
3369 :assigned_to_id => '',
3370 :custom_field_values => {'2' => ''}}
3370 :custom_field_values => {'2' => ''}}
3371
3371
3372 assert_response 302
3372 assert_response 302
3373 # check that the issues were updated
3373 # check that the issues were updated
3374 assert_equal [7, 7], Issue.find_all_by_id([1, 2]).collect {|i| i.priority.id}
3374 assert_equal [7, 7], Issue.where(:id =>[1, 2]).collect {|i| i.priority.id}
3375
3375
3376 issue = Issue.find(1)
3376 issue = Issue.find(1)
3377 journal = issue.journals.reorder('created_on DESC').first
3377 journal = issue.journals.reorder('created_on DESC').first
3378 assert_equal '125', issue.custom_value_for(2).value
3378 assert_equal '125', issue.custom_value_for(2).value
3379 assert_equal 'Bulk editing', journal.notes
3379 assert_equal 'Bulk editing', journal.notes
3380 assert_equal 1, journal.details.size
3380 assert_equal 1, journal.details.size
3381 end
3381 end
3382
3382
3383 def test_bulk_update_with_group_assignee
3383 def test_bulk_update_with_group_assignee
3384 group = Group.find(11)
3384 group = Group.find(11)
3385 project = Project.find(1)
3385 project = Project.find(1)
3386 project.members << Member.new(:principal => group, :roles => [Role.givable.first])
3386 project.members << Member.new(:principal => group, :roles => [Role.givable.first])
3387
3387
3388 @request.session[:user_id] = 2
3388 @request.session[:user_id] = 2
3389 # update issues assignee
3389 # update issues assignee
3390 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing',
3390 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing',
3391 :issue => {:priority_id => '',
3391 :issue => {:priority_id => '',
3392 :assigned_to_id => group.id,
3392 :assigned_to_id => group.id,
3393 :custom_field_values => {'2' => ''}}
3393 :custom_field_values => {'2' => ''}}
3394
3394
3395 assert_response 302
3395 assert_response 302
3396 assert_equal [group, group], Issue.where(:id => [1, 2]).collect {|i| i.assigned_to}
3396 assert_equal [group, group], Issue.where(:id => [1, 2]).collect {|i| i.assigned_to}
3397 end
3397 end
3398
3398
3399 def test_bulk_update_on_different_projects
3399 def test_bulk_update_on_different_projects
3400 @request.session[:user_id] = 2
3400 @request.session[:user_id] = 2
3401 # update issues priority
3401 # update issues priority
3402 post :bulk_update, :ids => [1, 2, 6], :notes => 'Bulk editing',
3402 post :bulk_update, :ids => [1, 2, 6], :notes => 'Bulk editing',
3403 :issue => {:priority_id => 7,
3403 :issue => {:priority_id => 7,
3404 :assigned_to_id => '',
3404 :assigned_to_id => '',
3405 :custom_field_values => {'2' => ''}}
3405 :custom_field_values => {'2' => ''}}
3406
3406
3407 assert_response 302
3407 assert_response 302
3408 # check that the issues were updated
3408 # check that the issues were updated
3409 assert_equal [7, 7, 7], Issue.find([1,2,6]).map(&:priority_id)
3409 assert_equal [7, 7, 7], Issue.find([1,2,6]).map(&:priority_id)
3410
3410
3411 issue = Issue.find(1)
3411 issue = Issue.find(1)
3412 journal = issue.journals.reorder('created_on DESC').first
3412 journal = issue.journals.reorder('created_on DESC').first
3413 assert_equal '125', issue.custom_value_for(2).value
3413 assert_equal '125', issue.custom_value_for(2).value
3414 assert_equal 'Bulk editing', journal.notes
3414 assert_equal 'Bulk editing', journal.notes
3415 assert_equal 1, journal.details.size
3415 assert_equal 1, journal.details.size
3416 end
3416 end
3417
3417
3418 def test_bulk_update_on_different_projects_without_rights
3418 def test_bulk_update_on_different_projects_without_rights
3419 @request.session[:user_id] = 3
3419 @request.session[:user_id] = 3
3420 user = User.find(3)
3420 user = User.find(3)
3421 action = { :controller => "issues", :action => "bulk_update" }
3421 action = { :controller => "issues", :action => "bulk_update" }
3422 assert user.allowed_to?(action, Issue.find(1).project)
3422 assert user.allowed_to?(action, Issue.find(1).project)
3423 assert ! user.allowed_to?(action, Issue.find(6).project)
3423 assert ! user.allowed_to?(action, Issue.find(6).project)
3424 post :bulk_update, :ids => [1, 6], :notes => 'Bulk should fail',
3424 post :bulk_update, :ids => [1, 6], :notes => 'Bulk should fail',
3425 :issue => {:priority_id => 7,
3425 :issue => {:priority_id => 7,
3426 :assigned_to_id => '',
3426 :assigned_to_id => '',
3427 :custom_field_values => {'2' => ''}}
3427 :custom_field_values => {'2' => ''}}
3428 assert_response 403
3428 assert_response 403
3429 assert_not_equal "Bulk should fail", Journal.last.notes
3429 assert_not_equal "Bulk should fail", Journal.last.notes
3430 end
3430 end
3431
3431
3432 def test_bullk_update_should_send_a_notification
3432 def test_bullk_update_should_send_a_notification
3433 @request.session[:user_id] = 2
3433 @request.session[:user_id] = 2
3434 ActionMailer::Base.deliveries.clear
3434 ActionMailer::Base.deliveries.clear
3435 post(:bulk_update,
3435 post(:bulk_update,
3436 {
3436 {
3437 :ids => [1, 2],
3437 :ids => [1, 2],
3438 :notes => 'Bulk editing',
3438 :notes => 'Bulk editing',
3439 :issue => {
3439 :issue => {
3440 :priority_id => 7,
3440 :priority_id => 7,
3441 :assigned_to_id => '',
3441 :assigned_to_id => '',
3442 :custom_field_values => {'2' => ''}
3442 :custom_field_values => {'2' => ''}
3443 }
3443 }
3444 })
3444 })
3445
3445
3446 assert_response 302
3446 assert_response 302
3447 assert_equal 2, ActionMailer::Base.deliveries.size
3447 assert_equal 2, ActionMailer::Base.deliveries.size
3448 end
3448 end
3449
3449
3450 def test_bulk_update_project
3450 def test_bulk_update_project
3451 @request.session[:user_id] = 2
3451 @request.session[:user_id] = 2
3452 post :bulk_update, :ids => [1, 2], :issue => {:project_id => '2'}
3452 post :bulk_update, :ids => [1, 2], :issue => {:project_id => '2'}
3453 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook'
3453 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook'
3454 # Issues moved to project 2
3454 # Issues moved to project 2
3455 assert_equal 2, Issue.find(1).project_id
3455 assert_equal 2, Issue.find(1).project_id
3456 assert_equal 2, Issue.find(2).project_id
3456 assert_equal 2, Issue.find(2).project_id
3457 # No tracker change
3457 # No tracker change
3458 assert_equal 1, Issue.find(1).tracker_id
3458 assert_equal 1, Issue.find(1).tracker_id
3459 assert_equal 2, Issue.find(2).tracker_id
3459 assert_equal 2, Issue.find(2).tracker_id
3460 end
3460 end
3461
3461
3462 def test_bulk_update_project_on_single_issue_should_follow_when_needed
3462 def test_bulk_update_project_on_single_issue_should_follow_when_needed
3463 @request.session[:user_id] = 2
3463 @request.session[:user_id] = 2
3464 post :bulk_update, :id => 1, :issue => {:project_id => '2'}, :follow => '1'
3464 post :bulk_update, :id => 1, :issue => {:project_id => '2'}, :follow => '1'
3465 assert_redirected_to '/issues/1'
3465 assert_redirected_to '/issues/1'
3466 end
3466 end
3467
3467
3468 def test_bulk_update_project_on_multiple_issues_should_follow_when_needed
3468 def test_bulk_update_project_on_multiple_issues_should_follow_when_needed
3469 @request.session[:user_id] = 2
3469 @request.session[:user_id] = 2
3470 post :bulk_update, :id => [1, 2], :issue => {:project_id => '2'}, :follow => '1'
3470 post :bulk_update, :id => [1, 2], :issue => {:project_id => '2'}, :follow => '1'
3471 assert_redirected_to '/projects/onlinestore/issues'
3471 assert_redirected_to '/projects/onlinestore/issues'
3472 end
3472 end
3473
3473
3474 def test_bulk_update_tracker
3474 def test_bulk_update_tracker
3475 @request.session[:user_id] = 2
3475 @request.session[:user_id] = 2
3476 post :bulk_update, :ids => [1, 2], :issue => {:tracker_id => '2'}
3476 post :bulk_update, :ids => [1, 2], :issue => {:tracker_id => '2'}
3477 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook'
3477 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook'
3478 assert_equal 2, Issue.find(1).tracker_id
3478 assert_equal 2, Issue.find(1).tracker_id
3479 assert_equal 2, Issue.find(2).tracker_id
3479 assert_equal 2, Issue.find(2).tracker_id
3480 end
3480 end
3481
3481
3482 def test_bulk_update_status
3482 def test_bulk_update_status
3483 @request.session[:user_id] = 2
3483 @request.session[:user_id] = 2
3484 # update issues priority
3484 # update issues priority
3485 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing status',
3485 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing status',
3486 :issue => {:priority_id => '',
3486 :issue => {:priority_id => '',
3487 :assigned_to_id => '',
3487 :assigned_to_id => '',
3488 :status_id => '5'}
3488 :status_id => '5'}
3489
3489
3490 assert_response 302
3490 assert_response 302
3491 issue = Issue.find(1)
3491 issue = Issue.find(1)
3492 assert issue.closed?
3492 assert issue.closed?
3493 end
3493 end
3494
3494
3495 def test_bulk_update_priority
3495 def test_bulk_update_priority
3496 @request.session[:user_id] = 2
3496 @request.session[:user_id] = 2
3497 post :bulk_update, :ids => [1, 2], :issue => {:priority_id => 6}
3497 post :bulk_update, :ids => [1, 2], :issue => {:priority_id => 6}
3498
3498
3499 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook'
3499 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook'
3500 assert_equal 6, Issue.find(1).priority_id
3500 assert_equal 6, Issue.find(1).priority_id
3501 assert_equal 6, Issue.find(2).priority_id
3501 assert_equal 6, Issue.find(2).priority_id
3502 end
3502 end
3503
3503
3504 def test_bulk_update_with_notes
3504 def test_bulk_update_with_notes
3505 @request.session[:user_id] = 2
3505 @request.session[:user_id] = 2
3506 post :bulk_update, :ids => [1, 2], :notes => 'Moving two issues'
3506 post :bulk_update, :ids => [1, 2], :notes => 'Moving two issues'
3507
3507
3508 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook'
3508 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook'
3509 assert_equal 'Moving two issues', Issue.find(1).journals.sort_by(&:id).last.notes
3509 assert_equal 'Moving two issues', Issue.find(1).journals.sort_by(&:id).last.notes
3510 assert_equal 'Moving two issues', Issue.find(2).journals.sort_by(&:id).last.notes
3510 assert_equal 'Moving two issues', Issue.find(2).journals.sort_by(&:id).last.notes
3511 end
3511 end
3512
3512
3513 def test_bulk_update_parent_id
3513 def test_bulk_update_parent_id
3514 IssueRelation.delete_all
3514 IssueRelation.delete_all
3515 @request.session[:user_id] = 2
3515 @request.session[:user_id] = 2
3516 post :bulk_update, :ids => [1, 3],
3516 post :bulk_update, :ids => [1, 3],
3517 :notes => 'Bulk editing parent',
3517 :notes => 'Bulk editing parent',
3518 :issue => {:priority_id => '', :assigned_to_id => '',
3518 :issue => {:priority_id => '', :assigned_to_id => '',
3519 :status_id => '', :parent_issue_id => '2'}
3519 :status_id => '', :parent_issue_id => '2'}
3520 assert_response 302
3520 assert_response 302
3521 parent = Issue.find(2)
3521 parent = Issue.find(2)
3522 assert_equal parent.id, Issue.find(1).parent_id
3522 assert_equal parent.id, Issue.find(1).parent_id
3523 assert_equal parent.id, Issue.find(3).parent_id
3523 assert_equal parent.id, Issue.find(3).parent_id
3524 assert_equal [1, 3], parent.children.collect(&:id).sort
3524 assert_equal [1, 3], parent.children.collect(&:id).sort
3525 end
3525 end
3526
3526
3527 def test_bulk_update_custom_field
3527 def test_bulk_update_custom_field
3528 @request.session[:user_id] = 2
3528 @request.session[:user_id] = 2
3529 # update issues priority
3529 # update issues priority
3530 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing custom field',
3530 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing custom field',
3531 :issue => {:priority_id => '',
3531 :issue => {:priority_id => '',
3532 :assigned_to_id => '',
3532 :assigned_to_id => '',
3533 :custom_field_values => {'2' => '777'}}
3533 :custom_field_values => {'2' => '777'}}
3534
3534
3535 assert_response 302
3535 assert_response 302
3536
3536
3537 issue = Issue.find(1)
3537 issue = Issue.find(1)
3538 journal = issue.journals.reorder('created_on DESC').first
3538 journal = issue.journals.reorder('created_on DESC').first
3539 assert_equal '777', issue.custom_value_for(2).value
3539 assert_equal '777', issue.custom_value_for(2).value
3540 assert_equal 1, journal.details.size
3540 assert_equal 1, journal.details.size
3541 assert_equal '125', journal.details.first.old_value
3541 assert_equal '125', journal.details.first.old_value
3542 assert_equal '777', journal.details.first.value
3542 assert_equal '777', journal.details.first.value
3543 end
3543 end
3544
3544
3545 def test_bulk_update_custom_field_to_blank
3545 def test_bulk_update_custom_field_to_blank
3546 @request.session[:user_id] = 2
3546 @request.session[:user_id] = 2
3547 post :bulk_update, :ids => [1, 3], :notes => 'Bulk editing custom field',
3547 post :bulk_update, :ids => [1, 3], :notes => 'Bulk editing custom field',
3548 :issue => {:priority_id => '',
3548 :issue => {:priority_id => '',
3549 :assigned_to_id => '',
3549 :assigned_to_id => '',
3550 :custom_field_values => {'1' => '__none__'}}
3550 :custom_field_values => {'1' => '__none__'}}
3551 assert_response 302
3551 assert_response 302
3552 assert_equal '', Issue.find(1).custom_field_value(1)
3552 assert_equal '', Issue.find(1).custom_field_value(1)
3553 assert_equal '', Issue.find(3).custom_field_value(1)
3553 assert_equal '', Issue.find(3).custom_field_value(1)
3554 end
3554 end
3555
3555
3556 def test_bulk_update_multi_custom_field
3556 def test_bulk_update_multi_custom_field
3557 field = CustomField.find(1)
3557 field = CustomField.find(1)
3558 field.update_attribute :multiple, true
3558 field.update_attribute :multiple, true
3559
3559
3560 @request.session[:user_id] = 2
3560 @request.session[:user_id] = 2
3561 post :bulk_update, :ids => [1, 2, 3], :notes => 'Bulk editing multi custom field',
3561 post :bulk_update, :ids => [1, 2, 3], :notes => 'Bulk editing multi custom field',
3562 :issue => {:priority_id => '',
3562 :issue => {:priority_id => '',
3563 :assigned_to_id => '',
3563 :assigned_to_id => '',
3564 :custom_field_values => {'1' => ['MySQL', 'Oracle']}}
3564 :custom_field_values => {'1' => ['MySQL', 'Oracle']}}
3565
3565
3566 assert_response 302
3566 assert_response 302
3567
3567
3568 assert_equal ['MySQL', 'Oracle'], Issue.find(1).custom_field_value(1).sort
3568 assert_equal ['MySQL', 'Oracle'], Issue.find(1).custom_field_value(1).sort
3569 assert_equal ['MySQL', 'Oracle'], Issue.find(3).custom_field_value(1).sort
3569 assert_equal ['MySQL', 'Oracle'], Issue.find(3).custom_field_value(1).sort
3570 # the custom field is not associated with the issue tracker
3570 # the custom field is not associated with the issue tracker
3571 assert_nil Issue.find(2).custom_field_value(1)
3571 assert_nil Issue.find(2).custom_field_value(1)
3572 end
3572 end
3573
3573
3574 def test_bulk_update_multi_custom_field_to_blank
3574 def test_bulk_update_multi_custom_field_to_blank
3575 field = CustomField.find(1)
3575 field = CustomField.find(1)
3576 field.update_attribute :multiple, true
3576 field.update_attribute :multiple, true
3577
3577
3578 @request.session[:user_id] = 2
3578 @request.session[:user_id] = 2
3579 post :bulk_update, :ids => [1, 3], :notes => 'Bulk editing multi custom field',
3579 post :bulk_update, :ids => [1, 3], :notes => 'Bulk editing multi custom field',
3580 :issue => {:priority_id => '',
3580 :issue => {:priority_id => '',
3581 :assigned_to_id => '',
3581 :assigned_to_id => '',
3582 :custom_field_values => {'1' => ['__none__']}}
3582 :custom_field_values => {'1' => ['__none__']}}
3583 assert_response 302
3583 assert_response 302
3584 assert_equal [''], Issue.find(1).custom_field_value(1)
3584 assert_equal [''], Issue.find(1).custom_field_value(1)
3585 assert_equal [''], Issue.find(3).custom_field_value(1)
3585 assert_equal [''], Issue.find(3).custom_field_value(1)
3586 end
3586 end
3587
3587
3588 def test_bulk_update_unassign
3588 def test_bulk_update_unassign
3589 assert_not_nil Issue.find(2).assigned_to
3589 assert_not_nil Issue.find(2).assigned_to
3590 @request.session[:user_id] = 2
3590 @request.session[:user_id] = 2
3591 # unassign issues
3591 # unassign issues
3592 post :bulk_update, :ids => [1, 2], :notes => 'Bulk unassigning', :issue => {:assigned_to_id => 'none'}
3592 post :bulk_update, :ids => [1, 2], :notes => 'Bulk unassigning', :issue => {:assigned_to_id => 'none'}
3593 assert_response 302
3593 assert_response 302
3594 # check that the issues were updated
3594 # check that the issues were updated
3595 assert_nil Issue.find(2).assigned_to
3595 assert_nil Issue.find(2).assigned_to
3596 end
3596 end
3597
3597
3598 def test_post_bulk_update_should_allow_fixed_version_to_be_set_to_a_subproject
3598 def test_post_bulk_update_should_allow_fixed_version_to_be_set_to_a_subproject
3599 @request.session[:user_id] = 2
3599 @request.session[:user_id] = 2
3600
3600
3601 post :bulk_update, :ids => [1,2], :issue => {:fixed_version_id => 4}
3601 post :bulk_update, :ids => [1,2], :issue => {:fixed_version_id => 4}
3602
3602
3603 assert_response :redirect
3603 assert_response :redirect
3604 issues = Issue.find([1,2])
3604 issues = Issue.find([1,2])
3605 issues.each do |issue|
3605 issues.each do |issue|
3606 assert_equal 4, issue.fixed_version_id
3606 assert_equal 4, issue.fixed_version_id
3607 assert_not_equal issue.project_id, issue.fixed_version.project_id
3607 assert_not_equal issue.project_id, issue.fixed_version.project_id
3608 end
3608 end
3609 end
3609 end
3610
3610
3611 def test_post_bulk_update_should_redirect_back_using_the_back_url_parameter
3611 def test_post_bulk_update_should_redirect_back_using_the_back_url_parameter
3612 @request.session[:user_id] = 2
3612 @request.session[:user_id] = 2
3613 post :bulk_update, :ids => [1,2], :back_url => '/issues'
3613 post :bulk_update, :ids => [1,2], :back_url => '/issues'
3614
3614
3615 assert_response :redirect
3615 assert_response :redirect
3616 assert_redirected_to '/issues'
3616 assert_redirected_to '/issues'
3617 end
3617 end
3618
3618
3619 def test_post_bulk_update_should_not_redirect_back_using_the_back_url_parameter_off_the_host
3619 def test_post_bulk_update_should_not_redirect_back_using_the_back_url_parameter_off_the_host
3620 @request.session[:user_id] = 2
3620 @request.session[:user_id] = 2
3621 post :bulk_update, :ids => [1,2], :back_url => 'http://google.com'
3621 post :bulk_update, :ids => [1,2], :back_url => 'http://google.com'
3622
3622
3623 assert_response :redirect
3623 assert_response :redirect
3624 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => Project.find(1).identifier
3624 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => Project.find(1).identifier
3625 end
3625 end
3626
3626
3627 def test_bulk_update_with_all_failures_should_show_errors
3627 def test_bulk_update_with_all_failures_should_show_errors
3628 @request.session[:user_id] = 2
3628 @request.session[:user_id] = 2
3629 post :bulk_update, :ids => [1, 2], :issue => {:start_date => 'foo'}
3629 post :bulk_update, :ids => [1, 2], :issue => {:start_date => 'foo'}
3630
3630
3631 assert_response :success
3631 assert_response :success
3632 assert_template 'bulk_edit'
3632 assert_template 'bulk_edit'
3633 assert_select '#errorExplanation span', :text => 'Failed to save 2 issue(s) on 2 selected: #1, #2.'
3633 assert_select '#errorExplanation span', :text => 'Failed to save 2 issue(s) on 2 selected: #1, #2.'
3634 assert_select '#errorExplanation ul li', :text => 'Start date is not a valid date: #1, #2'
3634 assert_select '#errorExplanation ul li', :text => 'Start date is not a valid date: #1, #2'
3635
3635
3636 assert_equal [1, 2], assigns[:issues].map(&:id)
3636 assert_equal [1, 2], assigns[:issues].map(&:id)
3637 end
3637 end
3638
3638
3639 def test_bulk_update_with_some_failures_should_show_errors
3639 def test_bulk_update_with_some_failures_should_show_errors
3640 issue1 = Issue.generate!(:start_date => '2013-05-12')
3640 issue1 = Issue.generate!(:start_date => '2013-05-12')
3641 issue2 = Issue.generate!(:start_date => '2013-05-15')
3641 issue2 = Issue.generate!(:start_date => '2013-05-15')
3642 issue3 = Issue.generate!
3642 issue3 = Issue.generate!
3643 @request.session[:user_id] = 2
3643 @request.session[:user_id] = 2
3644 post :bulk_update, :ids => [issue1.id, issue2.id, issue3.id],
3644 post :bulk_update, :ids => [issue1.id, issue2.id, issue3.id],
3645 :issue => {:due_date => '2013-05-01'}
3645 :issue => {:due_date => '2013-05-01'}
3646 assert_response :success
3646 assert_response :success
3647 assert_template 'bulk_edit'
3647 assert_template 'bulk_edit'
3648 assert_select '#errorExplanation span',
3648 assert_select '#errorExplanation span',
3649 :text => "Failed to save 2 issue(s) on 3 selected: ##{issue1.id}, ##{issue2.id}."
3649 :text => "Failed to save 2 issue(s) on 3 selected: ##{issue1.id}, ##{issue2.id}."
3650 assert_select '#errorExplanation ul li',
3650 assert_select '#errorExplanation ul li',
3651 :text => "Due date must be greater than start date: ##{issue1.id}, ##{issue2.id}"
3651 :text => "Due date must be greater than start date: ##{issue1.id}, ##{issue2.id}"
3652 assert_equal [issue1.id, issue2.id], assigns[:issues].map(&:id)
3652 assert_equal [issue1.id, issue2.id], assigns[:issues].map(&:id)
3653 end
3653 end
3654
3654
3655 def test_bulk_update_with_failure_should_preserved_form_values
3655 def test_bulk_update_with_failure_should_preserved_form_values
3656 @request.session[:user_id] = 2
3656 @request.session[:user_id] = 2
3657 post :bulk_update, :ids => [1, 2], :issue => {:tracker_id => '2', :start_date => 'foo'}
3657 post :bulk_update, :ids => [1, 2], :issue => {:tracker_id => '2', :start_date => 'foo'}
3658
3658
3659 assert_response :success
3659 assert_response :success
3660 assert_template 'bulk_edit'
3660 assert_template 'bulk_edit'
3661 assert_select 'select[name=?]', 'issue[tracker_id]' do
3661 assert_select 'select[name=?]', 'issue[tracker_id]' do
3662 assert_select 'option[value=2][selected=selected]'
3662 assert_select 'option[value=2][selected=selected]'
3663 end
3663 end
3664 assert_select 'input[name=?][value=?]', 'issue[start_date]', 'foo'
3664 assert_select 'input[name=?][value=?]', 'issue[start_date]', 'foo'
3665 end
3665 end
3666
3666
3667 def test_get_bulk_copy
3667 def test_get_bulk_copy
3668 @request.session[:user_id] = 2
3668 @request.session[:user_id] = 2
3669 get :bulk_edit, :ids => [1, 2, 3], :copy => '1'
3669 get :bulk_edit, :ids => [1, 2, 3], :copy => '1'
3670 assert_response :success
3670 assert_response :success
3671 assert_template 'bulk_edit'
3671 assert_template 'bulk_edit'
3672
3672
3673 issues = assigns(:issues)
3673 issues = assigns(:issues)
3674 assert_not_nil issues
3674 assert_not_nil issues
3675 assert_equal [1, 2, 3], issues.map(&:id).sort
3675 assert_equal [1, 2, 3], issues.map(&:id).sort
3676
3676
3677 assert_select 'input[name=copy_attachments]'
3677 assert_select 'input[name=copy_attachments]'
3678 end
3678 end
3679
3679
3680 def test_bulk_copy_to_another_project
3680 def test_bulk_copy_to_another_project
3681 @request.session[:user_id] = 2
3681 @request.session[:user_id] = 2
3682 assert_difference 'Issue.count', 2 do
3682 assert_difference 'Issue.count', 2 do
3683 assert_no_difference 'Project.find(1).issues.count' do
3683 assert_no_difference 'Project.find(1).issues.count' do
3684 post :bulk_update, :ids => [1, 2], :issue => {:project_id => '2'}, :copy => '1'
3684 post :bulk_update, :ids => [1, 2], :issue => {:project_id => '2'}, :copy => '1'
3685 end
3685 end
3686 end
3686 end
3687 assert_redirected_to '/projects/ecookbook/issues'
3687 assert_redirected_to '/projects/ecookbook/issues'
3688
3688
3689 copies = Issue.order('id DESC').limit(issues.size)
3689 copies = Issue.order('id DESC').limit(issues.size)
3690 copies.each do |copy|
3690 copies.each do |copy|
3691 assert_equal 2, copy.project_id
3691 assert_equal 2, copy.project_id
3692 end
3692 end
3693 end
3693 end
3694
3694
3695 def test_bulk_copy_should_allow_not_changing_the_issue_attributes
3695 def test_bulk_copy_should_allow_not_changing_the_issue_attributes
3696 @request.session[:user_id] = 2
3696 @request.session[:user_id] = 2
3697 issues = [
3697 issues = [
3698 Issue.create!(:project_id => 1, :tracker_id => 1, :status_id => 1,
3698 Issue.create!(:project_id => 1, :tracker_id => 1, :status_id => 1,
3699 :priority_id => 2, :subject => 'issue 1', :author_id => 1,
3699 :priority_id => 2, :subject => 'issue 1', :author_id => 1,
3700 :assigned_to_id => nil),
3700 :assigned_to_id => nil),
3701 Issue.create!(:project_id => 2, :tracker_id => 3, :status_id => 2,
3701 Issue.create!(:project_id => 2, :tracker_id => 3, :status_id => 2,
3702 :priority_id => 1, :subject => 'issue 2', :author_id => 2,
3702 :priority_id => 1, :subject => 'issue 2', :author_id => 2,
3703 :assigned_to_id => 3)
3703 :assigned_to_id => 3)
3704 ]
3704 ]
3705 assert_difference 'Issue.count', issues.size do
3705 assert_difference 'Issue.count', issues.size do
3706 post :bulk_update, :ids => issues.map(&:id), :copy => '1',
3706 post :bulk_update, :ids => issues.map(&:id), :copy => '1',
3707 :issue => {
3707 :issue => {
3708 :project_id => '', :tracker_id => '', :assigned_to_id => '',
3708 :project_id => '', :tracker_id => '', :assigned_to_id => '',
3709 :status_id => '', :start_date => '', :due_date => ''
3709 :status_id => '', :start_date => '', :due_date => ''
3710 }
3710 }
3711 end
3711 end
3712
3712
3713 copies = Issue.order('id DESC').limit(issues.size)
3713 copies = Issue.order('id DESC').limit(issues.size)
3714 issues.each do |orig|
3714 issues.each do |orig|
3715 copy = copies.detect {|c| c.subject == orig.subject}
3715 copy = copies.detect {|c| c.subject == orig.subject}
3716 assert_not_nil copy
3716 assert_not_nil copy
3717 assert_equal orig.project_id, copy.project_id
3717 assert_equal orig.project_id, copy.project_id
3718 assert_equal orig.tracker_id, copy.tracker_id
3718 assert_equal orig.tracker_id, copy.tracker_id
3719 assert_equal orig.status_id, copy.status_id
3719 assert_equal orig.status_id, copy.status_id
3720 assert_equal orig.assigned_to_id, copy.assigned_to_id
3720 assert_equal orig.assigned_to_id, copy.assigned_to_id
3721 assert_equal orig.priority_id, copy.priority_id
3721 assert_equal orig.priority_id, copy.priority_id
3722 end
3722 end
3723 end
3723 end
3724
3724
3725 def test_bulk_copy_should_allow_changing_the_issue_attributes
3725 def test_bulk_copy_should_allow_changing_the_issue_attributes
3726 # Fixes random test failure with Mysql
3726 # Fixes random test failure with Mysql
3727 # where Issue.where(:project_id => 2).limit(2).order('id desc')
3727 # where Issue.where(:project_id => 2).limit(2).order('id desc')
3728 # doesn't return the expected results
3728 # doesn't return the expected results
3729 Issue.delete_all("project_id=2")
3729 Issue.delete_all("project_id=2")
3730
3730
3731 @request.session[:user_id] = 2
3731 @request.session[:user_id] = 2
3732 assert_difference 'Issue.count', 2 do
3732 assert_difference 'Issue.count', 2 do
3733 assert_no_difference 'Project.find(1).issues.count' do
3733 assert_no_difference 'Project.find(1).issues.count' do
3734 post :bulk_update, :ids => [1, 2], :copy => '1',
3734 post :bulk_update, :ids => [1, 2], :copy => '1',
3735 :issue => {
3735 :issue => {
3736 :project_id => '2', :tracker_id => '', :assigned_to_id => '4',
3736 :project_id => '2', :tracker_id => '', :assigned_to_id => '4',
3737 :status_id => '1', :start_date => '2009-12-01', :due_date => '2009-12-31'
3737 :status_id => '1', :start_date => '2009-12-01', :due_date => '2009-12-31'
3738 }
3738 }
3739 end
3739 end
3740 end
3740 end
3741
3741
3742 copied_issues = Issue.where(:project_id => 2).limit(2).order('id desc').to_a
3742 copied_issues = Issue.where(:project_id => 2).limit(2).order('id desc').to_a
3743 assert_equal 2, copied_issues.size
3743 assert_equal 2, copied_issues.size
3744 copied_issues.each do |issue|
3744 copied_issues.each do |issue|
3745 assert_equal 2, issue.project_id, "Project is incorrect"
3745 assert_equal 2, issue.project_id, "Project is incorrect"
3746 assert_equal 4, issue.assigned_to_id, "Assigned to is incorrect"
3746 assert_equal 4, issue.assigned_to_id, "Assigned to is incorrect"
3747 assert_equal 1, issue.status_id, "Status is incorrect"
3747 assert_equal 1, issue.status_id, "Status is incorrect"
3748 assert_equal '2009-12-01', issue.start_date.to_s, "Start date is incorrect"
3748 assert_equal '2009-12-01', issue.start_date.to_s, "Start date is incorrect"
3749 assert_equal '2009-12-31', issue.due_date.to_s, "Due date is incorrect"
3749 assert_equal '2009-12-31', issue.due_date.to_s, "Due date is incorrect"
3750 end
3750 end
3751 end
3751 end
3752
3752
3753 def test_bulk_copy_should_allow_adding_a_note
3753 def test_bulk_copy_should_allow_adding_a_note
3754 @request.session[:user_id] = 2
3754 @request.session[:user_id] = 2
3755 assert_difference 'Issue.count', 1 do
3755 assert_difference 'Issue.count', 1 do
3756 post :bulk_update, :ids => [1], :copy => '1',
3756 post :bulk_update, :ids => [1], :copy => '1',
3757 :notes => 'Copying one issue',
3757 :notes => 'Copying one issue',
3758 :issue => {
3758 :issue => {
3759 :project_id => '', :tracker_id => '', :assigned_to_id => '4',
3759 :project_id => '', :tracker_id => '', :assigned_to_id => '4',
3760 :status_id => '3', :start_date => '2009-12-01', :due_date => '2009-12-31'
3760 :status_id => '3', :start_date => '2009-12-01', :due_date => '2009-12-31'
3761 }
3761 }
3762 end
3762 end
3763 issue = Issue.order('id DESC').first
3763 issue = Issue.order('id DESC').first
3764 assert_equal 1, issue.journals.size
3764 assert_equal 1, issue.journals.size
3765 journal = issue.journals.first
3765 journal = issue.journals.first
3766 assert_equal 1, journal.details.size
3766 assert_equal 1, journal.details.size
3767 assert_equal 'Copying one issue', journal.notes
3767 assert_equal 'Copying one issue', journal.notes
3768 end
3768 end
3769
3769
3770 def test_bulk_copy_should_allow_not_copying_the_attachments
3770 def test_bulk_copy_should_allow_not_copying_the_attachments
3771 attachment_count = Issue.find(3).attachments.size
3771 attachment_count = Issue.find(3).attachments.size
3772 assert attachment_count > 0
3772 assert attachment_count > 0
3773 @request.session[:user_id] = 2
3773 @request.session[:user_id] = 2
3774
3774
3775 assert_difference 'Issue.count', 1 do
3775 assert_difference 'Issue.count', 1 do
3776 assert_no_difference 'Attachment.count' do
3776 assert_no_difference 'Attachment.count' do
3777 post :bulk_update, :ids => [3], :copy => '1',
3777 post :bulk_update, :ids => [3], :copy => '1',
3778 :issue => {
3778 :issue => {
3779 :project_id => ''
3779 :project_id => ''
3780 }
3780 }
3781 end
3781 end
3782 end
3782 end
3783 end
3783 end
3784
3784
3785 def test_bulk_copy_should_allow_copying_the_attachments
3785 def test_bulk_copy_should_allow_copying_the_attachments
3786 attachment_count = Issue.find(3).attachments.size
3786 attachment_count = Issue.find(3).attachments.size
3787 assert attachment_count > 0
3787 assert attachment_count > 0
3788 @request.session[:user_id] = 2
3788 @request.session[:user_id] = 2
3789
3789
3790 assert_difference 'Issue.count', 1 do
3790 assert_difference 'Issue.count', 1 do
3791 assert_difference 'Attachment.count', attachment_count do
3791 assert_difference 'Attachment.count', attachment_count do
3792 post :bulk_update, :ids => [3], :copy => '1', :copy_attachments => '1',
3792 post :bulk_update, :ids => [3], :copy => '1', :copy_attachments => '1',
3793 :issue => {
3793 :issue => {
3794 :project_id => ''
3794 :project_id => ''
3795 }
3795 }
3796 end
3796 end
3797 end
3797 end
3798 end
3798 end
3799
3799
3800 def test_bulk_copy_should_add_relations_with_copied_issues
3800 def test_bulk_copy_should_add_relations_with_copied_issues
3801 @request.session[:user_id] = 2
3801 @request.session[:user_id] = 2
3802
3802
3803 assert_difference 'Issue.count', 2 do
3803 assert_difference 'Issue.count', 2 do
3804 assert_difference 'IssueRelation.count', 2 do
3804 assert_difference 'IssueRelation.count', 2 do
3805 post :bulk_update, :ids => [1, 3], :copy => '1',
3805 post :bulk_update, :ids => [1, 3], :copy => '1',
3806 :issue => {
3806 :issue => {
3807 :project_id => '1'
3807 :project_id => '1'
3808 }
3808 }
3809 end
3809 end
3810 end
3810 end
3811 end
3811 end
3812
3812
3813 def test_bulk_copy_should_allow_not_copying_the_subtasks
3813 def test_bulk_copy_should_allow_not_copying_the_subtasks
3814 issue = Issue.generate_with_descendants!
3814 issue = Issue.generate_with_descendants!
3815 @request.session[:user_id] = 2
3815 @request.session[:user_id] = 2
3816
3816
3817 assert_difference 'Issue.count', 1 do
3817 assert_difference 'Issue.count', 1 do
3818 post :bulk_update, :ids => [issue.id], :copy => '1',
3818 post :bulk_update, :ids => [issue.id], :copy => '1',
3819 :issue => {
3819 :issue => {
3820 :project_id => ''
3820 :project_id => ''
3821 }
3821 }
3822 end
3822 end
3823 end
3823 end
3824
3824
3825 def test_bulk_copy_should_allow_copying_the_subtasks
3825 def test_bulk_copy_should_allow_copying_the_subtasks
3826 issue = Issue.generate_with_descendants!
3826 issue = Issue.generate_with_descendants!
3827 count = issue.descendants.count
3827 count = issue.descendants.count
3828 @request.session[:user_id] = 2
3828 @request.session[:user_id] = 2
3829
3829
3830 assert_difference 'Issue.count', count+1 do
3830 assert_difference 'Issue.count', count+1 do
3831 post :bulk_update, :ids => [issue.id], :copy => '1', :copy_subtasks => '1',
3831 post :bulk_update, :ids => [issue.id], :copy => '1', :copy_subtasks => '1',
3832 :issue => {
3832 :issue => {
3833 :project_id => ''
3833 :project_id => ''
3834 }
3834 }
3835 end
3835 end
3836 copy = Issue.where(:parent_id => nil).order("id DESC").first
3836 copy = Issue.where(:parent_id => nil).order("id DESC").first
3837 assert_equal count, copy.descendants.count
3837 assert_equal count, copy.descendants.count
3838 end
3838 end
3839
3839
3840 def test_bulk_copy_should_not_copy_selected_subtasks_twice
3840 def test_bulk_copy_should_not_copy_selected_subtasks_twice
3841 issue = Issue.generate_with_descendants!
3841 issue = Issue.generate_with_descendants!
3842 count = issue.descendants.count
3842 count = issue.descendants.count
3843 @request.session[:user_id] = 2
3843 @request.session[:user_id] = 2
3844
3844
3845 assert_difference 'Issue.count', count+1 do
3845 assert_difference 'Issue.count', count+1 do
3846 post :bulk_update, :ids => issue.self_and_descendants.map(&:id), :copy => '1', :copy_subtasks => '1',
3846 post :bulk_update, :ids => issue.self_and_descendants.map(&:id), :copy => '1', :copy_subtasks => '1',
3847 :issue => {
3847 :issue => {
3848 :project_id => ''
3848 :project_id => ''
3849 }
3849 }
3850 end
3850 end
3851 copy = Issue.where(:parent_id => nil).order("id DESC").first
3851 copy = Issue.where(:parent_id => nil).order("id DESC").first
3852 assert_equal count, copy.descendants.count
3852 assert_equal count, copy.descendants.count
3853 end
3853 end
3854
3854
3855 def test_bulk_copy_to_another_project_should_follow_when_needed
3855 def test_bulk_copy_to_another_project_should_follow_when_needed
3856 @request.session[:user_id] = 2
3856 @request.session[:user_id] = 2
3857 post :bulk_update, :ids => [1], :copy => '1', :issue => {:project_id => 2}, :follow => '1'
3857 post :bulk_update, :ids => [1], :copy => '1', :issue => {:project_id => 2}, :follow => '1'
3858 issue = Issue.order('id DESC').first
3858 issue = Issue.order('id DESC').first
3859 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue
3859 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue
3860 end
3860 end
3861
3861
3862 def test_bulk_copy_with_all_failures_should_display_errors
3862 def test_bulk_copy_with_all_failures_should_display_errors
3863 @request.session[:user_id] = 2
3863 @request.session[:user_id] = 2
3864 post :bulk_update, :ids => [1, 2], :copy => '1', :issue => {:start_date => 'foo'}
3864 post :bulk_update, :ids => [1, 2], :copy => '1', :issue => {:start_date => 'foo'}
3865
3865
3866 assert_response :success
3866 assert_response :success
3867 end
3867 end
3868
3868
3869 def test_destroy_issue_with_no_time_entries
3869 def test_destroy_issue_with_no_time_entries
3870 assert_nil TimeEntry.find_by_issue_id(2)
3870 assert_nil TimeEntry.find_by_issue_id(2)
3871 @request.session[:user_id] = 2
3871 @request.session[:user_id] = 2
3872
3872
3873 assert_difference 'Issue.count', -1 do
3873 assert_difference 'Issue.count', -1 do
3874 delete :destroy, :id => 2
3874 delete :destroy, :id => 2
3875 end
3875 end
3876 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
3876 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
3877 assert_nil Issue.find_by_id(2)
3877 assert_nil Issue.find_by_id(2)
3878 end
3878 end
3879
3879
3880 def test_destroy_issues_with_time_entries
3880 def test_destroy_issues_with_time_entries
3881 @request.session[:user_id] = 2
3881 @request.session[:user_id] = 2
3882
3882
3883 assert_no_difference 'Issue.count' do
3883 assert_no_difference 'Issue.count' do
3884 delete :destroy, :ids => [1, 3]
3884 delete :destroy, :ids => [1, 3]
3885 end
3885 end
3886 assert_response :success
3886 assert_response :success
3887 assert_template 'destroy'
3887 assert_template 'destroy'
3888 assert_not_nil assigns(:hours)
3888 assert_not_nil assigns(:hours)
3889 assert Issue.find_by_id(1) && Issue.find_by_id(3)
3889 assert Issue.find_by_id(1) && Issue.find_by_id(3)
3890
3890
3891 assert_select 'form' do
3891 assert_select 'form' do
3892 assert_select 'input[name=_method][value=delete]'
3892 assert_select 'input[name=_method][value=delete]'
3893 end
3893 end
3894 end
3894 end
3895
3895
3896 def test_destroy_issues_and_destroy_time_entries
3896 def test_destroy_issues_and_destroy_time_entries
3897 @request.session[:user_id] = 2
3897 @request.session[:user_id] = 2
3898
3898
3899 assert_difference 'Issue.count', -2 do
3899 assert_difference 'Issue.count', -2 do
3900 assert_difference 'TimeEntry.count', -3 do
3900 assert_difference 'TimeEntry.count', -3 do
3901 delete :destroy, :ids => [1, 3], :todo => 'destroy'
3901 delete :destroy, :ids => [1, 3], :todo => 'destroy'
3902 end
3902 end
3903 end
3903 end
3904 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
3904 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
3905 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
3905 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
3906 assert_nil TimeEntry.find_by_id([1, 2])
3906 assert_nil TimeEntry.find_by_id([1, 2])
3907 end
3907 end
3908
3908
3909 def test_destroy_issues_and_assign_time_entries_to_project
3909 def test_destroy_issues_and_assign_time_entries_to_project
3910 @request.session[:user_id] = 2
3910 @request.session[:user_id] = 2
3911
3911
3912 assert_difference 'Issue.count', -2 do
3912 assert_difference 'Issue.count', -2 do
3913 assert_no_difference 'TimeEntry.count' do
3913 assert_no_difference 'TimeEntry.count' do
3914 delete :destroy, :ids => [1, 3], :todo => 'nullify'
3914 delete :destroy, :ids => [1, 3], :todo => 'nullify'
3915 end
3915 end
3916 end
3916 end
3917 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
3917 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
3918 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
3918 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
3919 assert_nil TimeEntry.find(1).issue_id
3919 assert_nil TimeEntry.find(1).issue_id
3920 assert_nil TimeEntry.find(2).issue_id
3920 assert_nil TimeEntry.find(2).issue_id
3921 end
3921 end
3922
3922
3923 def test_destroy_issues_and_reassign_time_entries_to_another_issue
3923 def test_destroy_issues_and_reassign_time_entries_to_another_issue
3924 @request.session[:user_id] = 2
3924 @request.session[:user_id] = 2
3925
3925
3926 assert_difference 'Issue.count', -2 do
3926 assert_difference 'Issue.count', -2 do
3927 assert_no_difference 'TimeEntry.count' do
3927 assert_no_difference 'TimeEntry.count' do
3928 delete :destroy, :ids => [1, 3], :todo => 'reassign', :reassign_to_id => 2
3928 delete :destroy, :ids => [1, 3], :todo => 'reassign', :reassign_to_id => 2
3929 end
3929 end
3930 end
3930 end
3931 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
3931 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
3932 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
3932 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
3933 assert_equal 2, TimeEntry.find(1).issue_id
3933 assert_equal 2, TimeEntry.find(1).issue_id
3934 assert_equal 2, TimeEntry.find(2).issue_id
3934 assert_equal 2, TimeEntry.find(2).issue_id
3935 end
3935 end
3936
3936
3937 def test_destroy_issues_from_different_projects
3937 def test_destroy_issues_from_different_projects
3938 @request.session[:user_id] = 2
3938 @request.session[:user_id] = 2
3939
3939
3940 assert_difference 'Issue.count', -3 do
3940 assert_difference 'Issue.count', -3 do
3941 delete :destroy, :ids => [1, 2, 6], :todo => 'destroy'
3941 delete :destroy, :ids => [1, 2, 6], :todo => 'destroy'
3942 end
3942 end
3943 assert_redirected_to :controller => 'issues', :action => 'index'
3943 assert_redirected_to :controller => 'issues', :action => 'index'
3944 assert !(Issue.find_by_id(1) || Issue.find_by_id(2) || Issue.find_by_id(6))
3944 assert !(Issue.find_by_id(1) || Issue.find_by_id(2) || Issue.find_by_id(6))
3945 end
3945 end
3946
3946
3947 def test_destroy_parent_and_child_issues
3947 def test_destroy_parent_and_child_issues
3948 parent = Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :subject => 'Parent Issue')
3948 parent = Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :subject => 'Parent Issue')
3949 child = Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :subject => 'Child Issue', :parent_issue_id => parent.id)
3949 child = Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :subject => 'Child Issue', :parent_issue_id => parent.id)
3950 assert child.is_descendant_of?(parent.reload)
3950 assert child.is_descendant_of?(parent.reload)
3951
3951
3952 @request.session[:user_id] = 2
3952 @request.session[:user_id] = 2
3953 assert_difference 'Issue.count', -2 do
3953 assert_difference 'Issue.count', -2 do
3954 delete :destroy, :ids => [parent.id, child.id], :todo => 'destroy'
3954 delete :destroy, :ids => [parent.id, child.id], :todo => 'destroy'
3955 end
3955 end
3956 assert_response 302
3956 assert_response 302
3957 end
3957 end
3958
3958
3959 def test_destroy_invalid_should_respond_with_404
3959 def test_destroy_invalid_should_respond_with_404
3960 @request.session[:user_id] = 2
3960 @request.session[:user_id] = 2
3961 assert_no_difference 'Issue.count' do
3961 assert_no_difference 'Issue.count' do
3962 delete :destroy, :id => 999
3962 delete :destroy, :id => 999
3963 end
3963 end
3964 assert_response 404
3964 assert_response 404
3965 end
3965 end
3966
3966
3967 def test_default_search_scope
3967 def test_default_search_scope
3968 get :index
3968 get :index
3969
3969
3970 assert_select 'div#quick-search form' do
3970 assert_select 'div#quick-search form' do
3971 assert_select 'input[name=issues][value=1][type=hidden]'
3971 assert_select 'input[name=issues][value=1][type=hidden]'
3972 end
3972 end
3973 end
3973 end
3974 end
3974 end
General Comments 0
You need to be logged in to leave comments. Login now