diff --git a/UnitTests/MPBackendControllerTests.mm b/UnitTests/MPBackendControllerTests.mm index a2b19365..970320a4 100644 --- a/UnitTests/MPBackendControllerTests.mm +++ b/UnitTests/MPBackendControllerTests.mm @@ -34,9 +34,25 @@ #import "MPUploadBuilder.h" #import "MPMessageBuilder.h" #import "mParticle.h" +#import "MPKitContainer.h" +#import "MPKitConfiguration.h" #define BACKEND_TESTS_EXPECATIONS_TIMEOUT 10 +#pragma mark - MParticle+Tests category +@interface MParticle(Tests) + +@property (nonatomic, strong, nonnull) MPBackendController *backendController; + +@end + +#pragma mark - MPKitContainer category for unit tests +@interface MPKitContainer(Tests) + +- (id)startKit:(NSNumber *)kitCode configuration:(MPKitConfiguration *)kitConfiguration; + +@end + #pragma mark - MPBackendController+Tests category @interface MPBackendController(Tests) @@ -819,9 +835,38 @@ - (void)testCheckAttributes { } - (void)testUserAttributes { + if (![MPKitContainer registeredKits]) { + MPKitRegister *kitRegister = [[MPKitRegister alloc] initWithName:@"KitTest" className:@"MPKitTestClass" startImmediately:NO]; + [MPKitContainer registerKit:kitRegister]; + + kitRegister = [[MPKitRegister alloc] initWithName:@"KitSecondTest" className:@"MPKitSecondTestClass" startImmediately:YES]; + [MPKitContainer registerKit:kitRegister]; + + NSDictionary *configuration1 = @{ + @"id":@42, + @"as":@{ + @"appId":@"MyAppId" + } + }; + + NSDictionary *configuration2 = @{ + @"id":@314, + @"as":@{ + @"appId":@"unique id" + } + }; + + NSArray *kitConfigs = @[configuration1, configuration2]; + [[MPKitContainer sharedInstance] configureKits:nil]; + [[MPKitContainer sharedInstance] configureKits:kitConfigs]; + } + MPInitializationStatus originalInitializationStatus = self.backendController.initializationStatus; self.backendController.initializationStatus = MPInitializationStatusStarted; + MParticle *mParticle = [MParticle sharedInstance]; + mParticle.backendController.initializationStatus = MPInitializationStatusStarted; + NSDictionary *attributes = @{@"TardisKey1":@"Master", @"TardisKey2":@"Guest", @"TardisKey3":@42, @@ -830,8 +875,10 @@ - (void)testUserAttributes { [attributes enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { if ([obj isKindOfClass:[NSArray class]]) { + [mParticle setUserAttribute:key values:obj]; [self.backendController setUserAttribute:key values:obj attempt:0 completionHandler:^(NSString * _Nonnull key, NSArray * _Nullable values, MPExecStatus execStatus) {}]; } else { + [mParticle setUserAttribute:key value:obj]; [self.backendController setUserAttribute:key value:obj attempt:0 completionHandler:^(NSString * _Nonnull key, id _Nullable value, MPExecStatus execStatus) {}]; } }]; @@ -913,6 +960,8 @@ - (void)testUserAttributes { XCTAssertEqualObjects(userAttributes, attributes); self.backendController.initializationStatus = originalInitializationStatus; + mParticle.backendController.initializationStatus = originalInitializationStatus; + [[MPKitContainer sharedInstance] configureKits:nil]; } - (void)testDeferredUserAttributes { diff --git a/UnitTests/MPKitContainerTests.m b/UnitTests/MPKitContainerTests.m index 86fe1f68..5ec28243 100644 --- a/UnitTests/MPKitContainerTests.m +++ b/UnitTests/MPKitContainerTests.m @@ -499,6 +499,16 @@ - (void)testForwardQueueInvalid { } - (void)testAssortedItems { + NSDictionary *configuration = @{ + @"id":@42, + @"as":@{ + @"appId":@"MyAppId" + } + }; + + MPKitConfiguration *kitConfiguration = [[MPKitConfiguration alloc] initWithDictionary:configuration]; + [kitContainer startKit:@42 configuration:kitConfiguration]; + NSNotification *notification = [[NSNotification alloc] initWithName:@"Test Launching" object:self userInfo:@{@"deep":@"linking"}]; diff --git a/UnitTests/MPKitSecondTestClass.m b/UnitTests/MPKitSecondTestClass.m index 688b87d8..b6916bda 100644 --- a/UnitTests/MPKitSecondTestClass.m +++ b/UnitTests/MPKitSecondTestClass.m @@ -78,13 +78,4 @@ - (MPKitExecStatus *)setUserAttribute:(NSString *)key value:(NSString *)value { return execStatus; } -- (MPKitExecStatus *)setUserAttribute:(NSString *)key values:(NSArray *)values { - NSMutableDictionary *tempUserAttributes = self.userAttributes ? [self.userAttributes mutableCopy] : [[NSMutableDictionary alloc] initWithCapacity:1]; - tempUserAttributes[key] = values; - self.userAttributes = tempUserAttributes; - - MPKitExecStatus *execStatus = [[MPKitExecStatus alloc] initWithSDKCode:[[self class] kitCode] returnCode:MPKitReturnCodeSuccess]; - return execStatus; -} - @end diff --git a/mParticle-Apple-SDK/Kits/MPKitContainer.mm b/mParticle-Apple-SDK/Kits/MPKitContainer.mm index 2fab0e5d..cfa6fe58 100644 --- a/mParticle-Apple-SDK/Kits/MPKitContainer.mm +++ b/mParticle-Apple-SDK/Kits/MPKitContainer.mm @@ -2035,8 +2035,12 @@ - (void)forwardSDKCall:(SEL)selector event:(MPEvent *)event messageType:(MPMessa - (void)forwardSDKCall:(SEL)selector userAttributeKey:(NSString *)key value:(id)value kitHandler:(void (^)(id kit))kitHandler { NSArray> *activeKitsRegistry = [self activeKitsRegistry]; + SEL setUserAttributeSelector = @selector(setUserAttribute:value:); + SEL setUserAttributeListSelector = @selector(setUserAttribute:values:); + SEL otherUserAttributeSelector = selector == setUserAttributeListSelector ? setUserAttributeSelector : setUserAttributeListSelector; + for (idkitRegister in activeKitsRegistry) { - if ([kitRegister.wrapperInstance respondsToSelector:selector]) { + if ([kitRegister.wrapperInstance respondsToSelector:selector] || [kitRegister.wrapperInstance respondsToSelector:otherUserAttributeSelector]) { MPKitFilter *kitFilter = [self filter:kitRegister forUserAttributeKey:key value:value]; if (!kitFilter.shouldFilter) { diff --git a/mParticle-Apple-SDK/mParticle.m b/mParticle-Apple-SDK/mParticle.m index 18449a92..22061399 100644 --- a/mParticle-Apple-SDK/mParticle.m +++ b/mParticle-Apple-SDK/mParticle.m @@ -1461,11 +1461,19 @@ - (void)setUserAttribute:(nonnull NSString *)key values:(nullable NSArray kit) { - [kit setUserAttribute:key values:values]; + if ([kit respondsToSelector:setUserAttributeListSelector]) { + [kit setUserAttribute:key values:values]; + } else if ([kit respondsToSelector:setUserAttributeSelector]) { + NSString *csvValues = [values componentsJoinedByString:@","]; + [kit setUserAttribute:key value:csvValues]; + } }]; } else { [[MPKitContainer sharedInstance] forwardSDKCall:@selector(removeUserAttribute:)