From f464445714acfa88a99f509ff1f5acb03c91d0e3 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Tue, 5 May 2026 17:00:11 -0700 Subject: [PATCH 1/2] Correcting typo in CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fd6eac7..b1239f41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # Changelog ## Version 3.1.0 -- Incoproate changes for Advanced Commerce API, Retention Messaging API 1.5 and App Store Server API v1.21 [https://github.com/apple/app-store-server-library-python/pull/188] [https://github.com/apple/app-store-server-library-python/pull/189] from @riyazpanjwani +- Incorporate changes for Advanced Commerce API, Retention Messaging API 1.5 and App Store Server API v1.21 [https://github.com/apple/app-store-server-library-python/pull/188] [https://github.com/apple/app-store-server-library-python/pull/189] from @riyazpanjwani - Incorporate changes for App Store Server API v1.20 [https://github.com/apple/app-store-server-library-python/pull/191] from @riyazpanjwani - Incorporate changes for Retention Messaging API v1.3 and 1.4 [https://github.com/apple/app-store-server-library-python/pull/186] - Fix deliveryStatus not being included in consumption information [https://github.com/apple/app-store-server-library-python/pull/184] from @ohadbenita From ab5ce5ffa1226044b56a01de3e410562cd3dd903 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Wed, 6 May 2026 19:52:02 -0700 Subject: [PATCH 2/2] Updating to fix bug with serialization of version and type for new objects --- .../models/LibraryUtility.py | 2 + ...cedCommerceOneTimeChargeCreateRequest.json | 4 +- tests/test_advanced_commerce_models.py | 40 +++++++++++++++++++ 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/appstoreserverlibrary/models/LibraryUtility.py b/appstoreserverlibrary/models/LibraryUtility.py index 253d446f..0ee535d8 100644 --- a/appstoreserverlibrary/models/LibraryUtility.py +++ b/appstoreserverlibrary/models/LibraryUtility.py @@ -97,6 +97,8 @@ def make_overrides(cl): cattrs_overrides[raw_field] = override(rename=matching_name) else: cattrs_overrides[raw_field] = override(rename=matching_name, omit_if_default=True) + elif not attribute.init and attribute.name not in cattrs_overrides: + cattrs_overrides[attribute.name] = override(omit=False) elif attribute.default is None and attribute.name not in cattrs_overrides: cattrs_overrides[attribute.name] = override(omit_if_default=True) return cattrs_overrides diff --git a/tests/resources/models/advancedCommerceOneTimeChargeCreateRequest.json b/tests/resources/models/advancedCommerceOneTimeChargeCreateRequest.json index d9874797..b81f2783 100644 --- a/tests/resources/models/advancedCommerceOneTimeChargeCreateRequest.json +++ b/tests/resources/models/advancedCommerceOneTimeChargeCreateRequest.json @@ -10,7 +10,5 @@ "requestReferenceId": "550e8400-e29b-41d4-a716-446655440000" }, "taxCode": "taxCode", - "storefront": "USA", - "operation": "CREATE", - "version": "1.0" + "storefront": "USA" } diff --git a/tests/test_advanced_commerce_models.py b/tests/test_advanced_commerce_models.py index 88ec27cd..93e2315d 100644 --- a/tests/test_advanced_commerce_models.py +++ b/tests/test_advanced_commerce_models.py @@ -622,6 +622,46 @@ def test_advanced_commerce_subscription_migrate_response_deserialization(self): self.assertEqual("signed_renewal_info_value", response.signedRenewalInfo) self.assertEqual("signed_transaction_info_value", response.signedTransactionInfo) + def test_one_time_charge_create_request_deserialization_sets_operation_and_version(self): + json_data = read_data_from_file('tests/resources/models/advancedCommerceOneTimeChargeCreateRequest.json') + + request_dict = json.loads(json_data) + request = _get_cattrs_converter(AdvancedCommerceOneTimeChargeCreateRequest).structure(request_dict, AdvancedCommerceOneTimeChargeCreateRequest) + + result = _get_cattrs_converter(AdvancedCommerceOneTimeChargeCreateRequest).unstructure(request) + self.assertEqual("CREATE_ONE_TIME_CHARGE", result["operation"]) + self.assertEqual("1", result["version"]) + + def test_subscription_create_request_deserialization_sets_operation_and_version(self): + json_data = read_data_from_file('tests/resources/models/advancedCommerceSubscriptionCreateRequest.json') + + request_dict = json.loads(json_data) + request = _get_cattrs_converter(AdvancedCommerceSubscriptionCreateRequest).structure(request_dict, AdvancedCommerceSubscriptionCreateRequest) + + result = _get_cattrs_converter(AdvancedCommerceSubscriptionCreateRequest).unstructure(request) + self.assertEqual("CREATE_SUBSCRIPTION", result["operation"]) + self.assertEqual("1", result["version"]) + + def test_subscription_modify_in_app_request_deserialization_sets_operation_and_version(self): + json_data = read_data_from_file('tests/resources/models/advancedCommerceSubscriptionModifyInAppRequest.json') + + request_dict = json.loads(json_data) + request = _get_cattrs_converter(AdvancedCommerceSubscriptionModifyInAppRequest).structure(request_dict, AdvancedCommerceSubscriptionModifyInAppRequest) + + result = _get_cattrs_converter(AdvancedCommerceSubscriptionModifyInAppRequest).unstructure(request) + self.assertEqual("MODIFY_SUBSCRIPTION", result["operation"]) + self.assertEqual("1", result["version"]) + + def test_subscription_reactivate_in_app_request_deserialization_sets_operation_and_version(self): + json_data = read_data_from_file('tests/resources/models/advancedCommerceSubscriptionReactivateInAppRequest.json') + + request_dict = json.loads(json_data) + request = _get_cattrs_converter(AdvancedCommerceSubscriptionReactivateInAppRequest).structure(request_dict, AdvancedCommerceSubscriptionReactivateInAppRequest) + + result = _get_cattrs_converter(AdvancedCommerceSubscriptionReactivateInAppRequest).unstructure(request) + self.assertEqual("REACTIVATE_SUBSCRIPTION", result["operation"]) + self.assertEqual("1", result["version"]) + def test_advanced_commerce_price_increase_info_status(self): self.assertEqual("SCHEDULED", AdvancedCommercePriceIncreaseInfoStatus.SCHEDULED.value) self.assertEqual("PENDING", AdvancedCommercePriceIncreaseInfoStatus.PENDING.value)