##// END OF EJS Templates
fix find_all_by_id(n1, n2) parameter at test_show_export_to_pdf_with_changesets of IssuesControllerTest...
Toshi MARUYAMA -
r12192:8ec6004a7f1b
parent child
Show More
@@ -1,3969 +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.update_all(["is_private = ?", true], "id = 1")
1029 Issue.update_all(["is_private = ?", true], "id = 1")
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.update_all(["is_private = ?", true], "id = 1")
1042 Issue.update_all(["is_private = ?", true], "id = 1")
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.update_all(["is_private = ?", true], "id = 1")
1056 Issue.update_all(["is_private = ?", true], "id = 1")
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.update_all(["is_private = ?, author_id = 3", true], "id = 1")
1063 Issue.update_all(["is_private = ?, author_id = 3", true], "id = 1")
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.update_all(["is_private = ?, assigned_to_id = 3", true], "id = 1")
1070 Issue.update_all(["is_private = ?, assigned_to_id = 3", true], "id = 1")
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.update_all(["is_private = ?", true], "id = 1")
1077 Issue.update_all(["is_private = ?", true], "id = 1")
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 Issue.find(3).changesets = Changeset.find_all_by_id(100, 101, 102)
1428 [[100], [100, 101], [100, 101, 102]].each do |cs|
1429
1429 issue1 = Issue.find(3)
1430 get :show, :id => 3, :format => 'pdf'
1430 issue1.changesets = Changeset.find(cs)
1431 assert_response :success
1431 issue1.save!
1432 assert_equal 'application/pdf', @response.content_type
1432 issue = Issue.find(3)
1433 assert @response.body.starts_with?('%PDF')
1433 assert_equal issue.changesets.count, cs.size
1434 get :show, :id => 3, :format => 'pdf'
1435 assert_response :success
1436 assert_equal 'application/pdf', @response.content_type
1437 assert @response.body.starts_with?('%PDF')
1438 end
1434 end
1439 end
1435
1440
1436 def test_show_invalid_should_respond_with_404
1441 def test_show_invalid_should_respond_with_404
1437 get :show, :id => 999
1442 get :show, :id => 999
1438 assert_response 404
1443 assert_response 404
1439 end
1444 end
1440
1445
1441 def test_get_new
1446 def test_get_new
1442 @request.session[:user_id] = 2
1447 @request.session[:user_id] = 2
1443 get :new, :project_id => 1, :tracker_id => 1
1448 get :new, :project_id => 1, :tracker_id => 1
1444 assert_response :success
1449 assert_response :success
1445 assert_template 'new'
1450 assert_template 'new'
1446
1451
1447 assert_select 'form#issue-form' do
1452 assert_select 'form#issue-form' do
1448 assert_select 'input[name=?]', 'issue[is_private]'
1453 assert_select 'input[name=?]', 'issue[is_private]'
1449 assert_select 'select[name=?]', 'issue[project_id]', 0
1454 assert_select 'select[name=?]', 'issue[project_id]', 0
1450 assert_select 'select[name=?]', 'issue[tracker_id]'
1455 assert_select 'select[name=?]', 'issue[tracker_id]'
1451 assert_select 'input[name=?]', 'issue[subject]'
1456 assert_select 'input[name=?]', 'issue[subject]'
1452 assert_select 'textarea[name=?]', 'issue[description]'
1457 assert_select 'textarea[name=?]', 'issue[description]'
1453 assert_select 'select[name=?]', 'issue[status_id]'
1458 assert_select 'select[name=?]', 'issue[status_id]'
1454 assert_select 'select[name=?]', 'issue[priority_id]'
1459 assert_select 'select[name=?]', 'issue[priority_id]'
1455 assert_select 'select[name=?]', 'issue[assigned_to_id]'
1460 assert_select 'select[name=?]', 'issue[assigned_to_id]'
1456 assert_select 'select[name=?]', 'issue[category_id]'
1461 assert_select 'select[name=?]', 'issue[category_id]'
1457 assert_select 'select[name=?]', 'issue[fixed_version_id]'
1462 assert_select 'select[name=?]', 'issue[fixed_version_id]'
1458 assert_select 'input[name=?]', 'issue[parent_issue_id]'
1463 assert_select 'input[name=?]', 'issue[parent_issue_id]'
1459 assert_select 'input[name=?]', 'issue[start_date]'
1464 assert_select 'input[name=?]', 'issue[start_date]'
1460 assert_select 'input[name=?]', 'issue[due_date]'
1465 assert_select 'input[name=?]', 'issue[due_date]'
1461 assert_select 'select[name=?]', 'issue[done_ratio]'
1466 assert_select 'select[name=?]', 'issue[done_ratio]'
1462 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'
1463 assert_select 'input[name=?]', 'issue[watcher_user_ids][]'
1468 assert_select 'input[name=?]', 'issue[watcher_user_ids][]'
1464 end
1469 end
1465
1470
1466 # Be sure we don't display inactive IssuePriorities
1471 # Be sure we don't display inactive IssuePriorities
1467 assert ! IssuePriority.find(15).active?
1472 assert ! IssuePriority.find(15).active?
1468 assert_select 'select[name=?]', 'issue[priority_id]' do
1473 assert_select 'select[name=?]', 'issue[priority_id]' do
1469 assert_select 'option[value=15]', 0
1474 assert_select 'option[value=15]', 0
1470 end
1475 end
1471 end
1476 end
1472
1477
1473 def test_get_new_with_minimal_permissions
1478 def test_get_new_with_minimal_permissions
1474 Role.find(1).update_attribute :permissions, [:add_issues]
1479 Role.find(1).update_attribute :permissions, [:add_issues]
1475 WorkflowTransition.delete_all :role_id => 1
1480 WorkflowTransition.delete_all :role_id => 1
1476
1481
1477 @request.session[:user_id] = 2
1482 @request.session[:user_id] = 2
1478 get :new, :project_id => 1, :tracker_id => 1
1483 get :new, :project_id => 1, :tracker_id => 1
1479 assert_response :success
1484 assert_response :success
1480 assert_template 'new'
1485 assert_template 'new'
1481
1486
1482 assert_select 'form#issue-form' do
1487 assert_select 'form#issue-form' do
1483 assert_select 'input[name=?]', 'issue[is_private]', 0
1488 assert_select 'input[name=?]', 'issue[is_private]', 0
1484 assert_select 'select[name=?]', 'issue[project_id]', 0
1489 assert_select 'select[name=?]', 'issue[project_id]', 0
1485 assert_select 'select[name=?]', 'issue[tracker_id]'
1490 assert_select 'select[name=?]', 'issue[tracker_id]'
1486 assert_select 'input[name=?]', 'issue[subject]'
1491 assert_select 'input[name=?]', 'issue[subject]'
1487 assert_select 'textarea[name=?]', 'issue[description]'
1492 assert_select 'textarea[name=?]', 'issue[description]'
1488 assert_select 'select[name=?]', 'issue[status_id]'
1493 assert_select 'select[name=?]', 'issue[status_id]'
1489 assert_select 'select[name=?]', 'issue[priority_id]'
1494 assert_select 'select[name=?]', 'issue[priority_id]'
1490 assert_select 'select[name=?]', 'issue[assigned_to_id]'
1495 assert_select 'select[name=?]', 'issue[assigned_to_id]'
1491 assert_select 'select[name=?]', 'issue[category_id]'
1496 assert_select 'select[name=?]', 'issue[category_id]'
1492 assert_select 'select[name=?]', 'issue[fixed_version_id]'
1497 assert_select 'select[name=?]', 'issue[fixed_version_id]'
1493 assert_select 'input[name=?]', 'issue[parent_issue_id]', 0
1498 assert_select 'input[name=?]', 'issue[parent_issue_id]', 0
1494 assert_select 'input[name=?]', 'issue[start_date]'
1499 assert_select 'input[name=?]', 'issue[start_date]'
1495 assert_select 'input[name=?]', 'issue[due_date]'
1500 assert_select 'input[name=?]', 'issue[due_date]'
1496 assert_select 'select[name=?]', 'issue[done_ratio]'
1501 assert_select 'select[name=?]', 'issue[done_ratio]'
1497 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'
1498 assert_select 'input[name=?]', 'issue[watcher_user_ids][]', 0
1503 assert_select 'input[name=?]', 'issue[watcher_user_ids][]', 0
1499 end
1504 end
1500 end
1505 end
1501
1506
1502 def test_get_new_with_list_custom_field
1507 def test_get_new_with_list_custom_field
1503 @request.session[:user_id] = 2
1508 @request.session[:user_id] = 2
1504 get :new, :project_id => 1, :tracker_id => 1
1509 get :new, :project_id => 1, :tracker_id => 1
1505 assert_response :success
1510 assert_response :success
1506 assert_template 'new'
1511 assert_template 'new'
1507
1512
1508 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
1509 assert_select 'option', 4
1514 assert_select 'option', 4
1510 assert_select 'option[value=MySQL]', :text => 'MySQL'
1515 assert_select 'option[value=MySQL]', :text => 'MySQL'
1511 end
1516 end
1512 end
1517 end
1513
1518
1514 def test_get_new_with_multi_custom_field
1519 def test_get_new_with_multi_custom_field
1515 field = IssueCustomField.find(1)
1520 field = IssueCustomField.find(1)
1516 field.update_attribute :multiple, true
1521 field.update_attribute :multiple, true
1517
1522
1518 @request.session[:user_id] = 2
1523 @request.session[:user_id] = 2
1519 get :new, :project_id => 1, :tracker_id => 1
1524 get :new, :project_id => 1, :tracker_id => 1
1520 assert_response :success
1525 assert_response :success
1521 assert_template 'new'
1526 assert_template 'new'
1522
1527
1523 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
1524 assert_select 'option', 3
1529 assert_select 'option', 3
1525 assert_select 'option[value=MySQL]', :text => 'MySQL'
1530 assert_select 'option[value=MySQL]', :text => 'MySQL'
1526 end
1531 end
1527 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][]', ''
1528 end
1533 end
1529
1534
1530 def test_get_new_with_multi_user_custom_field
1535 def test_get_new_with_multi_user_custom_field
1531 field = IssueCustomField.create!(:name => 'Multi user', :field_format => 'user', :multiple => true,
1536 field = IssueCustomField.create!(:name => 'Multi user', :field_format => 'user', :multiple => true,
1532 :tracker_ids => [1], :is_for_all => true)
1537 :tracker_ids => [1], :is_for_all => true)
1533
1538
1534 @request.session[:user_id] = 2
1539 @request.session[:user_id] = 2
1535 get :new, :project_id => 1, :tracker_id => 1
1540 get :new, :project_id => 1, :tracker_id => 1
1536 assert_response :success
1541 assert_response :success
1537 assert_template 'new'
1542 assert_template 'new'
1538
1543
1539 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
1540 assert_select 'option', Project.find(1).users.count
1545 assert_select 'option', Project.find(1).users.count
1541 assert_select 'option[value=2]', :text => 'John Smith'
1546 assert_select 'option[value=2]', :text => 'John Smith'
1542 end
1547 end
1543 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}][]", ''
1544 end
1549 end
1545
1550
1546 def test_get_new_with_date_custom_field
1551 def test_get_new_with_date_custom_field
1547 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)
1548
1553
1549 @request.session[:user_id] = 2
1554 @request.session[:user_id] = 2
1550 get :new, :project_id => 1, :tracker_id => 1
1555 get :new, :project_id => 1, :tracker_id => 1
1551 assert_response :success
1556 assert_response :success
1552
1557
1553 assert_select 'input[name=?]', "issue[custom_field_values][#{field.id}]"
1558 assert_select 'input[name=?]', "issue[custom_field_values][#{field.id}]"
1554 end
1559 end
1555
1560
1556 def test_get_new_with_text_custom_field
1561 def test_get_new_with_text_custom_field
1557 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)
1558
1563
1559 @request.session[:user_id] = 2
1564 @request.session[:user_id] = 2
1560 get :new, :project_id => 1, :tracker_id => 1
1565 get :new, :project_id => 1, :tracker_id => 1
1561 assert_response :success
1566 assert_response :success
1562
1567
1563 assert_select 'textarea[name=?]', "issue[custom_field_values][#{field.id}]"
1568 assert_select 'textarea[name=?]', "issue[custom_field_values][#{field.id}]"
1564 end
1569 end
1565
1570
1566 def test_get_new_without_default_start_date_is_creation_date
1571 def test_get_new_without_default_start_date_is_creation_date
1567 with_settings :default_issue_start_date_to_creation_date => 0 do
1572 with_settings :default_issue_start_date_to_creation_date => 0 do
1568 @request.session[:user_id] = 2
1573 @request.session[:user_id] = 2
1569 get :new, :project_id => 1, :tracker_id => 1
1574 get :new, :project_id => 1, :tracker_id => 1
1570 assert_response :success
1575 assert_response :success
1571 assert_template 'new'
1576 assert_template 'new'
1572 assert_select 'input[name=?]', 'issue[start_date]'
1577 assert_select 'input[name=?]', 'issue[start_date]'
1573 assert_select 'input[name=?][value]', 'issue[start_date]', 0
1578 assert_select 'input[name=?][value]', 'issue[start_date]', 0
1574 end
1579 end
1575 end
1580 end
1576
1581
1577 def test_get_new_with_default_start_date_is_creation_date
1582 def test_get_new_with_default_start_date_is_creation_date
1578 with_settings :default_issue_start_date_to_creation_date => 1 do
1583 with_settings :default_issue_start_date_to_creation_date => 1 do
1579 @request.session[:user_id] = 2
1584 @request.session[:user_id] = 2
1580 get :new, :project_id => 1, :tracker_id => 1
1585 get :new, :project_id => 1, :tracker_id => 1
1581 assert_response :success
1586 assert_response :success
1582 assert_template 'new'
1587 assert_template 'new'
1583 assert_select 'input[name=?][value=?]', 'issue[start_date]',
1588 assert_select 'input[name=?][value=?]', 'issue[start_date]',
1584 Date.today.to_s
1589 Date.today.to_s
1585 end
1590 end
1586 end
1591 end
1587
1592
1588 def test_get_new_form_should_allow_attachment_upload
1593 def test_get_new_form_should_allow_attachment_upload
1589 @request.session[:user_id] = 2
1594 @request.session[:user_id] = 2
1590 get :new, :project_id => 1, :tracker_id => 1
1595 get :new, :project_id => 1, :tracker_id => 1
1591
1596
1592 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
1593 assert_select 'input[name=?][type=file]', 'attachments[dummy][file]'
1598 assert_select 'input[name=?][type=file]', 'attachments[dummy][file]'
1594 end
1599 end
1595 end
1600 end
1596
1601
1597 def test_get_new_should_prefill_the_form_from_params
1602 def test_get_new_should_prefill_the_form_from_params
1598 @request.session[:user_id] = 2
1603 @request.session[:user_id] = 2
1599 get :new, :project_id => 1,
1604 get :new, :project_id => 1,
1600 :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'}}
1601
1606
1602 issue = assigns(:issue)
1607 issue = assigns(:issue)
1603 assert_equal 3, issue.tracker_id
1608 assert_equal 3, issue.tracker_id
1604 assert_equal 'Prefilled', issue.description
1609 assert_equal 'Prefilled', issue.description
1605 assert_equal 'Custom field value', issue.custom_field_value(2)
1610 assert_equal 'Custom field value', issue.custom_field_value(2)
1606
1611
1607 assert_select 'select[name=?]', 'issue[tracker_id]' do
1612 assert_select 'select[name=?]', 'issue[tracker_id]' do
1608 assert_select 'option[value=3][selected=selected]'
1613 assert_select 'option[value=3][selected=selected]'
1609 end
1614 end
1610 assert_select 'textarea[name=?]', 'issue[description]', :text => /Prefilled/
1615 assert_select 'textarea[name=?]', 'issue[description]', :text => /Prefilled/
1611 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'
1612 end
1617 end
1613
1618
1614 def test_get_new_should_mark_required_fields
1619 def test_get_new_should_mark_required_fields
1615 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])
1616 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])
1617 WorkflowPermission.delete_all
1622 WorkflowPermission.delete_all
1618 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')
1619 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')
1620 @request.session[:user_id] = 2
1625 @request.session[:user_id] = 2
1621
1626
1622 get :new, :project_id => 1
1627 get :new, :project_id => 1
1623 assert_response :success
1628 assert_response :success
1624 assert_template 'new'
1629 assert_template 'new'
1625
1630
1626 assert_select 'label[for=issue_start_date]' do
1631 assert_select 'label[for=issue_start_date]' do
1627 assert_select 'span[class=required]', 0
1632 assert_select 'span[class=required]', 0
1628 end
1633 end
1629 assert_select 'label[for=issue_due_date]' do
1634 assert_select 'label[for=issue_due_date]' do
1630 assert_select 'span[class=required]'
1635 assert_select 'span[class=required]'
1631 end
1636 end
1632 assert_select 'label[for=?]', "issue_custom_field_values_#{cf1.id}" do
1637 assert_select 'label[for=?]', "issue_custom_field_values_#{cf1.id}" do
1633 assert_select 'span[class=required]', 0
1638 assert_select 'span[class=required]', 0
1634 end
1639 end
1635 assert_select 'label[for=?]', "issue_custom_field_values_#{cf2.id}" do
1640 assert_select 'label[for=?]', "issue_custom_field_values_#{cf2.id}" do
1636 assert_select 'span[class=required]'
1641 assert_select 'span[class=required]'
1637 end
1642 end
1638 end
1643 end
1639
1644
1640 def test_get_new_should_not_display_readonly_fields
1645 def test_get_new_should_not_display_readonly_fields
1641 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])
1642 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])
1643 WorkflowPermission.delete_all
1648 WorkflowPermission.delete_all
1644 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')
1645 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')
1646 @request.session[:user_id] = 2
1651 @request.session[:user_id] = 2
1647
1652
1648 get :new, :project_id => 1
1653 get :new, :project_id => 1
1649 assert_response :success
1654 assert_response :success
1650 assert_template 'new'
1655 assert_template 'new'
1651
1656
1652 assert_select 'input[name=?]', 'issue[start_date]'
1657 assert_select 'input[name=?]', 'issue[start_date]'
1653 assert_select 'input[name=?]', 'issue[due_date]', 0
1658 assert_select 'input[name=?]', 'issue[due_date]', 0
1654 assert_select 'input[name=?]', "issue[custom_field_values][#{cf1.id}]"
1659 assert_select 'input[name=?]', "issue[custom_field_values][#{cf1.id}]"
1655 assert_select 'input[name=?]', "issue[custom_field_values][#{cf2.id}]", 0
1660 assert_select 'input[name=?]', "issue[custom_field_values][#{cf2.id}]", 0
1656 end
1661 end
1657
1662
1658 def test_get_new_without_tracker_id
1663 def test_get_new_without_tracker_id
1659 @request.session[:user_id] = 2
1664 @request.session[:user_id] = 2
1660 get :new, :project_id => 1
1665 get :new, :project_id => 1
1661 assert_response :success
1666 assert_response :success
1662 assert_template 'new'
1667 assert_template 'new'
1663
1668
1664 issue = assigns(:issue)
1669 issue = assigns(:issue)
1665 assert_not_nil issue
1670 assert_not_nil issue
1666 assert_equal Project.find(1).trackers.first, issue.tracker
1671 assert_equal Project.find(1).trackers.first, issue.tracker
1667 end
1672 end
1668
1673
1669 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
1670 @request.session[:user_id] = 2
1675 @request.session[:user_id] = 2
1671 IssueStatus.delete_all
1676 IssueStatus.delete_all
1672
1677
1673 get :new, :project_id => 1
1678 get :new, :project_id => 1
1674 assert_response 500
1679 assert_response 500
1675 assert_error_tag :content => /No default issue/
1680 assert_error_tag :content => /No default issue/
1676 end
1681 end
1677
1682
1678 def test_get_new_with_no_tracker_should_display_an_error
1683 def test_get_new_with_no_tracker_should_display_an_error
1679 @request.session[:user_id] = 2
1684 @request.session[:user_id] = 2
1680 Tracker.delete_all
1685 Tracker.delete_all
1681
1686
1682 get :new, :project_id => 1
1687 get :new, :project_id => 1
1683 assert_response 500
1688 assert_response 500
1684 assert_error_tag :content => /No tracker/
1689 assert_error_tag :content => /No tracker/
1685 end
1690 end
1686
1691
1687 def test_update_form_for_new_issue
1692 def test_update_form_for_new_issue
1688 @request.session[:user_id] = 2
1693 @request.session[:user_id] = 2
1689 xhr :post, :update_form, :project_id => 1,
1694 xhr :post, :update_form, :project_id => 1,
1690 :issue => {:tracker_id => 2,
1695 :issue => {:tracker_id => 2,
1691 :subject => 'This is the test_new issue',
1696 :subject => 'This is the test_new issue',
1692 :description => 'This is the description',
1697 :description => 'This is the description',
1693 :priority_id => 5}
1698 :priority_id => 5}
1694 assert_response :success
1699 assert_response :success
1695 assert_template 'update_form'
1700 assert_template 'update_form'
1696 assert_template 'form'
1701 assert_template 'form'
1697 assert_equal 'text/javascript', response.content_type
1702 assert_equal 'text/javascript', response.content_type
1698
1703
1699 issue = assigns(:issue)
1704 issue = assigns(:issue)
1700 assert_kind_of Issue, issue
1705 assert_kind_of Issue, issue
1701 assert_equal 1, issue.project_id
1706 assert_equal 1, issue.project_id
1702 assert_equal 2, issue.tracker_id
1707 assert_equal 2, issue.tracker_id
1703 assert_equal 'This is the test_new issue', issue.subject
1708 assert_equal 'This is the test_new issue', issue.subject
1704 end
1709 end
1705
1710
1706 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
1707 @request.session[:user_id] = 2
1712 @request.session[:user_id] = 2
1708 WorkflowTransition.delete_all
1713 WorkflowTransition.delete_all
1709 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)
1710 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)
1711 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)
1712
1717
1713 xhr :post, :update_form, :project_id => 1,
1718 xhr :post, :update_form, :project_id => 1,
1714 :issue => {:tracker_id => 1,
1719 :issue => {:tracker_id => 1,
1715 :status_id => 5,
1720 :status_id => 5,
1716 :subject => 'This is an issue'}
1721 :subject => 'This is an issue'}
1717
1722
1718 assert_equal 5, assigns(:issue).status_id
1723 assert_equal 5, assigns(:issue).status_id
1719 assert_equal [1,2,5], assigns(:allowed_statuses).map(&:id).sort
1724 assert_equal [1,2,5], assigns(:allowed_statuses).map(&:id).sort
1720 end
1725 end
1721
1726
1722 def test_post_create
1727 def test_post_create
1723 @request.session[:user_id] = 2
1728 @request.session[:user_id] = 2
1724 assert_difference 'Issue.count' do
1729 assert_difference 'Issue.count' do
1725 post :create, :project_id => 1,
1730 post :create, :project_id => 1,
1726 :issue => {:tracker_id => 3,
1731 :issue => {:tracker_id => 3,
1727 :status_id => 2,
1732 :status_id => 2,
1728 :subject => 'This is the test_new issue',
1733 :subject => 'This is the test_new issue',
1729 :description => 'This is the description',
1734 :description => 'This is the description',
1730 :priority_id => 5,
1735 :priority_id => 5,
1731 :start_date => '2010-11-07',
1736 :start_date => '2010-11-07',
1732 :estimated_hours => '',
1737 :estimated_hours => '',
1733 :custom_field_values => {'2' => 'Value for field 2'}}
1738 :custom_field_values => {'2' => 'Value for field 2'}}
1734 end
1739 end
1735 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
1740 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
1736
1741
1737 issue = Issue.find_by_subject('This is the test_new issue')
1742 issue = Issue.find_by_subject('This is the test_new issue')
1738 assert_not_nil issue
1743 assert_not_nil issue
1739 assert_equal 2, issue.author_id
1744 assert_equal 2, issue.author_id
1740 assert_equal 3, issue.tracker_id
1745 assert_equal 3, issue.tracker_id
1741 assert_equal 2, issue.status_id
1746 assert_equal 2, issue.status_id
1742 assert_equal Date.parse('2010-11-07'), issue.start_date
1747 assert_equal Date.parse('2010-11-07'), issue.start_date
1743 assert_nil issue.estimated_hours
1748 assert_nil issue.estimated_hours
1744 v = issue.custom_values.where(:custom_field_id => 2).first
1749 v = issue.custom_values.where(:custom_field_id => 2).first
1745 assert_not_nil v
1750 assert_not_nil v
1746 assert_equal 'Value for field 2', v.value
1751 assert_equal 'Value for field 2', v.value
1747 end
1752 end
1748
1753
1749 def test_post_new_with_group_assignment
1754 def test_post_new_with_group_assignment
1750 group = Group.find(11)
1755 group = Group.find(11)
1751 project = Project.find(1)
1756 project = Project.find(1)
1752 project.members << Member.new(:principal => group, :roles => [Role.givable.first])
1757 project.members << Member.new(:principal => group, :roles => [Role.givable.first])
1753
1758
1754 with_settings :issue_group_assignment => '1' do
1759 with_settings :issue_group_assignment => '1' do
1755 @request.session[:user_id] = 2
1760 @request.session[:user_id] = 2
1756 assert_difference 'Issue.count' do
1761 assert_difference 'Issue.count' do
1757 post :create, :project_id => project.id,
1762 post :create, :project_id => project.id,
1758 :issue => {:tracker_id => 3,
1763 :issue => {:tracker_id => 3,
1759 :status_id => 1,
1764 :status_id => 1,
1760 :subject => 'This is the test_new_with_group_assignment issue',
1765 :subject => 'This is the test_new_with_group_assignment issue',
1761 :assigned_to_id => group.id}
1766 :assigned_to_id => group.id}
1762 end
1767 end
1763 end
1768 end
1764 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
1769 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
1765
1770
1766 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')
1767 assert_not_nil issue
1772 assert_not_nil issue
1768 assert_equal group, issue.assigned_to
1773 assert_equal group, issue.assigned_to
1769 end
1774 end
1770
1775
1771 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
1772 with_settings :default_issue_start_date_to_creation_date => 0 do
1777 with_settings :default_issue_start_date_to_creation_date => 0 do
1773 @request.session[:user_id] = 2
1778 @request.session[:user_id] = 2
1774 assert_difference 'Issue.count' do
1779 assert_difference 'Issue.count' do
1775 post :create, :project_id => 1,
1780 post :create, :project_id => 1,
1776 :issue => {:tracker_id => 3,
1781 :issue => {:tracker_id => 3,
1777 :status_id => 2,
1782 :status_id => 2,
1778 :subject => 'This is the test_new issue',
1783 :subject => 'This is the test_new issue',
1779 :description => 'This is the description',
1784 :description => 'This is the description',
1780 :priority_id => 5,
1785 :priority_id => 5,
1781 :estimated_hours => '',
1786 :estimated_hours => '',
1782 :custom_field_values => {'2' => 'Value for field 2'}}
1787 :custom_field_values => {'2' => 'Value for field 2'}}
1783 end
1788 end
1784 assert_redirected_to :controller => 'issues', :action => 'show',
1789 assert_redirected_to :controller => 'issues', :action => 'show',
1785 :id => Issue.last.id
1790 :id => Issue.last.id
1786 issue = Issue.find_by_subject('This is the test_new issue')
1791 issue = Issue.find_by_subject('This is the test_new issue')
1787 assert_not_nil issue
1792 assert_not_nil issue
1788 assert_nil issue.start_date
1793 assert_nil issue.start_date
1789 end
1794 end
1790 end
1795 end
1791
1796
1792 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
1793 with_settings :default_issue_start_date_to_creation_date => 1 do
1798 with_settings :default_issue_start_date_to_creation_date => 1 do
1794 @request.session[:user_id] = 2
1799 @request.session[:user_id] = 2
1795 assert_difference 'Issue.count' do
1800 assert_difference 'Issue.count' do
1796 post :create, :project_id => 1,
1801 post :create, :project_id => 1,
1797 :issue => {:tracker_id => 3,
1802 :issue => {:tracker_id => 3,
1798 :status_id => 2,
1803 :status_id => 2,
1799 :subject => 'This is the test_new issue',
1804 :subject => 'This is the test_new issue',
1800 :description => 'This is the description',
1805 :description => 'This is the description',
1801 :priority_id => 5,
1806 :priority_id => 5,
1802 :estimated_hours => '',
1807 :estimated_hours => '',
1803 :custom_field_values => {'2' => 'Value for field 2'}}
1808 :custom_field_values => {'2' => 'Value for field 2'}}
1804 end
1809 end
1805 assert_redirected_to :controller => 'issues', :action => 'show',
1810 assert_redirected_to :controller => 'issues', :action => 'show',
1806 :id => Issue.last.id
1811 :id => Issue.last.id
1807 issue = Issue.find_by_subject('This is the test_new issue')
1812 issue = Issue.find_by_subject('This is the test_new issue')
1808 assert_not_nil issue
1813 assert_not_nil issue
1809 assert_equal Date.today, issue.start_date
1814 assert_equal Date.today, issue.start_date
1810 end
1815 end
1811 end
1816 end
1812
1817
1813 def test_post_create_and_continue
1818 def test_post_create_and_continue
1814 @request.session[:user_id] = 2
1819 @request.session[:user_id] = 2
1815 assert_difference 'Issue.count' do
1820 assert_difference 'Issue.count' do
1816 post :create, :project_id => 1,
1821 post :create, :project_id => 1,
1817 :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},
1818 :continue => ''
1823 :continue => ''
1819 end
1824 end
1820
1825
1821 issue = Issue.first(:order => 'id DESC')
1826 issue = Issue.first(:order => 'id DESC')
1822 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}
1823 assert_not_nil flash[:notice], "flash was not set"
1828 assert_not_nil flash[:notice], "flash was not set"
1824 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"
1825 end
1830 end
1826
1831
1827 def test_post_create_without_custom_fields_param
1832 def test_post_create_without_custom_fields_param
1828 @request.session[:user_id] = 2
1833 @request.session[:user_id] = 2
1829 assert_difference 'Issue.count' do
1834 assert_difference 'Issue.count' do
1830 post :create, :project_id => 1,
1835 post :create, :project_id => 1,
1831 :issue => {:tracker_id => 1,
1836 :issue => {:tracker_id => 1,
1832 :subject => 'This is the test_new issue',
1837 :subject => 'This is the test_new issue',
1833 :description => 'This is the description',
1838 :description => 'This is the description',
1834 :priority_id => 5}
1839 :priority_id => 5}
1835 end
1840 end
1836 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
1841 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
1837 end
1842 end
1838
1843
1839 def test_post_create_with_multi_custom_field
1844 def test_post_create_with_multi_custom_field
1840 field = IssueCustomField.find_by_name('Database')
1845 field = IssueCustomField.find_by_name('Database')
1841 field.update_attribute(:multiple, true)
1846 field.update_attribute(:multiple, true)
1842
1847
1843 @request.session[:user_id] = 2
1848 @request.session[:user_id] = 2
1844 assert_difference 'Issue.count' do
1849 assert_difference 'Issue.count' do
1845 post :create, :project_id => 1,
1850 post :create, :project_id => 1,
1846 :issue => {:tracker_id => 1,
1851 :issue => {:tracker_id => 1,
1847 :subject => 'This is the test_new issue',
1852 :subject => 'This is the test_new issue',
1848 :description => 'This is the description',
1853 :description => 'This is the description',
1849 :priority_id => 5,
1854 :priority_id => 5,
1850 :custom_field_values => {'1' => ['', 'MySQL', 'Oracle']}}
1855 :custom_field_values => {'1' => ['', 'MySQL', 'Oracle']}}
1851 end
1856 end
1852 assert_response 302
1857 assert_response 302
1853 issue = Issue.first(:order => 'id DESC')
1858 issue = Issue.first(:order => 'id DESC')
1854 assert_equal ['MySQL', 'Oracle'], issue.custom_field_value(1).sort
1859 assert_equal ['MySQL', 'Oracle'], issue.custom_field_value(1).sort
1855 end
1860 end
1856
1861
1857 def test_post_create_with_empty_multi_custom_field
1862 def test_post_create_with_empty_multi_custom_field
1858 field = IssueCustomField.find_by_name('Database')
1863 field = IssueCustomField.find_by_name('Database')
1859 field.update_attribute(:multiple, true)
1864 field.update_attribute(:multiple, true)
1860
1865
1861 @request.session[:user_id] = 2
1866 @request.session[:user_id] = 2
1862 assert_difference 'Issue.count' do
1867 assert_difference 'Issue.count' do
1863 post :create, :project_id => 1,
1868 post :create, :project_id => 1,
1864 :issue => {:tracker_id => 1,
1869 :issue => {:tracker_id => 1,
1865 :subject => 'This is the test_new issue',
1870 :subject => 'This is the test_new issue',
1866 :description => 'This is the description',
1871 :description => 'This is the description',
1867 :priority_id => 5,
1872 :priority_id => 5,
1868 :custom_field_values => {'1' => ['']}}
1873 :custom_field_values => {'1' => ['']}}
1869 end
1874 end
1870 assert_response 302
1875 assert_response 302
1871 issue = Issue.first(:order => 'id DESC')
1876 issue = Issue.first(:order => 'id DESC')
1872 assert_equal [''], issue.custom_field_value(1).sort
1877 assert_equal [''], issue.custom_field_value(1).sort
1873 end
1878 end
1874
1879
1875 def test_post_create_with_multi_user_custom_field
1880 def test_post_create_with_multi_user_custom_field
1876 field = IssueCustomField.create!(:name => 'Multi user', :field_format => 'user', :multiple => true,
1881 field = IssueCustomField.create!(:name => 'Multi user', :field_format => 'user', :multiple => true,
1877 :tracker_ids => [1], :is_for_all => true)
1882 :tracker_ids => [1], :is_for_all => true)
1878
1883
1879 @request.session[:user_id] = 2
1884 @request.session[:user_id] = 2
1880 assert_difference 'Issue.count' do
1885 assert_difference 'Issue.count' do
1881 post :create, :project_id => 1,
1886 post :create, :project_id => 1,
1882 :issue => {:tracker_id => 1,
1887 :issue => {:tracker_id => 1,
1883 :subject => 'This is the test_new issue',
1888 :subject => 'This is the test_new issue',
1884 :description => 'This is the description',
1889 :description => 'This is the description',
1885 :priority_id => 5,
1890 :priority_id => 5,
1886 :custom_field_values => {field.id.to_s => ['', '2', '3']}}
1891 :custom_field_values => {field.id.to_s => ['', '2', '3']}}
1887 end
1892 end
1888 assert_response 302
1893 assert_response 302
1889 issue = Issue.first(:order => 'id DESC')
1894 issue = Issue.first(:order => 'id DESC')
1890 assert_equal ['2', '3'], issue.custom_field_value(field).sort
1895 assert_equal ['2', '3'], issue.custom_field_value(field).sort
1891 end
1896 end
1892
1897
1893 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
1894 field = IssueCustomField.find_by_name('Database')
1899 field = IssueCustomField.find_by_name('Database')
1895 field.update_attribute(:is_required, true)
1900 field.update_attribute(:is_required, true)
1896
1901
1897 @request.session[:user_id] = 2
1902 @request.session[:user_id] = 2
1898 assert_no_difference 'Issue.count' do
1903 assert_no_difference 'Issue.count' do
1899 post :create, :project_id => 1,
1904 post :create, :project_id => 1,
1900 :issue => {:tracker_id => 1,
1905 :issue => {:tracker_id => 1,
1901 :subject => 'This is the test_new issue',
1906 :subject => 'This is the test_new issue',
1902 :description => 'This is the description',
1907 :description => 'This is the description',
1903 :priority_id => 5}
1908 :priority_id => 5}
1904 end
1909 end
1905 assert_response :success
1910 assert_response :success
1906 assert_template 'new'
1911 assert_template 'new'
1907 issue = assigns(:issue)
1912 issue = assigns(:issue)
1908 assert_not_nil issue
1913 assert_not_nil issue
1909 assert_error_tag :content => /Database can&#x27;t be blank/
1914 assert_error_tag :content => /Database can&#x27;t be blank/
1910 end
1915 end
1911
1916
1912 def test_create_should_validate_required_fields
1917 def test_create_should_validate_required_fields
1913 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])
1914 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])
1915 WorkflowPermission.delete_all
1920 WorkflowPermission.delete_all
1916 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')
1917 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')
1918 @request.session[:user_id] = 2
1923 @request.session[:user_id] = 2
1919
1924
1920 assert_no_difference 'Issue.count' do
1925 assert_no_difference 'Issue.count' do
1921 post :create, :project_id => 1, :issue => {
1926 post :create, :project_id => 1, :issue => {
1922 :tracker_id => 2,
1927 :tracker_id => 2,
1923 :status_id => 1,
1928 :status_id => 1,
1924 :subject => 'Test',
1929 :subject => 'Test',
1925 :start_date => '',
1930 :start_date => '',
1926 :due_date => '',
1931 :due_date => '',
1927 :custom_field_values => {cf1.id.to_s => '', cf2.id.to_s => ''}
1932 :custom_field_values => {cf1.id.to_s => '', cf2.id.to_s => ''}
1928 }
1933 }
1929 assert_response :success
1934 assert_response :success
1930 assert_template 'new'
1935 assert_template 'new'
1931 end
1936 end
1932
1937
1933 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
1934 assert_error_tag :content => /Bar can&#x27;t be blank/i
1939 assert_error_tag :content => /Bar can&#x27;t be blank/i
1935 end
1940 end
1936
1941
1937 def test_create_should_ignore_readonly_fields
1942 def test_create_should_ignore_readonly_fields
1938 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])
1939 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])
1940 WorkflowPermission.delete_all
1945 WorkflowPermission.delete_all
1941 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')
1942 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')
1943 @request.session[:user_id] = 2
1948 @request.session[:user_id] = 2
1944
1949
1945 assert_difference 'Issue.count' do
1950 assert_difference 'Issue.count' do
1946 post :create, :project_id => 1, :issue => {
1951 post :create, :project_id => 1, :issue => {
1947 :tracker_id => 2,
1952 :tracker_id => 2,
1948 :status_id => 1,
1953 :status_id => 1,
1949 :subject => 'Test',
1954 :subject => 'Test',
1950 :start_date => '2012-07-14',
1955 :start_date => '2012-07-14',
1951 :due_date => '2012-07-16',
1956 :due_date => '2012-07-16',
1952 :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'}
1953 }
1958 }
1954 assert_response 302
1959 assert_response 302
1955 end
1960 end
1956
1961
1957 issue = Issue.first(:order => 'id DESC')
1962 issue = Issue.first(:order => 'id DESC')
1958 assert_equal Date.parse('2012-07-14'), issue.start_date
1963 assert_equal Date.parse('2012-07-14'), issue.start_date
1959 assert_nil issue.due_date
1964 assert_nil issue.due_date
1960 assert_equal 'value1', issue.custom_field_value(cf1)
1965 assert_equal 'value1', issue.custom_field_value(cf1)
1961 assert_nil issue.custom_field_value(cf2)
1966 assert_nil issue.custom_field_value(cf2)
1962 end
1967 end
1963
1968
1964 def test_post_create_with_watchers
1969 def test_post_create_with_watchers
1965 @request.session[:user_id] = 2
1970 @request.session[:user_id] = 2
1966 ActionMailer::Base.deliveries.clear
1971 ActionMailer::Base.deliveries.clear
1967
1972
1968 assert_difference 'Watcher.count', 2 do
1973 assert_difference 'Watcher.count', 2 do
1969 post :create, :project_id => 1,
1974 post :create, :project_id => 1,
1970 :issue => {:tracker_id => 1,
1975 :issue => {:tracker_id => 1,
1971 :subject => 'This is a new issue with watchers',
1976 :subject => 'This is a new issue with watchers',
1972 :description => 'This is the description',
1977 :description => 'This is the description',
1973 :priority_id => 5,
1978 :priority_id => 5,
1974 :watcher_user_ids => ['2', '3']}
1979 :watcher_user_ids => ['2', '3']}
1975 end
1980 end
1976 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')
1977 assert_not_nil issue
1982 assert_not_nil issue
1978 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue
1983 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue
1979
1984
1980 # Watchers added
1985 # Watchers added
1981 assert_equal [2, 3], issue.watcher_user_ids.sort
1986 assert_equal [2, 3], issue.watcher_user_ids.sort
1982 assert issue.watched_by?(User.find(3))
1987 assert issue.watched_by?(User.find(3))
1983 # Watchers notified
1988 # Watchers notified
1984 mail = ActionMailer::Base.deliveries.last
1989 mail = ActionMailer::Base.deliveries.last
1985 assert_not_nil mail
1990 assert_not_nil mail
1986 assert [mail.bcc, mail.cc].flatten.include?(User.find(3).mail)
1991 assert [mail.bcc, mail.cc].flatten.include?(User.find(3).mail)
1987 end
1992 end
1988
1993
1989 def test_post_create_subissue
1994 def test_post_create_subissue
1990 @request.session[:user_id] = 2
1995 @request.session[:user_id] = 2
1991
1996
1992 assert_difference 'Issue.count' do
1997 assert_difference 'Issue.count' do
1993 post :create, :project_id => 1,
1998 post :create, :project_id => 1,
1994 :issue => {:tracker_id => 1,
1999 :issue => {:tracker_id => 1,
1995 :subject => 'This is a child issue',
2000 :subject => 'This is a child issue',
1996 :parent_issue_id => '2'}
2001 :parent_issue_id => '2'}
1997 assert_response 302
2002 assert_response 302
1998 end
2003 end
1999 issue = Issue.order('id DESC').first
2004 issue = Issue.order('id DESC').first
2000 assert_equal Issue.find(2), issue.parent
2005 assert_equal Issue.find(2), issue.parent
2001 end
2006 end
2002
2007
2003 def test_post_create_subissue_with_sharp_parent_id
2008 def test_post_create_subissue_with_sharp_parent_id
2004 @request.session[:user_id] = 2
2009 @request.session[:user_id] = 2
2005
2010
2006 assert_difference 'Issue.count' do
2011 assert_difference 'Issue.count' do
2007 post :create, :project_id => 1,
2012 post :create, :project_id => 1,
2008 :issue => {:tracker_id => 1,
2013 :issue => {:tracker_id => 1,
2009 :subject => 'This is a child issue',
2014 :subject => 'This is a child issue',
2010 :parent_issue_id => '#2'}
2015 :parent_issue_id => '#2'}
2011 assert_response 302
2016 assert_response 302
2012 end
2017 end
2013 issue = Issue.order('id DESC').first
2018 issue = Issue.order('id DESC').first
2014 assert_equal Issue.find(2), issue.parent
2019 assert_equal Issue.find(2), issue.parent
2015 end
2020 end
2016
2021
2017 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
2018 @request.session[:user_id] = 2
2023 @request.session[:user_id] = 2
2019
2024
2020 assert_no_difference 'Issue.count' do
2025 assert_no_difference 'Issue.count' do
2021 post :create, :project_id => 1,
2026 post :create, :project_id => 1,
2022 :issue => {:tracker_id => 1,
2027 :issue => {:tracker_id => 1,
2023 :subject => 'This is a child issue',
2028 :subject => 'This is a child issue',
2024 :parent_issue_id => '4'}
2029 :parent_issue_id => '4'}
2025
2030
2026 assert_response :success
2031 assert_response :success
2027 assert_select 'input[name=?][value=?]', 'issue[parent_issue_id]', '4'
2032 assert_select 'input[name=?][value=?]', 'issue[parent_issue_id]', '4'
2028 assert_error_tag :content => /Parent task is invalid/i
2033 assert_error_tag :content => /Parent task is invalid/i
2029 end
2034 end
2030 end
2035 end
2031
2036
2032 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
2033 @request.session[:user_id] = 2
2038 @request.session[:user_id] = 2
2034
2039
2035 assert_no_difference 'Issue.count' do
2040 assert_no_difference 'Issue.count' do
2036 post :create, :project_id => 1,
2041 post :create, :project_id => 1,
2037 :issue => {:tracker_id => 1,
2042 :issue => {:tracker_id => 1,
2038 :subject => 'This is a child issue',
2043 :subject => 'This is a child issue',
2039 :parent_issue_id => '01ABC'}
2044 :parent_issue_id => '01ABC'}
2040
2045
2041 assert_response :success
2046 assert_response :success
2042 assert_select 'input[name=?][value=?]', 'issue[parent_issue_id]', '01ABC'
2047 assert_select 'input[name=?][value=?]', 'issue[parent_issue_id]', '01ABC'
2043 assert_error_tag :content => /Parent task is invalid/i
2048 assert_error_tag :content => /Parent task is invalid/i
2044 end
2049 end
2045 end
2050 end
2046
2051
2047 def test_post_create_private
2052 def test_post_create_private
2048 @request.session[:user_id] = 2
2053 @request.session[:user_id] = 2
2049
2054
2050 assert_difference 'Issue.count' do
2055 assert_difference 'Issue.count' do
2051 post :create, :project_id => 1,
2056 post :create, :project_id => 1,
2052 :issue => {:tracker_id => 1,
2057 :issue => {:tracker_id => 1,
2053 :subject => 'This is a private issue',
2058 :subject => 'This is a private issue',
2054 :is_private => '1'}
2059 :is_private => '1'}
2055 end
2060 end
2056 issue = Issue.first(:order => 'id DESC')
2061 issue = Issue.first(:order => 'id DESC')
2057 assert issue.is_private?
2062 assert issue.is_private?
2058 end
2063 end
2059
2064
2060 def test_post_create_private_with_set_own_issues_private_permission
2065 def test_post_create_private_with_set_own_issues_private_permission
2061 role = Role.find(1)
2066 role = Role.find(1)
2062 role.remove_permission! :set_issues_private
2067 role.remove_permission! :set_issues_private
2063 role.add_permission! :set_own_issues_private
2068 role.add_permission! :set_own_issues_private
2064
2069
2065 @request.session[:user_id] = 2
2070 @request.session[:user_id] = 2
2066
2071
2067 assert_difference 'Issue.count' do
2072 assert_difference 'Issue.count' do
2068 post :create, :project_id => 1,
2073 post :create, :project_id => 1,
2069 :issue => {:tracker_id => 1,
2074 :issue => {:tracker_id => 1,
2070 :subject => 'This is a private issue',
2075 :subject => 'This is a private issue',
2071 :is_private => '1'}
2076 :is_private => '1'}
2072 end
2077 end
2073 issue = Issue.first(:order => 'id DESC')
2078 issue = Issue.first(:order => 'id DESC')
2074 assert issue.is_private?
2079 assert issue.is_private?
2075 end
2080 end
2076
2081
2077 def test_post_create_should_send_a_notification
2082 def test_post_create_should_send_a_notification
2078 ActionMailer::Base.deliveries.clear
2083 ActionMailer::Base.deliveries.clear
2079 @request.session[:user_id] = 2
2084 @request.session[:user_id] = 2
2080 assert_difference 'Issue.count' do
2085 assert_difference 'Issue.count' do
2081 post :create, :project_id => 1,
2086 post :create, :project_id => 1,
2082 :issue => {:tracker_id => 3,
2087 :issue => {:tracker_id => 3,
2083 :subject => 'This is the test_new issue',
2088 :subject => 'This is the test_new issue',
2084 :description => 'This is the description',
2089 :description => 'This is the description',
2085 :priority_id => 5,
2090 :priority_id => 5,
2086 :estimated_hours => '',
2091 :estimated_hours => '',
2087 :custom_field_values => {'2' => 'Value for field 2'}}
2092 :custom_field_values => {'2' => 'Value for field 2'}}
2088 end
2093 end
2089 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
2094 assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id
2090
2095
2091 assert_equal 1, ActionMailer::Base.deliveries.size
2096 assert_equal 1, ActionMailer::Base.deliveries.size
2092 end
2097 end
2093
2098
2094 def test_post_create_should_preserve_fields_values_on_validation_failure
2099 def test_post_create_should_preserve_fields_values_on_validation_failure
2095 @request.session[:user_id] = 2
2100 @request.session[:user_id] = 2
2096 post :create, :project_id => 1,
2101 post :create, :project_id => 1,
2097 :issue => {:tracker_id => 1,
2102 :issue => {:tracker_id => 1,
2098 # empty subject
2103 # empty subject
2099 :subject => '',
2104 :subject => '',
2100 :description => 'This is a description',
2105 :description => 'This is a description',
2101 :priority_id => 6,
2106 :priority_id => 6,
2102 :custom_field_values => {'1' => 'Oracle', '2' => 'Value for field 2'}}
2107 :custom_field_values => {'1' => 'Oracle', '2' => 'Value for field 2'}}
2103 assert_response :success
2108 assert_response :success
2104 assert_template 'new'
2109 assert_template 'new'
2105
2110
2106 assert_select 'textarea[name=?]', 'issue[description]', :text => 'This is a description'
2111 assert_select 'textarea[name=?]', 'issue[description]', :text => 'This is a description'
2107 assert_select 'select[name=?]', 'issue[priority_id]' do
2112 assert_select 'select[name=?]', 'issue[priority_id]' do
2108 assert_select 'option[value=6][selected=selected]', :text => 'High'
2113 assert_select 'option[value=6][selected=selected]', :text => 'High'
2109 end
2114 end
2110 # Custom fields
2115 # Custom fields
2111 assert_select 'select[name=?]', 'issue[custom_field_values][1]' do
2116 assert_select 'select[name=?]', 'issue[custom_field_values][1]' do
2112 assert_select 'option[value=Oracle][selected=selected]', :text => 'Oracle'
2117 assert_select 'option[value=Oracle][selected=selected]', :text => 'Oracle'
2113 end
2118 end
2114 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'
2115 end
2120 end
2116
2121
2117 def test_post_create_with_failure_should_preserve_watchers
2122 def test_post_create_with_failure_should_preserve_watchers
2118 assert !User.find(8).member_of?(Project.find(1))
2123 assert !User.find(8).member_of?(Project.find(1))
2119
2124
2120 @request.session[:user_id] = 2
2125 @request.session[:user_id] = 2
2121 post :create, :project_id => 1,
2126 post :create, :project_id => 1,
2122 :issue => {:tracker_id => 1,
2127 :issue => {:tracker_id => 1,
2123 :watcher_user_ids => ['3', '8']}
2128 :watcher_user_ids => ['3', '8']}
2124 assert_response :success
2129 assert_response :success
2125 assert_template 'new'
2130 assert_template 'new'
2126
2131
2127 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][]'
2128 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][]'
2129 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][]'
2130 end
2135 end
2131
2136
2132 def test_post_create_should_ignore_non_safe_attributes
2137 def test_post_create_should_ignore_non_safe_attributes
2133 @request.session[:user_id] = 2
2138 @request.session[:user_id] = 2
2134 assert_nothing_raised do
2139 assert_nothing_raised do
2135 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" }
2136 end
2141 end
2137 end
2142 end
2138
2143
2139 def test_post_create_with_attachment
2144 def test_post_create_with_attachment
2140 set_tmp_attachments_directory
2145 set_tmp_attachments_directory
2141 @request.session[:user_id] = 2
2146 @request.session[:user_id] = 2
2142
2147
2143 assert_difference 'Issue.count' do
2148 assert_difference 'Issue.count' do
2144 assert_difference 'Attachment.count' do
2149 assert_difference 'Attachment.count' do
2145 post :create, :project_id => 1,
2150 post :create, :project_id => 1,
2146 :issue => { :tracker_id => '1', :subject => 'With attachment' },
2151 :issue => { :tracker_id => '1', :subject => 'With attachment' },
2147 :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'}}
2148 end
2153 end
2149 end
2154 end
2150
2155
2151 issue = Issue.first(:order => 'id DESC')
2156 issue = Issue.first(:order => 'id DESC')
2152 attachment = Attachment.first(:order => 'id DESC')
2157 attachment = Attachment.first(:order => 'id DESC')
2153
2158
2154 assert_equal issue, attachment.container
2159 assert_equal issue, attachment.container
2155 assert_equal 2, attachment.author_id
2160 assert_equal 2, attachment.author_id
2156 assert_equal 'testfile.txt', attachment.filename
2161 assert_equal 'testfile.txt', attachment.filename
2157 assert_equal 'text/plain', attachment.content_type
2162 assert_equal 'text/plain', attachment.content_type
2158 assert_equal 'test file', attachment.description
2163 assert_equal 'test file', attachment.description
2159 assert_equal 59, attachment.filesize
2164 assert_equal 59, attachment.filesize
2160 assert File.exists?(attachment.diskfile)
2165 assert File.exists?(attachment.diskfile)
2161 assert_equal 59, File.size(attachment.diskfile)
2166 assert_equal 59, File.size(attachment.diskfile)
2162 end
2167 end
2163
2168
2164 def test_post_create_with_attachment_should_notify_with_attachments
2169 def test_post_create_with_attachment_should_notify_with_attachments
2165 ActionMailer::Base.deliveries.clear
2170 ActionMailer::Base.deliveries.clear
2166 set_tmp_attachments_directory
2171 set_tmp_attachments_directory
2167 @request.session[:user_id] = 2
2172 @request.session[:user_id] = 2
2168
2173
2169 with_settings :host_name => 'mydomain.foo', :protocol => 'http' do
2174 with_settings :host_name => 'mydomain.foo', :protocol => 'http' do
2170 assert_difference 'Issue.count' do
2175 assert_difference 'Issue.count' do
2171 post :create, :project_id => 1,
2176 post :create, :project_id => 1,
2172 :issue => { :tracker_id => '1', :subject => 'With attachment' },
2177 :issue => { :tracker_id => '1', :subject => 'With attachment' },
2173 :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'}}
2174 end
2179 end
2175 end
2180 end
2176
2181
2177 assert_not_nil ActionMailer::Base.deliveries.last
2182 assert_not_nil ActionMailer::Base.deliveries.last
2178 assert_select_email do
2183 assert_select_email do
2179 assert_select 'a[href^=?]', 'http://mydomain.foo/attachments/download', 'testfile.txt'
2184 assert_select 'a[href^=?]', 'http://mydomain.foo/attachments/download', 'testfile.txt'
2180 end
2185 end
2181 end
2186 end
2182
2187
2183 def test_post_create_with_failure_should_save_attachments
2188 def test_post_create_with_failure_should_save_attachments
2184 set_tmp_attachments_directory
2189 set_tmp_attachments_directory
2185 @request.session[:user_id] = 2
2190 @request.session[:user_id] = 2
2186
2191
2187 assert_no_difference 'Issue.count' do
2192 assert_no_difference 'Issue.count' do
2188 assert_difference 'Attachment.count' do
2193 assert_difference 'Attachment.count' do
2189 post :create, :project_id => 1,
2194 post :create, :project_id => 1,
2190 :issue => { :tracker_id => '1', :subject => '' },
2195 :issue => { :tracker_id => '1', :subject => '' },
2191 :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'}}
2192 assert_response :success
2197 assert_response :success
2193 assert_template 'new'
2198 assert_template 'new'
2194 end
2199 end
2195 end
2200 end
2196
2201
2197 attachment = Attachment.first(:order => 'id DESC')
2202 attachment = Attachment.first(:order => 'id DESC')
2198 assert_equal 'testfile.txt', attachment.filename
2203 assert_equal 'testfile.txt', attachment.filename
2199 assert File.exists?(attachment.diskfile)
2204 assert File.exists?(attachment.diskfile)
2200 assert_nil attachment.container
2205 assert_nil attachment.container
2201
2206
2202 assert_select 'input[name=?][value=?]', 'attachments[p0][token]', attachment.token
2207 assert_select 'input[name=?][value=?]', 'attachments[p0][token]', attachment.token
2203 assert_select 'input[name=?][value=?]', 'attachments[p0][filename]', 'testfile.txt'
2208 assert_select 'input[name=?][value=?]', 'attachments[p0][filename]', 'testfile.txt'
2204 end
2209 end
2205
2210
2206 def test_post_create_with_failure_should_keep_saved_attachments
2211 def test_post_create_with_failure_should_keep_saved_attachments
2207 set_tmp_attachments_directory
2212 set_tmp_attachments_directory
2208 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)
2209 @request.session[:user_id] = 2
2214 @request.session[:user_id] = 2
2210
2215
2211 assert_no_difference 'Issue.count' do
2216 assert_no_difference 'Issue.count' do
2212 assert_no_difference 'Attachment.count' do
2217 assert_no_difference 'Attachment.count' do
2213 post :create, :project_id => 1,
2218 post :create, :project_id => 1,
2214 :issue => { :tracker_id => '1', :subject => '' },
2219 :issue => { :tracker_id => '1', :subject => '' },
2215 :attachments => {'p0' => {'token' => attachment.token}}
2220 :attachments => {'p0' => {'token' => attachment.token}}
2216 assert_response :success
2221 assert_response :success
2217 assert_template 'new'
2222 assert_template 'new'
2218 end
2223 end
2219 end
2224 end
2220
2225
2221 assert_select 'input[name=?][value=?]', 'attachments[p0][token]', attachment.token
2226 assert_select 'input[name=?][value=?]', 'attachments[p0][token]', attachment.token
2222 assert_select 'input[name=?][value=?]', 'attachments[p0][filename]', 'testfile.txt'
2227 assert_select 'input[name=?][value=?]', 'attachments[p0][filename]', 'testfile.txt'
2223 end
2228 end
2224
2229
2225 def test_post_create_should_attach_saved_attachments
2230 def test_post_create_should_attach_saved_attachments
2226 set_tmp_attachments_directory
2231 set_tmp_attachments_directory
2227 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)
2228 @request.session[:user_id] = 2
2233 @request.session[:user_id] = 2
2229
2234
2230 assert_difference 'Issue.count' do
2235 assert_difference 'Issue.count' do
2231 assert_no_difference 'Attachment.count' do
2236 assert_no_difference 'Attachment.count' do
2232 post :create, :project_id => 1,
2237 post :create, :project_id => 1,
2233 :issue => { :tracker_id => '1', :subject => 'Saved attachments' },
2238 :issue => { :tracker_id => '1', :subject => 'Saved attachments' },
2234 :attachments => {'p0' => {'token' => attachment.token}}
2239 :attachments => {'p0' => {'token' => attachment.token}}
2235 assert_response 302
2240 assert_response 302
2236 end
2241 end
2237 end
2242 end
2238
2243
2239 issue = Issue.first(:order => 'id DESC')
2244 issue = Issue.first(:order => 'id DESC')
2240 assert_equal 1, issue.attachments.count
2245 assert_equal 1, issue.attachments.count
2241
2246
2242 attachment.reload
2247 attachment.reload
2243 assert_equal issue, attachment.container
2248 assert_equal issue, attachment.container
2244 end
2249 end
2245
2250
2246 context "without workflow privilege" do
2251 context "without workflow privilege" do
2247 setup do
2252 setup do
2248 WorkflowTransition.delete_all(["role_id = ?", Role.anonymous.id])
2253 WorkflowTransition.delete_all(["role_id = ?", Role.anonymous.id])
2249 Role.anonymous.add_permission! :add_issues, :add_issue_notes
2254 Role.anonymous.add_permission! :add_issues, :add_issue_notes
2250 end
2255 end
2251
2256
2252 context "#new" do
2257 context "#new" do
2253 should "propose default status only" do
2258 should "propose default status only" do
2254 get :new, :project_id => 1
2259 get :new, :project_id => 1
2255 assert_response :success
2260 assert_response :success
2256 assert_template 'new'
2261 assert_template 'new'
2257 assert_select 'select[name=?]', 'issue[status_id]' do
2262 assert_select 'select[name=?]', 'issue[status_id]' do
2258 assert_select 'option', 1
2263 assert_select 'option', 1
2259 assert_select 'option[value=?]', IssueStatus.default.id.to_s
2264 assert_select 'option[value=?]', IssueStatus.default.id.to_s
2260 end
2265 end
2261 end
2266 end
2262
2267
2263 should "accept default status" do
2268 should "accept default status" do
2264 assert_difference 'Issue.count' do
2269 assert_difference 'Issue.count' do
2265 post :create, :project_id => 1,
2270 post :create, :project_id => 1,
2266 :issue => {:tracker_id => 1,
2271 :issue => {:tracker_id => 1,
2267 :subject => 'This is an issue',
2272 :subject => 'This is an issue',
2268 :status_id => 1}
2273 :status_id => 1}
2269 end
2274 end
2270 issue = Issue.last(:order => 'id')
2275 issue = Issue.last(:order => 'id')
2271 assert_equal IssueStatus.default, issue.status
2276 assert_equal IssueStatus.default, issue.status
2272 end
2277 end
2273
2278
2274 should "ignore unauthorized status" do
2279 should "ignore unauthorized status" do
2275 assert_difference 'Issue.count' do
2280 assert_difference 'Issue.count' do
2276 post :create, :project_id => 1,
2281 post :create, :project_id => 1,
2277 :issue => {:tracker_id => 1,
2282 :issue => {:tracker_id => 1,
2278 :subject => 'This is an issue',
2283 :subject => 'This is an issue',
2279 :status_id => 3}
2284 :status_id => 3}
2280 end
2285 end
2281 issue = Issue.last(:order => 'id')
2286 issue = Issue.last(:order => 'id')
2282 assert_equal IssueStatus.default, issue.status
2287 assert_equal IssueStatus.default, issue.status
2283 end
2288 end
2284 end
2289 end
2285
2290
2286 context "#update" do
2291 context "#update" do
2287 should "ignore status change" do
2292 should "ignore status change" do
2288 assert_difference 'Journal.count' do
2293 assert_difference 'Journal.count' do
2289 put :update, :id => 1, :issue => {:status_id => 3, :notes => 'just trying'}
2294 put :update, :id => 1, :issue => {:status_id => 3, :notes => 'just trying'}
2290 end
2295 end
2291 assert_equal 1, Issue.find(1).status_id
2296 assert_equal 1, Issue.find(1).status_id
2292 end
2297 end
2293
2298
2294 should "ignore attributes changes" do
2299 should "ignore attributes changes" do
2295 assert_difference 'Journal.count' do
2300 assert_difference 'Journal.count' do
2296 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'}
2297 end
2302 end
2298 issue = Issue.find(1)
2303 issue = Issue.find(1)
2299 assert_equal "Can't print recipes", issue.subject
2304 assert_equal "Can't print recipes", issue.subject
2300 assert_nil issue.assigned_to
2305 assert_nil issue.assigned_to
2301 end
2306 end
2302 end
2307 end
2303 end
2308 end
2304
2309
2305 context "with workflow privilege" do
2310 context "with workflow privilege" do
2306 setup do
2311 setup do
2307 WorkflowTransition.delete_all(["role_id = ?", Role.anonymous.id])
2312 WorkflowTransition.delete_all(["role_id = ?", Role.anonymous.id])
2308 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)
2309 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)
2310 Role.anonymous.add_permission! :add_issues, :add_issue_notes
2315 Role.anonymous.add_permission! :add_issues, :add_issue_notes
2311 end
2316 end
2312
2317
2313 context "#update" do
2318 context "#update" do
2314 should "accept authorized status" do
2319 should "accept authorized status" do
2315 assert_difference 'Journal.count' do
2320 assert_difference 'Journal.count' do
2316 put :update, :id => 1, :issue => {:status_id => 3, :notes => 'just trying'}
2321 put :update, :id => 1, :issue => {:status_id => 3, :notes => 'just trying'}
2317 end
2322 end
2318 assert_equal 3, Issue.find(1).status_id
2323 assert_equal 3, Issue.find(1).status_id
2319 end
2324 end
2320
2325
2321 should "ignore unauthorized status" do
2326 should "ignore unauthorized status" do
2322 assert_difference 'Journal.count' do
2327 assert_difference 'Journal.count' do
2323 put :update, :id => 1, :issue => {:status_id => 2, :notes => 'just trying'}
2328 put :update, :id => 1, :issue => {:status_id => 2, :notes => 'just trying'}
2324 end
2329 end
2325 assert_equal 1, Issue.find(1).status_id
2330 assert_equal 1, Issue.find(1).status_id
2326 end
2331 end
2327
2332
2328 should "accept authorized attributes changes" do
2333 should "accept authorized attributes changes" do
2329 assert_difference 'Journal.count' do
2334 assert_difference 'Journal.count' do
2330 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'}
2331 end
2336 end
2332 issue = Issue.find(1)
2337 issue = Issue.find(1)
2333 assert_equal 2, issue.assigned_to_id
2338 assert_equal 2, issue.assigned_to_id
2334 end
2339 end
2335
2340
2336 should "ignore unauthorized attributes changes" do
2341 should "ignore unauthorized attributes changes" do
2337 assert_difference 'Journal.count' do
2342 assert_difference 'Journal.count' do
2338 put :update, :id => 1, :issue => {:subject => 'changed', :notes => 'just trying'}
2343 put :update, :id => 1, :issue => {:subject => 'changed', :notes => 'just trying'}
2339 end
2344 end
2340 issue = Issue.find(1)
2345 issue = Issue.find(1)
2341 assert_equal "Can't print recipes", issue.subject
2346 assert_equal "Can't print recipes", issue.subject
2342 end
2347 end
2343 end
2348 end
2344
2349
2345 context "and :edit_issues permission" do
2350 context "and :edit_issues permission" do
2346 setup do
2351 setup do
2347 Role.anonymous.add_permission! :add_issues, :edit_issues
2352 Role.anonymous.add_permission! :add_issues, :edit_issues
2348 end
2353 end
2349
2354
2350 should "accept authorized status" do
2355 should "accept authorized status" do
2351 assert_difference 'Journal.count' do
2356 assert_difference 'Journal.count' do
2352 put :update, :id => 1, :issue => {:status_id => 3, :notes => 'just trying'}
2357 put :update, :id => 1, :issue => {:status_id => 3, :notes => 'just trying'}
2353 end
2358 end
2354 assert_equal 3, Issue.find(1).status_id
2359 assert_equal 3, Issue.find(1).status_id
2355 end
2360 end
2356
2361
2357 should "ignore unauthorized status" do
2362 should "ignore unauthorized status" do
2358 assert_difference 'Journal.count' do
2363 assert_difference 'Journal.count' do
2359 put :update, :id => 1, :issue => {:status_id => 2, :notes => 'just trying'}
2364 put :update, :id => 1, :issue => {:status_id => 2, :notes => 'just trying'}
2360 end
2365 end
2361 assert_equal 1, Issue.find(1).status_id
2366 assert_equal 1, Issue.find(1).status_id
2362 end
2367 end
2363
2368
2364 should "accept authorized attributes changes" do
2369 should "accept authorized attributes changes" do
2365 assert_difference 'Journal.count' do
2370 assert_difference 'Journal.count' do
2366 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'}
2367 end
2372 end
2368 issue = Issue.find(1)
2373 issue = Issue.find(1)
2369 assert_equal "changed", issue.subject
2374 assert_equal "changed", issue.subject
2370 assert_equal 2, issue.assigned_to_id
2375 assert_equal 2, issue.assigned_to_id
2371 end
2376 end
2372 end
2377 end
2373 end
2378 end
2374
2379
2375 def test_new_as_copy
2380 def test_new_as_copy
2376 @request.session[:user_id] = 2
2381 @request.session[:user_id] = 2
2377 get :new, :project_id => 1, :copy_from => 1
2382 get :new, :project_id => 1, :copy_from => 1
2378
2383
2379 assert_response :success
2384 assert_response :success
2380 assert_template 'new'
2385 assert_template 'new'
2381
2386
2382 assert_not_nil assigns(:issue)
2387 assert_not_nil assigns(:issue)
2383 orig = Issue.find(1)
2388 orig = Issue.find(1)
2384 assert_equal 1, assigns(:issue).project_id
2389 assert_equal 1, assigns(:issue).project_id
2385 assert_equal orig.subject, assigns(:issue).subject
2390 assert_equal orig.subject, assigns(:issue).subject
2386 assert assigns(:issue).copy?
2391 assert assigns(:issue).copy?
2387
2392
2388 assert_select 'form[id=issue-form][action=/projects/ecookbook/issues]' do
2393 assert_select 'form[id=issue-form][action=/projects/ecookbook/issues]' do
2389 assert_select 'select[name=?]', 'issue[project_id]' do
2394 assert_select 'select[name=?]', 'issue[project_id]' do
2390 assert_select 'option[value=1][selected=selected]', :text => 'eCookbook'
2395 assert_select 'option[value=1][selected=selected]', :text => 'eCookbook'
2391 assert_select 'option[value=2]:not([selected])', :text => 'OnlineStore'
2396 assert_select 'option[value=2]:not([selected])', :text => 'OnlineStore'
2392 end
2397 end
2393 assert_select 'input[name=copy_from][value=1]'
2398 assert_select 'input[name=copy_from][value=1]'
2394 end
2399 end
2395
2400
2396 # "New issue" menu item should not link to copy
2401 # "New issue" menu item should not link to copy
2397 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]'
2398 end
2403 end
2399
2404
2400 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
2401 @request.session[:user_id] = 2
2406 @request.session[:user_id] = 2
2402 issue = Issue.find(3)
2407 issue = Issue.find(3)
2403 assert issue.attachments.count > 0
2408 assert issue.attachments.count > 0
2404 get :new, :project_id => 1, :copy_from => 3
2409 get :new, :project_id => 1, :copy_from => 3
2405
2410
2406 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]'
2407 end
2412 end
2408
2413
2409 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
2410 @request.session[:user_id] = 2
2415 @request.session[:user_id] = 2
2411 issue = Issue.find(3)
2416 issue = Issue.find(3)
2412 issue.attachments.delete_all
2417 issue.attachments.delete_all
2413 get :new, :project_id => 1, :copy_from => 3
2418 get :new, :project_id => 1, :copy_from => 3
2414
2419
2415 assert_select 'input[name=copy_attachments]', 0
2420 assert_select 'input[name=copy_attachments]', 0
2416 end
2421 end
2417
2422
2418 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
2419 @request.session[:user_id] = 2
2424 @request.session[:user_id] = 2
2420 issue = Issue.generate_with_descendants!
2425 issue = Issue.generate_with_descendants!
2421 get :new, :project_id => 1, :copy_from => issue.id
2426 get :new, :project_id => 1, :copy_from => issue.id
2422
2427
2423 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]'
2424 end
2429 end
2425
2430
2426 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
2427 @request.session[:user_id] = 2
2432 @request.session[:user_id] = 2
2428 get :new, :project_id => 1, :copy_from => 99999
2433 get :new, :project_id => 1, :copy_from => 99999
2429 assert_response 404
2434 assert_response 404
2430 end
2435 end
2431
2436
2432 def test_create_as_copy_on_different_project
2437 def test_create_as_copy_on_different_project
2433 @request.session[:user_id] = 2
2438 @request.session[:user_id] = 2
2434 assert_difference 'Issue.count' do
2439 assert_difference 'Issue.count' do
2435 post :create, :project_id => 1, :copy_from => 1,
2440 post :create, :project_id => 1, :copy_from => 1,
2436 :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'}
2437
2442
2438 assert_not_nil assigns(:issue)
2443 assert_not_nil assigns(:issue)
2439 assert assigns(:issue).copy?
2444 assert assigns(:issue).copy?
2440 end
2445 end
2441 issue = Issue.first(:order => 'id DESC')
2446 issue = Issue.first(:order => 'id DESC')
2442 assert_redirected_to "/issues/#{issue.id}"
2447 assert_redirected_to "/issues/#{issue.id}"
2443
2448
2444 assert_equal 2, issue.project_id
2449 assert_equal 2, issue.project_id
2445 assert_equal 3, issue.tracker_id
2450 assert_equal 3, issue.tracker_id
2446 assert_equal 'Copy', issue.subject
2451 assert_equal 'Copy', issue.subject
2447 end
2452 end
2448
2453
2449 def test_create_as_copy_should_copy_attachments
2454 def test_create_as_copy_should_copy_attachments
2450 @request.session[:user_id] = 2
2455 @request.session[:user_id] = 2
2451 issue = Issue.find(3)
2456 issue = Issue.find(3)
2452 count = issue.attachments.count
2457 count = issue.attachments.count
2453 assert count > 0
2458 assert count > 0
2454 assert_difference 'Issue.count' do
2459 assert_difference 'Issue.count' do
2455 assert_difference 'Attachment.count', count do
2460 assert_difference 'Attachment.count', count do
2456 assert_difference 'Journal.count', 2 do
2461 assert_difference 'Journal.count', 2 do
2457 post :create, :project_id => 1, :copy_from => 3,
2462 post :create, :project_id => 1, :copy_from => 3,
2458 :issue => {:project_id => '1', :tracker_id => '3',
2463 :issue => {:project_id => '1', :tracker_id => '3',
2459 :status_id => '1', :subject => 'Copy with attachments'},
2464 :status_id => '1', :subject => 'Copy with attachments'},
2460 :copy_attachments => '1'
2465 :copy_attachments => '1'
2461 end
2466 end
2462 end
2467 end
2463 end
2468 end
2464 copy = Issue.first(:order => 'id DESC')
2469 copy = Issue.first(:order => 'id DESC')
2465 assert_equal count, copy.attachments.count
2470 assert_equal count, copy.attachments.count
2466 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
2467 end
2472 end
2468
2473
2469 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
2470 @request.session[:user_id] = 2
2475 @request.session[:user_id] = 2
2471 issue = Issue.find(3)
2476 issue = Issue.find(3)
2472 count = issue.attachments.count
2477 count = issue.attachments.count
2473 assert count > 0
2478 assert count > 0
2474 assert_difference 'Issue.count' do
2479 assert_difference 'Issue.count' do
2475 assert_no_difference 'Attachment.count' do
2480 assert_no_difference 'Attachment.count' do
2476 assert_difference 'Journal.count', 2 do
2481 assert_difference 'Journal.count', 2 do
2477 post :create, :project_id => 1, :copy_from => 3,
2482 post :create, :project_id => 1, :copy_from => 3,
2478 :issue => {:project_id => '1', :tracker_id => '3',
2483 :issue => {:project_id => '1', :tracker_id => '3',
2479 :status_id => '1', :subject => 'Copy with attachments'}
2484 :status_id => '1', :subject => 'Copy with attachments'}
2480 end
2485 end
2481 end
2486 end
2482 end
2487 end
2483 copy = Issue.first(:order => 'id DESC')
2488 copy = Issue.first(:order => 'id DESC')
2484 assert_equal 0, copy.attachments.count
2489 assert_equal 0, copy.attachments.count
2485 end
2490 end
2486
2491
2487 def test_create_as_copy_with_attachments_should_add_new_files
2492 def test_create_as_copy_with_attachments_should_add_new_files
2488 @request.session[:user_id] = 2
2493 @request.session[:user_id] = 2
2489 issue = Issue.find(3)
2494 issue = Issue.find(3)
2490 count = issue.attachments.count
2495 count = issue.attachments.count
2491 assert count > 0
2496 assert count > 0
2492 assert_difference 'Issue.count' do
2497 assert_difference 'Issue.count' do
2493 assert_difference 'Attachment.count', count + 1 do
2498 assert_difference 'Attachment.count', count + 1 do
2494 assert_difference 'Journal.count', 2 do
2499 assert_difference 'Journal.count', 2 do
2495 post :create, :project_id => 1, :copy_from => 3,
2500 post :create, :project_id => 1, :copy_from => 3,
2496 :issue => {:project_id => '1', :tracker_id => '3',
2501 :issue => {:project_id => '1', :tracker_id => '3',
2497 :status_id => '1', :subject => 'Copy with attachments'},
2502 :status_id => '1', :subject => 'Copy with attachments'},
2498 :copy_attachments => '1',
2503 :copy_attachments => '1',
2499 :attachments => {'1' =>
2504 :attachments => {'1' =>
2500 {'file' => uploaded_test_file('testfile.txt', 'text/plain'),
2505 {'file' => uploaded_test_file('testfile.txt', 'text/plain'),
2501 'description' => 'test file'}}
2506 'description' => 'test file'}}
2502 end
2507 end
2503 end
2508 end
2504 end
2509 end
2505 copy = Issue.first(:order => 'id DESC')
2510 copy = Issue.first(:order => 'id DESC')
2506 assert_equal count + 1, copy.attachments.count
2511 assert_equal count + 1, copy.attachments.count
2507 end
2512 end
2508
2513
2509 def test_create_as_copy_should_add_relation_with_copied_issue
2514 def test_create_as_copy_should_add_relation_with_copied_issue
2510 @request.session[:user_id] = 2
2515 @request.session[:user_id] = 2
2511 assert_difference 'Issue.count' do
2516 assert_difference 'Issue.count' do
2512 assert_difference 'IssueRelation.count' do
2517 assert_difference 'IssueRelation.count' do
2513 post :create, :project_id => 1, :copy_from => 1,
2518 post :create, :project_id => 1, :copy_from => 1,
2514 :issue => {:project_id => '1', :tracker_id => '3',
2519 :issue => {:project_id => '1', :tracker_id => '3',
2515 :status_id => '1', :subject => 'Copy'}
2520 :status_id => '1', :subject => 'Copy'}
2516 end
2521 end
2517 end
2522 end
2518 copy = Issue.first(:order => 'id DESC')
2523 copy = Issue.first(:order => 'id DESC')
2519 assert_equal 1, copy.relations.size
2524 assert_equal 1, copy.relations.size
2520 end
2525 end
2521
2526
2522 def test_create_as_copy_should_copy_subtasks
2527 def test_create_as_copy_should_copy_subtasks
2523 @request.session[:user_id] = 2
2528 @request.session[:user_id] = 2
2524 issue = Issue.generate_with_descendants!
2529 issue = Issue.generate_with_descendants!
2525 count = issue.descendants.count
2530 count = issue.descendants.count
2526 assert_difference 'Issue.count', count + 1 do
2531 assert_difference 'Issue.count', count + 1 do
2527 assert_difference 'Journal.count', (count + 1) * 2 do
2532 assert_difference 'Journal.count', (count + 1) * 2 do
2528 post :create, :project_id => 1, :copy_from => issue.id,
2533 post :create, :project_id => 1, :copy_from => issue.id,
2529 :issue => {:project_id => '1', :tracker_id => '3',
2534 :issue => {:project_id => '1', :tracker_id => '3',
2530 :status_id => '1', :subject => 'Copy with subtasks'},
2535 :status_id => '1', :subject => 'Copy with subtasks'},
2531 :copy_subtasks => '1'
2536 :copy_subtasks => '1'
2532 end
2537 end
2533 end
2538 end
2534 copy = Issue.where(:parent_id => nil).first(:order => 'id DESC')
2539 copy = Issue.where(:parent_id => nil).first(:order => 'id DESC')
2535 assert_equal count, copy.descendants.count
2540 assert_equal count, copy.descendants.count
2536 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
2537 end
2542 end
2538
2543
2539 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
2540 @request.session[:user_id] = 2
2545 @request.session[:user_id] = 2
2541 issue = Issue.generate_with_descendants!
2546 issue = Issue.generate_with_descendants!
2542 assert_difference 'Issue.count', 1 do
2547 assert_difference 'Issue.count', 1 do
2543 assert_difference 'Journal.count', 2 do
2548 assert_difference 'Journal.count', 2 do
2544 post :create, :project_id => 1, :copy_from => 3,
2549 post :create, :project_id => 1, :copy_from => 3,
2545 :issue => {:project_id => '1', :tracker_id => '3',
2550 :issue => {:project_id => '1', :tracker_id => '3',
2546 :status_id => '1', :subject => 'Copy with subtasks'}
2551 :status_id => '1', :subject => 'Copy with subtasks'}
2547 end
2552 end
2548 end
2553 end
2549 copy = Issue.where(:parent_id => nil).first(:order => 'id DESC')
2554 copy = Issue.where(:parent_id => nil).first(:order => 'id DESC')
2550 assert_equal 0, copy.descendants.count
2555 assert_equal 0, copy.descendants.count
2551 end
2556 end
2552
2557
2553 def test_create_as_copy_with_failure
2558 def test_create_as_copy_with_failure
2554 @request.session[:user_id] = 2
2559 @request.session[:user_id] = 2
2555 post :create, :project_id => 1, :copy_from => 1,
2560 post :create, :project_id => 1, :copy_from => 1,
2556 :issue => {:project_id => '2', :tracker_id => '3', :status_id => '1', :subject => ''}
2561 :issue => {:project_id => '2', :tracker_id => '3', :status_id => '1', :subject => ''}
2557
2562
2558 assert_response :success
2563 assert_response :success
2559 assert_template 'new'
2564 assert_template 'new'
2560
2565
2561 assert_not_nil assigns(:issue)
2566 assert_not_nil assigns(:issue)
2562 assert assigns(:issue).copy?
2567 assert assigns(:issue).copy?
2563
2568
2564 assert_select 'form#issue-form[action=/projects/ecookbook/issues]' do
2569 assert_select 'form#issue-form[action=/projects/ecookbook/issues]' do
2565 assert_select 'select[name=?]', 'issue[project_id]' do
2570 assert_select 'select[name=?]', 'issue[project_id]' do
2566 assert_select 'option[value=1]:not([selected])', :text => 'eCookbook'
2571 assert_select 'option[value=1]:not([selected])', :text => 'eCookbook'
2567 assert_select 'option[value=2][selected=selected]', :text => 'OnlineStore'
2572 assert_select 'option[value=2][selected=selected]', :text => 'OnlineStore'
2568 end
2573 end
2569 assert_select 'input[name=copy_from][value=1]'
2574 assert_select 'input[name=copy_from][value=1]'
2570 end
2575 end
2571 end
2576 end
2572
2577
2573 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
2574 @request.session[:user_id] = 2
2579 @request.session[:user_id] = 2
2575 assert !User.find(2).member_of?(Project.find(4))
2580 assert !User.find(2).member_of?(Project.find(4))
2576
2581
2577 assert_difference 'Issue.count' do
2582 assert_difference 'Issue.count' do
2578 post :create, :project_id => 1, :copy_from => 1,
2583 post :create, :project_id => 1, :copy_from => 1,
2579 :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'}
2580 end
2585 end
2581 issue = Issue.first(:order => 'id DESC')
2586 issue = Issue.first(:order => 'id DESC')
2582 assert_equal 1, issue.project_id
2587 assert_equal 1, issue.project_id
2583 end
2588 end
2584
2589
2585 def test_get_edit
2590 def test_get_edit
2586 @request.session[:user_id] = 2
2591 @request.session[:user_id] = 2
2587 get :edit, :id => 1
2592 get :edit, :id => 1
2588 assert_response :success
2593 assert_response :success
2589 assert_template 'edit'
2594 assert_template 'edit'
2590 assert_not_nil assigns(:issue)
2595 assert_not_nil assigns(:issue)
2591 assert_equal Issue.find(1), assigns(:issue)
2596 assert_equal Issue.find(1), assigns(:issue)
2592
2597
2593 # Be sure we don't display inactive IssuePriorities
2598 # Be sure we don't display inactive IssuePriorities
2594 assert ! IssuePriority.find(15).active?
2599 assert ! IssuePriority.find(15).active?
2595 assert_select 'select[name=?]', 'issue[priority_id]' do
2600 assert_select 'select[name=?]', 'issue[priority_id]' do
2596 assert_select 'option[value=15]', 0
2601 assert_select 'option[value=15]', 0
2597 end
2602 end
2598 end
2603 end
2599
2604
2600 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
2601 @request.session[:user_id] = 2
2606 @request.session[:user_id] = 2
2602 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]
2603
2608
2604 get :edit, :id => 1
2609 get :edit, :id => 1
2605 assert_select 'input[name=?]', 'time_entry[hours]'
2610 assert_select 'input[name=?]', 'time_entry[hours]'
2606 end
2611 end
2607
2612
2608 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
2609 @request.session[:user_id] = 2
2614 @request.session[:user_id] = 2
2610 Role.find_by_name('Manager').remove_permission! :log_time
2615 Role.find_by_name('Manager').remove_permission! :log_time
2611
2616
2612 get :edit, :id => 1
2617 get :edit, :id => 1
2613 assert_select 'input[name=?]', 'time_entry[hours]', 0
2618 assert_select 'input[name=?]', 'time_entry[hours]', 0
2614 end
2619 end
2615
2620
2616 def test_get_edit_with_params
2621 def test_get_edit_with_params
2617 @request.session[:user_id] = 2
2622 @request.session[:user_id] = 2
2618 get :edit, :id => 1, :issue => { :status_id => 5, :priority_id => 7 },
2623 get :edit, :id => 1, :issue => { :status_id => 5, :priority_id => 7 },
2619 :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 }
2620 assert_response :success
2625 assert_response :success
2621 assert_template 'edit'
2626 assert_template 'edit'
2622
2627
2623 issue = assigns(:issue)
2628 issue = assigns(:issue)
2624 assert_not_nil issue
2629 assert_not_nil issue
2625
2630
2626 assert_equal 5, issue.status_id
2631 assert_equal 5, issue.status_id
2627 assert_select 'select[name=?]', 'issue[status_id]' do
2632 assert_select 'select[name=?]', 'issue[status_id]' do
2628 assert_select 'option[value=5][selected=selected]', :text => 'Closed'
2633 assert_select 'option[value=5][selected=selected]', :text => 'Closed'
2629 end
2634 end
2630
2635
2631 assert_equal 7, issue.priority_id
2636 assert_equal 7, issue.priority_id
2632 assert_select 'select[name=?]', 'issue[priority_id]' do
2637 assert_select 'select[name=?]', 'issue[priority_id]' do
2633 assert_select 'option[value=7][selected=selected]', :text => 'Urgent'
2638 assert_select 'option[value=7][selected=selected]', :text => 'Urgent'
2634 end
2639 end
2635
2640
2636 assert_select 'input[name=?][value=2.5]', 'time_entry[hours]'
2641 assert_select 'input[name=?][value=2.5]', 'time_entry[hours]'
2637 assert_select 'select[name=?]', 'time_entry[activity_id]' do
2642 assert_select 'select[name=?]', 'time_entry[activity_id]' do
2638 assert_select 'option[value=10][selected=selected]', :text => 'Development'
2643 assert_select 'option[value=10][selected=selected]', :text => 'Development'
2639 end
2644 end
2640 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]'
2641 end
2646 end
2642
2647
2643 def test_get_edit_with_multi_custom_field
2648 def test_get_edit_with_multi_custom_field
2644 field = CustomField.find(1)
2649 field = CustomField.find(1)
2645 field.update_attribute :multiple, true
2650 field.update_attribute :multiple, true
2646 issue = Issue.find(1)
2651 issue = Issue.find(1)
2647 issue.custom_field_values = {1 => ['MySQL', 'Oracle']}
2652 issue.custom_field_values = {1 => ['MySQL', 'Oracle']}
2648 issue.save!
2653 issue.save!
2649
2654
2650 @request.session[:user_id] = 2
2655 @request.session[:user_id] = 2
2651 get :edit, :id => 1
2656 get :edit, :id => 1
2652 assert_response :success
2657 assert_response :success
2653 assert_template 'edit'
2658 assert_template 'edit'
2654
2659
2655 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
2656 assert_select 'option', 3
2661 assert_select 'option', 3
2657 assert_select 'option[value=MySQL][selected=selected]'
2662 assert_select 'option[value=MySQL][selected=selected]'
2658 assert_select 'option[value=Oracle][selected=selected]'
2663 assert_select 'option[value=Oracle][selected=selected]'
2659 assert_select 'option[value=PostgreSQL]:not([selected])'
2664 assert_select 'option[value=PostgreSQL]:not([selected])'
2660 end
2665 end
2661 end
2666 end
2662
2667
2663 def test_update_form_for_existing_issue
2668 def test_update_form_for_existing_issue
2664 @request.session[:user_id] = 2
2669 @request.session[:user_id] = 2
2665 xhr :put, :update_form, :project_id => 1,
2670 xhr :put, :update_form, :project_id => 1,
2666 :id => 1,
2671 :id => 1,
2667 :issue => {:tracker_id => 2,
2672 :issue => {:tracker_id => 2,
2668 :subject => 'This is the test_new issue',
2673 :subject => 'This is the test_new issue',
2669 :description => 'This is the description',
2674 :description => 'This is the description',
2670 :priority_id => 5}
2675 :priority_id => 5}
2671 assert_response :success
2676 assert_response :success
2672 assert_equal 'text/javascript', response.content_type
2677 assert_equal 'text/javascript', response.content_type
2673 assert_template 'update_form'
2678 assert_template 'update_form'
2674 assert_template 'form'
2679 assert_template 'form'
2675
2680
2676 issue = assigns(:issue)
2681 issue = assigns(:issue)
2677 assert_kind_of Issue, issue
2682 assert_kind_of Issue, issue
2678 assert_equal 1, issue.id
2683 assert_equal 1, issue.id
2679 assert_equal 1, issue.project_id
2684 assert_equal 1, issue.project_id
2680 assert_equal 2, issue.tracker_id
2685 assert_equal 2, issue.tracker_id
2681 assert_equal 'This is the test_new issue', issue.subject
2686 assert_equal 'This is the test_new issue', issue.subject
2682 end
2687 end
2683
2688
2684 def test_update_form_for_existing_issue_should_keep_issue_author
2689 def test_update_form_for_existing_issue_should_keep_issue_author
2685 @request.session[:user_id] = 3
2690 @request.session[:user_id] = 3
2686 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'}
2687 assert_response :success
2692 assert_response :success
2688 assert_equal 'text/javascript', response.content_type
2693 assert_equal 'text/javascript', response.content_type
2689
2694
2690 issue = assigns(:issue)
2695 issue = assigns(:issue)
2691 assert_equal User.find(2), issue.author
2696 assert_equal User.find(2), issue.author
2692 assert_equal 2, issue.author_id
2697 assert_equal 2, issue.author_id
2693 assert_not_equal User.current, issue.author
2698 assert_not_equal User.current, issue.author
2694 end
2699 end
2695
2700
2696 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
2697 @request.session[:user_id] = 2
2702 @request.session[:user_id] = 2
2698 WorkflowTransition.delete_all
2703 WorkflowTransition.delete_all
2699 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)
2700 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)
2701 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)
2702
2707
2703 xhr :put, :update_form, :project_id => 1,
2708 xhr :put, :update_form, :project_id => 1,
2704 :id => 2,
2709 :id => 2,
2705 :issue => {:tracker_id => 2,
2710 :issue => {:tracker_id => 2,
2706 :status_id => 5,
2711 :status_id => 5,
2707 :subject => 'This is an issue'}
2712 :subject => 'This is an issue'}
2708
2713
2709 assert_equal 5, assigns(:issue).status_id
2714 assert_equal 5, assigns(:issue).status_id
2710 assert_equal [1,2,5], assigns(:allowed_statuses).map(&:id).sort
2715 assert_equal [1,2,5], assigns(:allowed_statuses).map(&:id).sort
2711 end
2716 end
2712
2717
2713 def test_update_form_for_existing_issue_with_project_change
2718 def test_update_form_for_existing_issue_with_project_change
2714 @request.session[:user_id] = 2
2719 @request.session[:user_id] = 2
2715 xhr :put, :update_form, :project_id => 1,
2720 xhr :put, :update_form, :project_id => 1,
2716 :id => 1,
2721 :id => 1,
2717 :issue => {:project_id => 2,
2722 :issue => {:project_id => 2,
2718 :tracker_id => 2,
2723 :tracker_id => 2,
2719 :subject => 'This is the test_new issue',
2724 :subject => 'This is the test_new issue',
2720 :description => 'This is the description',
2725 :description => 'This is the description',
2721 :priority_id => 5}
2726 :priority_id => 5}
2722 assert_response :success
2727 assert_response :success
2723 assert_template 'form'
2728 assert_template 'form'
2724
2729
2725 issue = assigns(:issue)
2730 issue = assigns(:issue)
2726 assert_kind_of Issue, issue
2731 assert_kind_of Issue, issue
2727 assert_equal 1, issue.id
2732 assert_equal 1, issue.id
2728 assert_equal 2, issue.project_id
2733 assert_equal 2, issue.project_id
2729 assert_equal 2, issue.tracker_id
2734 assert_equal 2, issue.tracker_id
2730 assert_equal 'This is the test_new issue', issue.subject
2735 assert_equal 'This is the test_new issue', issue.subject
2731 end
2736 end
2732
2737
2733 def test_update_form_should_propose_default_status_for_existing_issue
2738 def test_update_form_should_propose_default_status_for_existing_issue
2734 @request.session[:user_id] = 2
2739 @request.session[:user_id] = 2
2735 WorkflowTransition.delete_all
2740 WorkflowTransition.delete_all
2736 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)
2737
2742
2738 xhr :put, :update_form, :project_id => 1, :id => 2
2743 xhr :put, :update_form, :project_id => 1, :id => 2
2739 assert_response :success
2744 assert_response :success
2740 assert_equal [2,3], assigns(:allowed_statuses).map(&:id).sort
2745 assert_equal [2,3], assigns(:allowed_statuses).map(&:id).sort
2741 end
2746 end
2742
2747
2743 def test_put_update_without_custom_fields_param
2748 def test_put_update_without_custom_fields_param
2744 @request.session[:user_id] = 2
2749 @request.session[:user_id] = 2
2745 ActionMailer::Base.deliveries.clear
2750 ActionMailer::Base.deliveries.clear
2746
2751
2747 issue = Issue.find(1)
2752 issue = Issue.find(1)
2748 assert_equal '125', issue.custom_value_for(2).value
2753 assert_equal '125', issue.custom_value_for(2).value
2749 old_subject = issue.subject
2754 old_subject = issue.subject
2750 new_subject = 'Subject modified by IssuesControllerTest#test_post_edit'
2755 new_subject = 'Subject modified by IssuesControllerTest#test_post_edit'
2751
2756
2752 assert_difference('Journal.count') do
2757 assert_difference('Journal.count') do
2753 assert_difference('JournalDetail.count', 2) do
2758 assert_difference('JournalDetail.count', 2) do
2754 put :update, :id => 1, :issue => {:subject => new_subject,
2759 put :update, :id => 1, :issue => {:subject => new_subject,
2755 :priority_id => '6',
2760 :priority_id => '6',
2756 :category_id => '1' # no change
2761 :category_id => '1' # no change
2757 }
2762 }
2758 end
2763 end
2759 end
2764 end
2760 assert_redirected_to :action => 'show', :id => '1'
2765 assert_redirected_to :action => 'show', :id => '1'
2761 issue.reload
2766 issue.reload
2762 assert_equal new_subject, issue.subject
2767 assert_equal new_subject, issue.subject
2763 # Make sure custom fields were not cleared
2768 # Make sure custom fields were not cleared
2764 assert_equal '125', issue.custom_value_for(2).value
2769 assert_equal '125', issue.custom_value_for(2).value
2765
2770
2766 mail = ActionMailer::Base.deliveries.last
2771 mail = ActionMailer::Base.deliveries.last
2767 assert_not_nil mail
2772 assert_not_nil mail
2768 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}]")
2769 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
2770 end
2775 end
2771
2776
2772 def test_put_update_with_project_change
2777 def test_put_update_with_project_change
2773 @request.session[:user_id] = 2
2778 @request.session[:user_id] = 2
2774 ActionMailer::Base.deliveries.clear
2779 ActionMailer::Base.deliveries.clear
2775
2780
2776 assert_difference('Journal.count') do
2781 assert_difference('Journal.count') do
2777 assert_difference('JournalDetail.count', 3) do
2782 assert_difference('JournalDetail.count', 3) do
2778 put :update, :id => 1, :issue => {:project_id => '2',
2783 put :update, :id => 1, :issue => {:project_id => '2',
2779 :tracker_id => '1', # no change
2784 :tracker_id => '1', # no change
2780 :priority_id => '6',
2785 :priority_id => '6',
2781 :category_id => '3'
2786 :category_id => '3'
2782 }
2787 }
2783 end
2788 end
2784 end
2789 end
2785 assert_redirected_to :action => 'show', :id => '1'
2790 assert_redirected_to :action => 'show', :id => '1'
2786 issue = Issue.find(1)
2791 issue = Issue.find(1)
2787 assert_equal 2, issue.project_id
2792 assert_equal 2, issue.project_id
2788 assert_equal 1, issue.tracker_id
2793 assert_equal 1, issue.tracker_id
2789 assert_equal 6, issue.priority_id
2794 assert_equal 6, issue.priority_id
2790 assert_equal 3, issue.category_id
2795 assert_equal 3, issue.category_id
2791
2796
2792 mail = ActionMailer::Base.deliveries.last
2797 mail = ActionMailer::Base.deliveries.last
2793 assert_not_nil mail
2798 assert_not_nil mail
2794 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}]")
2795 assert_mail_body_match "Project changed from eCookbook to OnlineStore", mail
2800 assert_mail_body_match "Project changed from eCookbook to OnlineStore", mail
2796 end
2801 end
2797
2802
2798 def test_put_update_with_tracker_change
2803 def test_put_update_with_tracker_change
2799 @request.session[:user_id] = 2
2804 @request.session[:user_id] = 2
2800 ActionMailer::Base.deliveries.clear
2805 ActionMailer::Base.deliveries.clear
2801
2806
2802 assert_difference('Journal.count') do
2807 assert_difference('Journal.count') do
2803 assert_difference('JournalDetail.count', 2) do
2808 assert_difference('JournalDetail.count', 2) do
2804 put :update, :id => 1, :issue => {:project_id => '1',
2809 put :update, :id => 1, :issue => {:project_id => '1',
2805 :tracker_id => '2',
2810 :tracker_id => '2',
2806 :priority_id => '6'
2811 :priority_id => '6'
2807 }
2812 }
2808 end
2813 end
2809 end
2814 end
2810 assert_redirected_to :action => 'show', :id => '1'
2815 assert_redirected_to :action => 'show', :id => '1'
2811 issue = Issue.find(1)
2816 issue = Issue.find(1)
2812 assert_equal 1, issue.project_id
2817 assert_equal 1, issue.project_id
2813 assert_equal 2, issue.tracker_id
2818 assert_equal 2, issue.tracker_id
2814 assert_equal 6, issue.priority_id
2819 assert_equal 6, issue.priority_id
2815 assert_equal 1, issue.category_id
2820 assert_equal 1, issue.category_id
2816
2821
2817 mail = ActionMailer::Base.deliveries.last
2822 mail = ActionMailer::Base.deliveries.last
2818 assert_not_nil mail
2823 assert_not_nil mail
2819 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}]")
2820 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
2821 end
2826 end
2822
2827
2823 def test_put_update_with_custom_field_change
2828 def test_put_update_with_custom_field_change
2824 @request.session[:user_id] = 2
2829 @request.session[:user_id] = 2
2825 issue = Issue.find(1)
2830 issue = Issue.find(1)
2826 assert_equal '125', issue.custom_value_for(2).value
2831 assert_equal '125', issue.custom_value_for(2).value
2827
2832
2828 assert_difference('Journal.count') do
2833 assert_difference('Journal.count') do
2829 assert_difference('JournalDetail.count', 3) do
2834 assert_difference('JournalDetail.count', 3) do
2830 put :update, :id => 1, :issue => {:subject => 'Custom field change',
2835 put :update, :id => 1, :issue => {:subject => 'Custom field change',
2831 :priority_id => '6',
2836 :priority_id => '6',
2832 :category_id => '1', # no change
2837 :category_id => '1', # no change
2833 :custom_field_values => { '2' => 'New custom value' }
2838 :custom_field_values => { '2' => 'New custom value' }
2834 }
2839 }
2835 end
2840 end
2836 end
2841 end
2837 assert_redirected_to :action => 'show', :id => '1'
2842 assert_redirected_to :action => 'show', :id => '1'
2838 issue.reload
2843 issue.reload
2839 assert_equal 'New custom value', issue.custom_value_for(2).value
2844 assert_equal 'New custom value', issue.custom_value_for(2).value
2840
2845
2841 mail = ActionMailer::Base.deliveries.last
2846 mail = ActionMailer::Base.deliveries.last
2842 assert_not_nil mail
2847 assert_not_nil mail
2843 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
2844 end
2849 end
2845
2850
2846 def test_put_update_with_multi_custom_field_change
2851 def test_put_update_with_multi_custom_field_change
2847 field = CustomField.find(1)
2852 field = CustomField.find(1)
2848 field.update_attribute :multiple, true
2853 field.update_attribute :multiple, true
2849 issue = Issue.find(1)
2854 issue = Issue.find(1)
2850 issue.custom_field_values = {1 => ['MySQL', 'Oracle']}
2855 issue.custom_field_values = {1 => ['MySQL', 'Oracle']}
2851 issue.save!
2856 issue.save!
2852
2857
2853 @request.session[:user_id] = 2
2858 @request.session[:user_id] = 2
2854 assert_difference('Journal.count') do
2859 assert_difference('Journal.count') do
2855 assert_difference('JournalDetail.count', 3) do
2860 assert_difference('JournalDetail.count', 3) do
2856 put :update, :id => 1,
2861 put :update, :id => 1,
2857 :issue => {
2862 :issue => {
2858 :subject => 'Custom field change',
2863 :subject => 'Custom field change',
2859 :custom_field_values => { '1' => ['', 'Oracle', 'PostgreSQL'] }
2864 :custom_field_values => { '1' => ['', 'Oracle', 'PostgreSQL'] }
2860 }
2865 }
2861 end
2866 end
2862 end
2867 end
2863 assert_redirected_to :action => 'show', :id => '1'
2868 assert_redirected_to :action => 'show', :id => '1'
2864 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
2865 end
2870 end
2866
2871
2867 def test_put_update_with_status_and_assignee_change
2872 def test_put_update_with_status_and_assignee_change
2868 issue = Issue.find(1)
2873 issue = Issue.find(1)
2869 assert_equal 1, issue.status_id
2874 assert_equal 1, issue.status_id
2870 @request.session[:user_id] = 2
2875 @request.session[:user_id] = 2
2871 assert_difference('TimeEntry.count', 0) do
2876 assert_difference('TimeEntry.count', 0) do
2872 put :update,
2877 put :update,
2873 :id => 1,
2878 :id => 1,
2874 :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' },
2875 :time_entry => { :hours => '', :comments => '', :activity_id => TimeEntryActivity.first }
2880 :time_entry => { :hours => '', :comments => '', :activity_id => TimeEntryActivity.first }
2876 end
2881 end
2877 assert_redirected_to :action => 'show', :id => '1'
2882 assert_redirected_to :action => 'show', :id => '1'
2878 issue.reload
2883 issue.reload
2879 assert_equal 2, issue.status_id
2884 assert_equal 2, issue.status_id
2880 j = Journal.order('id DESC').first
2885 j = Journal.order('id DESC').first
2881 assert_equal 'Assigned to dlopper', j.notes
2886 assert_equal 'Assigned to dlopper', j.notes
2882 assert_equal 2, j.details.size
2887 assert_equal 2, j.details.size
2883
2888
2884 mail = ActionMailer::Base.deliveries.last
2889 mail = ActionMailer::Base.deliveries.last
2885 assert_mail_body_match "Status changed from New to Assigned", mail
2890 assert_mail_body_match "Status changed from New to Assigned", mail
2886 # subject should contain the new status
2891 # subject should contain the new status
2887 assert mail.subject.include?("(#{ IssueStatus.find(2).name })")
2892 assert mail.subject.include?("(#{ IssueStatus.find(2).name })")
2888 end
2893 end
2889
2894
2890 def test_put_update_with_note_only
2895 def test_put_update_with_note_only
2891 notes = 'Note added by IssuesControllerTest#test_update_with_note_only'
2896 notes = 'Note added by IssuesControllerTest#test_update_with_note_only'
2892 # anonymous user
2897 # anonymous user
2893 put :update,
2898 put :update,
2894 :id => 1,
2899 :id => 1,
2895 :issue => { :notes => notes }
2900 :issue => { :notes => notes }
2896 assert_redirected_to :action => 'show', :id => '1'
2901 assert_redirected_to :action => 'show', :id => '1'
2897 j = Journal.order('id DESC').first
2902 j = Journal.order('id DESC').first
2898 assert_equal notes, j.notes
2903 assert_equal notes, j.notes
2899 assert_equal 0, j.details.size
2904 assert_equal 0, j.details.size
2900 assert_equal User.anonymous, j.user
2905 assert_equal User.anonymous, j.user
2901
2906
2902 mail = ActionMailer::Base.deliveries.last
2907 mail = ActionMailer::Base.deliveries.last
2903 assert_mail_body_match notes, mail
2908 assert_mail_body_match notes, mail
2904 end
2909 end
2905
2910
2906 def test_put_update_with_private_note_only
2911 def test_put_update_with_private_note_only
2907 notes = 'Private note'
2912 notes = 'Private note'
2908 @request.session[:user_id] = 2
2913 @request.session[:user_id] = 2
2909
2914
2910 assert_difference 'Journal.count' do
2915 assert_difference 'Journal.count' do
2911 put :update, :id => 1, :issue => {:notes => notes, :private_notes => '1'}
2916 put :update, :id => 1, :issue => {:notes => notes, :private_notes => '1'}
2912 assert_redirected_to :action => 'show', :id => '1'
2917 assert_redirected_to :action => 'show', :id => '1'
2913 end
2918 end
2914
2919
2915 j = Journal.order('id DESC').first
2920 j = Journal.order('id DESC').first
2916 assert_equal notes, j.notes
2921 assert_equal notes, j.notes
2917 assert_equal true, j.private_notes
2922 assert_equal true, j.private_notes
2918 end
2923 end
2919
2924
2920 def test_put_update_with_private_note_and_changes
2925 def test_put_update_with_private_note_and_changes
2921 notes = 'Private note'
2926 notes = 'Private note'
2922 @request.session[:user_id] = 2
2927 @request.session[:user_id] = 2
2923
2928
2924 assert_difference 'Journal.count', 2 do
2929 assert_difference 'Journal.count', 2 do
2925 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'}
2926 assert_redirected_to :action => 'show', :id => '1'
2931 assert_redirected_to :action => 'show', :id => '1'
2927 end
2932 end
2928
2933
2929 j = Journal.order('id DESC').first
2934 j = Journal.order('id DESC').first
2930 assert_equal notes, j.notes
2935 assert_equal notes, j.notes
2931 assert_equal true, j.private_notes
2936 assert_equal true, j.private_notes
2932 assert_equal 0, j.details.count
2937 assert_equal 0, j.details.count
2933
2938
2934 j = Journal.order('id DESC').offset(1).first
2939 j = Journal.order('id DESC').offset(1).first
2935 assert_nil j.notes
2940 assert_nil j.notes
2936 assert_equal false, j.private_notes
2941 assert_equal false, j.private_notes
2937 assert_equal 1, j.details.count
2942 assert_equal 1, j.details.count
2938 end
2943 end
2939
2944
2940 def test_put_update_with_note_and_spent_time
2945 def test_put_update_with_note_and_spent_time
2941 @request.session[:user_id] = 2
2946 @request.session[:user_id] = 2
2942 spent_hours_before = Issue.find(1).spent_hours
2947 spent_hours_before = Issue.find(1).spent_hours
2943 assert_difference('TimeEntry.count') do
2948 assert_difference('TimeEntry.count') do
2944 put :update,
2949 put :update,
2945 :id => 1,
2950 :id => 1,
2946 :issue => { :notes => '2.5 hours added' },
2951 :issue => { :notes => '2.5 hours added' },
2947 :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 }
2948 end
2953 end
2949 assert_redirected_to :action => 'show', :id => '1'
2954 assert_redirected_to :action => 'show', :id => '1'
2950
2955
2951 issue = Issue.find(1)
2956 issue = Issue.find(1)
2952
2957
2953 j = Journal.order('id DESC').first
2958 j = Journal.order('id DESC').first
2954 assert_equal '2.5 hours added', j.notes
2959 assert_equal '2.5 hours added', j.notes
2955 assert_equal 0, j.details.size
2960 assert_equal 0, j.details.size
2956
2961
2957 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')
2958 assert_not_nil t
2963 assert_not_nil t
2959 assert_equal 2.5, t.hours
2964 assert_equal 2.5, t.hours
2960 assert_equal spent_hours_before + 2.5, issue.spent_hours
2965 assert_equal spent_hours_before + 2.5, issue.spent_hours
2961 end
2966 end
2962
2967
2963 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
2964 parent = Issue.generate!(:project_id => 1, :is_private => true)
2969 parent = Issue.generate!(:project_id => 1, :is_private => true)
2965 issue = Issue.generate!(:parent_issue_id => parent.id)
2970 issue = Issue.generate!(:parent_issue_id => parent.id)
2966 assert !parent.visible?(User.find(3))
2971 assert !parent.visible?(User.find(3))
2967 @request.session[:user_id] = 3
2972 @request.session[:user_id] = 3
2968
2973
2969 get :edit, :id => issue.id
2974 get :edit, :id => issue.id
2970 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
2971
2976
2972 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}
2973 assert_response 302
2978 assert_response 302
2974 assert_equal parent, issue.parent
2979 assert_equal parent, issue.parent
2975 end
2980 end
2976
2981
2977 def test_put_update_with_attachment_only
2982 def test_put_update_with_attachment_only
2978 set_tmp_attachments_directory
2983 set_tmp_attachments_directory
2979
2984
2980 # 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
2981 # journal to get fetched in the next find.
2986 # journal to get fetched in the next find.
2982 Journal.delete_all
2987 Journal.delete_all
2983
2988
2984 # anonymous user
2989 # anonymous user
2985 assert_difference 'Attachment.count' do
2990 assert_difference 'Attachment.count' do
2986 put :update, :id => 1,
2991 put :update, :id => 1,
2987 :issue => {:notes => ''},
2992 :issue => {:notes => ''},
2988 :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'}}
2989 end
2994 end
2990
2995
2991 assert_redirected_to :action => 'show', :id => '1'
2996 assert_redirected_to :action => 'show', :id => '1'
2992 j = Issue.find(1).journals.reorder('id DESC').first
2997 j = Issue.find(1).journals.reorder('id DESC').first
2993 assert j.notes.blank?
2998 assert j.notes.blank?
2994 assert_equal 1, j.details.size
2999 assert_equal 1, j.details.size
2995 assert_equal 'testfile.txt', j.details.first.value
3000 assert_equal 'testfile.txt', j.details.first.value
2996 assert_equal User.anonymous, j.user
3001 assert_equal User.anonymous, j.user
2997
3002
2998 attachment = Attachment.first(:order => 'id DESC')
3003 attachment = Attachment.first(:order => 'id DESC')
2999 assert_equal Issue.find(1), attachment.container
3004 assert_equal Issue.find(1), attachment.container
3000 assert_equal User.anonymous, attachment.author
3005 assert_equal User.anonymous, attachment.author
3001 assert_equal 'testfile.txt', attachment.filename
3006 assert_equal 'testfile.txt', attachment.filename
3002 assert_equal 'text/plain', attachment.content_type
3007 assert_equal 'text/plain', attachment.content_type
3003 assert_equal 'test file', attachment.description
3008 assert_equal 'test file', attachment.description
3004 assert_equal 59, attachment.filesize
3009 assert_equal 59, attachment.filesize
3005 assert File.exists?(attachment.diskfile)
3010 assert File.exists?(attachment.diskfile)
3006 assert_equal 59, File.size(attachment.diskfile)
3011 assert_equal 59, File.size(attachment.diskfile)
3007
3012
3008 mail = ActionMailer::Base.deliveries.last
3013 mail = ActionMailer::Base.deliveries.last
3009 assert_mail_body_match 'testfile.txt', mail
3014 assert_mail_body_match 'testfile.txt', mail
3010 end
3015 end
3011
3016
3012 def test_put_update_with_failure_should_save_attachments
3017 def test_put_update_with_failure_should_save_attachments
3013 set_tmp_attachments_directory
3018 set_tmp_attachments_directory
3014 @request.session[:user_id] = 2
3019 @request.session[:user_id] = 2
3015
3020
3016 assert_no_difference 'Journal.count' do
3021 assert_no_difference 'Journal.count' do
3017 assert_difference 'Attachment.count' do
3022 assert_difference 'Attachment.count' do
3018 put :update, :id => 1,
3023 put :update, :id => 1,
3019 :issue => { :subject => '' },
3024 :issue => { :subject => '' },
3020 :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'}}
3021 assert_response :success
3026 assert_response :success
3022 assert_template 'edit'
3027 assert_template 'edit'
3023 end
3028 end
3024 end
3029 end
3025
3030
3026 attachment = Attachment.first(:order => 'id DESC')
3031 attachment = Attachment.first(:order => 'id DESC')
3027 assert_equal 'testfile.txt', attachment.filename
3032 assert_equal 'testfile.txt', attachment.filename
3028 assert File.exists?(attachment.diskfile)
3033 assert File.exists?(attachment.diskfile)
3029 assert_nil attachment.container
3034 assert_nil attachment.container
3030
3035
3031 assert_select 'input[name=?][value=?]', 'attachments[p0][token]', attachment.token
3036 assert_select 'input[name=?][value=?]', 'attachments[p0][token]', attachment.token
3032 assert_select 'input[name=?][value=?]', 'attachments[p0][filename]', 'testfile.txt'
3037 assert_select 'input[name=?][value=?]', 'attachments[p0][filename]', 'testfile.txt'
3033 end
3038 end
3034
3039
3035 def test_put_update_with_failure_should_keep_saved_attachments
3040 def test_put_update_with_failure_should_keep_saved_attachments
3036 set_tmp_attachments_directory
3041 set_tmp_attachments_directory
3037 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)
3038 @request.session[:user_id] = 2
3043 @request.session[:user_id] = 2
3039
3044
3040 assert_no_difference 'Journal.count' do
3045 assert_no_difference 'Journal.count' do
3041 assert_no_difference 'Attachment.count' do
3046 assert_no_difference 'Attachment.count' do
3042 put :update, :id => 1,
3047 put :update, :id => 1,
3043 :issue => { :subject => '' },
3048 :issue => { :subject => '' },
3044 :attachments => {'p0' => {'token' => attachment.token}}
3049 :attachments => {'p0' => {'token' => attachment.token}}
3045 assert_response :success
3050 assert_response :success
3046 assert_template 'edit'
3051 assert_template 'edit'
3047 end
3052 end
3048 end
3053 end
3049
3054
3050 assert_select 'input[name=?][value=?]', 'attachments[p0][token]', attachment.token
3055 assert_select 'input[name=?][value=?]', 'attachments[p0][token]', attachment.token
3051 assert_select 'input[name=?][value=?]', 'attachments[p0][filename]', 'testfile.txt'
3056 assert_select 'input[name=?][value=?]', 'attachments[p0][filename]', 'testfile.txt'
3052 end
3057 end
3053
3058
3054 def test_put_update_should_attach_saved_attachments
3059 def test_put_update_should_attach_saved_attachments
3055 set_tmp_attachments_directory
3060 set_tmp_attachments_directory
3056 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)
3057 @request.session[:user_id] = 2
3062 @request.session[:user_id] = 2
3058
3063
3059 assert_difference 'Journal.count' do
3064 assert_difference 'Journal.count' do
3060 assert_difference 'JournalDetail.count' do
3065 assert_difference 'JournalDetail.count' do
3061 assert_no_difference 'Attachment.count' do
3066 assert_no_difference 'Attachment.count' do
3062 put :update, :id => 1,
3067 put :update, :id => 1,
3063 :issue => {:notes => 'Attachment added'},
3068 :issue => {:notes => 'Attachment added'},
3064 :attachments => {'p0' => {'token' => attachment.token}}
3069 :attachments => {'p0' => {'token' => attachment.token}}
3065 assert_redirected_to '/issues/1'
3070 assert_redirected_to '/issues/1'
3066 end
3071 end
3067 end
3072 end
3068 end
3073 end
3069
3074
3070 attachment.reload
3075 attachment.reload
3071 assert_equal Issue.find(1), attachment.container
3076 assert_equal Issue.find(1), attachment.container
3072
3077
3073 journal = Journal.first(:order => 'id DESC')
3078 journal = Journal.first(:order => 'id DESC')
3074 assert_equal 1, journal.details.size
3079 assert_equal 1, journal.details.size
3075 assert_equal 'testfile.txt', journal.details.first.value
3080 assert_equal 'testfile.txt', journal.details.first.value
3076 end
3081 end
3077
3082
3078 def test_put_update_with_attachment_that_fails_to_save
3083 def test_put_update_with_attachment_that_fails_to_save
3079 set_tmp_attachments_directory
3084 set_tmp_attachments_directory
3080
3085
3081 # 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
3082 # journal to get fetched in the next find.
3087 # journal to get fetched in the next find.
3083 Journal.delete_all
3088 Journal.delete_all
3084
3089
3085 # Mock out the unsaved attachment
3090 # Mock out the unsaved attachment
3086 Attachment.any_instance.stubs(:create).returns(Attachment.new)
3091 Attachment.any_instance.stubs(:create).returns(Attachment.new)
3087
3092
3088 # anonymous user
3093 # anonymous user
3089 put :update,
3094 put :update,
3090 :id => 1,
3095 :id => 1,
3091 :issue => {:notes => ''},
3096 :issue => {:notes => ''},
3092 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
3097 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
3093 assert_redirected_to :action => 'show', :id => '1'
3098 assert_redirected_to :action => 'show', :id => '1'
3094 assert_equal '1 file(s) could not be saved.', flash[:warning]
3099 assert_equal '1 file(s) could not be saved.', flash[:warning]
3095 end
3100 end
3096
3101
3097 def test_put_update_with_no_change
3102 def test_put_update_with_no_change
3098 issue = Issue.find(1)
3103 issue = Issue.find(1)
3099 issue.journals.clear
3104 issue.journals.clear
3100 ActionMailer::Base.deliveries.clear
3105 ActionMailer::Base.deliveries.clear
3101
3106
3102 put :update,
3107 put :update,
3103 :id => 1,
3108 :id => 1,
3104 :issue => {:notes => ''}
3109 :issue => {:notes => ''}
3105 assert_redirected_to :action => 'show', :id => '1'
3110 assert_redirected_to :action => 'show', :id => '1'
3106
3111
3107 issue.reload
3112 issue.reload
3108 assert issue.journals.empty?
3113 assert issue.journals.empty?
3109 # No email should be sent
3114 # No email should be sent
3110 assert ActionMailer::Base.deliveries.empty?
3115 assert ActionMailer::Base.deliveries.empty?
3111 end
3116 end
3112
3117
3113 def test_put_update_should_send_a_notification
3118 def test_put_update_should_send_a_notification
3114 @request.session[:user_id] = 2
3119 @request.session[:user_id] = 2
3115 ActionMailer::Base.deliveries.clear
3120 ActionMailer::Base.deliveries.clear
3116 issue = Issue.find(1)
3121 issue = Issue.find(1)
3117 old_subject = issue.subject
3122 old_subject = issue.subject
3118 new_subject = 'Subject modified by IssuesControllerTest#test_post_edit'
3123 new_subject = 'Subject modified by IssuesControllerTest#test_post_edit'
3119
3124
3120 put :update, :id => 1, :issue => {:subject => new_subject,
3125 put :update, :id => 1, :issue => {:subject => new_subject,
3121 :priority_id => '6',
3126 :priority_id => '6',
3122 :category_id => '1' # no change
3127 :category_id => '1' # no change
3123 }
3128 }
3124 assert_equal 1, ActionMailer::Base.deliveries.size
3129 assert_equal 1, ActionMailer::Base.deliveries.size
3125 end
3130 end
3126
3131
3127 def test_put_update_with_invalid_spent_time_hours_only
3132 def test_put_update_with_invalid_spent_time_hours_only
3128 @request.session[:user_id] = 2
3133 @request.session[:user_id] = 2
3129 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'
3130
3135
3131 assert_no_difference('Journal.count') do
3136 assert_no_difference('Journal.count') do
3132 put :update,
3137 put :update,
3133 :id => 1,
3138 :id => 1,
3134 :issue => {:notes => notes},
3139 :issue => {:notes => notes},
3135 :time_entry => {"comments"=>"", "activity_id"=>"", "hours"=>"2z"}
3140 :time_entry => {"comments"=>"", "activity_id"=>"", "hours"=>"2z"}
3136 end
3141 end
3137 assert_response :success
3142 assert_response :success
3138 assert_template 'edit'
3143 assert_template 'edit'
3139
3144
3140 assert_error_tag :descendant => {:content => /Activity can&#x27;t be blank/}
3145 assert_error_tag :descendant => {:content => /Activity can&#x27;t be blank/}
3141 assert_select 'textarea[name=?]', 'issue[notes]', :text => notes
3146 assert_select 'textarea[name=?]', 'issue[notes]', :text => notes
3142 assert_select 'input[name=?][value=?]', 'time_entry[hours]', '2z'
3147 assert_select 'input[name=?][value=?]', 'time_entry[hours]', '2z'
3143 end
3148 end
3144
3149
3145 def test_put_update_with_invalid_spent_time_comments_only
3150 def test_put_update_with_invalid_spent_time_comments_only
3146 @request.session[:user_id] = 2
3151 @request.session[:user_id] = 2
3147 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'
3148
3153
3149 assert_no_difference('Journal.count') do
3154 assert_no_difference('Journal.count') do
3150 put :update,
3155 put :update,
3151 :id => 1,
3156 :id => 1,
3152 :issue => {:notes => notes},
3157 :issue => {:notes => notes},
3153 :time_entry => {"comments"=>"this is my comment", "activity_id"=>"", "hours"=>""}
3158 :time_entry => {"comments"=>"this is my comment", "activity_id"=>"", "hours"=>""}
3154 end
3159 end
3155 assert_response :success
3160 assert_response :success
3156 assert_template 'edit'
3161 assert_template 'edit'
3157
3162
3158 assert_error_tag :descendant => {:content => /Activity can&#x27;t be blank/}
3163 assert_error_tag :descendant => {:content => /Activity can&#x27;t be blank/}
3159 assert_error_tag :descendant => {:content => /Hours can&#x27;t be blank/}
3164 assert_error_tag :descendant => {:content => /Hours can&#x27;t be blank/}
3160 assert_select 'textarea[name=?]', 'issue[notes]', :text => notes
3165 assert_select 'textarea[name=?]', 'issue[notes]', :text => notes
3161 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'
3162 end
3167 end
3163
3168
3164 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
3165 issue = Issue.find(2)
3170 issue = Issue.find(2)
3166 @request.session[:user_id] = 2
3171 @request.session[:user_id] = 2
3167
3172
3168 put :update,
3173 put :update,
3169 :id => issue.id,
3174 :id => issue.id,
3170 :issue => {
3175 :issue => {
3171 :fixed_version_id => 4
3176 :fixed_version_id => 4
3172 }
3177 }
3173
3178
3174 assert_response :redirect
3179 assert_response :redirect
3175 issue.reload
3180 issue.reload
3176 assert_equal 4, issue.fixed_version_id
3181 assert_equal 4, issue.fixed_version_id
3177 assert_not_equal issue.project_id, issue.fixed_version.project_id
3182 assert_not_equal issue.project_id, issue.fixed_version.project_id
3178 end
3183 end
3179
3184
3180 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
3181 issue = Issue.find(2)
3186 issue = Issue.find(2)
3182 @request.session[:user_id] = 2
3187 @request.session[:user_id] = 2
3183
3188
3184 put :update,
3189 put :update,
3185 :id => issue.id,
3190 :id => issue.id,
3186 :issue => {
3191 :issue => {
3187 :fixed_version_id => 4
3192 :fixed_version_id => 4
3188 },
3193 },
3189 :back_url => '/issues'
3194 :back_url => '/issues'
3190
3195
3191 assert_response :redirect
3196 assert_response :redirect
3192 assert_redirected_to '/issues'
3197 assert_redirected_to '/issues'
3193 end
3198 end
3194
3199
3195 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
3196 issue = Issue.find(2)
3201 issue = Issue.find(2)
3197 @request.session[:user_id] = 2
3202 @request.session[:user_id] = 2
3198
3203
3199 put :update,
3204 put :update,
3200 :id => issue.id,
3205 :id => issue.id,
3201 :issue => {
3206 :issue => {
3202 :fixed_version_id => 4
3207 :fixed_version_id => 4
3203 },
3208 },
3204 :back_url => 'http://google.com'
3209 :back_url => 'http://google.com'
3205
3210
3206 assert_response :redirect
3211 assert_response :redirect
3207 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue.id
3212 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue.id
3208 end
3213 end
3209
3214
3210 def test_get_bulk_edit
3215 def test_get_bulk_edit
3211 @request.session[:user_id] = 2
3216 @request.session[:user_id] = 2
3212 get :bulk_edit, :ids => [1, 2]
3217 get :bulk_edit, :ids => [1, 2]
3213 assert_response :success
3218 assert_response :success
3214 assert_template 'bulk_edit'
3219 assert_template 'bulk_edit'
3215
3220
3216 assert_select 'ul#bulk-selection' do
3221 assert_select 'ul#bulk-selection' do
3217 assert_select 'li', 2
3222 assert_select 'li', 2
3218 assert_select 'li a', :text => 'Bug #1'
3223 assert_select 'li a', :text => 'Bug #1'
3219 end
3224 end
3220
3225
3221 assert_select 'form#bulk_edit_form[action=?]', '/issues/bulk_update' do
3226 assert_select 'form#bulk_edit_form[action=?]', '/issues/bulk_update' do
3222 assert_select 'input[name=?]', 'ids[]', 2
3227 assert_select 'input[name=?]', 'ids[]', 2
3223 assert_select 'input[name=?][value=1][type=hidden]', 'ids[]'
3228 assert_select 'input[name=?][value=1][type=hidden]', 'ids[]'
3224
3229
3225 assert_select 'select[name=?]', 'issue[project_id]'
3230 assert_select 'select[name=?]', 'issue[project_id]'
3226 assert_select 'input[name=?]', 'issue[parent_issue_id]'
3231 assert_select 'input[name=?]', 'issue[parent_issue_id]'
3227
3232
3228 # Project specific custom field, date type
3233 # Project specific custom field, date type
3229 field = CustomField.find(9)
3234 field = CustomField.find(9)
3230 assert !field.is_for_all?
3235 assert !field.is_for_all?
3231 assert_equal 'date', field.field_format
3236 assert_equal 'date', field.field_format
3232 assert_select 'input[name=?]', 'issue[custom_field_values][9]'
3237 assert_select 'input[name=?]', 'issue[custom_field_values][9]'
3233
3238
3234 # System wide custom field
3239 # System wide custom field
3235 assert CustomField.find(1).is_for_all?
3240 assert CustomField.find(1).is_for_all?
3236 assert_select 'select[name=?]', 'issue[custom_field_values][1]'
3241 assert_select 'select[name=?]', 'issue[custom_field_values][1]'
3237
3242
3238 # Be sure we don't display inactive IssuePriorities
3243 # Be sure we don't display inactive IssuePriorities
3239 assert ! IssuePriority.find(15).active?
3244 assert ! IssuePriority.find(15).active?
3240 assert_select 'select[name=?]', 'issue[priority_id]' do
3245 assert_select 'select[name=?]', 'issue[priority_id]' do
3241 assert_select 'option[value=15]', 0
3246 assert_select 'option[value=15]', 0
3242 end
3247 end
3243 end
3248 end
3244 end
3249 end
3245
3250
3246 def test_get_bulk_edit_on_different_projects
3251 def test_get_bulk_edit_on_different_projects
3247 @request.session[:user_id] = 2
3252 @request.session[:user_id] = 2
3248 get :bulk_edit, :ids => [1, 2, 6]
3253 get :bulk_edit, :ids => [1, 2, 6]
3249 assert_response :success
3254 assert_response :success
3250 assert_template 'bulk_edit'
3255 assert_template 'bulk_edit'
3251
3256
3252 # 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
3253 assert_select 'input[name=?]', 'issue[parent_issue_id]', 0
3258 assert_select 'input[name=?]', 'issue[parent_issue_id]', 0
3254
3259
3255 # Project specific custom field, date type
3260 # Project specific custom field, date type
3256 field = CustomField.find(9)
3261 field = CustomField.find(9)
3257 assert !field.is_for_all?
3262 assert !field.is_for_all?
3258 assert !field.project_ids.include?(Issue.find(6).project_id)
3263 assert !field.project_ids.include?(Issue.find(6).project_id)
3259 assert_select 'input[name=?]', 'issue[custom_field_values][9]', 0
3264 assert_select 'input[name=?]', 'issue[custom_field_values][9]', 0
3260 end
3265 end
3261
3266
3262 def test_get_bulk_edit_with_user_custom_field
3267 def test_get_bulk_edit_with_user_custom_field
3263 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)
3264
3269
3265 @request.session[:user_id] = 2
3270 @request.session[:user_id] = 2
3266 get :bulk_edit, :ids => [1, 2]
3271 get :bulk_edit, :ids => [1, 2]
3267 assert_response :success
3272 assert_response :success
3268 assert_template 'bulk_edit'
3273 assert_template 'bulk_edit'
3269
3274
3270 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
3271 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
3272 end
3277 end
3273 end
3278 end
3274
3279
3275 def test_get_bulk_edit_with_version_custom_field
3280 def test_get_bulk_edit_with_version_custom_field
3276 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)
3277
3282
3278 @request.session[:user_id] = 2
3283 @request.session[:user_id] = 2
3279 get :bulk_edit, :ids => [1, 2]
3284 get :bulk_edit, :ids => [1, 2]
3280 assert_response :success
3285 assert_response :success
3281 assert_template 'bulk_edit'
3286 assert_template 'bulk_edit'
3282
3287
3283 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
3284 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
3285 end
3290 end
3286 end
3291 end
3287
3292
3288 def test_get_bulk_edit_with_multi_custom_field
3293 def test_get_bulk_edit_with_multi_custom_field
3289 field = CustomField.find(1)
3294 field = CustomField.find(1)
3290 field.update_attribute :multiple, true
3295 field.update_attribute :multiple, true
3291
3296
3292 @request.session[:user_id] = 2
3297 @request.session[:user_id] = 2
3293 get :bulk_edit, :ids => [1, 2]
3298 get :bulk_edit, :ids => [1, 2]
3294 assert_response :success
3299 assert_response :success
3295 assert_template 'bulk_edit'
3300 assert_template 'bulk_edit'
3296
3301
3297 assert_select 'select[name=?]', 'issue[custom_field_values][1][]' do
3302 assert_select 'select[name=?]', 'issue[custom_field_values][1][]' do
3298 assert_select 'option', field.possible_values.size + 1 # "none" options
3303 assert_select 'option', field.possible_values.size + 1 # "none" options
3299 end
3304 end
3300 end
3305 end
3301
3306
3302 def test_bulk_edit_should_propose_to_clear_text_custom_fields
3307 def test_bulk_edit_should_propose_to_clear_text_custom_fields
3303 @request.session[:user_id] = 2
3308 @request.session[:user_id] = 2
3304 get :bulk_edit, :ids => [1, 3]
3309 get :bulk_edit, :ids => [1, 3]
3305 assert_select 'input[name=?][value=?]', 'issue[custom_field_values][2]', '__none__'
3310 assert_select 'input[name=?][value=?]', 'issue[custom_field_values][2]', '__none__'
3306 end
3311 end
3307
3312
3308 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
3309 WorkflowTransition.delete_all
3314 WorkflowTransition.delete_all
3310 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1,
3315 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1,
3311 :old_status_id => 1, :new_status_id => 1)
3316 :old_status_id => 1, :new_status_id => 1)
3312 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1,
3317 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1,
3313 :old_status_id => 1, :new_status_id => 3)
3318 :old_status_id => 1, :new_status_id => 3)
3314 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1,
3319 WorkflowTransition.create!(:role_id => 1, :tracker_id => 1,
3315 :old_status_id => 1, :new_status_id => 4)
3320 :old_status_id => 1, :new_status_id => 4)
3316 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2,
3321 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2,
3317 :old_status_id => 2, :new_status_id => 1)
3322 :old_status_id => 2, :new_status_id => 1)
3318 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2,
3323 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2,
3319 :old_status_id => 2, :new_status_id => 3)
3324 :old_status_id => 2, :new_status_id => 3)
3320 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2,
3325 WorkflowTransition.create!(:role_id => 1, :tracker_id => 2,
3321 :old_status_id => 2, :new_status_id => 5)
3326 :old_status_id => 2, :new_status_id => 5)
3322 @request.session[:user_id] = 2
3327 @request.session[:user_id] = 2
3323 get :bulk_edit, :ids => [1, 2]
3328 get :bulk_edit, :ids => [1, 2]
3324
3329
3325 assert_response :success
3330 assert_response :success
3326 statuses = assigns(:available_statuses)
3331 statuses = assigns(:available_statuses)
3327 assert_not_nil statuses
3332 assert_not_nil statuses
3328 assert_equal [1, 3], statuses.map(&:id).sort
3333 assert_equal [1, 3], statuses.map(&:id).sort
3329
3334
3330 assert_select 'select[name=?]', 'issue[status_id]' do
3335 assert_select 'select[name=?]', 'issue[status_id]' do
3331 assert_select 'option', 3 # 2 statuses + "no change" option
3336 assert_select 'option', 3 # 2 statuses + "no change" option
3332 end
3337 end
3333 end
3338 end
3334
3339
3335 def test_bulk_edit_should_propose_target_project_open_shared_versions
3340 def test_bulk_edit_should_propose_target_project_open_shared_versions
3336 @request.session[:user_id] = 2
3341 @request.session[:user_id] = 2
3337 post :bulk_edit, :ids => [1, 2, 6], :issue => {:project_id => 1}
3342 post :bulk_edit, :ids => [1, 2, 6], :issue => {:project_id => 1}
3338 assert_response :success
3343 assert_response :success
3339 assert_template 'bulk_edit'
3344 assert_template 'bulk_edit'
3340 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
3341
3346
3342 assert_select 'select[name=?]', 'issue[fixed_version_id]' do
3347 assert_select 'select[name=?]', 'issue[fixed_version_id]' do
3343 assert_select 'option', :text => '2.0'
3348 assert_select 'option', :text => '2.0'
3344 end
3349 end
3345 end
3350 end
3346
3351
3347 def test_bulk_edit_should_propose_target_project_categories
3352 def test_bulk_edit_should_propose_target_project_categories
3348 @request.session[:user_id] = 2
3353 @request.session[:user_id] = 2
3349 post :bulk_edit, :ids => [1, 2, 6], :issue => {:project_id => 1}
3354 post :bulk_edit, :ids => [1, 2, 6], :issue => {:project_id => 1}
3350 assert_response :success
3355 assert_response :success
3351 assert_template 'bulk_edit'
3356 assert_template 'bulk_edit'
3352 assert_equal Project.find(1).issue_categories.sort, assigns(:categories).sort
3357 assert_equal Project.find(1).issue_categories.sort, assigns(:categories).sort
3353
3358
3354 assert_select 'select[name=?]', 'issue[category_id]' do
3359 assert_select 'select[name=?]', 'issue[category_id]' do
3355 assert_select 'option', :text => 'Recipes'
3360 assert_select 'option', :text => 'Recipes'
3356 end
3361 end
3357 end
3362 end
3358
3363
3359 def test_bulk_update
3364 def test_bulk_update
3360 @request.session[:user_id] = 2
3365 @request.session[:user_id] = 2
3361 # update issues priority
3366 # update issues priority
3362 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing',
3367 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing',
3363 :issue => {:priority_id => 7,
3368 :issue => {:priority_id => 7,
3364 :assigned_to_id => '',
3369 :assigned_to_id => '',
3365 :custom_field_values => {'2' => ''}}
3370 :custom_field_values => {'2' => ''}}
3366
3371
3367 assert_response 302
3372 assert_response 302
3368 # check that the issues were updated
3373 # check that the issues were updated
3369 assert_equal [7, 7], Issue.find_all_by_id([1, 2]).collect {|i| i.priority.id}
3374 assert_equal [7, 7], Issue.find_all_by_id([1, 2]).collect {|i| i.priority.id}
3370
3375
3371 issue = Issue.find(1)
3376 issue = Issue.find(1)
3372 journal = issue.journals.reorder('created_on DESC').first
3377 journal = issue.journals.reorder('created_on DESC').first
3373 assert_equal '125', issue.custom_value_for(2).value
3378 assert_equal '125', issue.custom_value_for(2).value
3374 assert_equal 'Bulk editing', journal.notes
3379 assert_equal 'Bulk editing', journal.notes
3375 assert_equal 1, journal.details.size
3380 assert_equal 1, journal.details.size
3376 end
3381 end
3377
3382
3378 def test_bulk_update_with_group_assignee
3383 def test_bulk_update_with_group_assignee
3379 group = Group.find(11)
3384 group = Group.find(11)
3380 project = Project.find(1)
3385 project = Project.find(1)
3381 project.members << Member.new(:principal => group, :roles => [Role.givable.first])
3386 project.members << Member.new(:principal => group, :roles => [Role.givable.first])
3382
3387
3383 @request.session[:user_id] = 2
3388 @request.session[:user_id] = 2
3384 # update issues assignee
3389 # update issues assignee
3385 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing',
3390 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing',
3386 :issue => {:priority_id => '',
3391 :issue => {:priority_id => '',
3387 :assigned_to_id => group.id,
3392 :assigned_to_id => group.id,
3388 :custom_field_values => {'2' => ''}}
3393 :custom_field_values => {'2' => ''}}
3389
3394
3390 assert_response 302
3395 assert_response 302
3391 assert_equal [group, group], Issue.find_all_by_id([1, 2]).collect {|i| i.assigned_to}
3396 assert_equal [group, group], Issue.find_all_by_id([1, 2]).collect {|i| i.assigned_to}
3392 end
3397 end
3393
3398
3394 def test_bulk_update_on_different_projects
3399 def test_bulk_update_on_different_projects
3395 @request.session[:user_id] = 2
3400 @request.session[:user_id] = 2
3396 # update issues priority
3401 # update issues priority
3397 post :bulk_update, :ids => [1, 2, 6], :notes => 'Bulk editing',
3402 post :bulk_update, :ids => [1, 2, 6], :notes => 'Bulk editing',
3398 :issue => {:priority_id => 7,
3403 :issue => {:priority_id => 7,
3399 :assigned_to_id => '',
3404 :assigned_to_id => '',
3400 :custom_field_values => {'2' => ''}}
3405 :custom_field_values => {'2' => ''}}
3401
3406
3402 assert_response 302
3407 assert_response 302
3403 # check that the issues were updated
3408 # check that the issues were updated
3404 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)
3405
3410
3406 issue = Issue.find(1)
3411 issue = Issue.find(1)
3407 journal = issue.journals.reorder('created_on DESC').first
3412 journal = issue.journals.reorder('created_on DESC').first
3408 assert_equal '125', issue.custom_value_for(2).value
3413 assert_equal '125', issue.custom_value_for(2).value
3409 assert_equal 'Bulk editing', journal.notes
3414 assert_equal 'Bulk editing', journal.notes
3410 assert_equal 1, journal.details.size
3415 assert_equal 1, journal.details.size
3411 end
3416 end
3412
3417
3413 def test_bulk_update_on_different_projects_without_rights
3418 def test_bulk_update_on_different_projects_without_rights
3414 @request.session[:user_id] = 3
3419 @request.session[:user_id] = 3
3415 user = User.find(3)
3420 user = User.find(3)
3416 action = { :controller => "issues", :action => "bulk_update" }
3421 action = { :controller => "issues", :action => "bulk_update" }
3417 assert user.allowed_to?(action, Issue.find(1).project)
3422 assert user.allowed_to?(action, Issue.find(1).project)
3418 assert ! user.allowed_to?(action, Issue.find(6).project)
3423 assert ! user.allowed_to?(action, Issue.find(6).project)
3419 post :bulk_update, :ids => [1, 6], :notes => 'Bulk should fail',
3424 post :bulk_update, :ids => [1, 6], :notes => 'Bulk should fail',
3420 :issue => {:priority_id => 7,
3425 :issue => {:priority_id => 7,
3421 :assigned_to_id => '',
3426 :assigned_to_id => '',
3422 :custom_field_values => {'2' => ''}}
3427 :custom_field_values => {'2' => ''}}
3423 assert_response 403
3428 assert_response 403
3424 assert_not_equal "Bulk should fail", Journal.last.notes
3429 assert_not_equal "Bulk should fail", Journal.last.notes
3425 end
3430 end
3426
3431
3427 def test_bullk_update_should_send_a_notification
3432 def test_bullk_update_should_send_a_notification
3428 @request.session[:user_id] = 2
3433 @request.session[:user_id] = 2
3429 ActionMailer::Base.deliveries.clear
3434 ActionMailer::Base.deliveries.clear
3430 post(:bulk_update,
3435 post(:bulk_update,
3431 {
3436 {
3432 :ids => [1, 2],
3437 :ids => [1, 2],
3433 :notes => 'Bulk editing',
3438 :notes => 'Bulk editing',
3434 :issue => {
3439 :issue => {
3435 :priority_id => 7,
3440 :priority_id => 7,
3436 :assigned_to_id => '',
3441 :assigned_to_id => '',
3437 :custom_field_values => {'2' => ''}
3442 :custom_field_values => {'2' => ''}
3438 }
3443 }
3439 })
3444 })
3440
3445
3441 assert_response 302
3446 assert_response 302
3442 assert_equal 2, ActionMailer::Base.deliveries.size
3447 assert_equal 2, ActionMailer::Base.deliveries.size
3443 end
3448 end
3444
3449
3445 def test_bulk_update_project
3450 def test_bulk_update_project
3446 @request.session[:user_id] = 2
3451 @request.session[:user_id] = 2
3447 post :bulk_update, :ids => [1, 2], :issue => {:project_id => '2'}
3452 post :bulk_update, :ids => [1, 2], :issue => {:project_id => '2'}
3448 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook'
3453 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook'
3449 # Issues moved to project 2
3454 # Issues moved to project 2
3450 assert_equal 2, Issue.find(1).project_id
3455 assert_equal 2, Issue.find(1).project_id
3451 assert_equal 2, Issue.find(2).project_id
3456 assert_equal 2, Issue.find(2).project_id
3452 # No tracker change
3457 # No tracker change
3453 assert_equal 1, Issue.find(1).tracker_id
3458 assert_equal 1, Issue.find(1).tracker_id
3454 assert_equal 2, Issue.find(2).tracker_id
3459 assert_equal 2, Issue.find(2).tracker_id
3455 end
3460 end
3456
3461
3457 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
3458 @request.session[:user_id] = 2
3463 @request.session[:user_id] = 2
3459 post :bulk_update, :id => 1, :issue => {:project_id => '2'}, :follow => '1'
3464 post :bulk_update, :id => 1, :issue => {:project_id => '2'}, :follow => '1'
3460 assert_redirected_to '/issues/1'
3465 assert_redirected_to '/issues/1'
3461 end
3466 end
3462
3467
3463 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
3464 @request.session[:user_id] = 2
3469 @request.session[:user_id] = 2
3465 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'
3466 assert_redirected_to '/projects/onlinestore/issues'
3471 assert_redirected_to '/projects/onlinestore/issues'
3467 end
3472 end
3468
3473
3469 def test_bulk_update_tracker
3474 def test_bulk_update_tracker
3470 @request.session[:user_id] = 2
3475 @request.session[:user_id] = 2
3471 post :bulk_update, :ids => [1, 2], :issue => {:tracker_id => '2'}
3476 post :bulk_update, :ids => [1, 2], :issue => {:tracker_id => '2'}
3472 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook'
3477 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook'
3473 assert_equal 2, Issue.find(1).tracker_id
3478 assert_equal 2, Issue.find(1).tracker_id
3474 assert_equal 2, Issue.find(2).tracker_id
3479 assert_equal 2, Issue.find(2).tracker_id
3475 end
3480 end
3476
3481
3477 def test_bulk_update_status
3482 def test_bulk_update_status
3478 @request.session[:user_id] = 2
3483 @request.session[:user_id] = 2
3479 # update issues priority
3484 # update issues priority
3480 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing status',
3485 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing status',
3481 :issue => {:priority_id => '',
3486 :issue => {:priority_id => '',
3482 :assigned_to_id => '',
3487 :assigned_to_id => '',
3483 :status_id => '5'}
3488 :status_id => '5'}
3484
3489
3485 assert_response 302
3490 assert_response 302
3486 issue = Issue.find(1)
3491 issue = Issue.find(1)
3487 assert issue.closed?
3492 assert issue.closed?
3488 end
3493 end
3489
3494
3490 def test_bulk_update_priority
3495 def test_bulk_update_priority
3491 @request.session[:user_id] = 2
3496 @request.session[:user_id] = 2
3492 post :bulk_update, :ids => [1, 2], :issue => {:priority_id => 6}
3497 post :bulk_update, :ids => [1, 2], :issue => {:priority_id => 6}
3493
3498
3494 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook'
3499 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook'
3495 assert_equal 6, Issue.find(1).priority_id
3500 assert_equal 6, Issue.find(1).priority_id
3496 assert_equal 6, Issue.find(2).priority_id
3501 assert_equal 6, Issue.find(2).priority_id
3497 end
3502 end
3498
3503
3499 def test_bulk_update_with_notes
3504 def test_bulk_update_with_notes
3500 @request.session[:user_id] = 2
3505 @request.session[:user_id] = 2
3501 post :bulk_update, :ids => [1, 2], :notes => 'Moving two issues'
3506 post :bulk_update, :ids => [1, 2], :notes => 'Moving two issues'
3502
3507
3503 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook'
3508 assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook'
3504 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
3505 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
3506 end
3511 end
3507
3512
3508 def test_bulk_update_parent_id
3513 def test_bulk_update_parent_id
3509 IssueRelation.delete_all
3514 IssueRelation.delete_all
3510 @request.session[:user_id] = 2
3515 @request.session[:user_id] = 2
3511 post :bulk_update, :ids => [1, 3],
3516 post :bulk_update, :ids => [1, 3],
3512 :notes => 'Bulk editing parent',
3517 :notes => 'Bulk editing parent',
3513 :issue => {:priority_id => '', :assigned_to_id => '',
3518 :issue => {:priority_id => '', :assigned_to_id => '',
3514 :status_id => '', :parent_issue_id => '2'}
3519 :status_id => '', :parent_issue_id => '2'}
3515 assert_response 302
3520 assert_response 302
3516 parent = Issue.find(2)
3521 parent = Issue.find(2)
3517 assert_equal parent.id, Issue.find(1).parent_id
3522 assert_equal parent.id, Issue.find(1).parent_id
3518 assert_equal parent.id, Issue.find(3).parent_id
3523 assert_equal parent.id, Issue.find(3).parent_id
3519 assert_equal [1, 3], parent.children.collect(&:id).sort
3524 assert_equal [1, 3], parent.children.collect(&:id).sort
3520 end
3525 end
3521
3526
3522 def test_bulk_update_custom_field
3527 def test_bulk_update_custom_field
3523 @request.session[:user_id] = 2
3528 @request.session[:user_id] = 2
3524 # update issues priority
3529 # update issues priority
3525 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing custom field',
3530 post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing custom field',
3526 :issue => {:priority_id => '',
3531 :issue => {:priority_id => '',
3527 :assigned_to_id => '',
3532 :assigned_to_id => '',
3528 :custom_field_values => {'2' => '777'}}
3533 :custom_field_values => {'2' => '777'}}
3529
3534
3530 assert_response 302
3535 assert_response 302
3531
3536
3532 issue = Issue.find(1)
3537 issue = Issue.find(1)
3533 journal = issue.journals.reorder('created_on DESC').first
3538 journal = issue.journals.reorder('created_on DESC').first
3534 assert_equal '777', issue.custom_value_for(2).value
3539 assert_equal '777', issue.custom_value_for(2).value
3535 assert_equal 1, journal.details.size
3540 assert_equal 1, journal.details.size
3536 assert_equal '125', journal.details.first.old_value
3541 assert_equal '125', journal.details.first.old_value
3537 assert_equal '777', journal.details.first.value
3542 assert_equal '777', journal.details.first.value
3538 end
3543 end
3539
3544
3540 def test_bulk_update_custom_field_to_blank
3545 def test_bulk_update_custom_field_to_blank
3541 @request.session[:user_id] = 2
3546 @request.session[:user_id] = 2
3542 post :bulk_update, :ids => [1, 3], :notes => 'Bulk editing custom field',
3547 post :bulk_update, :ids => [1, 3], :notes => 'Bulk editing custom field',
3543 :issue => {:priority_id => '',
3548 :issue => {:priority_id => '',
3544 :assigned_to_id => '',
3549 :assigned_to_id => '',
3545 :custom_field_values => {'1' => '__none__'}}
3550 :custom_field_values => {'1' => '__none__'}}
3546 assert_response 302
3551 assert_response 302
3547 assert_equal '', Issue.find(1).custom_field_value(1)
3552 assert_equal '', Issue.find(1).custom_field_value(1)
3548 assert_equal '', Issue.find(3).custom_field_value(1)
3553 assert_equal '', Issue.find(3).custom_field_value(1)
3549 end
3554 end
3550
3555
3551 def test_bulk_update_multi_custom_field
3556 def test_bulk_update_multi_custom_field
3552 field = CustomField.find(1)
3557 field = CustomField.find(1)
3553 field.update_attribute :multiple, true
3558 field.update_attribute :multiple, true
3554
3559
3555 @request.session[:user_id] = 2
3560 @request.session[:user_id] = 2
3556 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',
3557 :issue => {:priority_id => '',
3562 :issue => {:priority_id => '',
3558 :assigned_to_id => '',
3563 :assigned_to_id => '',
3559 :custom_field_values => {'1' => ['MySQL', 'Oracle']}}
3564 :custom_field_values => {'1' => ['MySQL', 'Oracle']}}
3560
3565
3561 assert_response 302
3566 assert_response 302
3562
3567
3563 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
3564 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
3565 # the custom field is not associated with the issue tracker
3570 # the custom field is not associated with the issue tracker
3566 assert_nil Issue.find(2).custom_field_value(1)
3571 assert_nil Issue.find(2).custom_field_value(1)
3567 end
3572 end
3568
3573
3569 def test_bulk_update_multi_custom_field_to_blank
3574 def test_bulk_update_multi_custom_field_to_blank
3570 field = CustomField.find(1)
3575 field = CustomField.find(1)
3571 field.update_attribute :multiple, true
3576 field.update_attribute :multiple, true
3572
3577
3573 @request.session[:user_id] = 2
3578 @request.session[:user_id] = 2
3574 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',
3575 :issue => {:priority_id => '',
3580 :issue => {:priority_id => '',
3576 :assigned_to_id => '',
3581 :assigned_to_id => '',
3577 :custom_field_values => {'1' => ['__none__']}}
3582 :custom_field_values => {'1' => ['__none__']}}
3578 assert_response 302
3583 assert_response 302
3579 assert_equal [''], Issue.find(1).custom_field_value(1)
3584 assert_equal [''], Issue.find(1).custom_field_value(1)
3580 assert_equal [''], Issue.find(3).custom_field_value(1)
3585 assert_equal [''], Issue.find(3).custom_field_value(1)
3581 end
3586 end
3582
3587
3583 def test_bulk_update_unassign
3588 def test_bulk_update_unassign
3584 assert_not_nil Issue.find(2).assigned_to
3589 assert_not_nil Issue.find(2).assigned_to
3585 @request.session[:user_id] = 2
3590 @request.session[:user_id] = 2
3586 # unassign issues
3591 # unassign issues
3587 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'}
3588 assert_response 302
3593 assert_response 302
3589 # check that the issues were updated
3594 # check that the issues were updated
3590 assert_nil Issue.find(2).assigned_to
3595 assert_nil Issue.find(2).assigned_to
3591 end
3596 end
3592
3597
3593 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
3594 @request.session[:user_id] = 2
3599 @request.session[:user_id] = 2
3595
3600
3596 post :bulk_update, :ids => [1,2], :issue => {:fixed_version_id => 4}
3601 post :bulk_update, :ids => [1,2], :issue => {:fixed_version_id => 4}
3597
3602
3598 assert_response :redirect
3603 assert_response :redirect
3599 issues = Issue.find([1,2])
3604 issues = Issue.find([1,2])
3600 issues.each do |issue|
3605 issues.each do |issue|
3601 assert_equal 4, issue.fixed_version_id
3606 assert_equal 4, issue.fixed_version_id
3602 assert_not_equal issue.project_id, issue.fixed_version.project_id
3607 assert_not_equal issue.project_id, issue.fixed_version.project_id
3603 end
3608 end
3604 end
3609 end
3605
3610
3606 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
3607 @request.session[:user_id] = 2
3612 @request.session[:user_id] = 2
3608 post :bulk_update, :ids => [1,2], :back_url => '/issues'
3613 post :bulk_update, :ids => [1,2], :back_url => '/issues'
3609
3614
3610 assert_response :redirect
3615 assert_response :redirect
3611 assert_redirected_to '/issues'
3616 assert_redirected_to '/issues'
3612 end
3617 end
3613
3618
3614 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
3615 @request.session[:user_id] = 2
3620 @request.session[:user_id] = 2
3616 post :bulk_update, :ids => [1,2], :back_url => 'http://google.com'
3621 post :bulk_update, :ids => [1,2], :back_url => 'http://google.com'
3617
3622
3618 assert_response :redirect
3623 assert_response :redirect
3619 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
3620 end
3625 end
3621
3626
3622 def test_bulk_update_with_all_failures_should_show_errors
3627 def test_bulk_update_with_all_failures_should_show_errors
3623 @request.session[:user_id] = 2
3628 @request.session[:user_id] = 2
3624 post :bulk_update, :ids => [1, 2], :issue => {:start_date => 'foo'}
3629 post :bulk_update, :ids => [1, 2], :issue => {:start_date => 'foo'}
3625
3630
3626 assert_response :success
3631 assert_response :success
3627 assert_template 'bulk_edit'
3632 assert_template 'bulk_edit'
3628 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.'
3629 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'
3630
3635
3631 assert_equal [1, 2], assigns[:issues].map(&:id)
3636 assert_equal [1, 2], assigns[:issues].map(&:id)
3632 end
3637 end
3633
3638
3634 def test_bulk_update_with_some_failures_should_show_errors
3639 def test_bulk_update_with_some_failures_should_show_errors
3635 issue1 = Issue.generate!(:start_date => '2013-05-12')
3640 issue1 = Issue.generate!(:start_date => '2013-05-12')
3636 issue2 = Issue.generate!(:start_date => '2013-05-15')
3641 issue2 = Issue.generate!(:start_date => '2013-05-15')
3637 issue3 = Issue.generate!
3642 issue3 = Issue.generate!
3638 @request.session[:user_id] = 2
3643 @request.session[:user_id] = 2
3639 post :bulk_update, :ids => [issue1.id, issue2.id, issue3.id],
3644 post :bulk_update, :ids => [issue1.id, issue2.id, issue3.id],
3640 :issue => {:due_date => '2013-05-01'}
3645 :issue => {:due_date => '2013-05-01'}
3641 assert_response :success
3646 assert_response :success
3642 assert_template 'bulk_edit'
3647 assert_template 'bulk_edit'
3643 assert_select '#errorExplanation span',
3648 assert_select '#errorExplanation span',
3644 :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}."
3645 assert_select '#errorExplanation ul li',
3650 assert_select '#errorExplanation ul li',
3646 :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}"
3647 assert_equal [issue1.id, issue2.id], assigns[:issues].map(&:id)
3652 assert_equal [issue1.id, issue2.id], assigns[:issues].map(&:id)
3648 end
3653 end
3649
3654
3650 def test_bulk_update_with_failure_should_preserved_form_values
3655 def test_bulk_update_with_failure_should_preserved_form_values
3651 @request.session[:user_id] = 2
3656 @request.session[:user_id] = 2
3652 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'}
3653
3658
3654 assert_response :success
3659 assert_response :success
3655 assert_template 'bulk_edit'
3660 assert_template 'bulk_edit'
3656 assert_select 'select[name=?]', 'issue[tracker_id]' do
3661 assert_select 'select[name=?]', 'issue[tracker_id]' do
3657 assert_select 'option[value=2][selected=selected]'
3662 assert_select 'option[value=2][selected=selected]'
3658 end
3663 end
3659 assert_select 'input[name=?][value=?]', 'issue[start_date]', 'foo'
3664 assert_select 'input[name=?][value=?]', 'issue[start_date]', 'foo'
3660 end
3665 end
3661
3666
3662 def test_get_bulk_copy
3667 def test_get_bulk_copy
3663 @request.session[:user_id] = 2
3668 @request.session[:user_id] = 2
3664 get :bulk_edit, :ids => [1, 2, 3], :copy => '1'
3669 get :bulk_edit, :ids => [1, 2, 3], :copy => '1'
3665 assert_response :success
3670 assert_response :success
3666 assert_template 'bulk_edit'
3671 assert_template 'bulk_edit'
3667
3672
3668 issues = assigns(:issues)
3673 issues = assigns(:issues)
3669 assert_not_nil issues
3674 assert_not_nil issues
3670 assert_equal [1, 2, 3], issues.map(&:id).sort
3675 assert_equal [1, 2, 3], issues.map(&:id).sort
3671
3676
3672 assert_select 'input[name=copy_attachments]'
3677 assert_select 'input[name=copy_attachments]'
3673 end
3678 end
3674
3679
3675 def test_bulk_copy_to_another_project
3680 def test_bulk_copy_to_another_project
3676 @request.session[:user_id] = 2
3681 @request.session[:user_id] = 2
3677 assert_difference 'Issue.count', 2 do
3682 assert_difference 'Issue.count', 2 do
3678 assert_no_difference 'Project.find(1).issues.count' do
3683 assert_no_difference 'Project.find(1).issues.count' do
3679 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'
3680 end
3685 end
3681 end
3686 end
3682 assert_redirected_to '/projects/ecookbook/issues'
3687 assert_redirected_to '/projects/ecookbook/issues'
3683
3688
3684 copies = Issue.all(:order => 'id DESC', :limit => issues.size)
3689 copies = Issue.all(:order => 'id DESC', :limit => issues.size)
3685 copies.each do |copy|
3690 copies.each do |copy|
3686 assert_equal 2, copy.project_id
3691 assert_equal 2, copy.project_id
3687 end
3692 end
3688 end
3693 end
3689
3694
3690 def test_bulk_copy_should_allow_not_changing_the_issue_attributes
3695 def test_bulk_copy_should_allow_not_changing_the_issue_attributes
3691 @request.session[:user_id] = 2
3696 @request.session[:user_id] = 2
3692 issues = [
3697 issues = [
3693 Issue.create!(:project_id => 1, :tracker_id => 1, :status_id => 1,
3698 Issue.create!(:project_id => 1, :tracker_id => 1, :status_id => 1,
3694 :priority_id => 2, :subject => 'issue 1', :author_id => 1,
3699 :priority_id => 2, :subject => 'issue 1', :author_id => 1,
3695 :assigned_to_id => nil),
3700 :assigned_to_id => nil),
3696 Issue.create!(:project_id => 2, :tracker_id => 3, :status_id => 2,
3701 Issue.create!(:project_id => 2, :tracker_id => 3, :status_id => 2,
3697 :priority_id => 1, :subject => 'issue 2', :author_id => 2,
3702 :priority_id => 1, :subject => 'issue 2', :author_id => 2,
3698 :assigned_to_id => 3)
3703 :assigned_to_id => 3)
3699 ]
3704 ]
3700 assert_difference 'Issue.count', issues.size do
3705 assert_difference 'Issue.count', issues.size do
3701 post :bulk_update, :ids => issues.map(&:id), :copy => '1',
3706 post :bulk_update, :ids => issues.map(&:id), :copy => '1',
3702 :issue => {
3707 :issue => {
3703 :project_id => '', :tracker_id => '', :assigned_to_id => '',
3708 :project_id => '', :tracker_id => '', :assigned_to_id => '',
3704 :status_id => '', :start_date => '', :due_date => ''
3709 :status_id => '', :start_date => '', :due_date => ''
3705 }
3710 }
3706 end
3711 end
3707
3712
3708 copies = Issue.all(:order => 'id DESC', :limit => issues.size)
3713 copies = Issue.all(:order => 'id DESC', :limit => issues.size)
3709 issues.each do |orig|
3714 issues.each do |orig|
3710 copy = copies.detect {|c| c.subject == orig.subject}
3715 copy = copies.detect {|c| c.subject == orig.subject}
3711 assert_not_nil copy
3716 assert_not_nil copy
3712 assert_equal orig.project_id, copy.project_id
3717 assert_equal orig.project_id, copy.project_id
3713 assert_equal orig.tracker_id, copy.tracker_id
3718 assert_equal orig.tracker_id, copy.tracker_id
3714 assert_equal orig.status_id, copy.status_id
3719 assert_equal orig.status_id, copy.status_id
3715 assert_equal orig.assigned_to_id, copy.assigned_to_id
3720 assert_equal orig.assigned_to_id, copy.assigned_to_id
3716 assert_equal orig.priority_id, copy.priority_id
3721 assert_equal orig.priority_id, copy.priority_id
3717 end
3722 end
3718 end
3723 end
3719
3724
3720 def test_bulk_copy_should_allow_changing_the_issue_attributes
3725 def test_bulk_copy_should_allow_changing_the_issue_attributes
3721 # Fixes random test failure with Mysql
3726 # Fixes random test failure with Mysql
3722 # where Issue.where(:project_id => 2).limit(2).order('id desc')
3727 # where Issue.where(:project_id => 2).limit(2).order('id desc')
3723 # doesn't return the expected results
3728 # doesn't return the expected results
3724 Issue.delete_all("project_id=2")
3729 Issue.delete_all("project_id=2")
3725
3730
3726 @request.session[:user_id] = 2
3731 @request.session[:user_id] = 2
3727 assert_difference 'Issue.count', 2 do
3732 assert_difference 'Issue.count', 2 do
3728 assert_no_difference 'Project.find(1).issues.count' do
3733 assert_no_difference 'Project.find(1).issues.count' do
3729 post :bulk_update, :ids => [1, 2], :copy => '1',
3734 post :bulk_update, :ids => [1, 2], :copy => '1',
3730 :issue => {
3735 :issue => {
3731 :project_id => '2', :tracker_id => '', :assigned_to_id => '4',
3736 :project_id => '2', :tracker_id => '', :assigned_to_id => '4',
3732 :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'
3733 }
3738 }
3734 end
3739 end
3735 end
3740 end
3736
3741
3737 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
3738 assert_equal 2, copied_issues.size
3743 assert_equal 2, copied_issues.size
3739 copied_issues.each do |issue|
3744 copied_issues.each do |issue|
3740 assert_equal 2, issue.project_id, "Project is incorrect"
3745 assert_equal 2, issue.project_id, "Project is incorrect"
3741 assert_equal 4, issue.assigned_to_id, "Assigned to is incorrect"
3746 assert_equal 4, issue.assigned_to_id, "Assigned to is incorrect"
3742 assert_equal 1, issue.status_id, "Status is incorrect"
3747 assert_equal 1, issue.status_id, "Status is incorrect"
3743 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"
3744 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"
3745 end
3750 end
3746 end
3751 end
3747
3752
3748 def test_bulk_copy_should_allow_adding_a_note
3753 def test_bulk_copy_should_allow_adding_a_note
3749 @request.session[:user_id] = 2
3754 @request.session[:user_id] = 2
3750 assert_difference 'Issue.count', 1 do
3755 assert_difference 'Issue.count', 1 do
3751 post :bulk_update, :ids => [1], :copy => '1',
3756 post :bulk_update, :ids => [1], :copy => '1',
3752 :notes => 'Copying one issue',
3757 :notes => 'Copying one issue',
3753 :issue => {
3758 :issue => {
3754 :project_id => '', :tracker_id => '', :assigned_to_id => '4',
3759 :project_id => '', :tracker_id => '', :assigned_to_id => '4',
3755 :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'
3756 }
3761 }
3757 end
3762 end
3758 issue = Issue.first(:order => 'id DESC')
3763 issue = Issue.first(:order => 'id DESC')
3759 assert_equal 1, issue.journals.size
3764 assert_equal 1, issue.journals.size
3760 journal = issue.journals.first
3765 journal = issue.journals.first
3761 assert_equal 1, journal.details.size
3766 assert_equal 1, journal.details.size
3762 assert_equal 'Copying one issue', journal.notes
3767 assert_equal 'Copying one issue', journal.notes
3763 end
3768 end
3764
3769
3765 def test_bulk_copy_should_allow_not_copying_the_attachments
3770 def test_bulk_copy_should_allow_not_copying_the_attachments
3766 attachment_count = Issue.find(3).attachments.size
3771 attachment_count = Issue.find(3).attachments.size
3767 assert attachment_count > 0
3772 assert attachment_count > 0
3768 @request.session[:user_id] = 2
3773 @request.session[:user_id] = 2
3769
3774
3770 assert_difference 'Issue.count', 1 do
3775 assert_difference 'Issue.count', 1 do
3771 assert_no_difference 'Attachment.count' do
3776 assert_no_difference 'Attachment.count' do
3772 post :bulk_update, :ids => [3], :copy => '1',
3777 post :bulk_update, :ids => [3], :copy => '1',
3773 :issue => {
3778 :issue => {
3774 :project_id => ''
3779 :project_id => ''
3775 }
3780 }
3776 end
3781 end
3777 end
3782 end
3778 end
3783 end
3779
3784
3780 def test_bulk_copy_should_allow_copying_the_attachments
3785 def test_bulk_copy_should_allow_copying_the_attachments
3781 attachment_count = Issue.find(3).attachments.size
3786 attachment_count = Issue.find(3).attachments.size
3782 assert attachment_count > 0
3787 assert attachment_count > 0
3783 @request.session[:user_id] = 2
3788 @request.session[:user_id] = 2
3784
3789
3785 assert_difference 'Issue.count', 1 do
3790 assert_difference 'Issue.count', 1 do
3786 assert_difference 'Attachment.count', attachment_count do
3791 assert_difference 'Attachment.count', attachment_count do
3787 post :bulk_update, :ids => [3], :copy => '1', :copy_attachments => '1',
3792 post :bulk_update, :ids => [3], :copy => '1', :copy_attachments => '1',
3788 :issue => {
3793 :issue => {
3789 :project_id => ''
3794 :project_id => ''
3790 }
3795 }
3791 end
3796 end
3792 end
3797 end
3793 end
3798 end
3794
3799
3795 def test_bulk_copy_should_add_relations_with_copied_issues
3800 def test_bulk_copy_should_add_relations_with_copied_issues
3796 @request.session[:user_id] = 2
3801 @request.session[:user_id] = 2
3797
3802
3798 assert_difference 'Issue.count', 2 do
3803 assert_difference 'Issue.count', 2 do
3799 assert_difference 'IssueRelation.count', 2 do
3804 assert_difference 'IssueRelation.count', 2 do
3800 post :bulk_update, :ids => [1, 3], :copy => '1',
3805 post :bulk_update, :ids => [1, 3], :copy => '1',
3801 :issue => {
3806 :issue => {
3802 :project_id => '1'
3807 :project_id => '1'
3803 }
3808 }
3804 end
3809 end
3805 end
3810 end
3806 end
3811 end
3807
3812
3808 def test_bulk_copy_should_allow_not_copying_the_subtasks
3813 def test_bulk_copy_should_allow_not_copying_the_subtasks
3809 issue = Issue.generate_with_descendants!
3814 issue = Issue.generate_with_descendants!
3810 @request.session[:user_id] = 2
3815 @request.session[:user_id] = 2
3811
3816
3812 assert_difference 'Issue.count', 1 do
3817 assert_difference 'Issue.count', 1 do
3813 post :bulk_update, :ids => [issue.id], :copy => '1',
3818 post :bulk_update, :ids => [issue.id], :copy => '1',
3814 :issue => {
3819 :issue => {
3815 :project_id => ''
3820 :project_id => ''
3816 }
3821 }
3817 end
3822 end
3818 end
3823 end
3819
3824
3820 def test_bulk_copy_should_allow_copying_the_subtasks
3825 def test_bulk_copy_should_allow_copying_the_subtasks
3821 issue = Issue.generate_with_descendants!
3826 issue = Issue.generate_with_descendants!
3822 count = issue.descendants.count
3827 count = issue.descendants.count
3823 @request.session[:user_id] = 2
3828 @request.session[:user_id] = 2
3824
3829
3825 assert_difference 'Issue.count', count+1 do
3830 assert_difference 'Issue.count', count+1 do
3826 post :bulk_update, :ids => [issue.id], :copy => '1', :copy_subtasks => '1',
3831 post :bulk_update, :ids => [issue.id], :copy => '1', :copy_subtasks => '1',
3827 :issue => {
3832 :issue => {
3828 :project_id => ''
3833 :project_id => ''
3829 }
3834 }
3830 end
3835 end
3831 copy = Issue.where(:parent_id => nil).order("id DESC").first
3836 copy = Issue.where(:parent_id => nil).order("id DESC").first
3832 assert_equal count, copy.descendants.count
3837 assert_equal count, copy.descendants.count
3833 end
3838 end
3834
3839
3835 def test_bulk_copy_should_not_copy_selected_subtasks_twice
3840 def test_bulk_copy_should_not_copy_selected_subtasks_twice
3836 issue = Issue.generate_with_descendants!
3841 issue = Issue.generate_with_descendants!
3837 count = issue.descendants.count
3842 count = issue.descendants.count
3838 @request.session[:user_id] = 2
3843 @request.session[:user_id] = 2
3839
3844
3840 assert_difference 'Issue.count', count+1 do
3845 assert_difference 'Issue.count', count+1 do
3841 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',
3842 :issue => {
3847 :issue => {
3843 :project_id => ''
3848 :project_id => ''
3844 }
3849 }
3845 end
3850 end
3846 copy = Issue.where(:parent_id => nil).order("id DESC").first
3851 copy = Issue.where(:parent_id => nil).order("id DESC").first
3847 assert_equal count, copy.descendants.count
3852 assert_equal count, copy.descendants.count
3848 end
3853 end
3849
3854
3850 def test_bulk_copy_to_another_project_should_follow_when_needed
3855 def test_bulk_copy_to_another_project_should_follow_when_needed
3851 @request.session[:user_id] = 2
3856 @request.session[:user_id] = 2
3852 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'
3853 issue = Issue.first(:order => 'id DESC')
3858 issue = Issue.first(:order => 'id DESC')
3854 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue
3859 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue
3855 end
3860 end
3856
3861
3857 def test_bulk_copy_with_all_failures_should_display_errors
3862 def test_bulk_copy_with_all_failures_should_display_errors
3858 @request.session[:user_id] = 2
3863 @request.session[:user_id] = 2
3859 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'}
3860
3865
3861 assert_response :success
3866 assert_response :success
3862 end
3867 end
3863
3868
3864 def test_destroy_issue_with_no_time_entries
3869 def test_destroy_issue_with_no_time_entries
3865 assert_nil TimeEntry.find_by_issue_id(2)
3870 assert_nil TimeEntry.find_by_issue_id(2)
3866 @request.session[:user_id] = 2
3871 @request.session[:user_id] = 2
3867
3872
3868 assert_difference 'Issue.count', -1 do
3873 assert_difference 'Issue.count', -1 do
3869 delete :destroy, :id => 2
3874 delete :destroy, :id => 2
3870 end
3875 end
3871 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
3876 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
3872 assert_nil Issue.find_by_id(2)
3877 assert_nil Issue.find_by_id(2)
3873 end
3878 end
3874
3879
3875 def test_destroy_issues_with_time_entries
3880 def test_destroy_issues_with_time_entries
3876 @request.session[:user_id] = 2
3881 @request.session[:user_id] = 2
3877
3882
3878 assert_no_difference 'Issue.count' do
3883 assert_no_difference 'Issue.count' do
3879 delete :destroy, :ids => [1, 3]
3884 delete :destroy, :ids => [1, 3]
3880 end
3885 end
3881 assert_response :success
3886 assert_response :success
3882 assert_template 'destroy'
3887 assert_template 'destroy'
3883 assert_not_nil assigns(:hours)
3888 assert_not_nil assigns(:hours)
3884 assert Issue.find_by_id(1) && Issue.find_by_id(3)
3889 assert Issue.find_by_id(1) && Issue.find_by_id(3)
3885
3890
3886 assert_select 'form' do
3891 assert_select 'form' do
3887 assert_select 'input[name=_method][value=delete]'
3892 assert_select 'input[name=_method][value=delete]'
3888 end
3893 end
3889 end
3894 end
3890
3895
3891 def test_destroy_issues_and_destroy_time_entries
3896 def test_destroy_issues_and_destroy_time_entries
3892 @request.session[:user_id] = 2
3897 @request.session[:user_id] = 2
3893
3898
3894 assert_difference 'Issue.count', -2 do
3899 assert_difference 'Issue.count', -2 do
3895 assert_difference 'TimeEntry.count', -3 do
3900 assert_difference 'TimeEntry.count', -3 do
3896 delete :destroy, :ids => [1, 3], :todo => 'destroy'
3901 delete :destroy, :ids => [1, 3], :todo => 'destroy'
3897 end
3902 end
3898 end
3903 end
3899 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
3904 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
3900 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
3905 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
3901 assert_nil TimeEntry.find_by_id([1, 2])
3906 assert_nil TimeEntry.find_by_id([1, 2])
3902 end
3907 end
3903
3908
3904 def test_destroy_issues_and_assign_time_entries_to_project
3909 def test_destroy_issues_and_assign_time_entries_to_project
3905 @request.session[:user_id] = 2
3910 @request.session[:user_id] = 2
3906
3911
3907 assert_difference 'Issue.count', -2 do
3912 assert_difference 'Issue.count', -2 do
3908 assert_no_difference 'TimeEntry.count' do
3913 assert_no_difference 'TimeEntry.count' do
3909 delete :destroy, :ids => [1, 3], :todo => 'nullify'
3914 delete :destroy, :ids => [1, 3], :todo => 'nullify'
3910 end
3915 end
3911 end
3916 end
3912 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
3917 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
3913 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
3918 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
3914 assert_nil TimeEntry.find(1).issue_id
3919 assert_nil TimeEntry.find(1).issue_id
3915 assert_nil TimeEntry.find(2).issue_id
3920 assert_nil TimeEntry.find(2).issue_id
3916 end
3921 end
3917
3922
3918 def test_destroy_issues_and_reassign_time_entries_to_another_issue
3923 def test_destroy_issues_and_reassign_time_entries_to_another_issue
3919 @request.session[:user_id] = 2
3924 @request.session[:user_id] = 2
3920
3925
3921 assert_difference 'Issue.count', -2 do
3926 assert_difference 'Issue.count', -2 do
3922 assert_no_difference 'TimeEntry.count' do
3927 assert_no_difference 'TimeEntry.count' do
3923 delete :destroy, :ids => [1, 3], :todo => 'reassign', :reassign_to_id => 2
3928 delete :destroy, :ids => [1, 3], :todo => 'reassign', :reassign_to_id => 2
3924 end
3929 end
3925 end
3930 end
3926 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
3931 assert_redirected_to :action => 'index', :project_id => 'ecookbook'
3927 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
3932 assert !(Issue.find_by_id(1) || Issue.find_by_id(3))
3928 assert_equal 2, TimeEntry.find(1).issue_id
3933 assert_equal 2, TimeEntry.find(1).issue_id
3929 assert_equal 2, TimeEntry.find(2).issue_id
3934 assert_equal 2, TimeEntry.find(2).issue_id
3930 end
3935 end
3931
3936
3932 def test_destroy_issues_from_different_projects
3937 def test_destroy_issues_from_different_projects
3933 @request.session[:user_id] = 2
3938 @request.session[:user_id] = 2
3934
3939
3935 assert_difference 'Issue.count', -3 do
3940 assert_difference 'Issue.count', -3 do
3936 delete :destroy, :ids => [1, 2, 6], :todo => 'destroy'
3941 delete :destroy, :ids => [1, 2, 6], :todo => 'destroy'
3937 end
3942 end
3938 assert_redirected_to :controller => 'issues', :action => 'index'
3943 assert_redirected_to :controller => 'issues', :action => 'index'
3939 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))
3940 end
3945 end
3941
3946
3942 def test_destroy_parent_and_child_issues
3947 def test_destroy_parent_and_child_issues
3943 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')
3944 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)
3945 assert child.is_descendant_of?(parent.reload)
3950 assert child.is_descendant_of?(parent.reload)
3946
3951
3947 @request.session[:user_id] = 2
3952 @request.session[:user_id] = 2
3948 assert_difference 'Issue.count', -2 do
3953 assert_difference 'Issue.count', -2 do
3949 delete :destroy, :ids => [parent.id, child.id], :todo => 'destroy'
3954 delete :destroy, :ids => [parent.id, child.id], :todo => 'destroy'
3950 end
3955 end
3951 assert_response 302
3956 assert_response 302
3952 end
3957 end
3953
3958
3954 def test_destroy_invalid_should_respond_with_404
3959 def test_destroy_invalid_should_respond_with_404
3955 @request.session[:user_id] = 2
3960 @request.session[:user_id] = 2
3956 assert_no_difference 'Issue.count' do
3961 assert_no_difference 'Issue.count' do
3957 delete :destroy, :id => 999
3962 delete :destroy, :id => 999
3958 end
3963 end
3959 assert_response 404
3964 assert_response 404
3960 end
3965 end
3961
3966
3962 def test_default_search_scope
3967 def test_default_search_scope
3963 get :index
3968 get :index
3964
3969
3965 assert_select 'div#quick-search form' do
3970 assert_select 'div#quick-search form' do
3966 assert_select 'input[name=issues][value=1][type=hidden]'
3971 assert_select 'input[name=issues][value=1][type=hidden]'
3967 end
3972 end
3968 end
3973 end
3969 end
3974 end
General Comments 0
You need to be logged in to leave comments. Login now