]> source.dussan.org Git - redmine.git/commitdiff
Do not lose submitted content when attempting to update a wiki page that has been...
authorGo MAEDA <maeda@farend.jp>
Wed, 15 May 2019 13:21:35 +0000 (13:21 +0000)
committerGo MAEDA <maeda@farend.jp>
Wed, 15 May 2019 13:21:35 +0000 (13:21 +0000)
Patch by Jens Krämer.

git-svn-id: http://svn.redmine.org/redmine/trunk@18165 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/wiki_controller.rb
test/integration/wiki_test.rb [new file with mode: 0644]

index 995a40cc433528092c683e0607de4883cc692b58..ae2447763204f96cd61ce2e0df68d3f965cbe072 100644 (file)
@@ -34,7 +34,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
@@ -152,6 +152,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 (file)
index 0000000..bbf8dba
--- /dev/null
@@ -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
+