From 12a7ccbef21697c049e4103988cc04adf30b4e0c Mon Sep 17 00:00:00 2001 From: JeongHean Kim Date: Sun, 14 Nov 2021 22:17:18 +0900 Subject: [PATCH] Use http client in validateReceiptIos (#322) * Use http client in validateReceiptIos * Refactor nullable variable to late variable --- lib/flutter_inapp_purchase.dart | 10 ++--- test/flutter_inapp_purchase_test.dart | 54 ++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/lib/flutter_inapp_purchase.dart b/lib/flutter_inapp_purchase.dart index 0c546d62..f8860fe4 100644 --- a/lib/flutter_inapp_purchase.dart +++ b/lib/flutter_inapp_purchase.dart @@ -40,10 +40,10 @@ class FlutterInappPurchase { static MethodChannel get channel => _channel; final Platform _pf; - final http.Client? _httpClient; + late http.Client _httpClient; static Platform get _platform => instance._pf; - static http.Client? get _client => instance._httpClient; + static http.Client get _client => instance._httpClient; factory FlutterInappPurchase(FlutterInappPurchase _instance) { instance = _instance; @@ -53,7 +53,7 @@ class FlutterInappPurchase { @visibleForTesting FlutterInappPurchase.private(Platform platform, {http.Client? client}) : _pf = platform, - _httpClient = client; + _httpClient = client ?? http.Client(); /// Returns the platform version on `Android` and `iOS`. /// @@ -549,7 +549,7 @@ class FlutterInappPurchase { final String url = isTest ? 'https://sandbox.itunes.apple.com/verifyReceipt' : 'https://buy.itunes.apple.com/verifyReceipt'; - return await http.post( + return await _client.post( Uri.parse(url), headers: { 'Accept': 'application/json', @@ -585,7 +585,7 @@ class FlutterInappPurchase { final String type = isSubscription ? 'subscriptions' : 'products'; final String url = 'https://www.googleapis.com/androidpublisher/v3/applications/$packageName/purchases/$type/$productId/tokens/$productToken?access_token=$accessToken'; - return await _client!.get( + return await _client.get( Uri.parse(url), headers: { 'Accept': 'application/json', diff --git a/test/flutter_inapp_purchase_test.dart b/test/flutter_inapp_purchase_test.dart index 2a8aa0f6..a3f2eb02 100644 --- a/test/flutter_inapp_purchase_test.dart +++ b/test/flutter_inapp_purchase_test.dart @@ -1400,7 +1400,7 @@ void main() { }); FlutterInappPurchase(FlutterInappPurchase.private( - FakePlatform(operatingSystem: "ios"), + FakePlatform(operatingSystem: "android"), client: mockClient)); }); @@ -1443,5 +1443,57 @@ void main() { "https://www.googleapis.com/androidpublisher/v3/applications/$packageName/purchases/$type/$productId/tokens/$productToken?access_token=$accessToken"); }); }); + + group('validateReceiptIos', () { + final receiptBody = { + 'receipt-data': 'purchasedItem.transactionReceipt', + 'password': 'apple_password' + }; + + setUp(() { + http.Client mockClient = MockClient((request) async { + return Response(json.encode({'status': 0}), 200); + }); + + FlutterInappPurchase(FlutterInappPurchase.private( + FakePlatform(operatingSystem: "ios"), + client: mockClient, + )); + }); + + tearDown(() { + FlutterInappPurchase.channel.setMethodCallHandler(null); + }); + + test('returns correct http request url in sandbox', () async { + final response = await FlutterInappPurchase.instance.validateReceiptIos( + receiptBody: receiptBody, + isTest: true, + ); + + expect( + response.request!.url.toString(), + "https://sandbox.itunes.apple.com/verifyReceipt", + ); + expect(response.statusCode, 200); + final data = jsonDecode(response.body); + expect(data['status'], 0); + }); + + test('returns correct http request url in production', () async { + final response = await FlutterInappPurchase.instance.validateReceiptIos( + receiptBody: receiptBody, + isTest: false, + ); + + expect( + response.request!.url.toString(), + "https://buy.itunes.apple.com/verifyReceipt", + ); + expect(response.statusCode, 200); + final data = jsonDecode(response.body); + expect(data['status'], 0); + }); + }); }); }