From ea8ee1d35948c6adc4a377c9eb77d99b2d856932 Mon Sep 17 00:00:00 2001 From: erdgeist Date: Mon, 13 Jul 2026 14:12:33 +0200 Subject: Carry over other-locale translations when creating an autosave Node#autosave! only copied assets forward onto a newly created autosave, not translations. Invisible for single-locale nodes, but a node with an existing multi-locale head/draft that gets locked and edited in one locale would silently drop every other locale's translation from the new autosave -- and from there into the draft and eventually head, since save_draft! faithfully clones whatever the autosave actually holds. Fixed by using clone_attributes_from, which already does a complete clone (translations, assets, tags, template, published_at) -- the same method save_draft! already relies on two branches later, so no new mechanism, just closing the one place still doing a partial, hand-rolled version of it. --- test/models/node_test.rb | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'test') diff --git a/test/models/node_test.rb b/test/models/node_test.rb index a1da82c..91a4a6d 100644 --- a/test/models/node_test.rb +++ b/test/models/node_test.rb @@ -614,4 +614,36 @@ class NodeTest < ActiveSupport::TestCase assert_includes node.autosave.reload.assets, original assert_includes node.autosave.reload.assets, extra end + + test "autosave! carries over other-locale translations to the newly created autosave row" do + node = Node.root.children.create!(:slug => "autosave_translation_carryover_test") + user = User.find_by_login("quentin") + + Globalize.with_locale(:en) { node.draft.update!(:title => "English title") } + + node.lock_for_editing!(user) + Globalize.with_locale(:de) { node.autosave!({:title => "German edit"}, user) } + + autosave = node.autosave.reload + assert_includes autosave.translated_locales, :en + assert_equal "English title", Globalize.with_locale(:en) { autosave.title } + assert_equal "German edit", Globalize.with_locale(:de) { autosave.title } + end + + test "autosave! does not reset other-locale translations already attached directly to an existing autosave" do + node = Node.root.children.create!(:slug => "autosave_translation_no_reset_test") + user = User.find_by_login("quentin") + + Globalize.with_locale(:en) { node.draft.update!(:title => "Original English title") } + + node.lock_for_editing!(user) + Globalize.with_locale(:de) { node.autosave!({:title => "v1"}, user) } + Globalize.with_locale(:en) { node.autosave.update!(:title => "Edited directly on autosave") } + + Globalize.with_locale(:de) { node.autosave!({:title => "v2"}, user) } + + autosave = node.autosave.reload + assert_equal "Edited directly on autosave", Globalize.with_locale(:en) { autosave.title } + assert_equal "v2", Globalize.with_locale(:de) { autosave.title } + end end -- cgit v1.3