Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -84,4 +84,9 @@ class CreateUserResponse(
* The subscriptions for the user.
*/
val subscriptions: List<SubscriptionObject>,
/**
* The RYW data returned by the server.
* This is expected for the response to CreateUser only, not UpdateUser.
*/
val rywData: RywData?,
)
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.onesignal.user.internal.backend.impl

import com.onesignal.common.consistency.RywData
import com.onesignal.common.expandJSONArray
import com.onesignal.common.putJSONArray
import com.onesignal.common.putMap
Expand All @@ -8,6 +9,7 @@ import com.onesignal.common.safeBool
import com.onesignal.common.safeDouble
import com.onesignal.common.safeInt
import com.onesignal.common.safeJSONObject
import com.onesignal.common.safeLong
import com.onesignal.common.safeString
import com.onesignal.common.toMap
import com.onesignal.user.internal.backend.CreateUserResponse
Expand Down Expand Up @@ -55,7 +57,15 @@ object JSONConverter {
return@expandJSONArray null
}

return CreateUserResponse(respIdentities, respProperties, respSubscriptions)
val rywToken = jsonObject.safeString("ryw_token")
val rywDelay = jsonObject.safeLong("ryw_delay")
var rywData: RywData? = null

if (rywToken != null) {
rywData = RywData(rywToken, rywDelay)
}

return CreateUserResponse(respIdentities, respProperties, respSubscriptions, rywData)
}

