From 51966092a285bfd4c15b4b02ebe51e9662eac8d3 Mon Sep 17 00:00:00 2001 From: Jean-Michel Keuleyan Date: Thu, 29 Aug 2024 11:38:09 +0200 Subject: [PATCH 1/4] Ensure references_many no nil value --- lib/ledger_sync/resource_attribute.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/ledger_sync/resource_attribute.rb b/lib/ledger_sync/resource_attribute.rb index f9a75ce9..98b838fd 100644 --- a/lib/ledger_sync/resource_attribute.rb +++ b/lib/ledger_sync/resource_attribute.rb @@ -34,6 +34,8 @@ def initialize(args = {}) end def assert_valid(args = {}) + ensure_references_many_value_presence(args) + value = args.fetch(:value) type.assert_valid(value: value) @@ -72,5 +74,11 @@ def will_change?(val) assert_valid(value: val) value != type.cast(value: val) end + + def ensure_references_many_value_presence(args) + if references_many? && args.fetch(:value).nil? + args[:value] = [] + end + end end end From 15b7e9edc01d4087b416ec51dd560409dd970123 Mon Sep 17 00:00:00 2001 From: Jean-Michel Keuleyan Date: Sat, 31 Aug 2024 16:21:00 +0200 Subject: [PATCH 2/4] Add spec --- lib/ledger_sync/resource_attribute.rb | 8 --- spec/deserializer/acceptance_artifact_spec.rb | 57 +++++++++++++++++++ 2 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 spec/deserializer/acceptance_artifact_spec.rb diff --git a/lib/ledger_sync/resource_attribute.rb b/lib/ledger_sync/resource_attribute.rb index 98b838fd..f9a75ce9 100644 --- a/lib/ledger_sync/resource_attribute.rb +++ b/lib/ledger_sync/resource_attribute.rb @@ -34,8 +34,6 @@ def initialize(args = {}) end def assert_valid(args = {}) - ensure_references_many_value_presence(args) - value = args.fetch(:value) type.assert_valid(value: value) @@ -74,11 +72,5 @@ def will_change?(val) assert_valid(value: val) value != type.cast(value: val) end - - def ensure_references_many_value_presence(args) - if references_many? && args.fetch(:value).nil? - args[:value] = [] - end - end end end diff --git a/spec/deserializer/acceptance_artifact_spec.rb b/spec/deserializer/acceptance_artifact_spec.rb new file mode 100644 index 00000000..be995cf9 --- /dev/null +++ b/spec/deserializer/acceptance_artifact_spec.rb @@ -0,0 +1,57 @@ +# 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 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 "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) From 0b83a5c40b30dd335c6fc529b8ebee10fd87fd87 Mon Sep 17 00:00:00 2001 From: Jean-Michel Keuleyan Date: Mon, 2 Sep 2024 11:23:20 +0200 Subject: [PATCH 3/4] Fix returns --- .../serialization/type/deserializer_references_many_type.rb | 2 +- lib/ledger_sync/type/value_mixin.rb | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) 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 937108b4..cc9aed0d 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 From d15475448c1d2fb0ff68184f020500b9781df929 Mon Sep 17 00:00:00 2001 From: Jean-Michel Keuleyan Date: Mon, 2 Sep 2024 11:25:12 +0200 Subject: [PATCH 4/4] Improve specs --- spec/deserializer/acceptance_artifact_spec.rb | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/spec/deserializer/acceptance_artifact_spec.rb b/spec/deserializer/acceptance_artifact_spec.rb index be995cf9..7f8f3f84 100644 --- a/spec/deserializer/acceptance_artifact_spec.rb +++ b/spec/deserializer/acceptance_artifact_spec.rb @@ -32,7 +32,7 @@ class Deserializer < LedgerSync::Deserializer subject(:deserialized_object) { deserializer.deserialize(hash: response, resource: acceptance_artifact) } - context "with packages in the API's response" do + context "with empty `packages` in the API's response" do let(:response) { { "identifier" => "42", "packages" => [] } } it 'deserializes the identifier correctly' do @@ -40,7 +40,15 @@ class Deserializer < LedgerSync::Deserializer end end - context "without packages in the API's response" do + 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