Add scenario to RelatedContent model spec to check opposite related content creation
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
class RelatedContent < ActiveRecord::Base
|
class RelatedContent < ActiveRecord::Base
|
||||||
belongs_to :parent_relationable, polymorphic: true
|
belongs_to :parent_relationable, polymorphic: true
|
||||||
belongs_to :child_relationable, polymorphic: true
|
belongs_to :child_relationable, polymorphic: true
|
||||||
|
has_one :opposite_related_content, class_name: 'RelatedContent', foreign_key: :related_content_id
|
||||||
|
|
||||||
validates :parent_relationable_id, presence: true
|
validates :parent_relationable_id, presence: true
|
||||||
validates :parent_relationable_type, presence: true
|
validates :parent_relationable_type, presence: true
|
||||||
@@ -8,4 +9,13 @@ class RelatedContent < ActiveRecord::Base
|
|||||||
validates :child_relationable_type, presence: true
|
validates :child_relationable_type, presence: true
|
||||||
validates :parent_relationable_id, uniqueness: { scope: [:parent_relationable_type, :child_relationable_id, :child_relationable_type] }
|
validates :parent_relationable_id, uniqueness: { scope: [:parent_relationable_type, :child_relationable_id, :child_relationable_type] }
|
||||||
|
|
||||||
|
after_create :create_opposite_related_content, unless: proc { opposite_related_content.present? }
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def create_opposite_related_content
|
||||||
|
related_content = RelatedContent.create!(opposite_related_content: self, parent_relationable: child_relationable, child_relationable: parent_relationable)
|
||||||
|
self.opposite_related_content = related_content
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -23,4 +23,19 @@ describe RelatedContent do
|
|||||||
expect(new_related_content).not_to be_valid
|
expect(new_related_content).not_to be_valid
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe 'create_opposite_related_content' do
|
||||||
|
let(:parent_relationable) { create(:proposal) }
|
||||||
|
let(:child_relationable) { create(:debate) }
|
||||||
|
let(:related_content) { build(:related_content, parent_relationable: parent_relationable, child_relationable: child_relationable) }
|
||||||
|
|
||||||
|
it 'creates an opposite related_content' do
|
||||||
|
expect { related_content.save }.to change { RelatedContent.count }.by(2)
|
||||||
|
expect(related_content.opposite_related_content.child_relationable_id).to eq(parent_relationable.id)
|
||||||
|
expect(related_content.opposite_related_content.child_relationable_type).to eq(parent_relationable.class.name)
|
||||||
|
expect(related_content.opposite_related_content.parent_relationable_id).to eq(child_relationable.id)
|
||||||
|
expect(related_content.opposite_related_content.parent_relationable_type).to eq(child_relationable.class.name)
|
||||||
|
expect(related_content.opposite_related_content.opposite_related_content.id).to eq(related_content.id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user