Feature #13315 » 13315.patch
| app/controllers/context_menus_controller.rb | ||
|---|---|---|
| 20 | 20 |
class ContextMenusController < ApplicationController |
| 21 | 21 |
helper :watchers |
| 22 | 22 |
helper :issues |
| 23 |
helper :projects |
|
| 23 | 24 | |
| 24 | 25 |
before_action :find_issues, :only => :issues |
| 25 | 26 | |
| ... | ... | |
| 95 | 96 | |
| 96 | 97 |
render :layout => false |
| 97 | 98 |
end |
| 99 | ||
| 100 |
def versions |
|
| 101 |
@versions = Version.where(:id => params[:ids]).preload(:project).to_a |
|
| 102 | ||
| 103 |
(render_404; return) unless @versions.present? |
|
| 104 |
if @versions.size == 1 |
|
| 105 |
@version = @versions.first |
|
| 106 |
end |
|
| 107 | ||
| 108 |
@version_ids = @versions.collect(&:id).sort |
|
| 109 | ||
| 110 |
@allowed_statuses = Version::VERSION_STATUSES |
|
| 111 |
@allowed_sharings = Version::VERSION_SHARINGS |
|
| 112 | ||
| 113 |
projects = @versions.collect(&:project).compact.uniq |
|
| 114 |
project = projects.first if projects.size == 1 |
|
| 115 |
edit_allowed = |
|
| 116 |
if project |
|
| 117 |
User.current.allowed_to?(:manage_versions, project) && @versions.all?{|version| version.project == project}
|
|
| 118 |
else |
|
| 119 |
false |
|
| 120 |
end |
|
| 121 |
@can = {:edit => edit_allowed, :delete => edit_allowed}
|
|
| 122 |
@back = back_url |
|
| 123 | ||
| 124 |
render :layout => false |
|
| 125 |
end |
|
| 98 | 126 |
end |
| app/controllers/versions_controller.rb | ||
|---|---|---|
| 20 | 20 |
class VersionsController < ApplicationController |
| 21 | 21 |
menu_item :roadmap |
| 22 | 22 |
model_object Version |
| 23 |
before_action :find_model_object, :except => [:index, :new, :create, :close_completed] |
|
| 24 |
before_action :find_project_from_association, :except => [:index, :new, :create, :close_completed] |
|
| 23 |
before_action :find_model_object, :except => [:index, :new, :create, :close_completed, :destroy, :bulk_update]
|
|
| 24 |
before_action :find_project_from_association, :except => [:index, :new, :create, :close_completed, :destroy, :bulk_update]
|
|
| 25 | 25 |
before_action :find_project_by_project_id, :only => [:index, :new, :create, :close_completed] |
| 26 |
before_action :find_versions, :only => [:destroy, :bulk_update] |
|
| 26 | 27 |
before_action :authorize |
| 27 | 28 | |
| 28 | 29 |
accept_api_auth :index, :show, :create, :update, :destroy |
| ... | ... | |
| 149 | 150 |
end |
| 150 | 151 | |
| 151 | 152 |
def destroy |
| 152 |
if @version.deletable? |
|
| 153 |
@version.destroy |
|
| 154 |
respond_to do |format| |
|
| 155 |
format.html {redirect_back_or_default settings_project_path(@project, :tab => 'versions')}
|
|
| 156 |
format.api {render_api_ok}
|
|
| 153 |
destroyed = Version.transaction do |
|
| 154 |
@versions.each do |v| |
|
| 155 |
unless v.deletable? |
|
| 156 |
raise ActiveRecord::Rollback |
|
| 157 |
end |
|
| 158 |
unless v.destroy && v.destroyed? |
|
| 159 |
raise ActiveRecord::Rollback |
|
| 160 |
end |
|
| 157 | 161 |
end |
| 158 |
else |
|
| 159 |
respond_to do |format| |
|
| 160 |
format.html do |
|
| 162 |
end |
|
| 163 | ||
| 164 |
respond_to do |format| |
|
| 165 |
format.html do |
|
| 166 |
if destroyed |
|
| 167 |
flash[:notice] = l(:notice_successful_delete) |
|
| 168 |
else |
|
| 161 | 169 |
flash[:error] = l(:notice_unable_delete_version) |
| 162 |
redirect_to settings_project_path(@project, :tab => 'versions') |
|
| 163 | 170 |
end |
| 164 |
format.api {head :unprocessable_entity}
|
|
| 171 |
redirect_back_or_default settings_project_path(@project, :tab => 'versions') |
|
| 172 |
end |
|
| 173 |
format.api do |
|
| 174 |
if destroyed |
|
| 175 |
render_api_ok |
|
| 176 |
else |
|
| 177 |
head :unprocessable_entity |
|
| 178 |
end |
|
| 165 | 179 |
end |
| 166 | 180 |
end |
| 167 | 181 |
end |
| ... | ... | |
| 173 | 187 |
end |
| 174 | 188 |
end |
| 175 | 189 | |
| 190 |
def bulk_update |
|
| 191 |
attributes = parse_params_for_bulk_update(params[:version]) |
|
| 192 | ||
| 193 |
unsaved_versions = [] |
|
| 194 |
saved_versions = [] |
|
| 195 | ||
| 196 |
Version.transaction do |
|
| 197 |
@versions.each do |version| |
|
| 198 |
version.reload |
|
| 199 |
attrs = attributes.dup |
|
| 200 |
attrs.delete('sharing') unless version.allowed_sharings.include?(attrs['sharing'])
|
|
| 201 |
version.safe_attributes = attrs |
|
| 202 |
next unless version.changed? |
|
| 203 | ||
| 204 |
call_hook( |
|
| 205 |
:controller_versions_bulk_update_before_save, |
|
| 206 |
{:params => params, :version => version}
|
|
| 207 |
) |
|
| 208 |
if version.save |
|
| 209 |
saved_versions << version |
|
| 210 |
else |
|
| 211 |
flash[:error] = version.errors.full_messages.join(', ') unless flash[:error]
|
|
| 212 |
unsaved_versions << version |
|
| 213 |
raise ActiveRecord::Rollback |
|
| 214 |
end |
|
| 215 |
end |
|
| 216 |
end |
|
| 217 | ||
| 218 |
if unsaved_versions.empty? && saved_versions.present? |
|
| 219 |
flash[:notice] = l(:notice_successful_update) |
|
| 220 |
end |
|
| 221 |
redirect_back_or_default settings_project_path(@project, :tab => :versions) |
|
| 222 |
end |
|
| 223 | ||
| 176 | 224 |
private |
| 177 | 225 | |
| 226 |
def find_versions |
|
| 227 |
@versions = Version.where(:id => params[:id] || params[:ids]).preload(:project).to_a |
|
| 228 |
raise ActiveRecord::RecordNotFound if @versions.empty? |
|
| 229 | ||
| 230 |
projects = @versions.collect(&:project).compact.uniq |
|
| 231 |
@project = projects.first if projects.size == 1 |
|
| 232 |
rescue ActiveRecord::RecordNotFound |
|
| 233 |
render_404 |
|
| 234 |
end |
|
| 235 | ||
| 178 | 236 |
def retrieve_selected_tracker_ids(selectable_trackers, default_trackers=nil) |
| 179 | 237 |
if ids = params[:tracker_ids] |
| 180 | 238 |
@selected_tracker_ids = |
| app/helpers/routes_helper.rb | ||
|---|---|---|
| 97 | 97 |
end |
| 98 | 98 |
end |
| 99 | 99 | |
| 100 |
def _bulk_update_versions_path(version, *args) |
|
| 101 |
if version |
|
| 102 |
version_path(version, *args) |
|
| 103 |
else |
|
| 104 |
bulk_update_versions_path(*args) |
|
| 105 |
end |
|
| 106 |
end |
|
| 107 | ||
| 100 | 108 |
def board_path(board, *args) |
| 101 | 109 |
project_board_path(board.project, board, *args) |
| 102 | 110 |
end |
| app/views/context_menus/versions.html.erb | ||
|---|---|---|
| 1 |
<ul> |
|
| 2 |
<%= call_hook(:view_versions_context_menu_start, {:versions => @versions, :can => @can, :back => @back }) %>
|
|
| 3 | ||
| 4 |
<% if @version -%> |
|
| 5 |
<li><%= context_menu_link l(:button_edit), edit_version_path(@version), |
|
| 6 |
:class => 'icon icon-edit', :disabled => !@can[:edit] %></li> |
|
| 7 |
<% end -%> |
|
| 8 | ||
| 9 |
<% if @allowed_statuses.present? -%> |
|
| 10 |
<li class="folder"> |
|
| 11 |
<a href="#" class="submenu"><%= l(:field_status) %></a> |
|
| 12 |
<ul> |
|
| 13 |
<% @allowed_statuses.each do |s| -%> |
|
| 14 |
<li> |
|
| 15 |
<%= context_menu_link( |
|
| 16 |
l("version_status_#{s}"),
|
|
| 17 |
_bulk_update_versions_path( |
|
| 18 |
@version, |
|
| 19 |
:ids => @version_ids, :version => {:status => s}, :back_url => @back
|
|
| 20 |
), |
|
| 21 |
:method => :patch, |
|
| 22 |
:selected => (@version && s == @version.status), :disabled => !@can[:edit] |
|
| 23 |
) %> |
|
| 24 |
</li> |
|
| 25 |
<% end -%> |
|
| 26 |
</ul> |
|
| 27 |
</li> |
|
| 28 |
<% end -%> |
|
| 29 | ||
| 30 |
<% if @allowed_sharings.present? -%> |
|
| 31 |
<li class="folder"> |
|
| 32 |
<a href="#" class="submenu"><%= l(:field_sharing) %></a> |
|
| 33 |
<ul> |
|
| 34 |
<% @allowed_sharings.each do |s| -%> |
|
| 35 |
<li> |
|
| 36 |
<%= context_menu_link( |
|
| 37 |
format_version_sharing(s), |
|
| 38 |
_bulk_update_versions_path( |
|
| 39 |
@version, |
|
| 40 |
:ids => @version_ids, :version => {:sharing => s}, :back_url => @back
|
|
| 41 |
), |
|
| 42 |
:method => :patch, |
|
| 43 |
:selected => (@version && s == @version.sharing), :disabled => !@can[:edit] |
|
| 44 |
) %> |
|
| 45 |
</li> |
|
| 46 |
<% end -%> |
|
| 47 |
</ul> |
|
| 48 |
</li> |
|
| 49 |
<% end -%> |
|
| 50 | ||
| 51 |
<li><%= context_menu_link l(:button_delete), versions_path(:ids => @version_ids, :back_url => @back), |
|
| 52 |
:method => :delete, :data => {:confirm => l(:text_versions_destroy_confirmation)}, :class => 'icon icon-del', :disabled => !@can[:delete] %></li>
|
|
| 53 | ||
| 54 |
<%= call_hook(:view_versions_context_menu_end, {:versions => @versions, :can => @can, :back => @back }) %>
|
|
| 55 |
</ul> |
|
| app/views/projects/settings.html.erb | ||
|---|---|---|
| 3 | 3 |
<%= render_tabs project_settings_tabs %> |
| 4 | 4 | |
| 5 | 5 |
<% html_title(l(:label_settings)) -%> |
| 6 | ||
| 7 |
<%= context_menu %> |
|
| app/views/projects/settings/_versions.html.erb | ||
|---|---|---|
| 20 | 20 |
|
| 21 | 21 | |
| 22 | 22 |
<% if @versions.present? %> |
| 23 |
<%= form_tag({}, :data => {:cm_url => versions_context_menu_path}) do %>
|
|
| 24 |
<% is_allowed_manage_versions = User.current.allowed_to?(:manage_versions, @project) %> |
|
| 23 | 25 |
<table class="list versions"> |
| 24 | 26 |
<thead><tr> |
| 27 |
<th class="checkbox hide-when-print"> |
|
| 28 |
<% if is_allowed_manage_versions && @versions.any?{|version| version.project == @project} %>
|
|
| 29 |
<%= check_box_tag 'check_all', '', false, :class => 'toggle-selection', |
|
| 30 |
:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}" %>
|
|
| 31 |
<% end %> |
|
| 32 |
</th> |
|
| 25 | 33 |
<th><%= l(:label_version) %></th> |
| 26 | 34 |
<th><%= l(:field_default_version) %></th> |
| 27 | 35 |
<th><%= l(:field_effective_date) %></th> |
| ... | ... | |
| 33 | 41 |
</tr></thead> |
| 34 | 42 |
<tbody> |
| 35 | 43 |
<% @versions.each do |version| %> |
| 36 |
<tr class="version <%=h version.status %> <%= 'shared' if version.project != @project %>"> |
|
| 44 |
<% is_manage_version = (version.project == @project && is_allowed_manage_versions) %> |
|
| 45 |
<tr class="version <%=h version.status %><%= ' shared' if version.project != @project %><%= ' hascontextmenu' if is_manage_version %>"> |
|
| 46 |
<td class="checkbox hide-when-print"> |
|
| 47 |
<% if is_manage_version %> |
|
| 48 |
<%= check_box_tag("ids[]", version.id, false, :id => nil) %>
|
|
| 49 |
<% end %> |
|
| 50 |
</td> |
|
| 37 | 51 |
<td class="name <%= 'icon icon-shared' if version.project != @project %>"><%= link_to_version version %></td> |
| 38 | 52 |
<td class="tick"><%= checked_image(version.id == @project.default_version_id) %></td> |
| 39 | 53 |
<td class="date"><%= format_date(version.effective_date) %></td> |
| ... | ... | |
| 42 | 56 |
<td class="sharing"><%=h format_version_sharing(version.sharing) %></td> |
| 43 | 57 |
<td><%= link_to_if_authorized(version.wiki_page_title, {:controller => 'wiki', :action => 'show', :project_id => version.project, :id => Wiki.titleize(version.wiki_page_title)}) || h(version.wiki_page_title) unless version.wiki_page_title.blank? || version.project.wiki.nil? %></td>
|
| 44 | 58 |
<td class="buttons"> |
| 45 |
<% if version.project == @project && User.current.allowed_to?(:manage_versions, @project) %>
|
|
| 59 |
<% if is_manage_version %>
|
|
| 46 | 60 |
<%= link_to l(:button_edit), edit_version_path(version), :class => 'icon icon-edit' %> |
| 47 | 61 |
<%= delete_link version_path(version) %> |
| 48 | 62 |
<% end %> |
| ... | ... | |
| 51 | 65 |
<% end %> |
| 52 | 66 |
</tbody> |
| 53 | 67 |
</table> |
| 68 |
<% end %> |
|
| 54 | 69 |
<% else %> |
| 55 | 70 |
<p class="nodata"><%= l(:label_no_data) %></p> |
| 56 | 71 |
<% end %> |
| config/locales/en.yml | ||
|---|---|---|
| 1288 | 1288 |
text_no_subject: no subject |
| 1289 | 1289 |
text_allowed_queries_to_select: Public (to any users) queries only selectable |
| 1290 | 1290 |
text_setting_config_change: You can configure the behaviour in config/configuration.yml. Please restart the application after editing it. |
| 1291 |
text_versions_destroy_confirmation: 'Are you sure you want to delete the selected version(s)?' |
|
| 1291 | 1292 | |
| 1292 | 1293 |
default_role_manager: Manager |
| 1293 | 1294 |
default_role_developer: Developer |
| config/routes.rb | ||
|---|---|---|
| 233 | 233 |
match '/news/:id/comments', :to => 'comments#create', :via => :post |
| 234 | 234 |
match '/news/:id/comments/:comment_id', :to => 'comments#destroy', :via => :delete |
| 235 | 235 | |
| 236 |
match '/versions/context_menu', :to => 'context_menus#versions', :as => :versions_context_menu, :via => [:get, :post] |
|
| 237 |
delete '/versions', :to => 'versions#destroy' |
|
| 236 | 238 |
resources :versions, :only => [:show, :edit, :update, :destroy] do |
| 237 | 239 |
post 'status_by', :on => :member |
| 240 |
collection do |
|
| 241 |
patch 'bulk_update' |
|
| 242 |
end |
|
| 238 | 243 |
end |
| 239 | 244 | |
| 240 | 245 |
resources :documents, :only => [:show, :edit, :update, :destroy] do |
| lib/redmine.rb | ||
|---|---|---|
| 94 | 94 |
map.permission :select_project_modules, {:projects => :modules}, :require => :member
|
| 95 | 95 |
map.permission :view_members, {:members => [:index, :show]}, :public => true, :read => true
|
| 96 | 96 |
map.permission :manage_members, {:projects => :settings, :members => [:index, :show, :new, :create, :edit, :update, :destroy, :autocomplete]}, :require => :member
|
| 97 |
map.permission :manage_versions, {:projects => :settings, :versions => [:new, :create, :edit, :update, :close_completed, :destroy]}, :require => :member
|
|
| 97 |
map.permission :manage_versions, {:projects => :settings, :versions => [:new, :create, :edit, :update, :close_completed, :destroy, :bulk_update]}, :require => :member
|
|
| 98 | 98 |
map.permission :add_subprojects, {:projects => [:new, :create]}, :require => :member
|
| 99 | 99 |
# Queries |
| 100 | 100 |
map.permission :manage_public_queries, {:queries => [:new, :create, :edit, :update, :destroy]}, :require => :member
|
| test/functional/context_menus_controller_test.rb | ||
|---|---|---|
| 470 | 470 | |
| 471 | 471 |
assert_select 'a.disabled', :text => 'Edit' |
| 472 | 472 |
end |
| 473 | ||
| 474 |
def test_context_menu_one_version_should_link_to_version_path |
|
| 475 |
@request.session[:user_id] = 2 |
|
| 476 |
get( |
|
| 477 |
:versions, |
|
| 478 |
:params => {
|
|
| 479 |
:ids => [2] |
|
| 480 |
} |
|
| 481 |
) |
|
| 482 |
assert_response :success |
|
| 483 | ||
| 484 |
assert_select 'a.icon-edit[href=?]', '/versions/2/edit', :text => 'Edit' |
|
| 485 |
assert_select 'a.icon-del[href=?]', '/versions?ids%5B%5D=2', :text => 'Delete' |
|
| 486 | ||
| 487 |
# Statuses |
|
| 488 |
assert_select 'a[href=?][data-method="patch"]', '/versions/2?ids%5B%5D=2&version%5Bstatus%5D=open', :text => 'open' |
|
| 489 |
assert_select 'a.icon-checked.disabled[href=?]', '#', :text => 'locked' |
|
| 490 |
assert_select 'a[href=?][data-method="patch"]', '/versions/2?ids%5B%5D=2&version%5Bstatus%5D=closed', :text => 'closed' |
|
| 491 |
# Sharings |
|
| 492 |
assert_select 'a.icon-checked.disabled[href=?]', '#', :text => 'Not shared' |
|
| 493 |
assert_select 'a[href=?][data-method="patch"]', '/versions/2?ids%5B%5D=2&version%5Bsharing%5D=descendants', :text => 'With subprojects' |
|
| 494 |
assert_select 'a[href=?][data-method="patch"]', '/versions/2?ids%5B%5D=2&version%5Bsharing%5D=hierarchy', :text => 'With project hierarchy' |
|
| 495 |
assert_select 'a[href=?][data-method="patch"]', '/versions/2?ids%5B%5D=2&version%5Bsharing%5D=tree', :text => 'With project tree' |
|
| 496 |
assert_select 'a[href=?][data-method="patch"]', '/versions/2?ids%5B%5D=2&version%5Bsharing%5D=system', :text => 'With all projects' |
|
| 497 |
end |
|
| 498 | ||
| 499 |
def test_context_menu_multiple_versions_should_link_to_bulk_update_versions_path |
|
| 500 |
@request.session[:user_id] = 2 |
|
| 501 |
get( |
|
| 502 |
:versions, |
|
| 503 |
:params => {
|
|
| 504 |
:ids => [2, 3] |
|
| 505 |
} |
|
| 506 |
) |
|
| 507 |
assert_response :success |
|
| 508 | ||
| 509 |
assert_select 'a.icon-edit', :text => 'Edit', :count => 0 |
|
| 510 |
assert_select 'a.icon-del[href=?]', '/versions?ids%5B%5D=2&ids%5B%5D=3', :text => 'Delete' |
|
| 511 | ||
| 512 |
# Statuses |
|
| 513 |
assert_select 'a[href=?][data-method="patch"]', '/versions/bulk_update?ids%5B%5D=2&ids%5B%5D=3&version%5Bstatus%5D=open', :text => 'open' |
|
| 514 |
assert_select 'a[href=?][data-method="patch"]', '/versions/bulk_update?ids%5B%5D=2&ids%5B%5D=3&version%5Bstatus%5D=locked', :text => 'locked' |
|
| 515 |
assert_select 'a[href=?][data-method="patch"]', '/versions/bulk_update?ids%5B%5D=2&ids%5B%5D=3&version%5Bstatus%5D=closed', :text => 'closed' |
|
| 516 |
# Sharings |
|
| 517 |
assert_select 'a[href=?][data-method="patch"]', '/versions/bulk_update?ids%5B%5D=2&ids%5B%5D=3&version%5Bsharing%5D=none', :text => 'Not shared' |
|
| 518 |
assert_select 'a[href=?][data-method="patch"]', '/versions/bulk_update?ids%5B%5D=2&ids%5B%5D=3&version%5Bsharing%5D=descendants', :text => 'With subprojects' |
|
| 519 |
assert_select 'a[href=?][data-method="patch"]', '/versions/bulk_update?ids%5B%5D=2&ids%5B%5D=3&version%5Bsharing%5D=hierarchy', :text => 'With project hierarchy' |
|
| 520 |
assert_select 'a[href=?][data-method="patch"]', '/versions/bulk_update?ids%5B%5D=2&ids%5B%5D=3&version%5Bsharing%5D=tree', :text => 'With project tree' |
|
| 521 |
assert_select 'a[href=?][data-method="patch"]', '/versions/bulk_update?ids%5B%5D=2&ids%5B%5D=3&version%5Bsharing%5D=system', :text => 'With all projects' |
|
| 522 |
end |
|
| 473 | 523 |
end |
| test/functional/projects_controller_test.rb | ||
|---|---|---|
| 867 | 867 |
end |
| 868 | 868 |
end |
| 869 | 869 | |
| 870 |
def test_versions_in_settings_should_show_context_menu |
|
| 871 |
@request.session[:user_id] = 2 |
|
| 872 |
get( |
|
| 873 |
:settings, |
|
| 874 |
:params => {
|
|
| 875 |
:id => 'ecookbook', |
|
| 876 |
:tab => 'versions', |
|
| 877 |
:version_status => '', |
|
| 878 |
:version_name => '.1', |
|
| 879 |
} |
|
| 880 |
) |
|
| 881 |
assert_response :success |
|
| 882 |
assert_select 'table.versions' do |
|
| 883 |
assert_select 'thead' do |
|
| 884 |
assert_select 'th.checkbox input[type=checkbox][name=?]', 'check_all', 1 |
|
| 885 |
end |
|
| 886 |
assert_select 'tbody tr.hascontextmenu' do |
|
| 887 |
assert_select 'td.checkbox input[type=checkbox][name=?]', 'ids[]', 1 |
|
| 888 |
assert_select 'td.name', :text => '0.1' |
|
| 889 |
end |
|
| 890 |
end |
|
| 891 |
end |
|
| 892 | ||
| 893 |
def test_versions_in_settings_with_version_shared_by_other_project_should_not_show_context_menu |
|
| 894 |
@request.session[:user_id] = 2 |
|
| 895 |
get( |
|
| 896 |
:settings, |
|
| 897 |
:params => {
|
|
| 898 |
:id => 'ecookbook', |
|
| 899 |
:tab => 'versions', |
|
| 900 |
:version_status => '', |
|
| 901 |
:version_name => 'subproject', |
|
| 902 |
} |
|
| 903 |
) |
|
| 904 |
assert_response :success |
|
| 905 |
assert_select 'table.versions' do |
|
| 906 |
assert_select 'thead' do |
|
| 907 |
assert_select 'th.checkbox input[type=checkbox][name=?]', 'check_all', 0 |
|
| 908 |
end |
|
| 909 |
assert_select 'tbody tr.shared' do |
|
| 910 |
assert_select 'td.checkbox input[type=checkbox][name=?]', 'ids[]', 0 |
|
| 911 |
assert_select 'td.name', :text => 'Private child of eCookbook - Private Version of public subproject' |
|
| 912 |
end |
|
| 913 |
end |
|
| 914 |
end |
|
| 915 | ||
| 870 | 916 |
def test_settings_should_show_locked_members |
| 871 | 917 |
user = User.generate! |
| 872 | 918 |
member = User.add_to_project(user, Project.find(1)) |
| test/functional/versions_controller_test.rb | ||
|---|---|---|
| 348 | 348 |
assert_include 'Assigned', response.body |
| 349 | 349 |
assert_include 'Closed', response.body |
| 350 | 350 |
end |
| 351 | ||
| 352 |
def test_bulk_update_on_status |
|
| 353 |
ids = [2, 3] |
|
| 354 |
update_attr = {:status => 'closed'}
|
|
| 355 |
assert_equal 2, Version.where(:id => ids).where.not(update_attr).count |
|
| 356 | ||
| 357 |
@request.session[:user_id] = 2 |
|
| 358 |
patch :bulk_update, :params => {
|
|
| 359 |
:ids => ids, |
|
| 360 |
:version => update_attr |
|
| 361 |
} |
|
| 362 |
assert_redirected_to :controller => :projects, :action => :settings, |
|
| 363 |
:tab => :versions, :id => :ecookbook |
|
| 364 |
assert_equal 'Successful update.', flash[:notice] |
|
| 365 | ||
| 366 |
assert_equal 2, Version.where(:id => ids).where(update_attr).count |
|
| 367 |
end |
|
| 368 | ||
| 369 |
def test_bulk_update_on_sharing |
|
| 370 |
ids = [2, 3] |
|
| 371 |
update_attr = {:sharing => 'descendants'}
|
|
| 372 |
assert_equal 2, Version.where(:id => ids).where.not(update_attr).count |
|
| 373 | ||
| 374 |
@request.session[:user_id] = 2 |
|
| 375 |
patch :bulk_update, :params => {
|
|
| 376 |
:ids => ids, |
|
| 377 |
:version => update_attr |
|
| 378 |
} |
|
| 379 |
assert_redirected_to :controller => :projects, :action => :settings, |
|
| 380 |
:tab => :versions, :id => :ecookbook |
|
| 381 |
assert_equal 'Successful update.', flash[:notice] |
|
| 382 | ||
| 383 |
assert_equal 2, Version.where(:id => ids).where(update_attr).count |
|
| 384 |
end |
|
| 385 | ||
| 386 |
def test_bulk_update_with_validation_failure |
|
| 387 |
ids = [2, 3] |
|
| 388 |
versions = Version.where(:id => ids).reorder(:id => :asc) |
|
| 389 |
assert_equal 2, versions.count |
|
| 390 | ||
| 391 |
@request.session[:user_id] = 2 |
|
| 392 |
patch :bulk_update, :params => {
|
|
| 393 |
:ids => ids, |
|
| 394 |
:version => {
|
|
| 395 |
:status => 'invalid' |
|
| 396 |
} |
|
| 397 |
} |
|
| 398 |
assert_redirected_to :controller => :projects, :action => :settings, |
|
| 399 |
:tab => :versions, :id => :ecookbook |
|
| 400 |
assert_equal 'Status is not included in the list', flash[:error] |
|
| 401 | ||
| 402 |
assert_equal versions, Version.where(:id => ids).reorder(:id => :asc) |
|
| 403 |
end |
|
| 404 | ||
| 405 |
def test_bulk_destroy |
|
| 406 |
Issue.update(:fixed_version_id => nil) |
|
| 407 |
@request.session[:user_id] = 2 |
|
| 408 |
assert_difference 'Version.count', -2 do |
|
| 409 |
delete :destroy, :params => {:ids => [2, 3]}
|
|
| 410 |
end |
|
| 411 |
assert_redirected_to :controller => :projects, :action => :settings, |
|
| 412 |
:tab => :versions, :id => :ecookbook |
|
| 413 |
assert_equal 'Successful deletion.', flash[:notice] |
|
| 414 |
end |
|
| 415 | ||
| 416 |
def test_bulk_destroy_with_version_in_use_should_fail |
|
| 417 |
@request.session[:user_id] = 2 |
|
| 418 |
assert_no_difference 'Version.count' do |
|
| 419 |
delete :destroy, :params => {:ids => [2, 3]}
|
|
| 420 |
end |
|
| 421 |
assert_redirected_to :controller => :projects, :action => :settings, |
|
| 422 |
:tab => :versions, :id => :ecookbook |
|
| 423 |
assert_equal 'Unable to delete version.', flash[:error] |
|
| 424 |
end |
|
| 351 | 425 |
end |
| test/helpers/routes_helper_test.rb | ||
|---|---|---|
| 20 | 20 |
require File.expand_path('../../test_helper', __FILE__)
|
| 21 | 21 | |
| 22 | 22 |
class RoutesHelperTest < Redmine::HelperTest |
| 23 |
fixtures :projects, :issues |
|
| 23 |
fixtures :projects, :issues, :versions
|
|
| 24 | 24 | |
| 25 | 25 |
include Rails.application.routes.url_helpers |
| 26 | 26 | |
| ... | ... | |
| 47 | 47 |
assert_equal 'http://test.host/projects/ecookbook/issues?set_filter=1', _project_issues_url(Project.find(1), set_filter: 1) |
| 48 | 48 |
assert_equal 'http://test.host/issues?set_filter=1', _project_issues_url(nil, set_filter: 1) |
| 49 | 49 |
end |
| 50 | ||
| 51 |
def test_bulk_update_versions_path |
|
| 52 |
assert_equal '/versions/bulk_update', _bulk_update_versions_path(nil, nil) |
|
| 53 |
assert_equal '/versions/1', _bulk_update_versions_path(Version.find(1), nil) |
|
| 54 |
end |
|
| 50 | 55 |
end |
| test/integration/routing/context_menus_test.rb | ||
|---|---|---|
| 29 | 29 |
should_route 'GET /issues/context_menu' => 'context_menus#issues' |
| 30 | 30 |
should_route 'POST /issues/context_menu' => 'context_menus#issues' |
| 31 | 31 |
end |
| 32 | ||
| 33 |
def test_context_menus_versions |
|
| 34 |
should_route 'GET /versions/context_menu' => 'context_menus#versions' |
|
| 35 |
should_route 'POST /versions/context_menu' => 'context_menus#versions' |
|
| 36 |
end |
|
| 32 | 37 |
end |
| test/integration/routing/versions_test.rb | ||
|---|---|---|
| 35 | 35 | |
| 36 | 36 |
should_route 'POST /versions/1/status_by' => 'versions#status_by', :id => '1' |
| 37 | 37 |
end |
| 38 | ||
| 39 |
def test_versions_bulk_edit |
|
| 40 |
should_route 'PATCH /versions/bulk_update' => 'versions#bulk_update' |
|
| 41 |
should_route 'DELETE /versions' => 'versions#destroy' |
|
| 42 |
end |
|
| 38 | 43 |
end |
- « Previous
- 1
- 2
- Next »