blob: b6de5e035c5eceaf9458a10e74a0fa456a16755f [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:in_app_purchase_storekit/src/types/app_store_product_details.dart';
import 'package:in_app_purchase_storekit/src/types/app_store_purchase_details.dart';
import 'package:in_app_purchase_storekit/store_kit_wrappers.dart';
import 'package:test/test.dart';
import 'sk_test_stub_objects.dart';
void main() {
group('product related object wrapper test', () {
test(
'SKProductSubscriptionPeriodWrapper should have property values consistent with map',
() {
final SKProductSubscriptionPeriodWrapper wrapper =
SKProductSubscriptionPeriodWrapper.fromJson(
buildSubscriptionPeriodMap(dummySubscription));
expect(wrapper, equals(dummySubscription));
});
test(
'SKProductSubscriptionPeriodWrapper should have properties to be default values if map is empty',
() {
final SKProductSubscriptionPeriodWrapper wrapper =
SKProductSubscriptionPeriodWrapper.fromJson(
const <String, dynamic>{});
expect(wrapper.numberOfUnits, 0);
expect(wrapper.unit, SKSubscriptionPeriodUnit.day);
});
test(
'SKProductDiscountWrapper should have property values consistent with map',
() {
final SKProductDiscountWrapper wrapper =
SKProductDiscountWrapper.fromJson(buildDiscountMap(dummyDiscount));
expect(wrapper, equals(dummyDiscount));
});
test(
'SKProductDiscountWrapper missing identifier and type should have '
'property values consistent with map', () {
final SKProductDiscountWrapper wrapper =
SKProductDiscountWrapper.fromJson(
buildDiscountMapMissingIdentifierAndType(
dummyDiscountMissingIdentifierAndType));
expect(wrapper, equals(dummyDiscountMissingIdentifierAndType));
});
test(
'SKProductDiscountWrapper should have properties to be default if map is empty',
() {
final SKProductDiscountWrapper wrapper =
SKProductDiscountWrapper.fromJson(const <String, dynamic>{});
expect(wrapper.price, '');
expect(
wrapper.priceLocale,
SKPriceLocaleWrapper(
currencyCode: '',
currencySymbol: '',
countryCode: '',
));
expect(wrapper.numberOfPeriods, 0);
expect(wrapper.paymentMode, SKProductDiscountPaymentMode.payAsYouGo);
expect(
wrapper.subscriptionPeriod,
SKProductSubscriptionPeriodWrapper(
numberOfUnits: 0, unit: SKSubscriptionPeriodUnit.day));
});
test('SKProductWrapper should have property values consistent with map',
() {
final SKProductWrapper wrapper =
SKProductWrapper.fromJson(buildProductMap(dummyProductWrapper));
expect(wrapper, equals(dummyProductWrapper));
});
test(
'SKProductWrapper should have properties to be default if map is empty',
() {
final SKProductWrapper wrapper =
SKProductWrapper.fromJson(const <String, dynamic>{});
expect(wrapper.productIdentifier, '');
expect(wrapper.localizedTitle, '');
expect(wrapper.localizedDescription, '');
expect(
wrapper.priceLocale,
SKPriceLocaleWrapper(
currencyCode: '',
currencySymbol: '',
countryCode: '',
));
expect(wrapper.subscriptionGroupIdentifier, null);
expect(wrapper.price, '');
expect(wrapper.subscriptionPeriod, null);
expect(wrapper.discounts, <SKProductDiscountWrapper>[]);
});
test('toProductDetails() should return correct Product object', () {
final SKProductWrapper wrapper =
SKProductWrapper.fromJson(buildProductMap(dummyProductWrapper));
final AppStoreProductDetails product =
AppStoreProductDetails.fromSKProduct(wrapper);
expect(product.title, wrapper.localizedTitle);
expect(product.description, wrapper.localizedDescription);
expect(product.id, wrapper.productIdentifier);
expect(product.price, wrapper.priceLocale.currencySymbol + wrapper.price);
expect(product.skProduct, wrapper);
});
test('SKProductResponse wrapper should match', () {
final SkProductResponseWrapper wrapper =
SkProductResponseWrapper.fromJson(
buildProductResponseMap(dummyProductResponseWrapper));
expect(wrapper, equals(dummyProductResponseWrapper));
});
test('SKProductResponse wrapper should default to empty list', () {
final Map<String, List<dynamic>> productResponseMapEmptyList =
<String, List<dynamic>>{
'products': <Map<String, dynamic>>[],
'invalidProductIdentifiers': <String>[],
};
final SkProductResponseWrapper wrapper =
SkProductResponseWrapper.fromJson(productResponseMapEmptyList);
expect(wrapper.products.length, 0);
expect(wrapper.invalidProductIdentifiers.length, 0);
});
test('LocaleWrapper should have property values consistent with map', () {
final SKPriceLocaleWrapper wrapper =
SKPriceLocaleWrapper.fromJson(buildLocaleMap(dollarLocale));
expect(wrapper, equals(dollarLocale));
});
});
group('Payment queue related object tests', () {
test('Should construct correct SKPaymentWrapper from json', () {
final SKPaymentWrapper payment =
SKPaymentWrapper.fromJson(dummyPayment.toMap());
expect(payment, equals(dummyPayment));
});
test('SKPaymentWrapper should have propery values consistent with .toMap()',
() {
final Map<String, dynamic> mapResult = dummyPaymentWithDiscount.toMap();
expect(mapResult['productIdentifier'],
dummyPaymentWithDiscount.productIdentifier);
expect(mapResult['applicationUsername'],
dummyPaymentWithDiscount.applicationUsername);
expect(mapResult['requestData'], dummyPaymentWithDiscount.requestData);
expect(mapResult['quantity'], dummyPaymentWithDiscount.quantity);
expect(mapResult['simulatesAskToBuyInSandbox'],
dummyPaymentWithDiscount.simulatesAskToBuyInSandbox);
expect(mapResult['paymentDiscount'],
equals(dummyPaymentWithDiscount.paymentDiscount?.toMap()));
});
test('Should construct correct SKError from json', () {
final SKError error = SKError.fromJson(buildErrorMap(dummyError));
expect(error, equals(dummyError));
});
test('Should construct correct SKTransactionWrapper from json', () {
final SKPaymentTransactionWrapper transaction =
SKPaymentTransactionWrapper.fromJson(
buildTransactionMap(dummyTransaction));
expect(transaction, equals(dummyTransaction));
});
test('toPurchaseDetails() should return correct PurchaseDetail object', () {
final AppStorePurchaseDetails details =
AppStorePurchaseDetails.fromSKTransaction(
dummyTransaction, 'receipt data');
expect(dummyTransaction.transactionIdentifier, details.purchaseID);
expect(dummyTransaction.payment.productIdentifier, details.productID);
expect(dummyTransaction.transactionTimeStamp, isNotNull);
expect((dummyTransaction.transactionTimeStamp! * 1000).toInt().toString(),
details.transactionDate);
expect(details.verificationData.localVerificationData, 'receipt data');
expect(details.verificationData.serverVerificationData, 'receipt data');
expect(details.verificationData.source, 'app_store');
expect(details.skPaymentTransaction, dummyTransaction);
expect(details.pendingCompletePurchase, true);
});
test('SKPaymentTransactionWrapper.toFinishMap set correct value', () {
final SKPaymentTransactionWrapper transactionWrapper =
SKPaymentTransactionWrapper(
payment: dummyPayment,
transactionState: SKPaymentTransactionStateWrapper.failed,
transactionIdentifier: 'abcd');
final Map<String, String?> finishMap = transactionWrapper.toFinishMap();
expect(finishMap['transactionIdentifier'], 'abcd');
expect(finishMap['productIdentifier'], dummyPayment.productIdentifier);
});
test(
'SKPaymentTransactionWrapper.toFinishMap should set transactionIdentifier to null when necessary',
() {
final SKPaymentTransactionWrapper transactionWrapper =
SKPaymentTransactionWrapper(
payment: dummyPayment,
transactionState: SKPaymentTransactionStateWrapper.failed);
final Map<String, String?> finishMap = transactionWrapper.toFinishMap();
expect(finishMap['transactionIdentifier'], null);
});
test('Should generate correct map of the payment object', () {
final Map<String, Object?> map = dummyPayment.toMap();
expect(map['productIdentifier'], dummyPayment.productIdentifier);
expect(map['applicationUsername'], dummyPayment.applicationUsername);
expect(map['requestData'], dummyPayment.requestData);
expect(map['quantity'], dummyPayment.quantity);
expect(map['simulatesAskToBuyInSandbox'],
dummyPayment.simulatesAskToBuyInSandbox);
});
});
}