Skip to content

Commit 010893e

Browse files
fix to send new events to new endpoint and any old events that might … (#249)
* fix to send new events to new endpoint and any old events that might be around to the old events endpoints * use clientEngine instead of client_engine * add a couple of tests for sending to new and old endpoints
1 parent 82cc544 commit 010893e

File tree

2 files changed

+90
-6
lines changed

2 files changed

+90
-6
lines changed

OptimizelySDKEventDispatcher/OptimizelySDKEventDispatcher/OPTLYEventDispatcher.m

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,10 @@
2323
// TODO - Flush events when network connection has become available.
2424

2525
// --- Event URLs ----
26-
NSString * const OPTLYEventDispatcherImpressionEventURL = @"https://logx.optimizely.com/log/decision";
27-
NSString * const OPTLYEventDispatcherConversionEventURL = @"https://logx.optimizely.com/log/event";
26+
NSString * const OPTLYEventDispatcherEventsURL = @"https://logx.optimizely.com/v1/events";
27+
28+
NSString * const oldOPTLYEventDispatcherImpressionEventURL = @"https://logx.optimizely.com/log/decision";
29+
NSString * const oldOPTLYEventDispatcherConversionEventURL = @"https://logx.optimizely.com/log/event";
2830

2931
// Default interval and timeout values (in s) if not set by users
3032
const NSInteger OPTLYEventDispatcherDefaultDispatchIntervalTime_s = 0;
@@ -207,6 +209,16 @@ - (void)dispatchNewEvent:(nonnull NSDictionary *)params
207209
}];
208210
}
209211

212+
// A saved event has entityId and json in its dictionary so that it can be deleted by entityId
213+
- (bool)isSavedEvent:(nonnull NSDictionary *)event {
214+
return event[@"json"] != nil;
215+
}
216+
// It is an old single point event if it contains clientEngine. So, send it to the appropriate endpoint.
217+
// This may not be necessary but just in case there are some old events in the queue.
218+
- (bool)isOldEvent:(nonnull NSDictionary *)event {
219+
return [self isSavedEvent:event] && event[@"json"][@"clientEngine"] != nil;
220+
}
221+
210222
- (void)dispatchEvent:(nonnull NSDictionary *)event
211223
backoffRetry:(BOOL)backoffRetry
212224
eventType:(OPTLYDataStoreEventType)eventType
@@ -228,9 +240,10 @@ - (void)dispatchEvent:(nonnull NSDictionary *)event
228240
[self.pendingDispatchEvents addObject:event];
229241
}
230242

231-
NSURL *url = [self URLForEvent:eventType];
243+
NSURL *url = [self isOldEvent:event] ? [self oldURLForEvent:eventType] : [self URLForEvent:eventType];
232244

233-
NSDictionary *eventToSend = event[@"json"] == nil ? event : event[@"json"];
245+
NSDictionary *eventToSend = [self isSavedEvent:event] ? event[@"json"] : event;
246+
234247
__weak typeof(self) weakSelf = self;
235248
[self.networkService dispatchEvent:eventToSend
236249
backoffRetry:backoffRetry
@@ -465,14 +478,29 @@ - (NSInteger)numberOfEvents
465478
return numberOfImpressionEventsSaved + numberOfConversionEventsSaved;
466479
}
467480

