diff --git a/Sources/mParticle-Appboy/MPKitAppboy.m b/Sources/mParticle-Appboy/MPKitAppboy.m index e50f343..68639e4 100644 --- a/Sources/mParticle-Appboy/MPKitAppboy.m +++ b/Sources/mParticle-Appboy/MPKitAppboy.m @@ -41,6 +41,8 @@ // User Attribute key with reserved functionality for Braze kit static NSString *const brazeUserAttributeDob = @"dob"; +static NSString *const brazeUserAttributeEmailSubscribe = @"email_subscribe"; +static NSString *const brazeUserAttributePushSubscribe = @"push_subscribe"; // Strings used when sending enhanced commerce events static NSString *const attributesKey = @"Attributes"; @@ -796,6 +798,30 @@ - (MPKitExecStatus *)setUserAttribute:(NSString *)key value:(NSString *)value { [appboyInstance.user setPhoneNumber:value]; } else if ([key isEqualToString:mParticleUserAttributeZip]){ [appboyInstance.user setCustomAttributeWithKey:@"Zip" stringValue:value]; + } else if ([key isEqualToString:brazeUserAttributeEmailSubscribe]) { + if([value isEqualToString:@"opted_in"]) { + [appboyInstance.user setEmailSubscriptionState:BRZUserSubscriptionStateOptedIn]; + } else if ([value isEqualToString:@"unsubscribed"]) { + [appboyInstance.user setEmailSubscriptionState:BRZUserSubscriptionStateUnsubscribed]; + } else if ([value isEqualToString:@"subscribed"]) { + [appboyInstance.user setEmailSubscriptionState:BRZUserSubscriptionStateSubscribed]; + } else { + NSLog(@"mParticle -> Invalid email_subscribe value: %@", value); + execStatus = [[MPKitExecStatus alloc] initWithSDKCode:@(MPKitInstanceAppboy) returnCode:MPKitReturnCodeFail]; + return execStatus; + } + } else if ([key isEqualToString:brazeUserAttributePushSubscribe]) { + if([value isEqualToString:@"opted_in"]) { + [appboyInstance.user setPushNotificationSubscriptionState:BRZUserSubscriptionStateOptedIn]; + } else if ([value isEqualToString:@"unsubscribed"]) { + [appboyInstance.user setPushNotificationSubscriptionState:BRZUserSubscriptionStateUnsubscribed]; + } else if ([value isEqualToString:@"subscribed"]) { + [appboyInstance.user setPushNotificationSubscriptionState:BRZUserSubscriptionStateSubscribed]; + } else { + NSLog(@"mParticle -> Invalid push_subscribe value: %@", value); + execStatus = [[MPKitExecStatus alloc] initWithSDKCode:@(MPKitInstanceAppboy) returnCode:MPKitReturnCodeFail]; + return execStatus; + } } else { key = [self stripCharacter:@"$" fromString:key]; diff --git a/mParticle_AppboyTests/mParticle_AppboyTests.m b/mParticle_AppboyTests/mParticle_AppboyTests.m index 7617bb7..2dae0d1 100644 --- a/mParticle_AppboyTests/mParticle_AppboyTests.m +++ b/mParticle_AppboyTests/mParticle_AppboyTests.m @@ -19,6 +19,7 @@ - (void)setEnableTypeDetection:(BOOL)enableTypeDetection; + (BOOL)shouldDisableNotificationHandling; + (Braze *)brazeInstance; + (MPKitExecStatus *)updateUser:(FilteredMParticleUser *)user request:(NSDictionary *)userIdentities; ++ (MPKitExecStatus *)setUserAttribute:(NSString *)key value:(NSString *)value; @end @@ -171,6 +172,69 @@ - (void)testMpidForwardingOnStartUserIdNegative { [mockKitInstance verify]; } +- (void)testEmailSubscribtionUserAttribute { + NSDictionary *kitConfiguration = @{@"apiKey":@"BrazeID", + @"id":@42, + @"ABKCollectIDFA":@"true", + @"ABKRequestProcessingPolicyOptionKey": @"1", + @"ABKFlushIntervalOptionKey":@"2", + @"ABKSessionTimeoutKey":@"3", + @"ABKMinimumTriggerTimeIntervalKey":@"4", + @"userIdentificationType":@"MPID" + }; + MPKitAppboy *kitInstance = [[MPKitAppboy alloc] init]; + [kitInstance didFinishLaunchingWithConfiguration:kitConfiguration]; + + BRZConfiguration *configuration = [[BRZConfiguration alloc] init]; + Braze *testClient = [[Braze alloc] initWithConfiguration:configuration]; + id mockClient = OCMPartialMock(testClient); + [kitInstance setAppboyInstance:mockClient]; + XCTAssertEqualObjects(mockClient, [kitInstance appboyInstance]); + + // Should succeed since opted_in is a valid value + MPKitExecStatus *execStatus1 = [kitInstance setUserAttribute:@"email_subscribe" value:@"opted_in"]; + XCTAssertEqual(execStatus1.returnCode, MPKitReturnCodeSuccess); + // Should fail since testValue is an invalid value + MPKitExecStatus *execStatus2 = [kitInstance setUserAttribute:@"email_subscribe" value:@"testValue"]; + XCTAssertEqual(execStatus2.returnCode, MPKitReturnCodeFail); + + [mockClient verify]; + + [mockClient stopMocking]; +} + +- (void)testPushSubscribtionUserAttribute { + NSDictionary *kitConfiguration = @{@"apiKey":@"BrazeID", + @"id":@42, + @"ABKCollectIDFA":@"true", + @"ABKRequestProcessingPolicyOptionKey": @"1", + @"ABKFlushIntervalOptionKey":@"2", + @"ABKSessionTimeoutKey":@"3", + @"ABKMinimumTriggerTimeIntervalKey":@"4", + @"userIdentificationType":@"MPID" + }; + MPKitAppboy *kitInstance = [[MPKitAppboy alloc] init]; + [kitInstance didFinishLaunchingWithConfiguration:kitConfiguration]; + + BRZConfiguration *configuration = [[BRZConfiguration alloc] init]; + Braze *testClient = [[Braze alloc] initWithConfiguration:configuration]; + id mockClient = OCMPartialMock(testClient); + [kitInstance setAppboyInstance:mockClient]; + XCTAssertEqualObjects(mockClient, [kitInstance appboyInstance]); + + // Should succeed since opted_in is a valid value + MPKitExecStatus *execStatus1 = [kitInstance setUserAttribute:@"push_subscribe" value:@"opted_in"]; + XCTAssertEqual(execStatus1.returnCode, MPKitReturnCodeSuccess); + // Should fail since testValue is an invalid value + MPKitExecStatus *execStatus2 = [kitInstance setUserAttribute:@"push_subscribe" value:@"testValue"]; + XCTAssertEqual(execStatus2.returnCode, MPKitReturnCodeFail); + + [mockClient verify]; + + [mockClient stopMocking]; +} + + //- (void)testEndpointOverride { // MPKitAppboy *appBoy = [[MPKitAppboy alloc] init]; // @@ -582,7 +646,7 @@ - (void)testlogPurchaseCommerceEvent { - (void)testlogPurchaseCommerceEventSendingProductName { MPKitAppboy *kit = [[MPKitAppboy alloc] init]; kit.configuration = @{@"bundleCommerceEventData" : @0, - @"forwardSkuAsProductName": @"True"}; + @"replaceSkuWithProductName": @"True"}; BRZConfiguration *configuration = [[BRZConfiguration alloc] init]; Braze *testClient = [[Braze alloc] initWithConfiguration:configuration];