diff --git a/lib/diaspora_federation/entities/conversation.rb b/lib/diaspora_federation/entities/conversation.rb index b7c07c6..941d4d3 100644 --- a/lib/diaspora_federation/entities/conversation.rb +++ b/lib/diaspora_federation/entities/conversation.rb @@ -20,7 +20,7 @@ module DiasporaFederation # @!attribute [r] messages # @return [[Entities::Message]] Messages of this conversation - entity :messages, [Entities::Message] + entity :messages, [Entities::Message], default: [] # @!attribute [r] author # The diaspora ID of the person initiated the conversation. diff --git a/lib/diaspora_federation/entity.rb b/lib/diaspora_federation/entity.rb index 1edb93f..3dacbcf 100644 --- a/lib/diaspora_federation/entity.rb +++ b/lib/diaspora_federation/entity.rb @@ -153,7 +153,7 @@ module DiasporaFederation end def nilify(value) - return nil if value.respond_to?(:empty?) && value.empty? + return nil if value.respond_to?(:empty?) && value.empty? && !value.instance_of?(Array) value end @@ -207,8 +207,9 @@ module DiasporaFederation # @return [Hash] entity data def self.entity_data(root_node) Hash[class_props.map {|name, type| - [name, parse_element_from_node(name, type, root_node)] - }] + value = parse_element_from_node(name, type, root_node) + [name, value] if value + }.compact] end private_class_method :entity_data @@ -257,7 +258,7 @@ module DiasporaFederation # @return [Array] array with parsed child entities def self.parse_array_from_node(type, root_node) node = root_node.xpath(type.entity_name) - node.map {|child| type.from_xml(child) } + node.map {|child| type.from_xml(child) } unless node.empty? end private_class_method :parse_array_from_node diff --git a/spec/lib/diaspora_federation/entities/conversation_spec.rb b/spec/lib/diaspora_federation/entities/conversation_spec.rb index d050acf..72802b3 100644 --- a/spec/lib/diaspora_federation/entities/conversation_spec.rb +++ b/spec/lib/diaspora_federation/entities/conversation_spec.rb @@ -35,5 +35,24 @@ XML it_behaves_like "an Entity subclass" it_behaves_like "an XML Entity" + + context "default values" do + let(:minimal_xml) { + <<-XML + + #{parent.guid} + #{data[:subject]} + #{data[:created_at]} + #{data[:author]} + #{data[:participants]} + + XML + } + + it "allows no nested messages" do + parsed_instance = DiasporaFederation::Salmon::XmlPayload.unpack(Nokogiri::XML::Document.parse(minimal_xml).root) + expect(parsed_instance.messages).to eq([]) + end + end end end diff --git a/spec/lib/diaspora_federation/entities/photo_spec.rb b/spec/lib/diaspora_federation/entities/photo_spec.rb index f7d9ae9..c5ccda1 100644 --- a/spec/lib/diaspora_federation/entities/photo_spec.rb +++ b/spec/lib/diaspora_federation/entities/photo_spec.rb @@ -22,5 +22,28 @@ XML it_behaves_like "an Entity subclass" it_behaves_like "an XML Entity" + + context "default values" do + let(:minimal_xml) { + <<-XML + + #{data[:guid]} + #{data[:author]} + #{data[:created_at]} + #{data[:remote_photo_path]} + #{data[:remote_photo_name]} + #{data[:status_message_guid]} + #{data[:height]} + #{data[:width]} + + XML + } + + it "uses default values" do + parsed_instance = DiasporaFederation::Salmon::XmlPayload.unpack(Nokogiri::XML::Document.parse(minimal_xml).root) + expect(parsed_instance.public).to be_falsey + expect(parsed_instance.text).to be_nil + end + end end end diff --git a/spec/lib/diaspora_federation/entities/profile_spec.rb b/spec/lib/diaspora_federation/entities/profile_spec.rb index c3d7afe..a2f3bc2 100644 --- a/spec/lib/diaspora_federation/entities/profile_spec.rb +++ b/spec/lib/diaspora_federation/entities/profile_spec.rb @@ -25,5 +25,31 @@ XML it_behaves_like "an Entity subclass" it_behaves_like "an XML Entity" + + context "default values" do + let(:minimal_xml) { + <<-XML + + #{data[:author]} + + XML + } + + it "uses default values" do + parsed_instance = DiasporaFederation::Salmon::XmlPayload.unpack(Nokogiri::XML::Document.parse(minimal_xml).root) + expect(parsed_instance.first_name).to be_nil + expect(parsed_instance.last_name).to be_nil + expect(parsed_instance.image_url).to be_nil + expect(parsed_instance.image_url_medium).to be_nil + expect(parsed_instance.image_url_small).to be_nil + expect(parsed_instance.birthday).to be_nil + expect(parsed_instance.gender).to be_nil + expect(parsed_instance.bio).to be_nil + expect(parsed_instance.location).to be_nil + expect(parsed_instance.searchable).to be_truthy + expect(parsed_instance.nsfw).to be_falsey + expect(parsed_instance.tag_string).to be_nil + end + end end end diff --git a/spec/lib/diaspora_federation/entities/reshare_spec.rb b/spec/lib/diaspora_federation/entities/reshare_spec.rb index a0b5735..2a1a1d3 100644 --- a/spec/lib/diaspora_federation/entities/reshare_spec.rb +++ b/spec/lib/diaspora_federation/entities/reshare_spec.rb @@ -19,5 +19,25 @@ XML it_behaves_like "an Entity subclass" it_behaves_like "an XML Entity" + + context "default values" do + let(:minimal_xml) { + <<-XML + + #{data[:author]} + #{data[:guid]} + #{data[:created_at]} + #{data[:root_author]} + #{data[:root_guid]} + + XML + } + + it "uses default values" do + parsed_instance = DiasporaFederation::Salmon::XmlPayload.unpack(Nokogiri::XML::Document.parse(minimal_xml).root) + expect(parsed_instance.public).to be_truthy + expect(parsed_instance.provider_display_name).to be_nil + end + end end end diff --git a/spec/lib/diaspora_federation/entities/status_message_spec.rb b/spec/lib/diaspora_federation/entities/status_message_spec.rb index 5056ac2..eea0e92 100644 --- a/spec/lib/diaspora_federation/entities/status_message_spec.rb +++ b/spec/lib/diaspora_federation/entities/status_message_spec.rb @@ -57,5 +57,27 @@ module DiasporaFederation it_behaves_like "an Entity subclass" it_behaves_like "an XML Entity" + + context "default values" do + let(:minimal_xml) { + <<-XML + + #{data[:author]} + #{data[:guid]} + #{data[:created_at]} + #{data[:raw_message]} + + XML + } + + it "uses default values" do + parsed_instance = DiasporaFederation::Salmon::XmlPayload.unpack(Nokogiri::XML::Document.parse(minimal_xml).root) + expect(parsed_instance.photos).to eq([]) + expect(parsed_instance.location).to be_nil + expect(parsed_instance.poll).to be_nil + expect(parsed_instance.public).to be_falsey + expect(parsed_instance.provider_display_name).to be_nil + end + end end end