fun convertToJSON(properties: PropertiesObject): JSONObject {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ import com.onesignal.common.NetworkUtils
import com.onesignal.common.OneSignalUtils
import com.onesignal.common.RootToolsInternalMethods
import com.onesignal.common.TimeUtils
import com.onesignal.common.consistency.IamFetchReadyCondition
import com.onesignal.common.consistency.enums.IamFetchRywTokenKey
import com.onesignal.common.consistency.models.IConsistencyManager
import com.onesignal.common.exceptions.BackendException
import com.onesignal.common.modeling.ModelChangeTags
import com.onesignal.core.internal.application.IApplicationService
Expand Down Expand Up @@ -46,6 +49,7 @@ internal class LoginUserOperationExecutor(
private val _subscriptionsModelStore: SubscriptionModelStore,
private val _configModelStore: ConfigModelStore,
private val _languageContext: ILanguageContext,
private val _consistencyManager: IConsistencyManager,
) : IOperationExecutor {
override val operations: List<String>
get() = listOf(LOGIN_USER)
Expand Down Expand Up @@ -216,6 +220,13 @@ internal class LoginUserOperationExecutor(
subscriptionModel?.setStringProperty(SubscriptionModel::id.name, backendSubscription.id, ModelChangeTags.HYDRATE)
}

// Process any ryw data returned
if (response.rywData != null) {
_consistencyManager.setRywData(backendOneSignalId, IamFetchRywTokenKey.USER, response.rywData)
} else {
_consistencyManager.resolveConditionsWithID(IamFetchReadyCondition.ID)
}

val wasPossiblyAnUpsert = identities.isNotEmpty()
val followUpOperations =
if (wasPossiblyAnUpsert) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.onesignal.user.internal.operations

import br.com.colman.kotest.android.extensions.robolectric.RobolectricTest
import com.onesignal.common.consistency.RywData
import com.onesignal.common.consistency.models.IConsistencyManager
import com.onesignal.common.exceptions.BackendException
import com.onesignal.core.internal.operations.ExecutionResponse
import com.onesignal.core.internal.operations.ExecutionResult
Expand All @@ -25,10 +27,13 @@ import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.collections.shouldBeOneOf
import io.kotest.matchers.shouldBe
import io.kotest.matchers.types.shouldBeInstanceOf
import io.mockk.clearMocks
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.every
import io.mockk.just
import io.mockk.mockk
import io.mockk.runs

@RobolectricTest
class LoginUserOperationExecutorTests : FunSpec({
Expand All @@ -39,6 +44,8 @@ class LoginUserOperationExecutorTests : FunSpec({
val localSubscriptionId2 = "local-subscriptionId2"
val remoteSubscriptionId1 = "remote-subscriptionId1"
val remoteSubscriptionId2 = "remote-subscriptionId2"
val rywData = RywData("1", 500L)
val mockConsistencyManager = mockk<IConsistencyManager>()
val createSubscriptionOperation =
CreateSubscriptionOperation(
appId,
Expand All @@ -50,6 +57,11 @@ class LoginUserOperationExecutorTests : FunSpec({
SubscriptionStatus.SUBSCRIBED,
)

beforeTest {
clearMocks(mockConsistencyManager)
coEvery { mockConsistencyManager.setRywData(any(), any(), any()) } just runs
}

test("login anonymous user successfully creates user") {
// Given
val mockUserBackendService = mockk<IUserBackendService>()
Expand All @@ -58,6 +70,7 @@ class LoginUserOperationExecutorTests : FunSpec({
mapOf(IdentityConstants.ONESIGNAL_ID to remoteOneSignalId),
PropertiesObject(),
listOf(),
rywData,
)
// Given
val mockIdentityOperationExecutor = mockk<IdentityOperationExecutor>()
Expand All @@ -76,6 +89,7 @@ class LoginUserOperationExecutorTests : FunSpec({
mockSubscriptionsModelStore,
MockHelper.configModelStore(),
MockHelper.languageContext(),
mockConsistencyManager,
)
val operations =
listOf<Operation>(
Expand Down Expand Up @@ -120,6 +134,7 @@ class LoginUserOperationExecutorTests : FunSpec({
mockSubscriptionsModelStore,
MockHelper.configModelStore(),
MockHelper.languageContext(),
mockConsistencyManager,
)
val operations =
listOf<Operation>(
Expand Down Expand Up @@ -148,7 +163,7 @@ class LoginUserOperationExecutorTests : FunSpec({
val mockSubscriptionsModelStore = mockk<SubscriptionModelStore>()

val loginUserOperationExecutor =
LoginUserOperationExecutor(mockIdentityOperationExecutor, AndroidMockHelper.applicationService(), MockHelper.deviceService(), mockUserBackendService, mockIdentityModelStore, mockPropertiesModelStore, mockSubscriptionsModelStore, MockHelper.configModelStore(), MockHelper.languageContext())
LoginUserOperationExecutor(mockIdentityOperationExecutor, AndroidMockHelper.applicationService(), MockHelper.deviceService(), mockUserBackendService, mockIdentityModelStore, mockPropertiesModelStore, mockSubscriptionsModelStore, MockHelper.configModelStore(), MockHelper.languageContext(), mockConsistencyManager)
val operations =
listOf<Operation>(
LoginUserOperation(appId, localOneSignalId, null, null),
Expand All @@ -167,7 +182,7 @@ class LoginUserOperationExecutorTests : FunSpec({
// Given
val mockUserBackendService = mockk<IUserBackendService>()
coEvery { mockUserBackendService.createUser(any(), any(), any(), any()) } returns
CreateUserResponse(mapOf(IdentityConstants.ONESIGNAL_ID to remoteOneSignalId), PropertiesObject(), listOf())
CreateUserResponse(mapOf(IdentityConstants.ONESIGNAL_ID to remoteOneSignalId), PropertiesObject(), listOf(), rywData)

val mockIdentityOperationExecutor = mockk<IdentityOperationExecutor>()

Expand All @@ -176,7 +191,7 @@ class LoginUserOperationExecutorTests : FunSpec({
val mockSubscriptionsModelStore = mockk<SubscriptionModelStore>()

val loginUserOperationExecutor =
LoginUserOperationExecutor(mockIdentityOperationExecutor, MockHelper.applicationService(), MockHelper.deviceService(), mockUserBackendService, mockIdentityModelStore, mockPropertiesModelStore, mockSubscriptionsModelStore, MockHelper.configModelStore(), MockHelper.languageContext())
LoginUserOperationExecutor(mockIdentityOperationExecutor, MockHelper.applicationService(), MockHelper.deviceService(), mockUserBackendService, mockIdentityModelStore, mockPropertiesModelStore, mockSubscriptionsModelStore, MockHelper.configModelStore(), MockHelper.languageContext(), mockConsistencyManager)
val operations = listOf<Operation>(LoginUserOperation(appId, localOneSignalId, "externalId", null))

// When
Expand All @@ -195,7 +210,7 @@ class LoginUserOperationExecutorTests : FunSpec({
// Given
val mockUserBackendService = mockk<IUserBackendService>()
coEvery { mockUserBackendService.createUser(any(), any(), any(), any()) } returns
CreateUserResponse(mapOf(IdentityConstants.ONESIGNAL_ID to remoteOneSignalId), PropertiesObject(), listOf())
CreateUserResponse(mapOf(IdentityConstants.ONESIGNAL_ID to remoteOneSignalId), PropertiesObject(), listOf(), rywData)

val mockIdentityOperationExecutor = mockk<IdentityOperationExecutor>()

Expand All @@ -214,6 +229,7 @@ class LoginUserOperationExecutorTests : FunSpec({
mockSubscriptionsModelStore,
MockHelper.configModelStore(),
MockHelper.languageContext(),
mockConsistencyManager,
)
val operations = listOf<Operation>(LoginUserOperation(appId, localOneSignalId, "externalId", null))

Expand Down Expand Up @@ -242,7 +258,7 @@ class LoginUserOperationExecutorTests : FunSpec({
val mockSubscriptionsModelStore = mockk<SubscriptionModelStore>()

val loginUserOperationExecutor =
LoginUserOperationExecutor(mockIdentityOperationExecutor, MockHelper.applicationService(), MockHelper.deviceService(), mockUserBackendService, mockIdentityModelStore, mockPropertiesModelStore, mockSubscriptionsModelStore, MockHelper.configModelStore(), MockHelper.languageContext())
LoginUserOperationExecutor(mockIdentityOperationExecutor, MockHelper.applicationService(), MockHelper.deviceService(), mockUserBackendService, mockIdentityModelStore, mockPropertiesModelStore, mockSubscriptionsModelStore, MockHelper.configModelStore(), MockHelper.languageContext(), mockConsistencyManager)
val operations = listOf<Operation>(LoginUserOperation(appId, localOneSignalId, "externalId", "existingOneSignalId"))

// When
Expand All @@ -268,7 +284,7 @@ class LoginUserOperationExecutorTests : FunSpec({
// Given
val mockUserBackendService = mockk<IUserBackendService>()
coEvery { mockUserBackendService.createUser(any(), any(), any(), any()) } returns
CreateUserResponse(mapOf(IdentityConstants.ONESIGNAL_ID to remoteOneSignalId), PropertiesObject(), listOf())
CreateUserResponse(mapOf(IdentityConstants.ONESIGNAL_ID to remoteOneSignalId), PropertiesObject(), listOf(), rywData)

val mockIdentityOperationExecutor = mockk<IdentityOperationExecutor>()
coEvery { mockIdentityOperationExecutor.execute(any()) } returns ExecutionResponse(ExecutionResult.FAIL_RETRY)
Expand All @@ -278,7 +294,7 @@ class LoginUserOperationExecutorTests : FunSpec({
val mockSubscriptionsModelStore = mockk<SubscriptionModelStore>()

val loginUserOperationExecutor =
LoginUserOperationExecutor(mockIdentityOperationExecutor, MockHelper.applicationService(), MockHelper.deviceService(), mockUserBackendService, mockIdentityModelStore, mockPropertiesModelStore, mockSubscriptionsModelStore, MockHelper.configModelStore(), MockHelper.languageContext())
LoginUserOperationExecutor(mockIdentityOperationExecutor, MockHelper.applicationService(), MockHelper.deviceService(), mockUserBackendService, mockIdentityModelStore, mockPropertiesModelStore, mockSubscriptionsModelStore, MockHelper.configModelStore(), MockHelper.languageContext(), mockConsistencyManager)
val operations = listOf<Operation>(LoginUserOperation(appId, localOneSignalId, "externalId", "existingOneSignalId"))

// When
Expand All @@ -304,7 +320,7 @@ class LoginUserOperationExecutorTests : FunSpec({
// Given
val mockUserBackendService = mockk<IUserBackendService>()
coEvery { mockUserBackendService.createUser(any(), any(), any(), any()) } returns
CreateUserResponse(mapOf(IdentityConstants.ONESIGNAL_ID to remoteOneSignalId), PropertiesObject(), listOf())
CreateUserResponse(mapOf(IdentityConstants.ONESIGNAL_ID to remoteOneSignalId), PropertiesObject(), listOf(), rywData)

val mockIdentityOperationExecutor = mockk<IdentityOperationExecutor>()
coEvery { mockIdentityOperationExecutor.execute(any()) } returns ExecutionResponse(ExecutionResult.FAIL_NORETRY)
Expand All @@ -314,7 +330,7 @@ class LoginUserOperationExecutorTests : FunSpec({
val mockSubscriptionsModelStore = mockk<SubscriptionModelStore>()

val loginUserOperationExecutor =
LoginUserOperationExecutor(mockIdentityOperationExecutor, MockHelper.applicationService(), MockHelper.deviceService(), mockUserBackendService, mockIdentityModelStore, mockPropertiesModelStore, mockSubscriptionsModelStore, MockHelper.configModelStore(), MockHelper.languageContext())
LoginUserOperationExecutor(mockIdentityOperationExecutor, MockHelper.applicationService(), MockHelper.deviceService(), mockUserBackendService, mockIdentityModelStore, mockPropertiesModelStore, mockSubscriptionsModelStore, MockHelper.configModelStore(), MockHelper.languageContext(), mockConsistencyManager)
val operations = listOf<Operation>(LoginUserOperation(appId, localOneSignalId, "externalId", "existingOneSignalId"))

// When
Expand Down Expand Up @@ -352,7 +368,7 @@ class LoginUserOperationExecutorTests : FunSpec({
val mockSubscriptionsModelStore = mockk<SubscriptionModelStore>()

val loginUserOperationExecutor =
LoginUserOperationExecutor(mockIdentityOperationExecutor, MockHelper.applicationService(), MockHelper.deviceService(), mockUserBackendService, mockIdentityModelStore, mockPropertiesModelStore, mockSubscriptionsModelStore, MockHelper.configModelStore(), MockHelper.languageContext())
LoginUserOperationExecutor(mockIdentityOperationExecutor, MockHelper.applicationService(), MockHelper.deviceService(), mockUserBackendService, mockIdentityModelStore, mockPropertiesModelStore, mockSubscriptionsModelStore, MockHelper.configModelStore(), MockHelper.languageContext(), mockConsistencyManager)
val operations = listOf<Operation>(LoginUserOperation(appId, localOneSignalId, "externalId", "existingOneSignalId"))

// When
Expand Down Expand Up @@ -385,6 +401,7 @@ class LoginUserOperationExecutorTests : FunSpec({
mapOf(IdentityConstants.ONESIGNAL_ID to remoteOneSignalId),
PropertiesObject(),
listOf(),
rywData,
)
// Given
val mockIdentityOperationExecutor = mockk<IdentityOperationExecutor>()
Expand All @@ -403,6 +420,7 @@ class LoginUserOperationExecutorTests : FunSpec({
mockSubscriptionsModelStore,
MockHelper.configModelStore(),
MockHelper.languageContext(),
mockConsistencyManager,
)
val operations =
listOf<Operation>(
Expand Down Expand Up @@ -471,6 +489,7 @@ class LoginUserOperationExecutorTests : FunSpec({
mapOf(IdentityConstants.ONESIGNAL_ID to remoteOneSignalId),
PropertiesObject(),
listOf(SubscriptionObject(remoteSubscriptionId1, SubscriptionObjectType.ANDROID_PUSH), SubscriptionObject(remoteSubscriptionId2, SubscriptionObjectType.EMAIL)),
rywData,
)
// Given
val mockIdentityOperationExecutor = mockk<IdentityOperationExecutor>()
Expand Down Expand Up @@ -504,6 +523,7 @@ class LoginUserOperationExecutorTests : FunSpec({
mockSubscriptionsModelStore,
MockHelper.configModelStore(),
MockHelper.languageContext(),
mockConsistencyManager,
)
val operations =
listOf<Operation>(
Expand Down Expand Up @@ -557,6 +577,7 @@ class LoginUserOperationExecutorTests : FunSpec({
mapOf(IdentityConstants.ONESIGNAL_ID to remoteOneSignalId),
PropertiesObject(),
listOf(SubscriptionObject(remoteSubscriptionId1, SubscriptionObjectType.ANDROID_PUSH), SubscriptionObject(remoteSubscriptionId2, SubscriptionObjectType.EMAIL)),
rywData,
)
// Given
val mockIdentityOperationExecutor = mockk<IdentityOperationExecutor>()
Expand Down Expand Up @@ -590,6 +611,7 @@ class LoginUserOperationExecutorTests : FunSpec({
mockSubscriptionsModelStore,
MockHelper.configModelStore(),
MockHelper.languageContext(),
mockConsistencyManager,
)
val operations =
listOf<Operation>(
Expand Down Expand Up @@ -643,6 +665,7 @@ class LoginUserOperationExecutorTests : FunSpec({
mapOf(IdentityConstants.ONESIGNAL_ID to remoteOneSignalId),
PropertiesObject(),
listOf(SubscriptionObject(remoteSubscriptionId1, SubscriptionObjectType.ANDROID_PUSH), SubscriptionObject(remoteSubscriptionId2, SubscriptionObjectType.EMAIL)),
rywData,
)
// Given
val mockIdentityOperationExecutor = mockk<IdentityOperationExecutor>()
Expand All @@ -662,6 +685,7 @@ class LoginUserOperationExecutorTests : FunSpec({
mockSubscriptionsModelStore,
MockHelper.configModelStore(),
MockHelper.languageContext(),
mockConsistencyManager,
)
val operations =
listOf<Operation>(
Expand Down Expand Up @@ -706,7 +730,7 @@ class LoginUserOperationExecutorTests : FunSpec({
// Given
val mockUserBackendService = mockk<IUserBackendService>()
coEvery { mockUserBackendService.createUser(any(), any(), any(), any()) } returns
CreateUserResponse(mapOf(IdentityConstants.ONESIGNAL_ID to remoteOneSignalId), PropertiesObject(), listOf())
CreateUserResponse(mapOf(IdentityConstants.ONESIGNAL_ID to remoteOneSignalId), PropertiesObject(), listOf(), rywData)

val mockIdentityOperationExecutor = mockk<IdentityOperationExecutor>()

Expand All @@ -725,6 +749,7 @@ class LoginUserOperationExecutorTests : FunSpec({
mockSubscriptionsModelStore,
MockHelper.configModelStore(),
MockHelper.languageContext(),
mockConsistencyManager,
)
// anonymous Login request
val operations = listOf<Operation>(LoginUserOperation(appId, localOneSignalId, null, null))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ class RefreshUserOperationExecutorTests : FunSpec({
SubscriptionObject(remoteSubscriptionId1, SubscriptionObjectType.ANDROID_PUSH, enabled = true, token = "pushToken2"),
SubscriptionObject(remoteSubscriptionId2, SubscriptionObjectType.EMAIL, token = "name@company.com"),
),
null,
)

// Given
Expand Down Expand Up @@ -142,6 +143,7 @@ class RefreshUserOperationExecutorTests : FunSpec({
mapOf(IdentityConstants.ONESIGNAL_ID to remoteOneSignalId),
PropertiesObject(),
listOf(),
null,
)

// Given
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -196,15 +196,6 @@ internal class InAppMessagesManager(
for (redisplayInAppMessage in redisplayedInAppMessages) {
redisplayInAppMessage.isDisplayedInSession = false
}

// attempt to fetch messages from the backend (if we have the pre-requisite data already)
val onesignalId = _userManager.onesignalId
val updateConditionDeferred =
_consistencyManager.getRywDataFromAwaitableCondition(IamFetchReadyCondition(onesignalId))
val rywToken = updateConditionDeferred.await()
if (rywToken != null) {
fetchMessages(rywToken)
}
}
}

Expand Down
Loading