Skip to content

Commit

Permalink
Add return url to analytics (#1239)
Browse files Browse the repository at this point in the history
* Send app switch url along with handle return to app event
  • Loading branch information
saperi22 authored Jan 15, 2025
1 parent 45cbb6f commit 402d25a
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,18 @@ import com.braintreepayments.api.BrowserSwitchException
import com.braintreepayments.api.BrowserSwitchFinalResult
import com.braintreepayments.api.BrowserSwitchStartResult
import com.braintreepayments.api.core.AnalyticsClient
import com.braintreepayments.api.core.AnalyticsEventParams
import com.braintreepayments.api.core.BraintreeException
import com.braintreepayments.api.core.GetReturnLinkUseCase
import com.braintreepayments.api.core.MerchantRepository

/**
* Responsible for launching PayPal user authentication in a web browser
*/
class PayPalLauncher internal constructor(
private val browserSwitchClient: BrowserSwitchClient,
private val merchantRepository: MerchantRepository = MerchantRepository.instance,
private val getReturnLinkUseCase: GetReturnLinkUseCase = GetReturnLinkUseCase(merchantRepository),
lazyAnalyticsClient: Lazy<AnalyticsClient>
) {
/**
Expand Down Expand Up @@ -82,7 +87,20 @@ class PayPalLauncher internal constructor(
pendingRequest: PayPalPendingRequest.Started,
intent: Intent
): PayPalPaymentAuthResult {
analyticsClient.sendEvent(PayPalAnalytics.HANDLE_RETURN_STARTED)
analyticsClient.sendEvent(
PayPalAnalytics.HANDLE_RETURN_STARTED,
AnalyticsEventParams(
appSwitchUrl = when (val returnLinkResult = getReturnLinkUseCase()) {
is GetReturnLinkUseCase.ReturnLinkResult.AppLink -> {
returnLinkResult.appLinkReturnUri.toString()
}
is GetReturnLinkUseCase.ReturnLinkResult.DeepLink -> {
returnLinkResult.deepLinkFallbackUrlScheme
}
else -> null
}
)
)
return when (val browserSwitchResult =
browserSwitchClient.completeRequest(intent, pendingRequest.pendingRequestString)) {
is BrowserSwitchFinalResult.Success -> {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package com.braintreepayments.api.paypal

import android.content.Intent
import android.net.Uri
import androidx.activity.ComponentActivity
import com.braintreepayments.api.BrowserSwitchClient
import com.braintreepayments.api.BrowserSwitchException
import com.braintreepayments.api.BrowserSwitchFinalResult
import com.braintreepayments.api.BrowserSwitchOptions
import com.braintreepayments.api.BrowserSwitchStartResult
import com.braintreepayments.api.core.AnalyticsClient
import com.braintreepayments.api.core.AnalyticsEventParams
import com.braintreepayments.api.core.GetReturnLinkUseCase
import com.braintreepayments.api.core.MerchantRepository
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
Expand All @@ -29,13 +33,26 @@ class PayPalLauncherUnitTest {
private val options: BrowserSwitchOptions = mockk(relaxed = true)
private val pendingRequestString = "pending_request_string"
private val analyticsClient: AnalyticsClient = mockk(relaxed = true)
private val merchantRepository = mockk<MerchantRepository>(relaxed = true)
private val getReturnLinkUseCase = mockk<GetReturnLinkUseCase>()
private val returnUrl = "https://return.url"
private val deepLinkScheme = "deepLinkScheme"

private lateinit var sut: PayPalLauncher

@Before
fun setup() {
every { paymentAuthRequestParams.browserSwitchOptions } returns options
sut = PayPalLauncher(browserSwitchClient, lazy { analyticsClient })

val appSwitchReturnUrl = Uri.parse(returnUrl)
every { getReturnLinkUseCase() } returns GetReturnLinkUseCase.ReturnLinkResult.AppLink(
appSwitchReturnUrl
)
sut = PayPalLauncher(
browserSwitchClient,
merchantRepository,
getReturnLinkUseCase,
lazy { analyticsClient })
}

@Test
Expand Down Expand Up @@ -100,7 +117,48 @@ class PayPalLauncherUnitTest {
PayPalPendingRequest.Started(pendingRequestString),
intent
)
verify { analyticsClient.sendEvent(PayPalAnalytics.HANDLE_RETURN_STARTED) }
verify {
analyticsClient.sendEvent(
PayPalAnalytics.HANDLE_RETURN_STARTED,
AnalyticsEventParams(appSwitchUrl = returnUrl)
)
}
}

@Test
@Throws(JSONException::class)
fun `handleReturnToApp with deeplinkScheme sends handle started event with deeplink scheme`() {
every { getReturnLinkUseCase() } returns GetReturnLinkUseCase.ReturnLinkResult.DeepLink(
deepLinkScheme
)
sut.handleReturnToApp(
PayPalPendingRequest.Started(pendingRequestString),
intent
)
verify {
analyticsClient.sendEvent(
PayPalAnalytics.HANDLE_RETURN_STARTED,
AnalyticsEventParams(appSwitchUrl = deepLinkScheme)
)
}
}

@Test
@Throws(JSONException::class)
fun `handleReturnToApp with ReturnLinkResult Failure sends handle started event with null appSwitchUrl`() {
every { getReturnLinkUseCase() } returns GetReturnLinkUseCase.ReturnLinkResult.Failure(
Exception("handle return start failed")
)
sut.handleReturnToApp(
PayPalPendingRequest.Started(pendingRequestString),
intent
)
verify {
analyticsClient.sendEvent(
PayPalAnalytics.HANDLE_RETURN_STARTED,
AnalyticsEventParams()
)
}
}

@Test
Expand Down

0 comments on commit 402d25a

Please sign in to comment.