diff --git a/app/models/alchemy/node.rb b/app/models/alchemy/node.rb index 88fe526dcb..370c77475c 100644 --- a/app/models/alchemy/node.rb +++ b/app/models/alchemy/node.rb @@ -4,6 +4,8 @@ module Alchemy class Node < BaseRecord VALID_URL_REGEX = /\A(\/|\D[a-z\+\d\.\-]+:)/ + before_destroy :check_if_related_essence_nodes_present + acts_as_nested_set scope: "language_id", touch: true stampable stamper_class_name: Alchemy.user_class_name @@ -14,7 +16,6 @@ class Node < BaseRecord has_many :essence_nodes, class_name: "Alchemy::EssenceNode", foreign_key: :node_id, inverse_of: :ingredient_association - before_destroy :check_if_related_essence_nodes_present validates :name, presence: true, if: -> { page.nil? } validates :url, format: { with: VALID_URL_REGEX }, unless: -> { url.nil? } @@ -79,8 +80,9 @@ def view_folder_name end def check_if_related_essence_nodes_present - if essence_nodes.any? - errors.add(:base, :essence_nodes_present, page_names: essence_nodes.map(&:page).map(&:name).to_sentence) + dependent_essence_nodes = self_and_descendants.flat_map(&:essence_nodes) + if dependent_essence_nodes.any? + errors.add(:base, :essence_nodes_present, page_names: dependent_essence_nodes.map(&:page).map(&:name).to_sentence) throw(:abort) end end diff --git a/spec/models/alchemy/node_spec.rb b/spec/models/alchemy/node_spec.rb index a30c75dd85..defceb870e 100644 --- a/spec/models/alchemy/node_spec.rb +++ b/spec/models/alchemy/node_spec.rb @@ -152,6 +152,16 @@ module Alchemy expect(node).not_to be_destroyed expect(node.errors.full_messages).to eq(["This menu item is in use inside an Alchemy element on the following pages: #{page.name}."]) end + + context "if there are essence nodes present on a child node" do + let!(:parent_node) { create(:alchemy_node, children: [node]) } + + it "does not destroy the node and children either but adds an error" do + parent_node.destroy + expect(parent_node).not_to be_destroyed + expect(parent_node.errors.full_messages).to eq(["This menu item is in use inside an Alchemy element on the following pages: #{page.name}."]) + end + end end end end