class WikiController < ApplicationController
default_search_scope :wiki_pages
before_action :find_wiki, :authorize
- before_action :find_existing_or_new_page, :only => [:show, :edit, :update]
+ before_action :find_existing_or_new_page, :only => [:show, :edit]
before_action :find_existing_page, :only => [:rename, :protect, :history, :diff, :annotate, :add_attachment, :destroy, :destroy_version]
before_action :find_attachments, :only => [:preview]
accept_api_auth :index, :show, :update, :destroy
# Creates a new page or updates an existing one
def update
+ @page = @wiki.find_or_new_page(params[:id])
+
return render_403 unless editable?
was_new_page = @page.new_record?
@page.safe_attributes = params[:wiki_page]
--- /dev/null
+require File.expand_path('../../test_helper', __FILE__)
+
+class WikiIntegrationTest < Redmine::IntegrationTest
+ fixtures :projects,
+ :users, :email_addresses,
+ :roles,
+ :members,
+ :member_roles,
+ :trackers,
+ :projects_trackers,
+ :enabled_modules,
+ :wikis,
+ :wiki_pages,
+ :wiki_contents
+
+ def test_updating_a_renamed_page
+ log_user('jsmith', 'jsmith')
+
+ get '/projects/ecookbook/wiki'
+ assert_response :success
+
+ get '/projects/ecookbook/wiki/Wiki/edit'
+ assert_response :success
+
+ # this update should not end up with a loss of content
+ put '/projects/ecookbook/wiki/Wiki', params: {
+ content: {
+ text: "# Wiki\r\n\r\ncontent", comments:""
+ },
+ wiki_page: { parent_id: "" }
+ }
+ assert_redirected_to "/projects/ecookbook/wiki/Wiki"
+ follow_redirect!
+ assert_select 'div', /content/
+ assert content = WikiContent.last
+
+ # Let's assume somebody else, or the same user in another tab, renames the
+ # page while it is being edited.
+ post '/projects/ecookbook/wiki/Wiki/rename', params: { wiki_page: { title: "NewTitle" } }
+ assert_redirected_to "/projects/ecookbook/wiki/NewTitle"
+
+ # this update should not end up with a loss of content
+ put '/projects/ecookbook/wiki/Wiki', params: {
+ content: {
+ version: content.version, text: "# Wiki\r\n\r\nnew content", comments:""
+ },
+ wiki_page: { parent_id: "" }
+ }
+
+ assert_redirected_to "/projects/ecookbook/wiki/NewTitle"
+ follow_redirect!
+ assert_select 'div', /new content/
+ end
+
+end
+