diff --git a/lib/diaspora_federation/entities/related_entity.rb b/lib/diaspora_federation/entities/related_entity.rb index 1ba37a8..b384748 100644 --- a/lib/diaspora_federation/entities/related_entity.rb +++ b/lib/diaspora_federation/entities/related_entity.rb @@ -24,6 +24,14 @@ module DiasporaFederation # @return [RelatedEntity] parent entity entity :parent, Entities::RelatedEntity, default: nil + # The root entity, this entity is responsible for relaying relayables + # @return [RelatedEntity] absolute parent entity + def root + root = self + root = root.parent until root.parent.nil? + root + end + # Get related entity from the backend or fetch it from remote if not available locally # @return [RelatedEntity] fetched related entity def self.fetch(author, type, guid) diff --git a/spec/lib/diaspora_federation/entities/related_entity_spec.rb b/spec/lib/diaspora_federation/entities/related_entity_spec.rb index 811a32c..902eab3 100644 --- a/spec/lib/diaspora_federation/entities/related_entity_spec.rb +++ b/spec/lib/diaspora_federation/entities/related_entity_spec.rb @@ -5,6 +5,20 @@ module DiasporaFederation it_behaves_like "an Entity subclass" + describe "#root" do + it "returns self if it's already the root" do + entity = Fabricate(:related_entity, parent: nil) + expect(entity.root).to eq(entity) + end + + it "returns the root entity if the current entity has parents" do + root = Fabricate(:related_entity, parent: nil) + parent = Fabricate(:related_entity, parent: root) + entity = Fabricate(:related_entity, parent: parent) + expect(entity.root).to eq(root) + end + end + describe ".fetch" do let(:guid) { Fabricate.sequence(:guid) } let(:entity) { Fabricate(:related_entity) }