From 03f0534b2f13c3348348ce1e79e8790e995a935d Mon Sep 17 00:00:00 2001 From: Bertocq Date: Mon, 27 Nov 2017 19:13:07 +0100 Subject: [PATCH] Add scenario to RelatedContent model spec to check opposite related content creation --- app/models/related_content.rb | 10 ++++++++++ spec/models/relation_spec.rb | 15 +++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/app/models/related_content.rb b/app/models/related_content.rb index 4a6645f3a..6b85d14db 100644 --- a/app/models/related_content.rb +++ b/app/models/related_content.rb @@ -1,6 +1,7 @@ class RelatedContent < ActiveRecord::Base belongs_to :parent_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_type, presence: true @@ -8,4 +9,13 @@ class RelatedContent < ActiveRecord::Base validates :child_relationable_type, presence: true 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 diff --git a/spec/models/relation_spec.rb b/spec/models/relation_spec.rb index 9e75516ce..1d4bcd91d 100644 --- a/spec/models/relation_spec.rb +++ b/spec/models/relation_spec.rb @@ -23,4 +23,19 @@ describe RelatedContent do expect(new_related_content).not_to be_valid 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