481+
- (NSURL *)oldURLForEvent:(OPTLYDataStoreEventType)eventType {
482+
NSURL *url = nil;
483+
switch(eventType) {
484+
case OPTLYDataStoreEventTypeImpression:
485+
url = [NSURL URLWithString:oldOPTLYEventDispatcherImpressionEventURL];
486+
break;
487+
case OPTLYDataStoreEventTypeConversion:
488+
url = [NSURL URLWithString:oldOPTLYEventDispatcherConversionEventURL];
489+
break;
490+
default:
491+
break;
492+
}
493+
return url;
494+
}
495+
468496
- (NSURL *)URLForEvent:(OPTLYDataStoreEventType)eventType {
469497
NSURL *url = nil;
470498
switch(eventType) {
471499
case OPTLYDataStoreEventTypeImpression:
472-
url = [NSURL URLWithString:OPTLYEventDispatcherImpressionEventURL];
500+
url = [NSURL URLWithString:OPTLYEventDispatcherEventsURL];
473501
break;
474502
case OPTLYDataStoreEventTypeConversion:
475-
url = [NSURL URLWithString:OPTLYEventDispatcherConversionEventURL];
503+
url = [NSURL URLWithString:OPTLYEventDispatcherEventsURL];
476504
break;
477505
default:
478506
break;

OptimizelySDKEventDispatcher/OptimizelySDKEventDispatcherTests/OPTLYEventDispatcherTest.m

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,62 @@ - (void)testDispatchImpressionEventSuccess {
119119
}];
120120
}
121121

122+
// Test that a successful dispatch:
123+
// - no events are persisted
124+
// - flushEvents is called
125+
- (void)testDispatchImpressionOldEventSuccess {
126+
[self stubSuccessResponse];
127+
128+
OPTLYEventDispatcherDefault *eventDispatcher = [OPTLYEventDispatcherDefault new];
129+
id eventDispatcherMock = [OCMockObject partialMockForObject:eventDispatcher];
130+
[[eventDispatcherMock expect] flushEvents];
131+
132+
XCTestExpectation *expectation = [self expectationWithDescription:@"Wait for dispatchImpressionEvent success."];
133+
__weak typeof(self) weakSelf = self;
134+
NSMutableDictionary *params = [[NSMutableDictionary alloc] initWithDictionary:self.parameters];
135+
params[@"clientEngine"] = @"iOS";
136+
[eventDispatcherMock dispatchImpressionEvent:params callback:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
137+
NSInteger numberOfSavedEvents = [weakSelf.eventDispatcher numberOfEvents:OPTLYDataStoreEventTypeImpression];
138+
XCTAssert(numberOfSavedEvents == 0, @"Impression events should not have been saved.");
139+
XCTAssert([response.URL.absoluteString isEqualToString: @"https://logx.optimizely.com/log/decision"]);
140+
[eventDispatcherMock verify];
141+
[expectation fulfill];
142+
}];
143+
144+
[self waitForExpectationsWithTimeout:3.0 handler:^(NSError *error) {
145+
if (error) {
146+
NSLog(@"Timeout error for dispatchImpressionEvent: %@", error);
147+
}
148+
}];
149+
}
150+
151+
// Test that a successful dispatch:
152+
// - no events are persisted
153+
// - flushEvents is called
154+
- (void)testDispatchImpressionNewEventSuccess {
155+
[self stubSuccessResponse];
156+
157+
OPTLYEventDispatcherDefault *eventDispatcher = [OPTLYEventDispatcherDefault new];
158+
id eventDispatcherMock = [OCMockObject partialMockForObject:eventDispatcher];
159+
[[eventDispatcherMock expect] flushEvents];
160+
161+
XCTestExpectation *expectation = [self expectationWithDescription:@"Wait for dispatchImpressionEvent success."];
162+
__weak typeof(self) weakSelf = self;
163+
[eventDispatcherMock dispatchImpressionEvent:self.parameters callback:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
164+
NSInteger numberOfSavedEvents = [weakSelf.eventDispatcher numberOfEvents:OPTLYDataStoreEventTypeImpression];
165+
XCTAssert(numberOfSavedEvents == 0, @"Impression events should not have been saved.");
166+
XCTAssert([response.URL.absoluteString isEqualToString: @"https://logx.optimizely.com/v1/events"]);
167+
[eventDispatcherMock verify];
168+
[expectation fulfill];
169+
}];
170+
171+
[self waitForExpectationsWithTimeout:3.0 handler:^(NSError *error) {
172+
if (error) {
173+
NSLog(@"Timeout error for dispatchImpressionEvent: %@", error);
174+
}
175+
}];
176+
}
177+
122178
- (void)testDispatchConversionEventSuccess {
123179
[self stubSuccessResponse];
124180

0 commit comments

Comments
 (0)