Skip to content

Commit ed31a56

Browse files
authored
Merge pull request #443 from commercetools/events-sdk-fixes
Events sdk fixes
2 parents df5a379 + 7e2d411 commit ed31a56

File tree

5 files changed

+124
-2
lines changed

5 files changed

+124
-2
lines changed

commercetools.Sdk/Tests/commercetools.Api.Serialization.Tests/MessagesTests.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,28 @@ public void DeserializationOfListOfSubscriptionDeliveryUnwrapped()
163163
Assert.IsType<CustomerCreatedMessage>(customerCreatedPayload.Message);
164164
}
165165

166+
[Fact]
167+
public void DeserializationOfListOfEventDeliveryUnwrapped()
168+
{
169+
ISerializerService serializerService = this.serializationFixture.SerializerService;
170+
string serialized = File.ReadAllText("Resources/Messages/NotificationPayloads.json");
171+
var payloads = serializerService.Deserialize<List<ISubscriptionNotification>>(serialized);
172+
Assert.NotNull(payloads);
173+
Assert.Equal(5, payloads.Count);
174+
var resourceCreatedPayload = payloads[0] as ResourceCreatedDeliveryPayload;
175+
var resourceUpdatedPayload = payloads[1] as ResourceUpdatedDeliveryPayload;
176+
var resourceDeletedPayload = payloads[2] as ResourceDeletedDeliveryPayload;
177+
var customerCreatedPayload = payloads[3] as MessageDeliveryPayload;
178+
var importEventPayload = payloads[4] as EventDeliveryPayload;
179+
180+
Assert.NotNull(resourceCreatedPayload);
181+
Assert.NotNull(resourceUpdatedPayload);
182+
Assert.NotNull(resourceDeletedPayload);
183+
Assert.NotNull(customerCreatedPayload);
184+
Assert.NotNull(importEventPayload);
185+
Assert.Equal(2, resourceUpdatedPayload.OldVersion);
186+
Assert.IsType<CustomerCreatedMessage>(customerCreatedPayload.Message);
187+
}
166188
[Fact]
167189
public void DeserializationOfListOfMessageSubscriptionPayloadsUnwrapped()
168190
{
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
[
2+
{
3+
"notificationType": "ResourceCreated",
4+
"projectKey": "test-php-sdk-129839581278250",
5+
"resource": {
6+
"typeId": "customer",
7+
"id": "e63d76ff-e203-42ba-af17-375040b8ecb6"
8+
},
9+
"resourceUserProvidedIdentifiers": {
10+
"key": "test-ca15403ea56ec0e51137ff40a6f4607e"
11+
},
12+
"version": 1,
13+
"modifiedAt": "2019-09-12T09:39:21.338Z"
14+
},
15+
{
16+
"notificationType": "ResourceUpdated",
17+
"projectKey": "test-php-sdk-129839581278250",
18+
"resource": {
19+
"typeId": "category",
20+
"id": "e63d76ff-e203-42ba-af17-375040b8ecb6"
21+
},
22+
"resourceUserProvidedIdentifiers": {
23+
"key": "test-ca15403ea56ec0e51137ff40a6f4607e"
24+
},
25+
"version": 3,
26+
"oldVersion": 2,
27+
"modifiedAt": "2019-09-12T09:39:21.338Z"
28+
},
29+
{
30+
"notificationType": "ResourceDeleted",
31+
"projectKey": "test-php-sdk-129839581278250",
32+
"resource": {
33+
"typeId": "product",
34+
"id": "e63d76ff-e203-42ba-af17-375040b8ecb6"
35+
},
36+
"resourceUserProvidedIdentifiers": {
37+
"key": "test-ca15403ea56ec0e51137ff40a6f4607e"
38+
},
39+
"version": 2,
40+
"modifiedAt": "2019-09-12T09:39:21.338Z"
41+
},
42+
{
43+
"notificationType": "Message",
44+
"projectKey": "test-php-sdk-129839581278250",
45+
"payloadNotIncluded": {
46+
"reason": "does not fit into the size limit of your message queue",
47+
"payloadType": "CustomerCreated"
48+
},
49+
"resource": {
50+
"typeId": "customer",
51+
"id": "14dc1379-1edc-464f-9f7f-569274820aea"
52+
},
53+
"resourceUserProvidedIdentifiers": {
54+
"key": "test-ca15403ea56ec0e51137ff40a6f4607e"
55+
},
56+
"id": "f88a8c79-eb0a-4e74-843b-0c96c6e462bc",
57+
"version": 1,
58+
"sequenceNumber": 1,
59+
"resourceVersion": 1,
60+
"type": "CustomerCreated",
61+
"createdAt": "2019-08-14T08:24:39.347Z",
62+
"lastModifiedAt": "2019-08-14T08:24:39.347Z",
63+
"lastModifiedBy": {
64+
"clientId": "kdlz-oxUfPV3tV1W9Y1-czoE",
65+
"isPlatformClient": false
66+
},
67+
"createdBy": {
68+
"clientId": "kdlz-oxUfPV3tV1W9Y1-czoE",
69+
"isPlatformClient": false
70+
}
71+
},
72+
{
73+
"id": "3b364ca2-cbe5-42b4-a85a-37d4e57d659e",
74+
"notificationType": "Event",
75+
"type": "ImportContainerCreated",
76+
"resourceType": "import-api",
77+
"data": {
78+
"version": 1,
79+
"key": "my-import-container",
80+
"createdAt": "2025-03-26T17:28:20.376Z",
81+
"lastModifiedAt": "2025-03-26T17:28:20.376Z"
82+
},
83+
"createdAt": "2025-03-26T17:28:20.397Z"
84+
}
85+
]

commercetools.Sdk/commercetools.Base.Serialization/JsonConverters/DeserializeAsConverterFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public DeserializeAsConverterFactory(
2727
public override bool CanConvert(Type typeToConvert)
2828
{
2929
return (typeToConvert.IsAbstractClass() || typeToConvert.IsInterface)
30-
&& typeToConvert.IsDefined(typeof(DeserializeAsAttribute));
30+
&& typeToConvert.IsDefined(typeof(DeserializeAsAttribute)) && !typeToConvert.IsDefined(typeof(TypeDiscriminatorAttribute));
3131
}
3232

3333
/// <inheritdoc/>

commercetools.Sdk/commercetools.Base.Serialization/JsonConverters/TypeDiscriminatorConverter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public TypeDiscriminatorConverter(JsonNamingPolicy namingPolicy, JsonSerializerO
1919
if (DiscriminatorAttribute == null)
2020
throw new NullReferenceException($"Failed to find the required '{nameof(TypeDiscriminatorAttribute)}'");
2121
this.DiscriminatorProperty = typeof(T).GetProperty(DiscriminatorAttribute.Property,
22-
BindingFlags.Default | BindingFlags.Public | BindingFlags.Instance);
22+
BindingFlags.Default | BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy);
2323
if (this.DiscriminatorProperty == null)
2424
throw new NullReferenceException(
2525
$"Failed to find the specified discriminator property '{DiscriminatorAttribute.Property}' in type '{typeof(T).Name}'");
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using commercetools.Base.CustomAttributes;
2+
3+
namespace commercetools.Sdk.Api.Models.Subscriptions;
4+
5+
[TypeDiscriminator(nameof(NotificationType))]
6+
[DefaultTypeDiscriminator(typeof(commercetools.Sdk.Api.Models.Subscriptions.DeliveryPayload))]
7+
[SubTypeDiscriminator("Message", typeof(commercetools.Sdk.Api.Models.Subscriptions.MessageDeliveryPayload))]
8+
[SubTypeDiscriminator("ResourceCreated", typeof(commercetools.Sdk.Api.Models.Subscriptions.ResourceCreatedDeliveryPayload))]
9+
[SubTypeDiscriminator("ResourceDeleted", typeof(commercetools.Sdk.Api.Models.Subscriptions.ResourceDeletedDeliveryPayload))]
10+
[SubTypeDiscriminator("ResourceUpdated", typeof(commercetools.Sdk.Api.Models.Subscriptions.ResourceUpdatedDeliveryPayload))]
11+
public partial interface IDeliveryPayload
12+
{
13+
new string NotificationType { get; set; }
14+
15+
}

0 commit comments

Comments
 (0)