diff --git a/QonversionTests/QRequestSerializerTests.m b/QonversionTests/QRequestSerializerTests.m index 5badfcfe..71fd2cfc 100644 --- a/QonversionTests/QRequestSerializerTests.m +++ b/QonversionTests/QRequestSerializerTests.m @@ -1,17 +1,18 @@ #import #import "QNRequestSerializer.h" +#import "QONStoreKit2PurchaseModel.h" @interface QNRequestSerializerTests : XCTestCase @property (nonatomic, strong) QNRequestSerializer *serializer; @end - + @implementation QNRequestSerializerTests - (void)setUp { [super setUp]; - + self.serializer = [[QNRequestSerializer alloc] init]; } @@ -21,4 +22,89 @@ - (void)testThatLaunchDataCorrect { XCTAssertNotNil(launchData); } +- (QONStoreKit2PurchaseModel *)baseStoreKit2Model { + QONStoreKit2PurchaseModel *model = [QONStoreKit2PurchaseModel new]; + model.productId = @"com.qonversion.test.monthly"; + model.price = @"9.99"; + model.currency = @"USD"; + model.transactionId = @"1000000000000001"; + model.originalTransactionId = @"1000000000000001"; + model.subscriptionPeriodUnit = @"2"; + model.subscriptionPeriodNumberOfUnits = @"1"; + + return model; +} + +- (void)testThatStoreKit2PaidIntroReportsIntroductoryPrice { + QONStoreKit2PurchaseModel *model = [self baseStoreKit2Model]; + model.introductoryPrice = @"1.99"; + model.introductoryNumberOfPeriods = @"1"; + model.introductoryPeriodNumberOfUnits = @"1"; + model.introductoryPeriodUnit = @"2"; + model.introductoryPaymentMode = @"1"; + + NSDictionary *data = [self.serializer purchaseInfo:model receipt:nil]; + NSDictionary *introOffer = data[@"introductory_offer"]; + + XCTAssertNotNil(introOffer); + XCTAssertEqualObjects(introOffer[@"value"], @"1.99"); + XCTAssertNotEqualObjects(introOffer[@"value"], model.price); + XCTAssertEqualObjects(introOffer[@"number_of_periods"], @"1"); + XCTAssertEqualObjects(introOffer[@"period_number_of_units"], @"1"); + XCTAssertEqualObjects(introOffer[@"period_unit"], @"2"); + XCTAssertEqualObjects(introOffer[@"payment_mode"], @"1"); +} + +- (void)testThatStoreKit2FreeTrialReportsZeroIntroductoryPrice { + QONStoreKit2PurchaseModel *model = [self baseStoreKit2Model]; + model.introductoryPrice = @"0"; + model.introductoryNumberOfPeriods = @"1"; + model.introductoryPeriodNumberOfUnits = @"7"; + model.introductoryPeriodUnit = @"0"; + model.introductoryPaymentMode = @"2"; + + NSDictionary *data = [self.serializer purchaseInfo:model receipt:nil]; + NSDictionary *introOffer = data[@"introductory_offer"]; + + XCTAssertNotNil(introOffer); + XCTAssertEqualObjects(introOffer[@"value"], @"0"); +} + +- (void)testThatStoreKit2NoIntroOmitsIntroductoryOffer { + QONStoreKit2PurchaseModel *model = [self baseStoreKit2Model]; + + NSDictionary *data = [self.serializer purchaseInfo:model receipt:nil]; + + XCTAssertNil(data[@"introductory_offer"]); +} + +- (void)testThatStoreKit2PromoOfferReportsValues { + QONStoreKit2PurchaseModel *model = [self baseStoreKit2Model]; + model.promoOfferId = @"promo_winback"; + model.promoOfferPrice = @"4.99"; + model.promoOfferNumberOfPeriods = @"1"; + model.promoOfferPeriodNumberOfUnits = @"1"; + model.promoOfferPeriodUnit = @"2"; + model.promoOfferPaymentMode = @"1"; + + NSDictionary *data = [self.serializer purchaseInfo:model receipt:nil]; + NSDictionary *promoOffer = data[@"promo_offer"]; + + XCTAssertNotNil(promoOffer); + XCTAssertEqualObjects(promoOffer[@"id"], @"promo_winback"); + XCTAssertEqualObjects(promoOffer[@"value"], @"4.99"); + XCTAssertEqualObjects(promoOffer[@"number_of_periods"], @"1"); + XCTAssertEqualObjects(promoOffer[@"period_number_of_units"], @"1"); + XCTAssertEqualObjects(promoOffer[@"period_unit"], @"2"); + XCTAssertEqualObjects(promoOffer[@"payment_mode"], @"1"); +} + +- (void)testThatStoreKit2NoPromoOmitsPromoOffer { + QONStoreKit2PurchaseModel *model = [self baseStoreKit2Model]; + + NSDictionary *data = [self.serializer purchaseInfo:model receipt:nil]; + + XCTAssertNil(data[@"promo_offer"]); +} + @end diff --git a/Sources/Qonversion/Qonversion/Core/QNRequestSerializer/QNRequestSerializer.m b/Sources/Qonversion/Qonversion/Core/QNRequestSerializer/QNRequestSerializer.m index 0e75990f..027a7d19 100644 --- a/Sources/Qonversion/Qonversion/Core/QNRequestSerializer/QNRequestSerializer.m +++ b/Sources/Qonversion/Qonversion/Core/QNRequestSerializer/QNRequestSerializer.m @@ -136,25 +136,29 @@ - (NSDictionary *)purchaseInfo:(QONStoreKit2PurchaseModel *)purchaseModel purchaseDict[@"period_unit"] = purchaseModel.subscriptionPeriodUnit; purchaseDict[@"period_number_of_units"] = purchaseModel.subscriptionPeriodNumberOfUnits; - NSMutableDictionary *introOffer = [[NSMutableDictionary alloc] init]; - - introOffer[@"value"] = purchaseModel.price; - introOffer[@"number_of_periods"] = purchaseModel.introductoryNumberOfPeriods; - introOffer[@"period_number_of_units"] = purchaseModel.introductoryPeriodNumberOfUnits; - introOffer[@"period_unit"] = purchaseModel.introductoryPeriodUnit; - introOffer[@"payment_mode"] = purchaseModel.introductoryPaymentMode; - - result[@"introductory_offer"] = introOffer.count > 0 ? introOffer : nil; + if (purchaseModel.introductoryPrice != nil) { + NSMutableDictionary *introOffer = [[NSMutableDictionary alloc] init]; + + introOffer[@"value"] = purchaseModel.introductoryPrice; + introOffer[@"number_of_periods"] = purchaseModel.introductoryNumberOfPeriods; + introOffer[@"period_number_of_units"] = purchaseModel.introductoryPeriodNumberOfUnits; + introOffer[@"period_unit"] = purchaseModel.introductoryPeriodUnit; + introOffer[@"payment_mode"] = purchaseModel.introductoryPaymentMode; + + result[@"introductory_offer"] = introOffer; + } - NSMutableDictionary *promoOffer = [[NSMutableDictionary alloc] init]; - promoOffer[@"id"] = purchaseModel.promoOfferId; - promoOffer[@"value"] = purchaseModel.promoOfferPrice; - promoOffer[@"number_of_periods"] = purchaseModel.promoOfferNumberOfPeriods; - promoOffer[@"period_number_of_units"] = purchaseModel.promoOfferPeriodNumberOfUnits; - promoOffer[@"period_unit"] = purchaseModel.promoOfferPeriodUnit; - promoOffer[@"payment_mode"] = purchaseModel.promoOfferPaymentMode; + if (purchaseModel.promoOfferId != nil) { + NSMutableDictionary *promoOffer = [[NSMutableDictionary alloc] init]; + promoOffer[@"id"] = purchaseModel.promoOfferId; + promoOffer[@"value"] = purchaseModel.promoOfferPrice; + promoOffer[@"number_of_periods"] = purchaseModel.promoOfferNumberOfPeriods; + promoOffer[@"period_number_of_units"] = purchaseModel.promoOfferPeriodNumberOfUnits; + promoOffer[@"period_unit"] = purchaseModel.promoOfferPeriodUnit; + promoOffer[@"payment_mode"] = purchaseModel.promoOfferPaymentMode; - result[@"promo_offer"] = [promoOffer copy]; + result[@"promo_offer"] = [promoOffer copy]; + } purchaseDict[@"country"] = purchaseModel.storefrontCountryCode;