From 4add168aa0fd338e02536e5b5216d4a0d4f499c1 Mon Sep 17 00:00:00 2001 From: Brandon Stalnaker Date: Thu, 18 Sep 2025 09:34:33 -0400 Subject: [PATCH 1/2] fix: Add Nil Check Around Unassigned Logic --- mParticle-Rokt/MPKitRokt.m | 12 +++++- mParticle_RoktTests/mParticle_RoktTests.m | 50 +++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/mParticle-Rokt/MPKitRokt.m b/mParticle-Rokt/MPKitRokt.m index c788201..b14309d 100644 --- a/mParticle-Rokt/MPKitRokt.m +++ b/mParticle-Rokt/MPKitRokt.m @@ -405,6 +405,9 @@ + (NSString *)stringForIdentityType:(MPIdentity)identityType { } + (NSNumber *)identityTypeForString:(NSString *)identityString { + if (identityString == nil) { + return nil; + } NSDictionary *identityNumbers = @{@"customerid": @(MPIdentityCustomerId), @"email": @(MPIdentityEmail), @"facebook": @(MPIdentityFacebook), @@ -434,7 +437,7 @@ + (NSNumber *)identityTypeForString:(NSString *)identityString { return identityNumbers[identityString]; } -+ (NSNumber *)getRoktHashedEmailUserIdentityType { ++ (NSDictionary *)getKitConfig { // Get the kit configuration NSArray *kitConfigs = [MParticle sharedInstance].kitContainer_PRIVATE.originalConfig.copy; NSDictionary *roktKitConfig; @@ -444,6 +447,13 @@ + (NSNumber *)getRoktHashedEmailUserIdentityType { } } + return roktKitConfig; +} + ++ (NSNumber *)getRoktHashedEmailUserIdentityType { + // Get the kit configuration + NSDictionary *roktKitConfig = [MPKitRokt getKitConfig]; + // Get the string representing which identity to use and convert it to the key (NSNumber) NSString *hashedIdentityTypeString = roktKitConfig[kMPHashedEmailUserIdentityType]; NSNumber *hashedIdentityTypeNumber = [MPKitRokt identityTypeForString:hashedIdentityTypeString.lowercaseString]; diff --git a/mParticle_RoktTests/mParticle_RoktTests.m b/mParticle_RoktTests/mParticle_RoktTests.m index b6cefa7..c3c7d88 100644 --- a/mParticle_RoktTests/mParticle_RoktTests.m +++ b/mParticle_RoktTests/mParticle_RoktTests.m @@ -4,6 +4,9 @@ #import #import "MPKitRokt.h" +NSInteger const kMPRoktKitCode = 181; +NSString * const kMPHashedEmailUserIdentityType = @"hashedEmailUserIdentityType"; + @interface MPKitRokt () - (MPKitExecStatus *)executeWithIdentifier:(NSString * _Nullable)identifier @@ -24,6 +27,8 @@ + (void)addIdentityAttributes:(NSMutableDictionary * _Nu + (void)handleHashedEmail:(NSMutableDictionary * _Nullable)attributes; ++ (NSDictionary *)getKitConfig; + + (NSNumber *)getRoktHashedEmailUserIdentityType; + (RoktConfig *)convertMPRoktConfig:(MPRoktConfig *)mpRoktConfig; @@ -677,4 +682,49 @@ - (void)testTransformValuesToString { XCTAssertTrue(finalAtt.allKeys.count == 4); } +- (void)testGetRoktHashedEmailUserIdentityTypeOther4 { + // Test case 1: When kit configuration exists with hashed email identity type + NSDictionary *roktKitConfig = @{ + @"id": @(kMPRoktKitCode), + kMPHashedEmailUserIdentityType: @"other4" + }; + + // Mock the MParticle shared instance and kit container + id mockMPKitRoktClass = OCMClassMock([MPKitRokt class]); + [[[mockMPKitRoktClass stub] andReturn:roktKitConfig] getKitConfig]; + + // Call the method and verify result + NSNumber *result = [MPKitRokt getRoktHashedEmailUserIdentityType]; + XCTAssertEqualObjects(result, @(MPIdentityOther4), @"Should return MPIdentityOther4 when configured with 'other4'"); + + [mockMPKitRoktClass stopMocking]; +} + +- (void)testGetRoktHashedEmailUserIdentityTypeConfigNil { + // Test case 2: When kit config nil + // Mock the MParticle shared instance and kit container + id mockMPKitRoktClass = OCMClassMock([MPKitRokt class]); + [[[mockMPKitRoktClass stub] andReturn:nil] getKitConfig]; + + NSNumber *defaultResult = [MPKitRokt getRoktHashedEmailUserIdentityType]; + XCTAssertNil(defaultResult, @"Should return nil when when no configuration exists"); + + [mockMPKitRoktClass stopMocking]; +} + +- (void)testGetRoktHashedEmailUserIdentityTypeNil { + // Mock the MParticle shared instance and kit container + id mockMPKitRoktClass = OCMClassMock([MPKitRokt class]); + // Test case 3: When kit config exists but no hashed email identity type specified + NSDictionary *roktKitConfigNoHash = @{ + @"id": @(kMPRoktKitCode) + }; + [[[mockMPKitRoktClass stub] andReturn:roktKitConfigNoHash] getKitConfig]; + + NSNumber *noHashResult = [MPKitRokt getRoktHashedEmailUserIdentityType]; + XCTAssertNil(noHashResult, @"Should return nil when hashed email identity type not specified"); + + [mockMPKitRoktClass stopMocking]; +} + @end From d532a9b3935872f8e728f6ac041536999b46fe7b Mon Sep 17 00:00:00 2001 From: Brandon Stalnaker <33703490+BrandonStalnaker@users.noreply.github.com> Date: Thu, 18 Sep 2025 13:00:13 -0400 Subject: [PATCH 2/2] Address suggestion --- mParticle-Rokt/MPKitRokt.m | 1 - 1 file changed, 1 deletion(-) diff --git a/mParticle-Rokt/MPKitRokt.m b/mParticle-Rokt/MPKitRokt.m index b14309d..067abeb 100644 --- a/mParticle-Rokt/MPKitRokt.m +++ b/mParticle-Rokt/MPKitRokt.m @@ -451,7 +451,6 @@ + (NSDictionary *)getKitConfig { } + (NSNumber *)getRoktHashedEmailUserIdentityType { - // Get the kit configuration NSDictionary *roktKitConfig = [MPKitRokt getKitConfig]; // Get the string representing which identity to use and convert it to the key (NSNumber)