summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/controllers/wiki_controller.rb4
-rw-r--r--test/integration/wiki_test.rb56
2 files changed, 59 insertions, 1 deletions
diff --git a/app/controllers/wiki_controller.rb b/app/controllers/wiki_controller.rb
index 5d9a91327..a28e2bd61 100644
--- a/app/controllers/wiki_controller.rb
+++ b/app/controllers/wiki_controller.rb
@@ -32,7 +32,7 @@
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
@@ -150,6 +150,8 @@ class WikiController < ApplicationController
# 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]
diff --git a/test/integration/wiki_test.rb b/test/integration/wiki_test.rb
new file mode 100644
index 000000000..bbf8dba67
--- /dev/null
+++ b/test/integration/wiki_test.rb
@@ -0,0 +1,56 @@
+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
+