Skip to content

Commit eabab8b

Browse files
authored
Merge pull request #880 from Iterable/bugfix/AUT_issue_multiple_users_created
MOB-10807 Fix AUT issue where multiple users are created
2 parents 5a0b8dd + 60d30dc commit eabab8b

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

iterableapi/src/main/java/com/iterable/iterableapi/AnonymousUserManager.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public class AnonymousUserManager implements IterableActivityMonitor.AppStateCal
3232
private IterableApi iterableApi = IterableApi.sharedInstance;
3333
private final IterableActivityMonitor activityMonitor;
3434
long lastCriteriaFetch = 0;
35+
boolean isCriteriaMatched = false;
3536

3637
AnonymousUserManager(IterableApi iterableApi) {
3738
this(iterableApi,
@@ -249,11 +250,13 @@ private void createAnonymousUser(String criteriaId) {
249250
}
250251

251252
} catch (JSONException e) {
253+
isCriteriaMatched = false;
252254
e.printStackTrace();
253255
}
254256
}
255257

256258
private void handleTrackFailure(JSONObject data) {
259+
isCriteriaMatched = false;
257260
if (data != null && data.has(IterableConstants.HTTP_STATUS_CODE)) {
258261
try {
259262
int statusCode = (int) data.get(IterableConstants.HTTP_STATUS_CODE);
@@ -366,7 +369,8 @@ private void storeEventListToLocalStorage(JSONObject newDataObject) {
366369
String criteriaId = checkCriteriaCompletion();
367370
Log.i("TEST_USER", "criteriaId::" + String.valueOf(criteriaId));
368371

369-
if (criteriaId != null) {
372+
if (criteriaId != null && !isCriteriaMatched) {
373+
isCriteriaMatched = true;
370374
createAnonymousUser(criteriaId);
371375
}
372376
Log.i("criteriaId::", String.valueOf(criteriaId != null));

iterableapi/src/test/java/com/iterable/iterableapi/IterableApiMergeUserEmailTests.java

+31
Original file line numberDiff line numberDiff line change
@@ -945,4 +945,35 @@ public void testIdentifiedEmailMergeTrue() throws Exception {
945945
// check that email was set
946946
assertEquals(email2, IterableApi.getInstance().getEmail());
947947
}
948+
949+
@Test
950+
public void testCriteriaMetTwice() throws Exception {
951+
// clear any pending requests
952+
while (server.takeRequest(1, TimeUnit.SECONDS) != null) { }
953+
954+
// mock anon session response and track purchase response
955+
addResponse(IterableConstants.ENDPOINT_TRACK_ANON_SESSION);
956+
addResponse(IterableConstants.ENDPOINT_TRACK_PURCHASE);
957+
addResponse(IterableConstants.ENDPOINT_TRACK_PURCHASE);
958+
959+
// trigger track purchase event
960+
triggerTrackPurchaseEvent("test", "keyboard", 4.67, 3);
961+
triggerTrackPurchaseEvent("test", "keyboard", 4.67, 3);
962+
shadowOf(getMainLooper()).idle();
963+
964+
// check if only one request was sent to anon session endpoint
965+
RecordedRequest anonSessionRequest = server.takeRequest(1, TimeUnit.SECONDS);
966+
assertNotNull("Anon session request should not be null", anonSessionRequest);
967+
assertEquals("/" + IterableConstants.ENDPOINT_TRACK_ANON_SESSION, anonSessionRequest.getPath());
968+
969+
// check if first request was sent to track purchase endpoint
970+
RecordedRequest firstPurchaseRequest = server.takeRequest(1, TimeUnit.SECONDS);
971+
assertNotNull("Purchase request should not be null", firstPurchaseRequest);
972+
assertEquals("/" + IterableConstants.ENDPOINT_TRACK_PURCHASE, firstPurchaseRequest .getPath());
973+
974+
// check if second request was sent to track purchase endpoint
975+
RecordedRequest secondPurchaseRequest = server.takeRequest(1, TimeUnit.SECONDS);
976+
assertNotNull("Purchase request should not be null", secondPurchaseRequest);
977+
assertEquals("/" + IterableConstants.ENDPOINT_TRACK_PURCHASE, secondPurchaseRequest.getPath());
978+
}
948979
}

0 commit comments

Comments
 (0)