diff --git a/packages/in_app_purchase/in_app_purchase_storekit/CHANGELOG.md b/packages/in_app_purchase/in_app_purchase_storekit/CHANGELOG.md index 20ae28ac9cfc..35217311720b 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/CHANGELOG.md +++ b/packages/in_app_purchase/in_app_purchase_storekit/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.10+1 + +* Fixes SK2Transaction to expose the real purchased quantity instead of defaulting to 1. + ## 0.4.10 * Clarifies `completePurchase` usage and the consequences of unfinished transactions in the README and API docstrings. diff --git a/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_2_wrappers/sk2_transaction_wrapper.dart b/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_2_wrappers/sk2_transaction_wrapper.dart index 660242745942..50b569f3ab2b 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_2_wrappers/sk2_transaction_wrapper.dart +++ b/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_2_wrappers/sk2_transaction_wrapper.dart @@ -126,6 +126,7 @@ extension on SK2TransactionMessage { productId: productId, purchaseDate: purchaseDate ?? '', expirationDate: expirationDate, + quantity: purchasedQuantity, appAccountToken: appAccountToken, receiptData: receiptData, jsonRepresentation: jsonRepresentation, diff --git a/packages/in_app_purchase/in_app_purchase_storekit/pubspec.yaml b/packages/in_app_purchase/in_app_purchase_storekit/pubspec.yaml index 4a3746860f68..ceba6391adaa 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/pubspec.yaml +++ b/packages/in_app_purchase/in_app_purchase_storekit/pubspec.yaml @@ -2,7 +2,7 @@ name: in_app_purchase_storekit description: An implementation for the iOS and macOS platforms of the Flutter `in_app_purchase` plugin. This uses the StoreKit Framework. repository: https://github.com/flutter/packages/tree/main/packages/in_app_purchase/in_app_purchase_storekit issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+in_app_purchase%22 -version: 0.4.10 +version: 0.4.10+1 environment: sdk: ^3.10.0 diff --git a/packages/in_app_purchase/in_app_purchase_storekit/test/fakes/fake_storekit_platform.dart b/packages/in_app_purchase/in_app_purchase_storekit/test/fakes/fake_storekit_platform.dart index 33af9503f736..29536169b027 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/test/fakes/fake_storekit_platform.dart +++ b/packages/in_app_purchase/in_app_purchase_storekit/test/fakes/fake_storekit_platform.dart @@ -319,6 +319,8 @@ class FakeStoreKit2Platform implements InAppPurchase2API { late bool testTransactionFail; late int testTransactionCancel; late List finishedTransactions; + List transactionsList = []; + List unfinishedTransactionsList = []; PlatformException? queryProductException; bool isListenerRegistered = false; @@ -348,6 +350,28 @@ class FakeStoreKit2Platform implements InAppPurchase2API { eligibleWinBackOffers = >{}; eligibleIntroductoryOffers = {}; simulatedPurchaseResult = SK2ProductPurchaseResultMessage.success; + transactionsList = [ + SK2TransactionMessage( + id: 123, + originalId: 123, + productId: 'product_id', + purchaseDate: '12-12', + purchasedQuantity: 2, + status: SK2PurchaseStatusMessage.purchased, + ), + ]; + unfinishedTransactionsList = [ + SK2TransactionMessage( + id: 123, + originalId: 123, + productId: 'product_id', + purchaseDate: '12-12', + receiptData: 'fake_jws_representation', + appAccountToken: 'fake_app_account_token', + purchasedQuantity: 3, + status: SK2PurchaseStatusMessage.purchased, + ), + ]; } SK2TransactionMessage createRestoredTransaction( @@ -449,30 +473,12 @@ class FakeStoreKit2Platform implements InAppPurchase2API { @override Future> transactions() { - return Future>.value([ - SK2TransactionMessage( - id: 123, - originalId: 123, - productId: 'product_id', - purchaseDate: '12-12', - status: SK2PurchaseStatusMessage.purchased, - ), - ]); + return Future>.value(transactionsList); } @override Future> unfinishedTransactions() { - return Future>.value([ - SK2TransactionMessage( - id: 123, - originalId: 123, - productId: 'product_id', - purchaseDate: '12-12', - receiptData: 'fake_jws_representation', - appAccountToken: 'fake_app_account_token', - status: SK2PurchaseStatusMessage.purchased, - ), - ]); + return Future>.value(unfinishedTransactionsList); } @override diff --git a/packages/in_app_purchase/in_app_purchase_storekit/test/in_app_purchase_storekit_2_platform_test.dart b/packages/in_app_purchase/in_app_purchase_storekit/test/in_app_purchase_storekit_2_platform_test.dart index 883a6c468698..6376b73ac43f 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/test/in_app_purchase_storekit_2_platform_test.dart +++ b/packages/in_app_purchase/in_app_purchase_storekit/test/in_app_purchase_storekit_2_platform_test.dart @@ -655,5 +655,23 @@ void main() { expect(transactions.first.appAccountToken, isNotNull); expect(transactions.first.appAccountToken, 'fake_app_account_token'); }); + + test('should expose purchased quantity in unfinished transactions', () async { + final List transactions = await SK2Transaction.unfinishedTransactions(); + + expect(transactions, isNotEmpty); + expect(transactions.first.quantity, 3); + }); + }); + + group('transactions', () { + test('should return transactions', () async { + final List transactions = await SK2Transaction.transactions(); + + expect(transactions, isNotEmpty); + expect(transactions.first.id, '123'); + expect(transactions.first.productId, 'product_id'); + expect(transactions.first.quantity, 2); + }); }); }