From 968654abee0fc0f27ea0dbc2884e69ff53ce4101 Mon Sep 17 00:00:00 2001 From: emawby Date: Fri, 23 Apr 2021 12:17:02 -0700 Subject: [PATCH 1/2] removing check for duplicate setExternalUserId requests This check has caused issues with the external id not being set after setting email, and this check is not on Android. Removing to match Android behavior and avoid potential issues. --- .../OneSignalSDK/Source/OSStateSynchronizer.m | 10 ---------- iOS_SDK/OneSignalSDK/Source/OneSignal.m | 18 ------------------ 2 files changed, 28 deletions(-) diff --git a/iOS_SDK/OneSignalSDK/Source/OSStateSynchronizer.m b/iOS_SDK/OneSignalSDK/Source/OSStateSynchronizer.m index dc12f48ea..ec5537be4 100644 --- a/iOS_SDK/OneSignalSDK/Source/OSStateSynchronizer.m +++ b/iOS_SDK/OneSignalSDK/Source/OSStateSynchronizer.m @@ -200,16 +200,6 @@ - (void)setExternalUserId:(NSString *)externalId withExternalIdAuthHashToken:(NS withAppId:appId]; } - // Make sure this is not a duplicate request, if the email and push channels are aligned correctly with the same external id - if (![OneSignal shouldUpdateExternalUserId:externalId withRequests:requests]) { - // Use callback to return success for both cases here, since push and - // email (if email is not setup, email is not included) have been set already - let results = [OneSignal getDuplicateExternalUserIdResponse:externalId withRequests:requests]; - if (successBlock) - successBlock(results); - return; - } - [OneSignalClient.sharedClient executeSimultaneousRequests:requests withCompletion:^(NSDictionary *results) { if (results[OS_PUSH] && results[OS_PUSH][OS_SUCCESS] && [results[OS_PUSH][OS_SUCCESS] boolValue]) { [OneSignalUserDefaults.initStandard saveStringForKey:OSUD_EXTERNAL_USER_ID withValue:externalId]; diff --git a/iOS_SDK/OneSignalSDK/Source/OneSignal.m b/iOS_SDK/OneSignalSDK/Source/OneSignal.m index 48b977590..60cd7db31 100755 --- a/iOS_SDK/OneSignalSDK/Source/OneSignal.m +++ b/iOS_SDK/OneSignalSDK/Source/OneSignal.m @@ -2773,24 +2773,6 @@ + (BOOL)shouldUpdateExternalUserId:(NSString*)externalId withRequests:(NSDiction return updateExternalUserId || updateEmailExternalUserId; } -+ (NSMutableDictionary*)getDuplicateExternalUserIdResponse:(NSString*)externalId withRequests:(NSDictionary*)requests { - NSMutableDictionary *results = [NSMutableDictionary new]; - [OneSignal onesignal_Log:ONE_S_LL_WARN message:[NSString stringWithFormat:@"Attempted to set external user id, but %@ is already set", externalId]]; - - results[@"push"] = @{ - @"success" : @(true) - }; - - // Make sure to only add email if email was attempted - if (requests[@"email"]) { - results[@"email"] = @{ - @"success" : @(true) - }; - } - - return results; -} - /* Start of outcome module */ From 10a3d52f98683d515ce7fabaca09f5822e2131ac Mon Sep 17 00:00:00 2001 From: emawby Date: Fri, 23 Apr 2021 12:31:39 -0700 Subject: [PATCH 2/2] Updating unit tests for setExternalUserId change Now that setExternalUserId's put request is called after registerUser the unit tests need to be updated. --- iOS_SDK/OneSignalSDK/UnitTests/UnitTests.m | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/iOS_SDK/OneSignalSDK/UnitTests/UnitTests.m b/iOS_SDK/OneSignalSDK/UnitTests/UnitTests.m index 9bcad20bf..2891ee914 100644 --- a/iOS_SDK/OneSignalSDK/UnitTests/UnitTests.m +++ b/iOS_SDK/OneSignalSDK/UnitTests/UnitTests.m @@ -2323,9 +2323,9 @@ - (void)testSetExternalUserIdWithRegistration { [OneSignal setExternalUserId:TEST_EXTERNAL_USER_ID]; [UnitTestCommonMethods initOneSignal_andThreadWait]; - - XCTAssertEqualObjects(OneSignalClientOverrider.lastHTTPRequest[@"external_user_id"], TEST_EXTERNAL_USER_ID); - XCTAssertEqualObjects(OneSignalClientOverrider.lastHTTPRequestType, NSStringFromClass([OSRequestRegisterUser class])); + let registerUserRequest = OneSignalClientOverrider.executedRequests[1]; + XCTAssertEqualObjects(registerUserRequest.parameters[@"external_user_id"], TEST_EXTERNAL_USER_ID); + XCTAssertEqualObjects(NSStringFromClass([registerUserRequest class]), NSStringFromClass([OSRequestRegisterUser class])); } - (void)testSetExternalUserIdAfterRegistration { @@ -2354,21 +2354,21 @@ - (void)testRemoveExternalUserId { } // Tests to make sure that the SDK will not send an external ID if it already successfully sent the same ID -- (void)testDoesntSendExistingExternalUserIdAfterRegistration { +- (void)testDoesSendExistingExternalUserIdAfterRegistration { [OneSignal setExternalUserId:TEST_EXTERNAL_USER_ID]; [UnitTestCommonMethods initOneSignal_andThreadWait]; - XCTAssertEqualObjects(OneSignalClientOverrider.lastHTTPRequestType, NSStringFromClass([OSRequestRegisterUser class])); + XCTAssertEqualObjects(OneSignalClientOverrider.lastHTTPRequestType, NSStringFromClass([OSRequestUpdateExternalUserId class])); [OneSignal setExternalUserId:TEST_EXTERNAL_USER_ID]; // the PUT request to set external ID should not happen since the external ID // is the same as it was during registration - XCTAssertEqualObjects(OneSignalClientOverrider.lastHTTPRequestType, NSStringFromClass([OSRequestRegisterUser class])); + XCTAssertEqualObjects(OneSignalClientOverrider.lastHTTPRequestType, NSStringFromClass([OSRequestUpdateExternalUserId class])); } -- (void)testDoesntSendExistingExternalUserIdBeforeRegistration { +- (void)testDoesSendExistingExternalUserIdBeforeRegistration { //mimics a previous session where the external user ID was set [OneSignalUserDefaults.initStandard saveStringForKey:OSUD_EXTERNAL_USER_ID withValue:TEST_EXTERNAL_USER_ID]; @@ -2376,11 +2376,11 @@ - (void)testDoesntSendExistingExternalUserIdBeforeRegistration { [UnitTestCommonMethods initOneSignal_andThreadWait]; - XCTAssertEqualObjects(OneSignalClientOverrider.lastHTTPRequestType, NSStringFromClass([OSRequestRegisterUser class])); + XCTAssertEqualObjects(OneSignalClientOverrider.lastHTTPRequestType, NSStringFromClass([OSRequestUpdateExternalUserId class])); // the registration request should not have included external user ID // since it had been set already to the same value in a previous session - XCTAssertNil(OneSignalClientOverrider.lastHTTPRequest[@"external_user_id"]); + XCTAssertEqualObjects(OneSignalClientOverrider.lastHTTPRequest[@"external_user_id"], TEST_EXTERNAL_USER_ID); } - (void)testSetExternalUserId_forPush_withCompletion { @@ -2441,13 +2441,14 @@ - (void)testSetExternalUserId_WithAuthToken_forPush_withCompletion_beforRegister // 2. Init OneSignal [UnitTestCommonMethods initOneSignal_andThreadWait]; + [UnitTestCommonMethods runBackgroundThreads]; // 3. Make sure only push external id was attempted to be set since no email was set yet XCTAssertEqual(self.CALLBACK_EXTERNAL_USER_ID, TEST_EXTERNAL_USER_ID); XCTAssertNil(self.CALLBACK_EMAIL_EXTERNAL_USER_ID); // 3. Make sure last request was external id and had the correct external id being used in the request payload - XCTAssertEqualObjects(OneSignalClientOverrider.lastHTTPRequestType, NSStringFromClass([OSRequestRegisterUser class])); + XCTAssertEqualObjects(OneSignalClientOverrider.lastHTTPRequestType, NSStringFromClass([OSRequestUpdateExternalUserId class])); XCTAssertEqualObjects(OneSignalClientOverrider.lastHTTPRequest[@"external_user_id"], TEST_EXTERNAL_USER_ID); XCTAssertEqualObjects(OneSignalClientOverrider.lastHTTPRequest[@"external_user_id_auth_hash"], TEST_EXTERNAL_USER_ID_HASH_TOKEN); }