Skip to content

Commit af1abd5

Browse files
authored
Fix for tracking events with bool as a parameter (#430)
* added additional check for booleans when event is triggered with parameters added unit tests * use lowercase string to be sure
1 parent c3af60b commit af1abd5

File tree

5 files changed

+104
-4
lines changed

5 files changed

+104
-4
lines changed

Example/Tests/Classes/LPActionManagerTest.m

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,59 @@ - (void)test_matched_trigger
137137
XCTAssertFalse(result.matchedTrigger);
138138
}
139139

140+
- (void)test_matched_trigger_with_boolean_parameter
141+
{
142+
LPActionManager *manager = [LPActionManager sharedManager];
143+
144+
NSDictionary *config = @{@"whenLimits":@{@"children":@[],
145+
@"objects":@[],
146+
@"subjects":[NSNull null]
147+
},
148+
@"whenTriggers":@{@"children":@[@{@"noun":@"boolParamValues",
149+
@"objects":@[@"boolValue", @"false"],
150+
@"subject":@"event",
151+
@"verb":@"triggersWithParameter"
152+
}],
153+
@"verb":@"OR"
154+
}
155+
};
156+
157+
// track parameters
158+
LPContextualValues *contextualValues = [[LPContextualValues alloc] init];
159+
160+
contextualValues.parameters = @{@"boolValue":@NO};
161+
LeanplumMessageMatchResult result = [manager shouldShowMessage:@""
162+
withConfig:config
163+
when:@"event"
164+
withEventName:@"boolParamValues"
165+
contextualValues:contextualValues];
166+
XCTAssertTrue(result.matchedTrigger);
167+
168+
contextualValues.parameters = @{@"boolValue":@"false"};
169+
result = [manager shouldShowMessage:@""
170+
withConfig:config
171+
when:@"event"
172+
withEventName:@"boolParamValues"
173+
contextualValues:contextualValues];
174+
XCTAssertTrue(result.matchedTrigger);
175+
176+
contextualValues.parameters = @{@"boolValue":@"true"};
177+
result = [manager shouldShowMessage:@""
178+
withConfig:config
179+
when:@"event"
180+
withEventName:@"boolParamValues"
181+
contextualValues:contextualValues];
182+
XCTAssertFalse(result.matchedTrigger);
183+
184+
contextualValues.parameters = @{@"boolValue":@YES};
185+
result = [manager shouldShowMessage:@""
186+
withConfig:config
187+
when:@"event"
188+
withEventName:@"boolParamValues"
189+
contextualValues:contextualValues];
190+
XCTAssertFalse(result.matchedTrigger);
191+
}
192+
140193
- (void)test_active_period_false
141194
{
142195
LPActionManager *manager = [LPActionManager sharedManager];

Example/Tests/Classes/LPUtilsTest.m

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,4 +79,27 @@ - (void)test_base64EncodedStringFromData {
7979
XCTAssertEqualObjects(base64String, expectedSring);
8080
}
8181

82+
- (void)test_isBoolNumber {
83+
NSNumber *boolNumber = [NSNumber numberWithBool:YES];
84+
XCTAssertTrue([LPUtils isBoolNumber:boolNumber]);
85+
86+
NSNumber *boolNumber1 = [NSNumber numberWithBool:NO];
87+
XCTAssertTrue([LPUtils isBoolNumber:boolNumber1]);
88+
89+
NSNumber *boolNumber2 = [NSNumber numberWithBool:0];
90+
XCTAssertTrue([LPUtils isBoolNumber:boolNumber2]);
91+
92+
NSNumber *boolNumber3 = [NSNumber numberWithBool:1];
93+
XCTAssertTrue([LPUtils isBoolNumber:boolNumber3]);
94+
95+
NSNumber *intNumber = [NSNumber numberWithInt:1];
96+
XCTAssertFalse([LPUtils isBoolNumber:intNumber]);
97+
98+
NSNumber *doubleNumber = [NSNumber numberWithDouble:0.0];
99+
XCTAssertFalse([LPUtils isBoolNumber:doubleNumber]);
100+
101+
id stringValue = @"false";
102+
XCTAssertFalse([LPUtils isBoolNumber:stringValue]);
103+
}
104+
82105
@end

Leanplum-SDK/Classes/Features/Actions/LPActionManager.m

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -237,10 +237,22 @@ + (BOOL)matchedTrigger:(NSDictionary *)trigger
237237
if ([verb isEqual:@"triggersWithParameter"]) {
238238
// We need to check whether the key is in the parameter
239239
// or else it will create a null object that will always return YES.
240-
return objects.count >= 2 &&
241-
contextualValues.parameters[objects[0]] &&
242-
[[contextualValues.parameters[objects[0]] description]
243-
caseInsensitiveCompare:[objects[1] description]] == NSOrderedSame;
240+
if (objects.count >= 2) {
241+
if (contextualValues.parameters[objects[0]]) {
242+
BOOL result = NO;
243+
id trackedValue = contextualValues.parameters[objects[0]];
244+
id triggeredValue = objects[1];
245+
if ([trackedValue isKindOfClass:[NSNumber class]] && [LPUtils isBoolNumber:trackedValue] && [triggeredValue isKindOfClass:[NSString class]])
246+
{
247+
result = [(NSNumber *)trackedValue boolValue] == [(NSString *)triggeredValue lowercaseString].boolValue;
248+
} else {
249+
result = [[trackedValue description]
250+
caseInsensitiveCompare:[triggeredValue description]] == NSOrderedSame;
251+
}
252+
return result;
253+
}
254+
}
255+
return NO;
244256
}
245257

246258
return YES;

Leanplum-SDK/Classes/Utilities/LPUtils.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,9 @@
6464

6565
+ (NSBundle *)leanplumBundle;
6666

67+
/**
68+
* Checks if given value is a NSNumber with bool value
69+
*/
70+
+ (BOOL)isBoolNumber:(NSNumber *)value;
71+
6772
@end

Leanplum-SDK/Classes/Utilities/LPUtils.m

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,11 @@ + (NSBundle *)leanplumBundle
111111
return bundle;
112112
}
113113

114+
+ (BOOL)isBoolNumber:(NSNumber *)value
115+
{
116+
CFTypeID boolID = CFBooleanGetTypeID();
117+
CFTypeID numID = CFGetTypeID((__bridge CFTypeRef)(value));
118+
return numID == boolID;
119+
}
120+
114121
@end

0 commit comments

Comments
 (0)