From 71a95f4ca6460a7c2bc345e8b32dbef03d6dd985 Mon Sep 17 00:00:00 2001 From: erdgeist Date: Fri, 17 Jul 2026 22:11:44 +0200 Subject: Refuse destroying nodes that still have children NestedTree's before_destroy silently delete_all'd the whole subtree, bypassing every per-node cleanup. Nodes are never destroyed recursively; descendants must be removed individually. --- test/models/node_test.rb | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'test/models/node_test.rb') diff --git a/test/models/node_test.rb b/test/models/node_test.rb index 4401651..9c4834e 100644 --- a/test/models/node_test.rb +++ b/test/models/node_test.rb @@ -770,4 +770,41 @@ class NodeTest < ActiveSupport::TestCase node.default_template_name = "standard_template" assert node.valid? end + + test "destroying a node with children is refused" do + parent = Node.root.children.create!(:slug => "destroy_guard_parent") + parent.children.create!(:slug => "destroy_guard_child") + + assert_no_difference "Node.count" do + assert_not parent.destroy + end + assert parent.errors[:base].any? + end + + test "destroying a childless node leaves no orphaned pages or asset links" do + node = create_node_with_published_page + page_ids = node.pages.pluck(:id) + asset = Asset.create!(:name => "destroy cascade probe", + :upload_file_name => "test_image.png", + :upload_content_type => "image/png", + :upload_file_size => 49854, + :upload_updated_at => Time.current) + node.head.related_assets.create!(:asset_id => asset.id, :position => 1) + + node.destroy + + assert_equal 0, Page.where(:id => page_ids).count + assert_equal 0, RelatedAsset.where(:page_id => page_ids).count + end + + test "destroying a node also removes its autosave page" do + node = create_node_with_published_page + node.lock_for_editing!(@user1) + node.autosave!({:title => "in flight"}, @user1) + autosave_id = node.autosave_id + + node.destroy + + assert_equal 0, Page.where(:id => autosave_id).count + end end -- cgit v1.3