diff --git a/lib/diaspora_federation/entities/relayable.rb b/lib/diaspora_federation/entities/relayable.rb index c323213..04de399 100644 --- a/lib/diaspora_federation/entities/relayable.rb +++ b/lib/diaspora_federation/entities/relayable.rb @@ -203,8 +203,16 @@ module DiasporaFederation end def fetch_parent(data) - type = data[:parent_type] || self::PARENT_TYPE - guid = data[:parent_guid] + type = data.fetch(:parent_type) { + if const_defined?(:PARENT_TYPE) + self::PARENT_TYPE + else + raise DiasporaFederation::Entity::ValidationError, "invalid #{self}! missing 'parent_type'." + end + } + guid = data.fetch(:parent_guid) { + raise DiasporaFederation::Entity::ValidationError, "invalid #{self}! missing 'parent_guid'." + } data[:parent] = DiasporaFederation.callbacks.trigger(:fetch_related_entity, type, guid) diff --git a/spec/lib/diaspora_federation/entities/like_spec.rb b/spec/lib/diaspora_federation/entities/like_spec.rb index 75f7470..5b5c303 100644 --- a/spec/lib/diaspora_federation/entities/like_spec.rb +++ b/spec/lib/diaspora_federation/entities/like_spec.rb @@ -32,5 +32,35 @@ XML it_behaves_like "an XML Entity" it_behaves_like "a relayable Entity" + + context "invalid XML" do + it "raises a ValidationError if the parent_type is missing" do + broken_xml = <<-XML + + #{parent.guid} + #{data[:author_signature]} + #{data[:parent_author_signature]} + +XML + + expect { + DiasporaFederation::Entities::Like.from_xml(Nokogiri::XML::Document.parse(broken_xml).root) + }.to raise_error Entity::ValidationError, "invalid DiasporaFederation::Entities::Like! missing 'parent_type'." + end + + it "raises a ValidationError if the parent_guid is missing" do + broken_xml = <<-XML + + #{parent.entity_type} + #{data[:author_signature]} + #{data[:parent_author_signature]} + + XML + + expect { + DiasporaFederation::Entities::Like.from_xml(Nokogiri::XML::Document.parse(broken_xml).root) + }.to raise_error Entity::ValidationError, "invalid DiasporaFederation::Entities::Like! missing 'parent_guid'." + end + end end end diff --git a/spec/lib/diaspora_federation/entities/relayable_spec.rb b/spec/lib/diaspora_federation/entities/relayable_spec.rb index 730982c..8c0e820 100644 --- a/spec/lib/diaspora_federation/entities/relayable_spec.rb +++ b/spec/lib/diaspora_federation/entities/relayable_spec.rb @@ -295,6 +295,21 @@ XML end end + context "parse invalid XML" do + it "raises a ValidationError if the parent_guid is missing" do + broken_xml = <<-XML + + + + + XML + + expect { + SomeRelayable.from_xml(Nokogiri::XML::Document.parse(broken_xml).root) + }.to raise_error Entity::ValidationError, "invalid DiasporaFederation::SomeRelayable! missing 'parent_guid'." + end + end + context "fetch parent" do before do expect_callback(:fetch_public_key, author).and_return(author_pkey.public_key)