From 21ae4aaa0a0e707d11643b9da67a022f49dcbc3e Mon Sep 17 00:00:00 2001 From: Matt Eddy Date: Mon, 8 Oct 2018 11:45:46 -0700 Subject: [PATCH] Allow fieldsets to specify no attributes/relationships --- lib/fast_jsonapi/serialization_core.rb | 3 +++ spec/lib/object_serializer_fields_spec.rb | 33 +++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/lib/fast_jsonapi/serialization_core.rb b/lib/fast_jsonapi/serialization_core.rb index 200af9b..845aee7 100644 --- a/lib/fast_jsonapi/serialization_core.rb +++ b/lib/fast_jsonapi/serialization_core.rb @@ -44,6 +44,8 @@ module FastJsonapi def attributes_hash(record, fieldset = nil, params = {}) attributes = attributes_to_serialize attributes = attributes.slice(*fieldset) if fieldset.present? + attributes = {} if fieldset == [] + attributes.each_with_object({}) do |(_k, attribute), hash| attribute.serialize(record, params, hash) end @@ -52,6 +54,7 @@ module FastJsonapi def relationships_hash(record, relationships = nil, fieldset = nil, params = {}) relationships = relationships_to_serialize if relationships.nil? relationships = relationships.slice(*fieldset) if fieldset.present? + relationships = {} if fieldset == [] relationships.each_with_object({}) do |(_k, relationship), hash| relationship.serialize(record, params, hash) diff --git a/spec/lib/object_serializer_fields_spec.rb b/spec/lib/object_serializer_fields_spec.rb index 913ba83..697f209 100644 --- a/spec/lib/object_serializer_fields_spec.rb +++ b/spec/lib/object_serializer_fields_spec.rb @@ -22,6 +22,18 @@ describe FastJsonapi::ObjectSerializer do expect(hash[:data][:relationships].keys.sort).to eq %i[actors advertising_campaign] end + it 'returns no fields when none are specified' do + hash = MovieSerializer.new(movie, fields: { movie: [] }).serializable_hash + + expect(hash[:data][:attributes].keys).to eq [] + end + + it 'returns no relationships when none are specified' do + hash = MovieSerializer.new(movie, fields: { movie: [] }).serializable_hash + + expect(hash[:data][:relationships].keys).to eq [] + end + it 'only returns specified fields for included relationships' do hash = MovieSerializer.new(movie, fields: fields, include: %i[actors]).serializable_hash @@ -45,4 +57,25 @@ describe FastJsonapi::ObjectSerializer do expect(hash[:included][3][:relationships].keys.sort).to eq %i[movie] end + + context 'with no included fields specified' do + let(:fields) do + { + movie: %i[name actors advertising_campaign], + actor: [] + } + end + + it 'returns no fields for included relationships when none are specified' do + hash = MovieSerializer.new(movie, fields: fields, include: %i[actors advertising_campaign]).serializable_hash + + expect(hash[:included][2][:attributes].keys).to eq [] + end + + it 'returns no relationships when none are specified' do + hash = MovieSerializer.new(movie, fields: fields, include: %i[actors advertising_campaign]).serializable_hash + + expect(hash[:included][2][:relationships].keys).to eq [] + end + end end