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