Skip to content

Commit

Permalink
Merge pull request #679 from OneSignal/set_external_id
Browse files Browse the repository at this point in the history
Set External User ID
  • Loading branch information
Nightsd01 authored Dec 6, 2018
2 parents 70537ee + db0fd61 commit 3af1cba
Show file tree
Hide file tree
Showing 4 changed files with 146 additions and 0 deletions.
35 changes: 35 additions & 0 deletions OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignal.java
Original file line number Diff line number Diff line change
Expand Up @@ -1414,6 +1414,41 @@ public void run() {
emailLogout.run();
}

public static void setExternalUserId(final String externalId) {

if (shouldLogUserPrivacyConsentErrorMessageForMethodName("setExternalId()"))
return;

Runnable runSetExternalUserId = new Runnable() {
@Override
public void run() {
try {
OneSignalStateSynchronizer.setExternalUserId(externalId);
} catch (JSONException exception) {
String operation = externalId == "" ? "remove" : "set";
onesignalLog(LOG_LEVEL.ERROR, "Attempted to " + operation + " external ID but encountered a JSON exception");
exception.printStackTrace();
}
}
};

// If either the app context is null or the waiting queue isn't done (to preserve operation order)
if (appContext == null || shouldRunTaskThroughQueue()) {
addTaskToQueue(new PendingTaskRunnable(runSetExternalUserId));
return;
}

runSetExternalUserId.run();
}

public static void removeExternalUserId() {
if (shouldLogUserPrivacyConsentErrorMessageForMethodName("removeExternalUserId()"))
return;

// to remove the external user ID, the API requires an empty string
setExternalUserId("");
}

/**
* Tag a user based on an app event of your choosing so later you can create
* <a href="https://documentation.onesignal.com/docs/segmentation">OneSignal Segments</a>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,4 +165,9 @@ static void logoutEmail() {
getPushStateSynchronizer().logoutEmail();
getEmailStateSynchronizer().logoutEmail();
}

static void setExternalUserId(String externalId) throws JSONException {
getPushStateSynchronizer().setExternalUserId(externalId);
getEmailStateSynchronizer().setExternalUserId(externalId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -454,6 +454,10 @@ void syncHashedEmail(JSONObject emailFields) {
generateJsonDiff(syncValues, emailFields, syncValues, null);
}

void setExternalUserId(final String externalId) throws JSONException {
getUserStateForModification().syncValues.put("external_user_id", externalId);
}

abstract void setSubscription(boolean enable);

private void handlePlayerDeletedFromServer() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3236,6 +3236,108 @@ public void notificationReceived(OSNotification notification) {
assertNull(ShadowFirebaseAnalytics.lastEventString);
}

@Test
public void shouldSendExternalUserIdAfterRegistration() throws Exception {
OneSignalInit();
threadAndTaskWait();

String testExternalId = "test_ext_id";

OneSignal.setExternalUserId(testExternalId);

threadAndTaskWait();

assertEquals(3, ShadowOneSignalRestClient.networkCallCount);

ShadowOneSignalRestClient.Request externalIdRequest = ShadowOneSignalRestClient.requests.get(2);
assertEquals(ShadowOneSignalRestClient.REST_METHOD.PUT, externalIdRequest.method);
assertEquals(testExternalId, externalIdRequest.payload.getString("external_user_id"));
}

@Test
public void shouldSendExternalUserIdBeforeRegistration() throws Exception {
String testExternalId = "test_ext_id";

OneSignal.setExternalUserId(testExternalId);

OneSignalInit();
threadAndTaskWait();

assertEquals(2, ShadowOneSignalRestClient.networkCallCount);

ShadowOneSignalRestClient.Request registrationRequest = ShadowOneSignalRestClient.requests.get(1);
assertEquals(ShadowOneSignalRestClient.REST_METHOD.POST, registrationRequest.method);
assertEquals(testExternalId, registrationRequest.payload.getString("external_user_id"));
}

@Test
public void shouldRemoveExternalUserId() throws Exception {
OneSignal.setExternalUserId("test_ext_id");

OneSignalInit();
threadAndTaskWait();

OneSignal.removeExternalUserId();
threadAndTaskWait();

assertEquals(3, ShadowOneSignalRestClient.networkCallCount);

ShadowOneSignalRestClient.Request removeIdRequest = ShadowOneSignalRestClient.requests.get(2);
assertEquals(ShadowOneSignalRestClient.REST_METHOD.PUT, removeIdRequest.method);
assertEquals(removeIdRequest.payload.getString("external_user_id"), "");
}

@Test
public void doesNotSendSameExternalId() throws Exception {
String testExternalId = "test_ext_id";

OneSignal.setExternalUserId(testExternalId);

OneSignalInit();
threadAndTaskWait();

assertEquals(2, ShadowOneSignalRestClient.networkCallCount);

OneSignal.setExternalUserId(testExternalId);
threadAndTaskWait();

// Setting the same ID again should not generate a duplicate API request
// The SDK should detect it is the same and not generate a request
assertEquals(2, ShadowOneSignalRestClient.networkCallCount);
}

@Test
public void sendsExternalIdOnEmailPlayers() throws Exception {
String testExternalId = "test_ext_id";

OneSignalInit();
threadAndTaskWait();

OneSignal.setEmail("[email protected]");
threadAndTaskWait();

int currentRequestCount = ShadowOneSignalRestClient.networkCallCount;

OneSignal.setExternalUserId(testExternalId);
threadAndTaskWait();

// the SDK should have made two additional API calls
// One to set extID on the push player record,
// and another for the email player record
assertEquals(ShadowOneSignalRestClient.networkCallCount, currentRequestCount + 2);

int externalIdRequests = 0;

for (ShadowOneSignalRestClient.Request request : ShadowOneSignalRestClient.requests) {
if (request.payload != null && request.payload.has("external_user_id")) {
externalIdRequests += 1;
assertEquals(request.payload.getString("external_user_id"), testExternalId);
}
}

assertEquals(externalIdRequests, 2);
}

// ####### Unit test helper methods ########

private static OSNotification createTestOSNotification() throws Exception {
Expand Down

0 comments on commit 3af1cba

Please sign in to comment.