Commit 0df8e456b1ccae787e2b69ddef78f8ec0152563c

Authored by Rodrigo Souto
Committed by Daniela Feitosa
1 parent 16dd16e5

Not allow self and cyclical reference in article paternity

app/models/article.rb
@@ -79,6 +79,25 @@ class Article < ActiveRecord::Base @@ -79,6 +79,25 @@ class Article < ActiveRecord::Base
79 validate :native_translation_must_have_language 79 validate :native_translation_must_have_language
80 validate :translation_must_have_language 80 validate :translation_must_have_language
81 81
  82 + validate :no_self_reference
  83 + validate :no_cyclical_reference, :if => 'parent_id.present?'
  84 +
  85 + def no_self_reference
  86 + errors.add(:parent_id, _('self-reference is not allowed.')) if id && parent_id == id
  87 + end
  88 +
  89 + def no_cyclical_reference
  90 + current_parent = Article.find(parent_id)
  91 + while current_parent
  92 + if current_parent == self
  93 + errors.add(:parent_id, _('cyclical reference is not allowed.'))
  94 + break
  95 + end
  96 + current_parent = current_parent.parent
  97 + end
  98 + end
  99 +
  100 +
82 def is_trackable? 101 def is_trackable?
83 self.published? && self.notifiable? && self.advertise? && self.profile.public_profile 102 self.published? && self.notifiable? && self.advertise? && self.profile.public_profile
84 end 103 end
test/unit/article_test.rb
@@ -1800,4 +1800,22 @@ class ArticleTest < ActiveSupport::TestCase @@ -1800,4 +1800,22 @@ class ArticleTest < ActiveSupport::TestCase
1800 assert_equal [f2.path,article.slug].join('/'), article.path 1800 assert_equal [f2.path,article.slug].join('/'), article.path
1801 end 1801 end
1802 1802
  1803 + should 'not allow parent as itself' do
  1804 + article = Article.create!(:name => 'Sample Article', :profile => profile)
  1805 + article.parent = article
  1806 + article.valid?
  1807 +
  1808 + assert article.errors.invalid?(:parent_id)
  1809 + end
  1810 +
  1811 + should 'not allow cyclical paternity' do
  1812 + a1 = Article.create!(:name => 'Sample Article 1', :profile => profile)
  1813 + a2 = Article.create!(:name => 'Sample Article 2', :profile => profile, :parent => a1)
  1814 + a3 = Article.create!(:name => 'Sample Article 3', :profile => profile, :parent => a2)
  1815 + a1.parent = a3
  1816 + a1.valid?
  1817 +
  1818 + assert a1.errors.invalid?(:parent_id)
  1819 + end
  1820 +
1803 end 1821 end