From 46d12030f199914d6e4a44901272c020a21af66f Mon Sep 17 00:00:00 2001 From: Palumbo Date: Mon, 24 Mar 2025 08:30:45 +0100 Subject: [PATCH 1/2] fix: support ticket 31521 money regression issues --- .../BaseSerializerService.cs | 1 + .../JsonConverters/CustomObjectConverter.cs | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 commercetools.Sdk/commercetools.Base.Serialization/JsonConverters/CustomObjectConverter.cs diff --git a/commercetools.Sdk/commercetools.Base.Serialization/BaseSerializerService.cs b/commercetools.Sdk/commercetools.Base.Serialization/BaseSerializerService.cs index 79f6dc2b06d..4d4ca9cc10d 100644 --- a/commercetools.Sdk/commercetools.Base.Serialization/BaseSerializerService.cs +++ b/commercetools.Sdk/commercetools.Base.Serialization/BaseSerializerService.cs @@ -27,6 +27,7 @@ public BaseSerializerService( _serializerOptions.PropertyNamingPolicy, _serializerOptions)); _serializerOptions.Converters.Add(new TypeDiscriminatorConverterFactory( _serializerOptions.PropertyNamingPolicy, _serializerOptions)); + _serializerOptions.Converters.Add(new CustomObjectConverter()); } public T Deserialize(string input) diff --git a/commercetools.Sdk/commercetools.Base.Serialization/JsonConverters/CustomObjectConverter.cs b/commercetools.Sdk/commercetools.Base.Serialization/JsonConverters/CustomObjectConverter.cs new file mode 100644 index 00000000000..265a48ff6db --- /dev/null +++ b/commercetools.Sdk/commercetools.Base.Serialization/JsonConverters/CustomObjectConverter.cs @@ -0,0 +1,20 @@ +using System; +using System.Text.Json; +using System.Text.Json.Serialization; +using commercetools.Base.Models; + +namespace commercetools.Base.Serialization.JsonConverters +{ + public class CustomObjectConverter : JsonConverter where T : class + { + public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + return JsonSerializer.Deserialize(ref reader, options); + } + + public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options) + { + JsonSerializer.Serialize(writer, (object)value, options); + } + } +} \ No newline at end of file From 369fe709bd84c8abec3d8be96712ea210984a7ab Mon Sep 17 00:00:00 2001 From: Jens Schulze Date: Mon, 24 Mar 2025 12:00:21 +0100 Subject: [PATCH 2/2] add reproducer test --- .../Cart/CartIntegrationTests.cs | 58 +++++++++++++++++++ .../commercetools.Api.IntegrationTests.csproj | 2 +- .../BaseSerializerService.cs | 1 - .../JsonConverters/CustomObjectConverter.cs | 20 ------- 4 files changed, 59 insertions(+), 22 deletions(-) delete mode 100644 commercetools.Sdk/commercetools.Base.Serialization/JsonConverters/CustomObjectConverter.cs diff --git a/commercetools.Sdk/IntegrationTests/commercetools.Api.IntegrationTests/Cart/CartIntegrationTests.cs b/commercetools.Sdk/IntegrationTests/commercetools.Api.IntegrationTests/Cart/CartIntegrationTests.cs index ed0668e8138..d6499f8c101 100644 --- a/commercetools.Sdk/IntegrationTests/commercetools.Api.IntegrationTests/Cart/CartIntegrationTests.cs +++ b/commercetools.Sdk/IntegrationTests/commercetools.Api.IntegrationTests/Cart/CartIntegrationTests.cs @@ -4,8 +4,17 @@ using commercetools.Base.Client.Error; using commercetools.Sdk.Api.Client; using commercetools.Sdk.Api.Models.Carts; +using commercetools.Sdk.Api.Models.Common; +using commercetools.Sdk.Api.Models.Types; +using commercetools.Sdk.GraphQL.Api; using Xunit; using static commercetools.Api.IntegrationTests.Cart.CartFixture; +using static commercetools.Api.IntegrationTests.Type.TypeFixtures; +using CartDraft = commercetools.Sdk.Api.Models.Carts.CartDraft; +using CustomFieldsDraft = commercetools.Sdk.Api.Models.Types.CustomFieldsDraft; +using FieldDefinition = commercetools.Sdk.Api.Models.Types.FieldDefinition; +using LocalizedString = commercetools.Sdk.Api.Models.Common.LocalizedString; +using Money = commercetools.Sdk.Api.Models.Common.Money; namespace commercetools.Api.IntegrationTests.Cart { @@ -184,5 +193,54 @@ await WithUpdateableCart(_client, async cart => } }); } + + [Fact] + public async Task TestMoney() + { + var gqlClient = _client.GraphQLClient(); + var key = $"GetTypeById-{TestingUtility.RandomString()}"; + await WithType(_client, typeDraft => + { + var draft = DefaultTypeDraftWithKey(typeDraft, key); + draft.FieldDefinitions = new List() + { + new FieldDefinition() + { + Type = new CustomFieldMoneyType() + { + }, + Label = new LocalizedString() + { + { "en", "money" } + }, + Required = false, + Name = "money" + } + }; + return draft; + }, async type => + { + await WithCart(_client, draft => + { + draft.Currency = "EUR"; + draft.Custom = new CustomFieldsDraft() + { + Type = new TypeResourceIdentifier() { Key = type.Key }, + Fields = new FieldContainer() + { + { "money", new MoneyDraft() { CurrencyCode = "EUR", CentAmount = 100 } } + } + }; + return draft; + }, async cart => + { + var retrieveCart = await _client.Carts().WithId(cart.Id).Get().ExecuteAsync(); + Assert.IsAssignableFrom(retrieveCart.Custom.Fields["money"]); + var cartId = cart.Id; + var t = await gqlClient.Query(o => o.Cart(id: cartId, selector: cart => new { Custom = cart.Custom(custom => new { Field = custom.CustomFieldsRaw(selector: field => field.Value) }) })); + Assert.NotNull(t); + }); + }); + } } } \ No newline at end of file diff --git a/commercetools.Sdk/IntegrationTests/commercetools.Api.IntegrationTests/commercetools.Api.IntegrationTests.csproj b/commercetools.Sdk/IntegrationTests/commercetools.Api.IntegrationTests/commercetools.Api.IntegrationTests.csproj index ed393c56f38..feab18d983f 100644 --- a/commercetools.Sdk/IntegrationTests/commercetools.Api.IntegrationTests/commercetools.Api.IntegrationTests.csproj +++ b/commercetools.Sdk/IntegrationTests/commercetools.Api.IntegrationTests/commercetools.Api.IntegrationTests.csproj @@ -1,7 +1,7 @@  - net7.0 + net9.0 false 6e42aa04-1612-4e1c-8bb2-190e5c88343f true diff --git a/commercetools.Sdk/commercetools.Base.Serialization/BaseSerializerService.cs b/commercetools.Sdk/commercetools.Base.Serialization/BaseSerializerService.cs index 4d4ca9cc10d..79f6dc2b06d 100644 --- a/commercetools.Sdk/commercetools.Base.Serialization/BaseSerializerService.cs +++ b/commercetools.Sdk/commercetools.Base.Serialization/BaseSerializerService.cs @@ -27,7 +27,6 @@ public BaseSerializerService( _serializerOptions.PropertyNamingPolicy, _serializerOptions)); _serializerOptions.Converters.Add(new TypeDiscriminatorConverterFactory( _serializerOptions.PropertyNamingPolicy, _serializerOptions)); - _serializerOptions.Converters.Add(new CustomObjectConverter()); } public T Deserialize(string input) diff --git a/commercetools.Sdk/commercetools.Base.Serialization/JsonConverters/CustomObjectConverter.cs b/commercetools.Sdk/commercetools.Base.Serialization/JsonConverters/CustomObjectConverter.cs deleted file mode 100644 index 265a48ff6db..00000000000 --- a/commercetools.Sdk/commercetools.Base.Serialization/JsonConverters/CustomObjectConverter.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Text.Json; -using System.Text.Json.Serialization; -using commercetools.Base.Models; - -namespace commercetools.Base.Serialization.JsonConverters -{ - public class CustomObjectConverter : JsonConverter where T : class - { - public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - { - return JsonSerializer.Deserialize(ref reader, options); - } - - public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options) - { - JsonSerializer.Serialize(writer, (object)value, options); - } - } -} \ No newline at end of file