From f8640997610a6b8b2e4a9044a588d100d9cb75d7 Mon Sep 17 00:00:00 2001 From: Trevor Hinesley Date: Fri, 29 Jun 2018 16:36:34 -0500 Subject: [PATCH] Conditional relationships should be removed from included when proc evaluates to false --- lib/fast_jsonapi/serialization_core.rb | 2 ++ spec/lib/object_serializer_spec.rb | 49 +++++++++++++++++++++----- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/lib/fast_jsonapi/serialization_core.rb b/lib/fast_jsonapi/serialization_core.rb index f02c2c4..284f017 100644 --- a/lib/fast_jsonapi/serialization_core.rb +++ b/lib/fast_jsonapi/serialization_core.rb @@ -146,6 +146,8 @@ module FastJsonapi items = parse_include_item(include_item) items.each do |item| next unless relationships_to_serialize && relationships_to_serialize[item] + conditional_proc = relationships_to_serialize[item][:conditional_proc] + next if conditional_proc && !conditional_proc.call(record, params) raise NotImplementedError if @relationships_to_serialize[item][:polymorphic].is_a?(Hash) record_type = @relationships_to_serialize[item][:record_type] serializer = @relationships_to_serialize[item][:serializer].to_s.constantize diff --git a/spec/lib/object_serializer_spec.rb b/spec/lib/object_serializer_spec.rb index cd6f3aa..ed770af 100644 --- a/spec/lib/object_serializer_spec.rb +++ b/spec/lib/object_serializer_spec.rb @@ -349,11 +349,27 @@ describe FastJsonapi::ObjectSerializer do expect(serializable_hash['data']['relationships'].has_key?('actors')).to be_truthy end - it "doesn't return optional relationship when relationship is not included" do - movie.actor_ids = [] - json = MovieOptionalRelationshipSerializer.new(movie).serialized_json - serializable_hash = JSON.parse(json) - expect(serializable_hash['data']['relationships'].has_key?('actors')).to be_falsey + context "when relationship is not included" do + let(:json) { + MovieOptionalRelationshipSerializer.new(movie, options).serialized_json + } + let(:options) { + {} + } + let(:serializable_hash) { + JSON.parse(json) + } + + it "doesn't return optional relationship" do + movie.actor_ids = [] + expect(serializable_hash['data']['relationships'].has_key?('actors')).to be_falsey + end + + it "doesn't include optional relationship" do + movie.actor_ids = [] + options[:include] = [:actors] + expect(serializable_hash['included']).to be_blank + end end end @@ -364,10 +380,25 @@ describe FastJsonapi::ObjectSerializer do expect(serializable_hash['data']['relationships'].has_key?('owner')).to be_truthy end - it "doesn't return optional relationship when relationship is not included" do - json = MovieOptionalRelationshipWithParamsSerializer.new(movie, { params: { admin: false }}).serialized_json - serializable_hash = JSON.parse(json) - expect(serializable_hash['data']['relationships'].has_key?('owner')).to be_falsey + context "when relationship is not included" do + let(:json) { + MovieOptionalRelationshipWithParamsSerializer.new(movie, options).serialized_json + } + let(:options) { + { params: { admin: false }} + } + let(:serializable_hash) { + JSON.parse(json) + } + + it "doesn't return optional relationship" do + expect(serializable_hash['data']['relationships'].has_key?('owner')).to be_falsey + end + + it "doesn't include optional relationship" do + options[:include] = [:owner] + expect(serializable_hash['included']).to be_blank + end end end end