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)