diff --git a/lib/graphiti/resource/configuration.rb b/lib/graphiti/resource/configuration.rb index 0710db3b6..7080d524a 100644 --- a/lib/graphiti/resource/configuration.rb +++ b/lib/graphiti/resource/configuration.rb @@ -21,6 +21,10 @@ def polymorphic=(klasses) send(:prepend, Polymorphism) end + def polymorphic? + polymorphic.present? + end + def type=(val) val = val&.to_sym if (val = super) diff --git a/lib/graphiti/resource/polymorphism.rb b/lib/graphiti/resource/polymorphism.rb index c8f1cceb6..e5d73e633 100644 --- a/lib/graphiti/resource/polymorphism.rb +++ b/lib/graphiti/resource/polymorphism.rb @@ -8,6 +8,8 @@ def self.prepended(klass) end def serializer_for(model) + return super unless self.class.polymorphic? + if polymorphic_child? serializer else @@ -17,10 +19,14 @@ def serializer_for(model) end def associate_all(*args) + return super unless self.class.polymorphic? + _associate(:associate_all, *args) end def associate(*args) + return super unless self.class.polymorphic? + _associate(:associate, *args) end @@ -34,6 +40,8 @@ def _associate(meth, parent, other, association_name, type) module ClassMethods def inherited(klass) + return super unless polymorphic? + klass.type = nil klass.model = klass.infer_model klass.endpoint = klass.infer_endpoint @@ -42,6 +50,8 @@ def inherited(klass) end def sideload(name) + return super unless polymorphic? + if (split_on = name.to_s.split(/^on__/)).length > 1 on_type, name = split_on[1].split("--").map(&:to_sym) end diff --git a/spec/polymorphism_spec.rb b/spec/polymorphism_spec.rb index 4890ea8e8..8be699248 100644 --- a/spec/polymorphism_spec.rb +++ b/spec/polymorphism_spec.rb @@ -55,7 +55,7 @@ context "when unknown model returned" do around do |e| original = PORO::CreditCardResource.polymorphic - PORO::CreditCardResource.polymorphic = [] + PORO::CreditCardResource.polymorphic = [PORO::VisaResource] begin e.run ensure @@ -69,6 +69,24 @@ }.to raise_error(Graphiti::Errors::PolymorphicResourceChildNotFound) end end + + context "when no subclasses are configured" do + around do |e| + original = PORO::CreditCardResource.polymorphic + PORO::CreditCardResource.polymorphic = [] + begin + e.run + ensure + PORO::CreditCardResource.polymorphic = original + end + end + + it "behaves like a non-polymorphic resource" do + expect(PORO::CreditCardResource).not_to be_polymorphic + expect { resource.all.to_a }.not_to raise_error + expect(resource.new.serializer_for(mastercard)).to eq(resource.serializer) + end + end end context "via subclass" do