diff --git a/lib/ledger_sync/serialization/type/deserializer_references_many_type.rb b/lib/ledger_sync/serialization/type/deserializer_references_many_type.rb index 828d0f5a..8d9c0c00 100644 --- a/lib/ledger_sync/serialization/type/deserializer_references_many_type.rb +++ b/lib/ledger_sync/serialization/type/deserializer_references_many_type.rb @@ -11,7 +11,7 @@ def cast_value(args = {}) value = args.fetch(:value) resource = args.fetch(:resource) - return if value.nil? + return [] if value.nil? first_dot = deserializer_attribute.resource_attribute_dot_parts.first.to_sym nested_resource = resource.class.resource_attributes[first_dot].type.resource_class.new diff --git a/lib/ledger_sync/type/value_mixin.rb b/lib/ledger_sync/type/value_mixin.rb index 5aa9127c..edf90b5b 100644 --- a/lib/ledger_sync/type/value_mixin.rb +++ b/lib/ledger_sync/type/value_mixin.rb @@ -22,7 +22,6 @@ def assert_valid(args = {}) # Do not override this method. Override private method cast_value def cast(args = {}) assert_valid(args) - return nil if args.fetch(:value).nil? cast_value(args) end diff --git a/spec/deserializer/acceptance_artifact_spec.rb b/spec/deserializer/acceptance_artifact_spec.rb new file mode 100644 index 00000000..7f8f3f84 --- /dev/null +++ b/spec/deserializer/acceptance_artifact_spec.rb @@ -0,0 +1,65 @@ +# Usage: bundle exec rspec spec/deserializer/acceptance_artifact_spec.rb + +require 'ledger_sync' +require 'rspec' + +class Package < LedgerSync::Resource + attribute :blabla, type: LedgerSync::Type::String +end + +class Package + class Deserializer < LedgerSync::Deserializer + attribute :blabla, hash_attribute: :blabla + end +end + +class AcceptanceArtifact < LedgerSync::Resource + attribute :identifier, type: LedgerSync::Type::String + references_many :packages, to: Package +end + +class AcceptanceArtifact + class Deserializer < LedgerSync::Deserializer + attribute :identifier, hash_attribute: :identifier + references_many :packages, deserializer: Package::Deserializer, hash_attribute: :packages + end +end + +RSpec.describe AcceptanceArtifact::Deserializer do + describe '#deserialize' do + let(:deserializer) { described_class.new } + let(:acceptance_artifact) { AcceptanceArtifact.new } + + subject(:deserialized_object) { deserializer.deserialize(hash: response, resource: acceptance_artifact) } + + context "with empty `packages` in the API's response" do + let(:response) { { "identifier" => "42", "packages" => [] } } + + it 'deserializes the identifier correctly' do + expect(deserialized_object.identifier).to eq("42") + end + end + + context "with filled `packages` in the API's response" do + let(:response) { { "identifier" => "42", "packages" => [ { "blabla" => "ok" } ] } } + + it 'deserializes the identifier correctly' do + expect(deserialized_object.identifier).to eq("42") + end + end + + context "without `packages` in the API's response" do + let(:response) { { "identifier" => "42" } } + + it 'deserializes the packages correctly' do + expect(deserialized_object.packages).to eq([]) + end + end + end +end + +# Manual trigger +# deserializer = AcceptanceArtifact::Deserializer.new +# response_1 = { "identifier" => "42", "packages" => [] } +# response_2 = { "identifier" => "42" } +# accept_art = deserializer.deserialize(hash: response_1, resource: AcceptanceArtifact.new)