Skip to content

Commit

Permalink
buffer request in incoming request repository
Browse files Browse the repository at this point in the history
  • Loading branch information
jakub-rdx committed Jun 27, 2024
1 parent b0c2275 commit 6b03334
Show file tree
Hide file tree
Showing 7 changed files with 54 additions and 73 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,13 @@ interface IncomingRequestRepository {
fun getAmountOfRequests(): Int

suspend fun requestDeferred(requestId: String)

fun consumeBufferedRequest(): IncomingRequest?

fun setBufferedRequest(request: IncomingRequest)
}

@Suppress("TooManyFunctions")
class IncomingRequestRepositoryImpl @Inject constructor(
private val appEventBus: AppEventBus
) : IncomingRequestRepository {
Expand All @@ -56,6 +61,19 @@ class IncomingRequestRepositoryImpl @Inject constructor(

private val mutex = Mutex()

/**
* Request that can come in via deep link before wallet is setup.
*/
private var bufferedRequest: IncomingRequest? = null

override fun setBufferedRequest(request: IncomingRequest) {
bufferedRequest = request
}

override fun consumeBufferedRequest(): IncomingRequest? {
return bufferedRequest?.also { bufferedRequest = null }
}

override suspend fun add(incomingRequest: IncomingRequest) {
mutex.withLock {
val requestItem = QueueItem.RequestItem(incomingRequest)
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.babylon.wallet.android.domain.usecases.deeplink

import com.babylon.wallet.android.data.dapp.IncomingRequestRepository
import com.babylon.wallet.android.data.dapp.model.toDomainModel
import com.babylon.wallet.android.data.repository.BufferedMobileConnectRequestRepository
import com.babylon.wallet.android.domain.model.IncomingMessage
import com.radixdlt.sargon.RadixConnectMobile
import rdx.works.profile.domain.GetProfileUseCase
Expand All @@ -11,7 +11,7 @@ import javax.inject.Inject
class ProcessDeepLinkUseCase @Inject constructor(
private val radixConnectMobile: RadixConnectMobile,
private val getProfileUseCase: GetProfileUseCase,
private val bufferedMobileConnectRequestRepository: BufferedMobileConnectRequestRepository
private val incomingRequestRepository: IncomingRequestRepository
) {

suspend operator fun invoke(deepLink: String): Result<DeepLinkProcessingResult> {
Expand All @@ -25,7 +25,7 @@ class ProcessDeepLinkUseCase @Inject constructor(
)
).getOrThrow()
if (!profileInitialized) {
bufferedMobileConnectRequestRepository.setBufferedRequest(request)
incomingRequestRepository.setBufferedRequest(request)
return Result.success(DeepLinkProcessingResult.Buffered)
}
DeepLinkProcessingResult.Processed(request)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import android.net.Uri
import androidx.lifecycle.viewModelScope
import com.babylon.wallet.android.data.dapp.IncomingRequestRepository
import com.babylon.wallet.android.data.dapp.PeerdroidClient
import com.babylon.wallet.android.data.repository.BufferedMobileConnectRequestRepository
import com.babylon.wallet.android.data.repository.p2plink.P2PLinksRepository
import com.babylon.wallet.android.domain.RadixWalletException
import com.babylon.wallet.android.domain.model.IncomingMessage.IncomingRequest
Expand Down Expand Up @@ -72,8 +71,7 @@ class MainViewModel @Inject constructor(
private val checkEntitiesCreatedWithOlympiaUseCase: CheckEntitiesCreatedWithOlympiaUseCase,
private val observeAccountsAndSyncWithConnectorExtensionUseCase: ObserveAccountsAndSyncWithConnectorExtensionUseCase,
private val cloudBackupErrorStream: CloudBackupErrorStream,
private val processDeepLinkUseCase: ProcessDeepLinkUseCase,
private val bufferedMobileConnectRequestRepository: BufferedMobileConnectRequestRepository
private val processDeepLinkUseCase: ProcessDeepLinkUseCase
) : StateViewModel<MainUiState>(), OneOffEventHandler<MainEvent> by OneOffEventHandlerImpl() {

private var verifyingDappRequestJob: Job? = null
Expand Down Expand Up @@ -160,7 +158,7 @@ class MainViewModel @Inject constructor(
private fun processBufferedDeepLinkRequest() {
viewModelScope.launch {
appEventBus.events.filterIsInstance<AppEvent.ProcessBufferedDeepLinkRequest>().collect {
bufferedMobileConnectRequestRepository.getBufferedRequest()?.let { request ->
incomingRequestRepository.consumeBufferedRequest()?.let { request ->
verifyIncomingRequest(request)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.babylon.wallet.android.utils.AppEvent
import com.babylon.wallet.android.utils.AppEventBusImpl
import com.radixdlt.sargon.NetworkId
import io.mockk.coVerify
import io.mockk.mockk
import io.mockk.spyk
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.DelicateCoroutinesApi
Expand Down Expand Up @@ -98,24 +99,25 @@ class IncomingRequestRepositoryTest {
}

@Test
fun `adding mobile connect request and deferring current makes mobile request new current, while deferred event stays in queue`() = runTest {
var currentRequest: IncomingMessage.IncomingRequest? = null
val interactionId1 = UUID.randomUUID().toString()
val interactionId2 = UUID.randomUUID().toString()
incomingRequestRepository.currentRequestToHandle
.onEach { currentRequest = it }
.launchIn(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
incomingRequestRepository.add(incomingRequest = sampleIncomingRequest.copy(interactionId = interactionId1))
advanceUntilIdle()
assertTrue(incomingRequestRepository.getAmountOfRequests() == 1)
assert(currentRequest?.interactionId == interactionId1)
incomingRequestRepository.addPriorityRequest(sampleIncomingRequest.copy(interactionId = interactionId2))
incomingRequestRepository.requestDeferred(interactionId1)
advanceUntilIdle()
assert(currentRequest?.interactionId == interactionId2)
assertTrue(incomingRequestRepository.getAmountOfRequests() == 2)
coVerify(exactly = 1) { eventBus.sendEvent(AppEvent.DeferRequestHandling(interactionId1)) }
}
fun `adding mobile connect request and deferring current makes mobile request new current, while deferred event stays in queue`() =
runTest {
var currentRequest: IncomingMessage.IncomingRequest? = null
val interactionId1 = UUID.randomUUID().toString()
val interactionId2 = UUID.randomUUID().toString()
incomingRequestRepository.currentRequestToHandle
.onEach { currentRequest = it }
.launchIn(CoroutineScope(UnconfinedTestDispatcher(testScheduler)))
incomingRequestRepository.add(incomingRequest = sampleIncomingRequest.copy(interactionId = interactionId1))
advanceUntilIdle()
assertTrue(incomingRequestRepository.getAmountOfRequests() == 1)
assert(currentRequest?.interactionId == interactionId1)
incomingRequestRepository.addPriorityRequest(sampleIncomingRequest.copy(interactionId = interactionId2))
incomingRequestRepository.requestDeferred(interactionId1)
advanceUntilIdle()
assert(currentRequest?.interactionId == interactionId2)
assertTrue(incomingRequestRepository.getAmountOfRequests() == 2)
coVerify(exactly = 1) { eventBus.sendEvent(AppEvent.DeferRequestHandling(interactionId1)) }
}

@Test
fun `addFirst inserts item at 2nd position when there is high priority screen`() = runTest {
Expand All @@ -137,4 +139,12 @@ class IncomingRequestRepositoryTest {
assert(currentRequest?.interactionId == interactionId2)
assertTrue(incomingRequestRepository.getAmountOfRequests() == 2)
}

@Test
fun `reading buffered request clears it`() = runTest {
val request = mockk<IncomingMessage.IncomingRequest>()
incomingRequestRepository.setBufferedRequest(request)
assert(incomingRequestRepository.consumeBufferedRequest() != null)
assert(incomingRequestRepository.consumeBufferedRequest() == null)
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.babylon.wallet.android.presentation
import app.cash.turbine.test
import com.babylon.wallet.android.NPSSurveyState
import com.babylon.wallet.android.NPSSurveyStateObserver
import com.babylon.wallet.android.data.repository.BufferedMobileConnectRequestRepository
import com.babylon.wallet.android.data.dapp.IncomingRequestRepository
import com.babylon.wallet.android.data.repository.p2plink.P2PLinksRepository
import com.babylon.wallet.android.domain.model.assets.AccountWithAssets
import com.babylon.wallet.android.domain.usecases.GetEntitiesWithSecurityPromptUseCase
Expand Down Expand Up @@ -61,7 +61,7 @@ class WalletViewModelTest : StateViewModelTest<WalletViewModel>() {
private val preferencesManager = mockk<PreferencesManager>()
private val appEventBus = mockk<AppEventBus>()
private val testDispatcher = StandardTestDispatcher()
private val bufferedMobileConnectRequestRepository = mockk<BufferedMobileConnectRequestRepository>()
private val incomingRequestRepository = mockk<IncomingRequestRepository>()
private val p2PLinksRepository = mockk<P2PLinksRepository>()

private val sampleProfile = Profile.sample()
Expand Down Expand Up @@ -90,7 +90,7 @@ class WalletViewModelTest : StateViewModelTest<WalletViewModel>() {

override fun setUp() {
super.setUp()
coEvery { bufferedMobileConnectRequestRepository.getBufferedRequest() } returns null
coEvery { incomingRequestRepository.consumeBufferedRequest() } returns null
coEvery { ensureBabylonFactorSourceExistUseCase.babylonFactorSourceExist() } returns true
every { getAccountsForSecurityPromptUseCase() } returns flow { emit(emptyList()) }
every { getBackupStateUseCase() } returns flowOf(
Expand Down

0 comments on commit 6b03334

Please sign in to comment.