From e3da9b13742ca6cb340594e2b8df0bf1fd3adc0f Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Tue, 7 Nov 2023 10:44:35 -0800 Subject: [PATCH 1/5] add storefront in skpaymentqueuewrapper update changelog fix test version check --- .../in_app_purchase_storekit/CHANGELOG.md | 4 ++ .../darwin/Classes/FIAPaymentQueueHandler.h | 2 + .../darwin/Classes/FIAPaymentQueueHandler.m | 4 ++ .../darwin/Classes/InAppPurchasePlugin.m | 18 ++++++ .../RunnerTests/InAppPurchasePluginTests.m | 63 +++++++++++++++++++ .../sk_payment_queue_wrapper.dart | 10 +++ .../in_app_purchase_storekit/pubspec.yaml | 2 +- .../sk_methodchannel_apis_test.dart | 24 +++++++ 8 files changed, 126 insertions(+), 1 deletion(-) 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 82a5de827a91..54e5a3831719 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.3.7 + +* Adds `Future storefront()` in SKPaymentQueueWrapper class. + ## 0.3.6+7 * Updates example code for current versions of Flutter. diff --git a/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/FIAPaymentQueueHandler.h b/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/FIAPaymentQueueHandler.h index fdc042655fd7..c7391465e613 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/FIAPaymentQueueHandler.h +++ b/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/FIAPaymentQueueHandler.h @@ -21,6 +21,8 @@ typedef void (^UpdatedDownloads)(NSArray *downloads); @property(NS_NONATOMIC_IOSONLY, weak, nullable) id delegate API_AVAILABLE( ios(13.0), macos(10.15), watchos(6.2)); +@property(NS_NONATOMIC_IOSONLY, readonly, nullable) + SKStorefront *storefront API_AVAILABLE(ios(13.0), macos(10.15), watchos(6.2)); /// Creates a new FIAPaymentQueueHandler initialized with an empty /// FIATransactionCache. diff --git a/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/FIAPaymentQueueHandler.m b/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/FIAPaymentQueueHandler.m index d18a09cfa405..600565750897 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/FIAPaymentQueueHandler.m +++ b/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/FIAPaymentQueueHandler.m @@ -233,4 +233,8 @@ - (BOOL)paymentQueue:(SKPaymentQueue *)queue return self.queue.transactions; } +- (SKStorefront *)storefront { + return self.queue.storefront; +} + @end diff --git a/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/InAppPurchasePlugin.m b/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/InAppPurchasePlugin.m index 1ecb0fc1dc68..d62fa04d16af 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/InAppPurchasePlugin.m +++ b/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/InAppPurchasePlugin.m @@ -89,6 +89,8 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result [self canMakePayments:result]; } else if ([@"-[SKPaymentQueue transactions]" isEqualToString:call.method]) { [self getPendingTransactions:result]; + } else if ([@"-[SKPaymentQueue storefront]" isEqualToString:call.method]) { + [self getStorefront:result]; } else if ([@"-[InAppPurchasePlugin startProductRequest:result:]" isEqualToString:call.method]) { [self handleProductRequestMethodCall:call result:result]; } else if ([@"-[InAppPurchasePlugin addPayment:result:]" isEqualToString:call.method]) { @@ -139,6 +141,22 @@ - (void)getPendingTransactions:(FlutterResult)result { result(transactionMaps); } +- (void)getStorefront:(FlutterResult)result { + if (@available(iOS 13.0, *)) { + SKStorefront *storefront = self.paymentQueueHandler.storefront; + if (!storefront) { + result(nil); + return; + } + result([FIAObjectTranslator getMapFromSKStorefront:storefront]); + return; + } else { + NSLog(@"storefront is not avaialbe in iOS below 13.0."); + result(nil); + return; + } +} + - (void)handleProductRequestMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { if (![call.arguments isKindOfClass:[NSArray class]]) { result([FlutterError errorWithCode:@"storekit_invalid_argument" diff --git a/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m b/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m index f7e6dcdaab16..bca9c485773f 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m +++ b/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m @@ -419,6 +419,69 @@ - (void)testGetPendingTransactions { XCTAssertEqualObjects(resultArray, @[ transactionMap ]); } +- (void)testPaymentQueueStorefront { + if (@available(iOS 13, *)) { + { + // storefront is not nil + XCTestExpectation *expectation = [self expectationWithDescription:@"expect success"]; + FlutterMethodCall *call = + [FlutterMethodCall methodCallWithMethodName:@"-[SKPaymentQueue storefront]" arguments:nil]; + SKPaymentQueue *mockQueue = OCMClassMock(SKPaymentQueue.class); + NSDictionary *storefrontMap = @{ + @"countryCode" : @"USA", + @"identifier" : @"unique_identifier", + }; + OCMStub(mockQueue.storefront).andReturn([[SKStorefrontStub alloc] initWithMap:storefrontMap]); + + __block NSDictionary *resultMap; + self.plugin.paymentQueueHandler = + [[FIAPaymentQueueHandler alloc] initWithQueue:mockQueue + transactionsUpdated:nil + transactionRemoved:nil + restoreTransactionFailed:nil + restoreCompletedTransactionsFinished:nil + shouldAddStorePayment:nil + updatedDownloads:nil + transactionCache:OCMClassMock(FIATransactionCache.class)]; + [self.plugin handleMethodCall:call + result:^(id r) { + resultMap = r; + [expectation fulfill]; + }]; + [self waitForExpectations:@[ expectation ] timeout:5]; + XCTAssertEqualObjects(resultMap, storefrontMap); + } + { + // storefront is nil + XCTestExpectation *expectation = [self expectationWithDescription:@"expect success"]; + FlutterMethodCall *call = + [FlutterMethodCall methodCallWithMethodName:@"-[SKPaymentQueue storefront]" arguments:nil]; + SKPaymentQueue *mockQueue = OCMClassMock(SKPaymentQueue.class); + OCMStub(mockQueue.storefront).andReturn(nil); + + __block NSDictionary *resultMap; + self.plugin.paymentQueueHandler = + [[FIAPaymentQueueHandler alloc] initWithQueue:mockQueue + transactionsUpdated:nil + transactionRemoved:nil + restoreTransactionFailed:nil + restoreCompletedTransactionsFinished:nil + shouldAddStorePayment:nil + updatedDownloads:nil + transactionCache:OCMClassMock(FIATransactionCache.class)]; + [self.plugin handleMethodCall:call + result:^(id r) { + resultMap = r; + [expectation fulfill]; + }]; + [self waitForExpectations:@[ expectation ] timeout:5]; + XCTAssertNil(resultMap); + } + } else { + NSLog(@"Skip testPaymentQueueStorefront for iOS lower than 13.0."); + } +} + - (void)testStartObservingPaymentQueue { XCTestExpectation *expectation = [self expectationWithDescription:@"Should return success result"]; diff --git a/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart b/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart index 361cb3af2d9e..3e69ebb29bf8 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart +++ b/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart @@ -41,6 +41,16 @@ class SKPaymentQueueWrapper { SKPaymentQueueDelegateWrapper? _paymentQueueDelegate; SKTransactionObserverWrapper? _observer; + /// Calls [`[SKPaymentQueue storefront]`](https://developer.apple.com/documentation/storekit/skpaymentqueue/3182430-storefront?language=objc) + Future storefront() async { + final Map? storefrontMap = await channel + .invokeMapMethod('-[SKPaymentQueue storefront]'); + if (storefrontMap == null) { + return null; + } + return SKStorefrontWrapper.fromJson(storefrontMap); + } + /// Calls [`-[SKPaymentQueue transactions]`](https://developer.apple.com/documentation/storekit/skpaymentqueue/1506026-transactions?language=objc) Future> transactions() async { return _getTransactionList((await channel 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 46ab2f20159b..49c6bad42659 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.3.6+7 +version: 0.3.7 environment: sdk: ">=2.19.0 <4.0.0" diff --git a/packages/in_app_purchase/in_app_purchase_storekit/test/store_kit_wrappers/sk_methodchannel_apis_test.dart b/packages/in_app_purchase/in_app_purchase_storekit/test/store_kit_wrappers/sk_methodchannel_apis_test.dart index 0cf01b0bbfd6..f04f4b3eb3a3 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/test/store_kit_wrappers/sk_methodchannel_apis_test.dart +++ b/packages/in_app_purchase/in_app_purchase_storekit/test/store_kit_wrappers/sk_methodchannel_apis_test.dart @@ -108,6 +108,22 @@ void main() { expect(await SKPaymentQueueWrapper.canMakePayments(), false); }); + test('storefront returns valid SKStoreFrontWrapper object', () async { + final SKPaymentQueueWrapper queue = SKPaymentQueueWrapper(); + expect( + await queue.storefront(), + SKStorefrontWrapper.fromJson(const { + 'countryCode': 'USA', + 'identifier': 'unique_identifier', + })); + }); + + test('storefront returns null', () async { + fakeStoreKitPlatform.testReturnNull = true; + final SKPaymentQueueWrapper queue = SKPaymentQueueWrapper(); + expect(await queue.storefront(), isNull); + }); + test('transactions should return a valid list of transactions', () async { expect(await SKPaymentQueueWrapper().transactions(), isNotEmpty); }); @@ -250,6 +266,14 @@ class FakeStoreKitPlatform { case '-[SKPaymentQueue transactions]': return Future>.value( [buildTransactionMap(dummyTransaction)]); + case '-[SKPaymentQueue storefront]': + if (testReturnNull) { + return Future.value(); + } + return Future>.value(const { + 'countryCode': 'USA', + 'identifier': 'unique_identifier', + }); case '-[InAppPurchasePlugin addPayment:result:]': payments.add(SKPaymentWrapper.fromJson(Map.from( call.arguments as Map))); From 8285cd02ac5fe2f1435cbf2cfa23178663fae0a4 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Tue, 7 Nov 2023 13:33:24 -0800 Subject: [PATCH 2/5] format --- .../RunnerTests/InAppPurchasePluginTests.m | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m b/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m index bca9c485773f..98d49e3e1218 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m +++ b/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m @@ -425,7 +425,8 @@ - (void)testPaymentQueueStorefront { // storefront is not nil XCTestExpectation *expectation = [self expectationWithDescription:@"expect success"]; FlutterMethodCall *call = - [FlutterMethodCall methodCallWithMethodName:@"-[SKPaymentQueue storefront]" arguments:nil]; + [FlutterMethodCall methodCallWithMethodName:@"-[SKPaymentQueue storefront]" + arguments:nil]; SKPaymentQueue *mockQueue = OCMClassMock(SKPaymentQueue.class); NSDictionary *storefrontMap = @{ @"countryCode" : @"USA", @@ -437,17 +438,17 @@ - (void)testPaymentQueueStorefront { self.plugin.paymentQueueHandler = [[FIAPaymentQueueHandler alloc] initWithQueue:mockQueue transactionsUpdated:nil - transactionRemoved:nil - restoreTransactionFailed:nil - restoreCompletedTransactionsFinished:nil + transactionRemoved:nil + restoreTransactionFailed:nil + restoreCompletedTransactionsFinished:nil shouldAddStorePayment:nil - updatedDownloads:nil - transactionCache:OCMClassMock(FIATransactionCache.class)]; + updatedDownloads:nil + transactionCache:OCMClassMock(FIATransactionCache.class)]; [self.plugin handleMethodCall:call - result:^(id r) { - resultMap = r; - [expectation fulfill]; - }]; + result:^(id r) { + resultMap = r; + [expectation fulfill]; + }]; [self waitForExpectations:@[ expectation ] timeout:5]; XCTAssertEqualObjects(resultMap, storefrontMap); } @@ -455,7 +456,8 @@ - (void)testPaymentQueueStorefront { // storefront is nil XCTestExpectation *expectation = [self expectationWithDescription:@"expect success"]; FlutterMethodCall *call = - [FlutterMethodCall methodCallWithMethodName:@"-[SKPaymentQueue storefront]" arguments:nil]; + [FlutterMethodCall methodCallWithMethodName:@"-[SKPaymentQueue storefront]" + arguments:nil]; SKPaymentQueue *mockQueue = OCMClassMock(SKPaymentQueue.class); OCMStub(mockQueue.storefront).andReturn(nil); @@ -463,17 +465,17 @@ - (void)testPaymentQueueStorefront { self.plugin.paymentQueueHandler = [[FIAPaymentQueueHandler alloc] initWithQueue:mockQueue transactionsUpdated:nil - transactionRemoved:nil - restoreTransactionFailed:nil - restoreCompletedTransactionsFinished:nil + transactionRemoved:nil + restoreTransactionFailed:nil + restoreCompletedTransactionsFinished:nil shouldAddStorePayment:nil - updatedDownloads:nil - transactionCache:OCMClassMock(FIATransactionCache.class)]; + updatedDownloads:nil + transactionCache:OCMClassMock(FIATransactionCache.class)]; [self.plugin handleMethodCall:call - result:^(id r) { - resultMap = r; - [expectation fulfill]; - }]; + result:^(id r) { + resultMap = r; + [expectation fulfill]; + }]; [self waitForExpectations:@[ expectation ] timeout:5]; XCTAssertNil(resultMap); } From eba3f75e2fe0bbd8e1f3f70a98f29d143f5ee979 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Tue, 14 Nov 2023 10:35:08 -0800 Subject: [PATCH 3/5] review --- .../darwin/Classes/FIAPaymentQueueHandler.h | 2 +- .../darwin/Classes/InAppPurchasePlugin.m | 10 +++++----- .../shared/RunnerTests/InAppPurchasePluginTests.m | 2 +- .../store_kit_wrappers/sk_payment_queue_wrapper.dart | 1 + 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/FIAPaymentQueueHandler.h b/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/FIAPaymentQueueHandler.h index c7391465e613..356940cd39ba 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/FIAPaymentQueueHandler.h +++ b/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/FIAPaymentQueueHandler.h @@ -21,7 +21,7 @@ typedef void (^UpdatedDownloads)(NSArray *downloads); @property(NS_NONATOMIC_IOSONLY, weak, nullable) id delegate API_AVAILABLE( ios(13.0), macos(10.15), watchos(6.2)); -@property(NS_NONATOMIC_IOSONLY, readonly, nullable) +@property(nonatomic, readonly, nullable) SKStorefront *storefront API_AVAILABLE(ios(13.0), macos(10.15), watchos(6.2)); /// Creates a new FIAPaymentQueueHandler initialized with an empty diff --git a/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/InAppPurchasePlugin.m b/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/InAppPurchasePlugin.m index d62fa04d16af..7086f611acea 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/InAppPurchasePlugin.m +++ b/packages/in_app_purchase/in_app_purchase_storekit/darwin/Classes/InAppPurchasePlugin.m @@ -142,7 +142,7 @@ - (void)getPendingTransactions:(FlutterResult)result { } - (void)getStorefront:(FlutterResult)result { - if (@available(iOS 13.0, *)) { + if (@available(iOS 13.0, macOS 10.15, *)) { SKStorefront *storefront = self.paymentQueueHandler.storefront; if (!storefront) { result(nil); @@ -150,11 +150,11 @@ - (void)getStorefront:(FlutterResult)result { } result([FIAObjectTranslator getMapFromSKStorefront:storefront]); return; - } else { - NSLog(@"storefront is not avaialbe in iOS below 13.0."); - result(nil); - return; } + + NSLog(@"storefront is not avaialbe in iOS below 13.0 or macOS below 10.15."); + result(nil); + return; } - (void)handleProductRequestMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { diff --git a/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m b/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m index 98d49e3e1218..800b382acbc1 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m +++ b/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m @@ -420,7 +420,7 @@ - (void)testGetPendingTransactions { } - (void)testPaymentQueueStorefront { - if (@available(iOS 13, *)) { + if (@available(iOS 13, macOS 10.15, *)) { { // storefront is not nil XCTestExpectation *expectation = [self expectationWithDescription:@"expect success"]; diff --git a/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart b/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart index 3e69ebb29bf8..70a87a4961ac 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart +++ b/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart @@ -42,6 +42,7 @@ class SKPaymentQueueWrapper { SKTransactionObserverWrapper? _observer; /// Calls [`[SKPaymentQueue storefront]`](https://developer.apple.com/documentation/storekit/skpaymentqueue/3182430-storefront?language=objc) + /// Returns `null` if the user's device is below iOS 13.0 or macOS 10.15. Future storefront() async { final Map? storefrontMap = await channel .invokeMapMethod('-[SKPaymentQueue storefront]'); From f6f61ca4b22a7b0e9aa8bc78a8a96419f3744fe0 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Wed, 15 Nov 2023 08:15:22 -0800 Subject: [PATCH 4/5] review --- .../RunnerTests/InAppPurchasePluginTests.m | 121 +++++++++--------- .../sk_payment_queue_wrapper.dart | 5 +- 2 files changed, 65 insertions(+), 61 deletions(-) diff --git a/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m b/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m index 800b382acbc1..a91c701aeb66 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m +++ b/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m @@ -421,66 +421,69 @@ - (void)testGetPendingTransactions { - (void)testPaymentQueueStorefront { if (@available(iOS 13, macOS 10.15, *)) { - { - // storefront is not nil - XCTestExpectation *expectation = [self expectationWithDescription:@"expect success"]; - FlutterMethodCall *call = - [FlutterMethodCall methodCallWithMethodName:@"-[SKPaymentQueue storefront]" - arguments:nil]; - SKPaymentQueue *mockQueue = OCMClassMock(SKPaymentQueue.class); - NSDictionary *storefrontMap = @{ - @"countryCode" : @"USA", - @"identifier" : @"unique_identifier", - }; - OCMStub(mockQueue.storefront).andReturn([[SKStorefrontStub alloc] initWithMap:storefrontMap]); - - __block NSDictionary *resultMap; - self.plugin.paymentQueueHandler = - [[FIAPaymentQueueHandler alloc] initWithQueue:mockQueue - transactionsUpdated:nil - transactionRemoved:nil - restoreTransactionFailed:nil - restoreCompletedTransactionsFinished:nil - shouldAddStorePayment:nil - updatedDownloads:nil - transactionCache:OCMClassMock(FIATransactionCache.class)]; - [self.plugin handleMethodCall:call - result:^(id r) { - resultMap = r; - [expectation fulfill]; - }]; - [self waitForExpectations:@[ expectation ] timeout:5]; - XCTAssertEqualObjects(resultMap, storefrontMap); - } - { - // storefront is nil - XCTestExpectation *expectation = [self expectationWithDescription:@"expect success"]; - FlutterMethodCall *call = - [FlutterMethodCall methodCallWithMethodName:@"-[SKPaymentQueue storefront]" - arguments:nil]; - SKPaymentQueue *mockQueue = OCMClassMock(SKPaymentQueue.class); - OCMStub(mockQueue.storefront).andReturn(nil); - - __block NSDictionary *resultMap; - self.plugin.paymentQueueHandler = - [[FIAPaymentQueueHandler alloc] initWithQueue:mockQueue - transactionsUpdated:nil - transactionRemoved:nil - restoreTransactionFailed:nil - restoreCompletedTransactionsFinished:nil - shouldAddStorePayment:nil - updatedDownloads:nil - transactionCache:OCMClassMock(FIATransactionCache.class)]; - [self.plugin handleMethodCall:call - result:^(id r) { - resultMap = r; - [expectation fulfill]; - }]; - [self waitForExpectations:@[ expectation ] timeout:5]; - XCTAssertNil(resultMap); - } + // storefront is not nil + XCTestExpectation *expectation = [self expectationWithDescription:@"expect success"]; + FlutterMethodCall *call = + [FlutterMethodCall methodCallWithMethodName:@"-[SKPaymentQueue storefront]" + arguments:nil]; + SKPaymentQueue *mockQueue = OCMClassMock(SKPaymentQueue.class); + NSDictionary *storefrontMap = @{ + @"countryCode" : @"USA", + @"identifier" : @"unique_identifier", + }; + OCMStub(mockQueue.storefront).andReturn([[SKStorefrontStub alloc] initWithMap:storefrontMap]); + + __block NSDictionary *resultMap; + self.plugin.paymentQueueHandler = + [[FIAPaymentQueueHandler alloc] initWithQueue:mockQueue + transactionsUpdated:nil + transactionRemoved:nil + restoreTransactionFailed:nil + restoreCompletedTransactionsFinished:nil + shouldAddStorePayment:nil + updatedDownloads:nil + transactionCache:OCMClassMock(FIATransactionCache.class)]; + [self.plugin handleMethodCall:call + result:^(id r) { + resultMap = r; + [expectation fulfill]; + }]; + [self waitForExpectations:@[ expectation ] timeout:5]; + XCTAssertEqualObjects(resultMap, storefrontMap); + } else { + NSLog(@"Skip testPaymentQueueStorefront for iOS lower than 13.0 or macOS lower than 10.15."); + } +} + + +- (void)testPaymentQueueStorefrontReturnsNil { + if (@available(iOS 13, macOS 10.15, *)) { + XCTestExpectation *expectation = [self expectationWithDescription:@"expect success"]; + FlutterMethodCall *call = + [FlutterMethodCall methodCallWithMethodName:@"-[SKPaymentQueue storefront]" + arguments:nil]; + SKPaymentQueue *mockQueue = OCMClassMock(SKPaymentQueue.class); + OCMStub(mockQueue.storefront).andReturn(nil); + + __block NSDictionary *resultMap; + self.plugin.paymentQueueHandler = + [[FIAPaymentQueueHandler alloc] initWithQueue:mockQueue + transactionsUpdated:nil + transactionRemoved:nil + restoreTransactionFailed:nil + restoreCompletedTransactionsFinished:nil + shouldAddStorePayment:nil + updatedDownloads:nil + transactionCache:OCMClassMock(FIATransactionCache.class)]; + [self.plugin handleMethodCall:call + result:^(id r) { + resultMap = r; + [expectation fulfill]; + }]; + [self waitForExpectations:@[ expectation ] timeout:5]; + XCTAssertNil(resultMap); } else { - NSLog(@"Skip testPaymentQueueStorefront for iOS lower than 13.0."); + NSLog(@"Skip testPaymentQueueStorefront for iOS lower than 13.0 or macOS lower than 10.15."); } } diff --git a/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart b/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart index 70a87a4961ac..7682714ab9cd 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart +++ b/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart @@ -41,7 +41,8 @@ class SKPaymentQueueWrapper { SKPaymentQueueDelegateWrapper? _paymentQueueDelegate; SKTransactionObserverWrapper? _observer; - /// Calls [`[SKPaymentQueue storefront]`](https://developer.apple.com/documentation/storekit/skpaymentqueue/3182430-storefront?language=objc) + /// Calls [`[SKPaymentQueue storefront]`](https://developer.apple.com/documentation/storekit/skpaymentqueue/3182430-storefront?language=objc). + /// /// Returns `null` if the user's device is below iOS 13.0 or macOS 10.15. Future storefront() async { final Map? storefrontMap = await channel @@ -52,7 +53,7 @@ class SKPaymentQueueWrapper { return SKStorefrontWrapper.fromJson(storefrontMap); } - /// Calls [`-[SKPaymentQueue transactions]`](https://developer.apple.com/documentation/storekit/skpaymentqueue/1506026-transactions?language=objc) + /// Calls [`-[SKPaymentQueue transactions]`](https://developer.apple.com/documentation/storekit/skpaymentqueue/1506026-transactions?language=objc). Future> transactions() async { return _getTransactionList((await channel .invokeListMethod('-[SKPaymentQueue transactions]'))!); From 83145c64446db7acb9ba16418d31f39777fdfae3 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Wed, 15 Nov 2023 15:03:57 -0800 Subject: [PATCH 5/5] format --- .../RunnerTests/InAppPurchasePluginTests.m | 47 +++++++++---------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m b/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m index a91c701aeb66..f8aa0e34afdd 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m +++ b/packages/in_app_purchase/in_app_purchase_storekit/example/shared/RunnerTests/InAppPurchasePluginTests.m @@ -424,8 +424,7 @@ - (void)testPaymentQueueStorefront { // storefront is not nil XCTestExpectation *expectation = [self expectationWithDescription:@"expect success"]; FlutterMethodCall *call = - [FlutterMethodCall methodCallWithMethodName:@"-[SKPaymentQueue storefront]" - arguments:nil]; + [FlutterMethodCall methodCallWithMethodName:@"-[SKPaymentQueue storefront]" arguments:nil]; SKPaymentQueue *mockQueue = OCMClassMock(SKPaymentQueue.class); NSDictionary *storefrontMap = @{ @"countryCode" : @"USA", @@ -437,31 +436,29 @@ - (void)testPaymentQueueStorefront { self.plugin.paymentQueueHandler = [[FIAPaymentQueueHandler alloc] initWithQueue:mockQueue transactionsUpdated:nil - transactionRemoved:nil - restoreTransactionFailed:nil - restoreCompletedTransactionsFinished:nil + transactionRemoved:nil + restoreTransactionFailed:nil + restoreCompletedTransactionsFinished:nil shouldAddStorePayment:nil - updatedDownloads:nil - transactionCache:OCMClassMock(FIATransactionCache.class)]; + updatedDownloads:nil + transactionCache:OCMClassMock(FIATransactionCache.class)]; [self.plugin handleMethodCall:call - result:^(id r) { - resultMap = r; - [expectation fulfill]; - }]; + result:^(id r) { + resultMap = r; + [expectation fulfill]; + }]; [self waitForExpectations:@[ expectation ] timeout:5]; XCTAssertEqualObjects(resultMap, storefrontMap); } else { - NSLog(@"Skip testPaymentQueueStorefront for iOS lower than 13.0 or macOS lower than 10.15."); + NSLog(@"Skip testPaymentQueueStorefront for iOS lower than 13.0 or macOS lower than 10.15."); } } - - (void)testPaymentQueueStorefrontReturnsNil { if (@available(iOS 13, macOS 10.15, *)) { XCTestExpectation *expectation = [self expectationWithDescription:@"expect success"]; FlutterMethodCall *call = - [FlutterMethodCall methodCallWithMethodName:@"-[SKPaymentQueue storefront]" - arguments:nil]; + [FlutterMethodCall methodCallWithMethodName:@"-[SKPaymentQueue storefront]" arguments:nil]; SKPaymentQueue *mockQueue = OCMClassMock(SKPaymentQueue.class); OCMStub(mockQueue.storefront).andReturn(nil); @@ -469,21 +466,21 @@ - (void)testPaymentQueueStorefrontReturnsNil { self.plugin.paymentQueueHandler = [[FIAPaymentQueueHandler alloc] initWithQueue:mockQueue transactionsUpdated:nil - transactionRemoved:nil - restoreTransactionFailed:nil - restoreCompletedTransactionsFinished:nil + transactionRemoved:nil + restoreTransactionFailed:nil + restoreCompletedTransactionsFinished:nil shouldAddStorePayment:nil - updatedDownloads:nil - transactionCache:OCMClassMock(FIATransactionCache.class)]; + updatedDownloads:nil + transactionCache:OCMClassMock(FIATransactionCache.class)]; [self.plugin handleMethodCall:call - result:^(id r) { - resultMap = r; - [expectation fulfill]; - }]; + result:^(id r) { + resultMap = r; + [expectation fulfill]; + }]; [self waitForExpectations:@[ expectation ] timeout:5]; XCTAssertNil(resultMap); } else { - NSLog(@"Skip testPaymentQueueStorefront for iOS lower than 13.0 or macOS lower than 10.15."); + NSLog(@"Skip testPaymentQueueStorefront for iOS lower than 13.0 or macOS lower than 10.15."); } }