Skip to content

Commit

Permalink
Forward user attribute list as CSV
Browse files Browse the repository at this point in the history
If a kit does not support user attribute lists natively, the core SDK will concatenate the array as a CSV string and forward it to the kit in question
  • Loading branch information
Dalmo Cirne committed Jun 9, 2016
1 parent 6dfef30 commit b0cb9df
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 12 deletions.
49 changes: 49 additions & 0 deletions UnitTests/MPBackendControllerTests.mm
Original file line number Diff line number Diff line change
Expand Up @@ -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<MPKitProtocol>)startKit:(NSNumber *)kitCode configuration:(MPKitConfiguration *)kitConfiguration;

@end

#pragma mark - MPBackendController+Tests category
@interface MPBackendController(Tests)

Expand Down Expand Up @@ -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,
Expand All @@ -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<NSString *> * _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) {}];
}
}];
Expand Down Expand Up @@ -913,6 +960,8 @@ - (void)testUserAttributes {
XCTAssertEqualObjects(userAttributes, attributes);

self.backendController.initializationStatus = originalInitializationStatus;
mParticle.backendController.initializationStatus = originalInitializationStatus;
[[MPKitContainer sharedInstance] configureKits:nil];
}

- (void)testDeferredUserAttributes {
Expand Down
10 changes: 10 additions & 0 deletions UnitTests/MPKitContainerTests.m
Original file line number Diff line number Diff line change
Expand Up @@ -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"}];
Expand Down
9 changes: 0 additions & 9 deletions UnitTests/MPKitSecondTestClass.m
Original file line number Diff line number Diff line change
Expand Up @@ -78,13 +78,4 @@ - (MPKitExecStatus *)setUserAttribute:(NSString *)key value:(NSString *)value {
return execStatus;
}

- (MPKitExecStatus *)setUserAttribute:(NSString *)key values:(NSArray<NSString *> *)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
6 changes: 5 additions & 1 deletion mParticle-Apple-SDK/Kits/MPKitContainer.mm
Original file line number Diff line number Diff line change
Expand Up @@ -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<MPKitProtocol> kit))kitHandler {
NSArray<id<MPExtensionKitProtocol>> *activeKitsRegistry = [self activeKitsRegistry];

SEL setUserAttributeSelector = @selector(setUserAttribute:value:);
SEL setUserAttributeListSelector = @selector(setUserAttribute:values:);
SEL otherUserAttributeSelector = selector == setUserAttributeListSelector ? setUserAttributeSelector : setUserAttributeListSelector;

for (id<MPExtensionKitProtocol>kitRegister 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) {
Expand Down
12 changes: 10 additions & 2 deletions mParticle-Apple-SDK/mParticle.m
Original file line number Diff line number Diff line change
Expand Up @@ -1461,11 +1461,19 @@ - (void)setUserAttribute:(nonnull NSString *)key values:(nullable NSArray<NSStri

// Forwarding calls to kits
if (values) {
[[MPKitContainer sharedInstance] forwardSDKCall:@selector(setUserAttribute:values:)
SEL setUserAttributeSelector = @selector(setUserAttribute:value:);
SEL setUserAttributeListSelector = @selector(setUserAttribute:values:);

[[MPKitContainer sharedInstance] forwardSDKCall:setUserAttributeListSelector
userAttributeKey:key
value:values
kitHandler:^(id<MPKitProtocol> 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:)
Expand Down

0 comments on commit b0cb9df

Please sign in to comment.