To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.
root / .svn / pristine / 08 / 08ba366b8c38c360363f9f7f4597d533502606b0.svn-base @ 1297:0a574315af3e
History | View | Annotate | Download (13.2 KB)
| 1 | 1296:038ba2d95de8 | Chris | # Redmine - project management software |
|---|---|---|---|
| 2 | # Copyright (C) 2006-2012 Jean-Philippe Lang |
||
| 3 | # |
||
| 4 | # This program is free software; you can redistribute it and/or |
||
| 5 | # modify it under the terms of the GNU General Public License |
||
| 6 | # as published by the Free Software Foundation; either version 2 |
||
| 7 | # of the License, or (at your option) any later version. |
||
| 8 | # |
||
| 9 | # This program is distributed in the hope that it will be useful, |
||
| 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
| 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
| 12 | # GNU General Public License for more details. |
||
| 13 | # |
||
| 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 |
||
| 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||
| 17 | |||
| 18 | require File.expand_path('../../test_helper', __FILE__)
|
||
| 19 | require 'workflows_controller' |
||
| 20 | |||
| 21 | # Re-raise errors caught by the controller. |
||
| 22 | class WorkflowsController; def rescue_action(e) raise e end; end |
||
| 23 | |||
| 24 | class WorkflowsControllerTest < ActionController::TestCase |
||
| 25 | fixtures :roles, :trackers, :workflows, :users, :issue_statuses |
||
| 26 | |||
| 27 | def setup |
||
| 28 | @controller = WorkflowsController.new |
||
| 29 | @request = ActionController::TestRequest.new |
||
| 30 | @response = ActionController::TestResponse.new |
||
| 31 | User.current = nil |
||
| 32 | @request.session[:user_id] = 1 # admin |
||
| 33 | end |
||
| 34 | |||
| 35 | def test_index |
||
| 36 | get :index |
||
| 37 | assert_response :success |
||
| 38 | assert_template 'index' |
||
| 39 | |||
| 40 | count = WorkflowTransition.count(:all, :conditions => 'role_id = 1 AND tracker_id = 2') |
||
| 41 | assert_tag :tag => 'a', :content => count.to_s, |
||
| 42 | :attributes => { :href => '/workflows/edit?role_id=1&tracker_id=2' }
|
||
| 43 | end |
||
| 44 | |||
| 45 | def test_get_edit |
||
| 46 | get :edit |
||
| 47 | assert_response :success |
||
| 48 | assert_template 'edit' |
||
| 49 | assert_not_nil assigns(:roles) |
||
| 50 | assert_not_nil assigns(:trackers) |
||
| 51 | end |
||
| 52 | |||
| 53 | def test_get_edit_with_role_and_tracker |
||
| 54 | WorkflowTransition.delete_all |
||
| 55 | WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 2, :new_status_id => 3) |
||
| 56 | WorkflowTransition.create!(:role_id => 2, :tracker_id => 1, :old_status_id => 3, :new_status_id => 5) |
||
| 57 | |||
| 58 | get :edit, :role_id => 2, :tracker_id => 1 |
||
| 59 | assert_response :success |
||
| 60 | assert_template 'edit' |
||
| 61 | |||
| 62 | # used status only |
||
| 63 | assert_not_nil assigns(:statuses) |
||
| 64 | assert_equal [2, 3, 5], assigns(:statuses).collect(&:id) |
||
| 65 | |||
| 66 | # allowed transitions |
||
| 67 | assert_tag :tag => 'input', :attributes => { :type => 'checkbox',
|
||
| 68 | :name => 'issue_status[3][5][]', |
||
| 69 | :value => 'always', |
||
| 70 | :checked => 'checked' } |
||
| 71 | # not allowed |
||
| 72 | assert_tag :tag => 'input', :attributes => { :type => 'checkbox',
|
||
| 73 | :name => 'issue_status[3][2][]', |
||
| 74 | :value => 'always', |
||
| 75 | :checked => nil } |
||
| 76 | # unused |
||
| 77 | assert_no_tag :tag => 'input', :attributes => { :type => 'checkbox',
|
||
| 78 | :name => 'issue_status[1][1][]' } |
||
| 79 | end |
||
| 80 | |||
| 81 | def test_get_edit_with_role_and_tracker_and_all_statuses |
||
| 82 | WorkflowTransition.delete_all |
||
| 83 | |||
| 84 | get :edit, :role_id => 2, :tracker_id => 1, :used_statuses_only => '0' |
||
| 85 | assert_response :success |
||
| 86 | assert_template 'edit' |
||
| 87 | |||
| 88 | assert_not_nil assigns(:statuses) |
||
| 89 | assert_equal IssueStatus.count, assigns(:statuses).size |
||
| 90 | |||
| 91 | assert_tag :tag => 'input', :attributes => { :type => 'checkbox',
|
||
| 92 | :name => 'issue_status[1][1][]', |
||
| 93 | :value => 'always', |
||
| 94 | :checked => nil } |
||
| 95 | end |
||
| 96 | |||
| 97 | def test_post_edit |
||
| 98 | post :edit, :role_id => 2, :tracker_id => 1, |
||
| 99 | :issue_status => {
|
||
| 100 | '4' => {'5' => ['always']},
|
||
| 101 | '3' => {'1' => ['always'], '2' => ['always']}
|
||
| 102 | } |
||
| 103 | assert_redirected_to '/workflows/edit?role_id=2&tracker_id=1' |
||
| 104 | |||
| 105 | assert_equal 3, WorkflowTransition.count(:conditions => {:tracker_id => 1, :role_id => 2})
|
||
| 106 | assert_not_nil WorkflowTransition.find(:first, :conditions => {:role_id => 2, :tracker_id => 1, :old_status_id => 3, :new_status_id => 2})
|
||
| 107 | assert_nil WorkflowTransition.find(:first, :conditions => {:role_id => 2, :tracker_id => 1, :old_status_id => 5, :new_status_id => 4})
|
||
| 108 | end |
||
| 109 | |||
| 110 | def test_post_edit_with_additional_transitions |
||
| 111 | post :edit, :role_id => 2, :tracker_id => 1, |
||
| 112 | :issue_status => {
|
||
| 113 | '4' => {'5' => ['always']},
|
||
| 114 | '3' => {'1' => ['author'], '2' => ['assignee'], '4' => ['author', 'assignee']}
|
||
| 115 | } |
||
| 116 | assert_redirected_to '/workflows/edit?role_id=2&tracker_id=1' |
||
| 117 | |||
| 118 | assert_equal 4, WorkflowTransition.count(:conditions => {:tracker_id => 1, :role_id => 2})
|
||
| 119 | |||
| 120 | w = WorkflowTransition.find(:first, :conditions => {:role_id => 2, :tracker_id => 1, :old_status_id => 4, :new_status_id => 5})
|
||
| 121 | assert ! w.author |
||
| 122 | assert ! w.assignee |
||
| 123 | w = WorkflowTransition.find(:first, :conditions => {:role_id => 2, :tracker_id => 1, :old_status_id => 3, :new_status_id => 1})
|
||
| 124 | assert w.author |
||
| 125 | assert ! w.assignee |
||
| 126 | w = WorkflowTransition.find(:first, :conditions => {:role_id => 2, :tracker_id => 1, :old_status_id => 3, :new_status_id => 2})
|
||
| 127 | assert ! w.author |
||
| 128 | assert w.assignee |
||
| 129 | w = WorkflowTransition.find(:first, :conditions => {:role_id => 2, :tracker_id => 1, :old_status_id => 3, :new_status_id => 4})
|
||
| 130 | assert w.author |
||
| 131 | assert w.assignee |
||
| 132 | end |
||
| 133 | |||
| 134 | def test_clear_workflow |
||
| 135 | assert WorkflowTransition.count(:conditions => {:tracker_id => 1, :role_id => 2}) > 0
|
||
| 136 | |||
| 137 | post :edit, :role_id => 2, :tracker_id => 1 |
||
| 138 | assert_equal 0, WorkflowTransition.count(:conditions => {:tracker_id => 1, :role_id => 2})
|
||
| 139 | end |
||
| 140 | |||
| 141 | def test_get_permissions |
||
| 142 | get :permissions |
||
| 143 | |||
| 144 | assert_response :success |
||
| 145 | assert_template 'permissions' |
||
| 146 | assert_not_nil assigns(:roles) |
||
| 147 | assert_not_nil assigns(:trackers) |
||
| 148 | end |
||
| 149 | |||
| 150 | def test_get_permissions_with_role_and_tracker |
||
| 151 | WorkflowPermission.delete_all |
||
| 152 | WorkflowPermission.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :field_name => 'assigned_to_id', :rule => 'required') |
||
| 153 | WorkflowPermission.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :field_name => 'fixed_version_id', :rule => 'required') |
||
| 154 | WorkflowPermission.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 3, :field_name => 'fixed_version_id', :rule => 'readonly') |
||
| 155 | |||
| 156 | get :permissions, :role_id => 1, :tracker_id => 2 |
||
| 157 | assert_response :success |
||
| 158 | assert_template 'permissions' |
||
| 159 | |||
| 160 | assert_select 'input[name=role_id][value=1]' |
||
| 161 | assert_select 'input[name=tracker_id][value=2]' |
||
| 162 | |||
| 163 | # Required field |
||
| 164 | assert_select 'select[name=?]', 'permissions[assigned_to_id][2]' do |
||
| 165 | assert_select 'option[value=]' |
||
| 166 | assert_select 'option[value=][selected=selected]', 0 |
||
| 167 | assert_select 'option[value=readonly]', :text => 'Read-only' |
||
| 168 | assert_select 'option[value=readonly][selected=selected]', 0 |
||
| 169 | assert_select 'option[value=required]', :text => 'Required' |
||
| 170 | assert_select 'option[value=required][selected=selected]' |
||
| 171 | end |
||
| 172 | |||
| 173 | # Read-only field |
||
| 174 | assert_select 'select[name=?]', 'permissions[fixed_version_id][3]' do |
||
| 175 | assert_select 'option[value=]' |
||
| 176 | assert_select 'option[value=][selected=selected]', 0 |
||
| 177 | assert_select 'option[value=readonly]', :text => 'Read-only' |
||
| 178 | assert_select 'option[value=readonly][selected=selected]' |
||
| 179 | assert_select 'option[value=required]', :text => 'Required' |
||
| 180 | assert_select 'option[value=required][selected=selected]', 0 |
||
| 181 | end |
||
| 182 | |||
| 183 | # Other field |
||
| 184 | assert_select 'select[name=?]', 'permissions[due_date][3]' do |
||
| 185 | assert_select 'option[value=]' |
||
| 186 | assert_select 'option[value=][selected=selected]', 0 |
||
| 187 | assert_select 'option[value=readonly]', :text => 'Read-only' |
||
| 188 | assert_select 'option[value=readonly][selected=selected]', 0 |
||
| 189 | assert_select 'option[value=required]', :text => 'Required' |
||
| 190 | assert_select 'option[value=required][selected=selected]', 0 |
||
| 191 | end |
||
| 192 | end |
||
| 193 | |||
| 194 | def test_get_permissions_with_required_custom_field_should_not_show_required_option |
||
| 195 | cf = IssueCustomField.create!(:name => 'Foo', :field_format => 'string', :tracker_ids => [1], :is_required => true) |
||
| 196 | |||
| 197 | get :permissions, :role_id => 1, :tracker_id => 1 |
||
| 198 | assert_response :success |
||
| 199 | assert_template 'permissions' |
||
| 200 | |||
| 201 | # Custom field that is always required |
||
| 202 | # The default option is "(Required)" |
||
| 203 | assert_select 'select[name=?]', "permissions[#{cf.id}][3]" do
|
||
| 204 | assert_select 'option[value=]' |
||
| 205 | assert_select 'option[value=readonly]', :text => 'Read-only' |
||
| 206 | assert_select 'option[value=required]', 0 |
||
| 207 | end |
||
| 208 | end |
||
| 209 | |||
| 210 | def test_get_permissions_with_role_and_tracker_and_all_statuses |
||
| 211 | WorkflowTransition.delete_all |
||
| 212 | |||
| 213 | get :permissions, :role_id => 1, :tracker_id => 2, :used_statuses_only => '0' |
||
| 214 | assert_response :success |
||
| 215 | assert_equal IssueStatus.sorted.all, assigns(:statuses) |
||
| 216 | end |
||
| 217 | |||
| 218 | def test_post_permissions |
||
| 219 | WorkflowPermission.delete_all |
||
| 220 | |||
| 221 | post :permissions, :role_id => 1, :tracker_id => 2, :permissions => {
|
||
| 222 | 'assigned_to_id' => {'1' => '', '2' => 'readonly', '3' => ''},
|
||
| 223 | 'fixed_version_id' => {'1' => 'required', '2' => 'readonly', '3' => ''},
|
||
| 224 | 'due_date' => {'1' => '', '2' => '', '3' => ''},
|
||
| 225 | } |
||
| 226 | assert_redirected_to '/workflows/permissions?role_id=1&tracker_id=2' |
||
| 227 | |||
| 228 | workflows = WorkflowPermission.all |
||
| 229 | assert_equal 3, workflows.size |
||
| 230 | workflows.each do |workflow| |
||
| 231 | assert_equal 1, workflow.role_id |
||
| 232 | assert_equal 2, workflow.tracker_id |
||
| 233 | end |
||
| 234 | assert workflows.detect {|wf| wf.old_status_id == 2 && wf.field_name == 'assigned_to_id' && wf.rule == 'readonly'}
|
||
| 235 | assert workflows.detect {|wf| wf.old_status_id == 1 && wf.field_name == 'fixed_version_id' && wf.rule == 'required'}
|
||
| 236 | assert workflows.detect {|wf| wf.old_status_id == 2 && wf.field_name == 'fixed_version_id' && wf.rule == 'readonly'}
|
||
| 237 | end |
||
| 238 | |||
| 239 | def test_post_permissions_should_clear_permissions |
||
| 240 | WorkflowPermission.delete_all |
||
| 241 | WorkflowPermission.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :field_name => 'assigned_to_id', :rule => 'required') |
||
| 242 | WorkflowPermission.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :field_name => 'fixed_version_id', :rule => 'required') |
||
| 243 | wf1 = WorkflowPermission.create!(:role_id => 1, :tracker_id => 3, :old_status_id => 2, :field_name => 'fixed_version_id', :rule => 'required') |
||
| 244 | wf2 = WorkflowPermission.create!(:role_id => 2, :tracker_id => 2, :old_status_id => 3, :field_name => 'fixed_version_id', :rule => 'readonly') |
||
| 245 | |||
| 246 | post :permissions, :role_id => 1, :tracker_id => 2 |
||
| 247 | assert_redirected_to '/workflows/permissions?role_id=1&tracker_id=2' |
||
| 248 | |||
| 249 | workflows = WorkflowPermission.all |
||
| 250 | assert_equal 2, workflows.size |
||
| 251 | assert wf1.reload |
||
| 252 | assert wf2.reload |
||
| 253 | end |
||
| 254 | |||
| 255 | def test_get_copy |
||
| 256 | get :copy |
||
| 257 | assert_response :success |
||
| 258 | assert_template 'copy' |
||
| 259 | assert_select 'select[name=source_tracker_id]' do |
||
| 260 | assert_select 'option[value=1]', :text => 'Bug' |
||
| 261 | end |
||
| 262 | assert_select 'select[name=source_role_id]' do |
||
| 263 | assert_select 'option[value=2]', :text => 'Developer' |
||
| 264 | end |
||
| 265 | assert_select 'select[name=?]', 'target_tracker_ids[]' do |
||
| 266 | assert_select 'option[value=3]', :text => 'Support request' |
||
| 267 | end |
||
| 268 | assert_select 'select[name=?]', 'target_role_ids[]' do |
||
| 269 | assert_select 'option[value=1]', :text => 'Manager' |
||
| 270 | end |
||
| 271 | end |
||
| 272 | |||
| 273 | def test_post_copy_one_to_one |
||
| 274 | source_transitions = status_transitions(:tracker_id => 1, :role_id => 2) |
||
| 275 | |||
| 276 | post :copy, :source_tracker_id => '1', :source_role_id => '2', |
||
| 277 | :target_tracker_ids => ['3'], :target_role_ids => ['1'] |
||
| 278 | assert_response 302 |
||
| 279 | assert_equal source_transitions, status_transitions(:tracker_id => 3, :role_id => 1) |
||
| 280 | end |
||
| 281 | |||
| 282 | def test_post_copy_one_to_many |
||
| 283 | source_transitions = status_transitions(:tracker_id => 1, :role_id => 2) |
||
| 284 | |||
| 285 | post :copy, :source_tracker_id => '1', :source_role_id => '2', |
||
| 286 | :target_tracker_ids => ['2', '3'], :target_role_ids => ['1', '3'] |
||
| 287 | assert_response 302 |
||
| 288 | assert_equal source_transitions, status_transitions(:tracker_id => 2, :role_id => 1) |
||
| 289 | assert_equal source_transitions, status_transitions(:tracker_id => 3, :role_id => 1) |
||
| 290 | assert_equal source_transitions, status_transitions(:tracker_id => 2, :role_id => 3) |
||
| 291 | assert_equal source_transitions, status_transitions(:tracker_id => 3, :role_id => 3) |
||
| 292 | end |
||
| 293 | |||
| 294 | def test_post_copy_many_to_many |
||
| 295 | source_t2 = status_transitions(:tracker_id => 2, :role_id => 2) |
||
| 296 | source_t3 = status_transitions(:tracker_id => 3, :role_id => 2) |
||
| 297 | |||
| 298 | post :copy, :source_tracker_id => 'any', :source_role_id => '2', |
||
| 299 | :target_tracker_ids => ['2', '3'], :target_role_ids => ['1', '3'] |
||
| 300 | assert_response 302 |
||
| 301 | assert_equal source_t2, status_transitions(:tracker_id => 2, :role_id => 1) |
||
| 302 | assert_equal source_t3, status_transitions(:tracker_id => 3, :role_id => 1) |
||
| 303 | assert_equal source_t2, status_transitions(:tracker_id => 2, :role_id => 3) |
||
| 304 | assert_equal source_t3, status_transitions(:tracker_id => 3, :role_id => 3) |
||
| 305 | end |
||
| 306 | |||
| 307 | # Returns an array of status transitions that can be compared |
||
| 308 | def status_transitions(conditions) |
||
| 309 | WorkflowTransition.find(:all, :conditions => conditions, |
||
| 310 | :order => 'tracker_id, role_id, old_status_id, new_status_id').collect {|w| [w.old_status, w.new_status_id]}
|
||
| 311 | end |
||
| 312 | end |