Skip to content

Commit

Permalink
Merge branch 'adds-interception-tests' into 'main'
Browse files Browse the repository at this point in the history
Adds interception tests

See merge request veepee/offerdiscovery/products/front-mobile/android/link-router!4
  • Loading branch information
Julio Cesar Bueno Cotta committed Oct 25, 2021
2 parents c3e182c + f395f32 commit 362d1db
Show file tree
Hide file tree
Showing 7 changed files with 157 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
title: Adds interception tests
url: https://git.vptech.eu/veepee/offerdiscovery/products/front-mobile/android/link-router/-/merge_requests/4
author: Julio Cesar Bueno Cotta
---

Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,16 @@ data class UriDeepLink(
override val parameter: UriParameter,
private val schemeFactory: (scheme: String) -> Scheme
) : DeepLink {
constructor(
uri: Uri,
schemeFactory: (scheme: String) -> Scheme
) : this(UriParameter(uri), schemeFactory)

constructor(
url: String,
schemeFactory: (scheme: String) -> Scheme
) : this(Uri.parse(url), schemeFactory)

@IgnoredOnParcel
override val scheme: Scheme = schemeFactory(parameter.uri.scheme!!)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ import com.veepee.vpcore.route.activity.route.TestActivityALink
import com.veepee.vpcore.route.activity.route.TestActivityBLink
import com.veepee.vpcore.route.activity.route.TestActivityBParameter
import com.veepee.vpcore.route.link.activity.*
import com.veepee.vpcore.route.link.activity.chain.ActivityLinkInterceptor
import com.veepee.vpcore.route.link.interceptor.Chain
import com.veepee.vpcore.route.link.interceptor.ChainFactoryImpl
import com.veepee.vpcore.route.requireLinkParameter
import org.junit.Assert.assertEquals
Expand Down Expand Up @@ -65,6 +67,26 @@ class ActivityLinkRouterTest {
}
}

@Test
fun `should intercept ActivityLink and return a different one`() {
val interceptor = object : ActivityLinkInterceptor {
override fun intercept(
chain: Chain<ActivityNameMapper<out ActivityName>, ActivityLink<ActivityName>>,
mapper: ActivityNameMapper<out ActivityName>,
link: ActivityLink<ActivityName>
): ActivityLink<ActivityName> {
if (link is TestActivityALink) {
return TestActivityBLink(activityBParameter)
}
return chain.next(mapper, link)
}
}
val router = ActivityLinkRouterImpl(mappers, ChainFactoryImpl(listOf(interceptor)))
val activity: Activity = mock()
val intent1 = router.intentFor(activity, TestActivityALink)
assertEquals(intent1.component!!.className, TestActivityB::class.java.name)
}

private fun assertIntentFor(
activityLink: ActivityLink<ActivityName>,
clazz: Class<out Activity>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,22 +17,37 @@ package com.veepee.vpcore.route.deeplink

import android.content.Context
import android.content.Intent
import android.net.Uri
import com.veepee.vpcore.route.activity.route.TestActivityALink
import com.veepee.vpcore.route.activity.route.TestActivityBLink
import com.veepee.vpcore.route.activity.route.TestActivityBParameter
import com.veepee.vpcore.route.deeplink.route.TestUriDeepLinkMapper
import com.veepee.vpcore.route.deeplink.route.BingUriDeepLinkMapper
import com.veepee.vpcore.route.deeplink.route.GoogleUriDeepLinkMapper
import com.veepee.vpcore.route.link.activity.ActivityLinkRouter
import com.veepee.vpcore.route.link.deeplink.*
import com.veepee.vpcore.route.link.deeplink.DeepLink
import com.veepee.vpcore.route.link.deeplink.DeepLinkMapper
import com.veepee.vpcore.route.link.deeplink.DeepLinkRouterImpl
import com.veepee.vpcore.route.link.deeplink.NoDeepLinkMapperException
import com.veepee.vpcore.route.link.deeplink.StackBuilder
import com.veepee.vpcore.route.link.deeplink.StackBuilderFactory
import com.veepee.vpcore.route.link.deeplink.UriDeepLink
import com.veepee.vpcore.route.link.deeplink.chain.DeepLinkInterceptor
import com.veepee.vpcore.route.link.interceptor.Chain
import com.veepee.vpcore.route.link.interceptor.ChainFactory
import com.veepee.vpcore.route.link.interceptor.ChainFactoryImpl
import org.junit.Assert.assertThrows
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.any
import org.mockito.kotlin.inOrder
import org.mockito.kotlin.mock
import org.mockito.kotlin.times
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
import org.robolectric.RobolectricTestRunner

@RunWith(RobolectricTestRunner::class)
class DeepLinkRouterImplTest {
private val chainFactory: ChainFactory<DeepLinkMapper<out DeepLink>, DeepLink> = mock()
private val chain: Chain<DeepLinkMapper<out DeepLink>, DeepLink> = mock()
Expand All @@ -44,7 +59,8 @@ class DeepLinkRouterImplTest {
private val intentB: Intent = mock()
private val deepLink: DeepLink = mock()

private val mappers: Set<DeepLinkMapper<DeepLink>> = setOf(TestUriDeepLinkMapper)
private val mappers: Set<DeepLinkMapper<DeepLink>> =
setOf(GoogleUriDeepLinkMapper, BingUriDeepLinkMapper)

@Before
fun setup() {
Expand Down Expand Up @@ -96,4 +112,37 @@ class DeepLinkRouterImplTest {
router.route(context, deepLink)
}
}

@Test
fun `should intercept bing deeplink and forward to google deeplink`() {
val interceptor = object : DeepLinkInterceptor {
override fun intercept(
chain: Chain<DeepLinkMapper<out DeepLink>, DeepLink>,
mapper: DeepLinkMapper<out DeepLink>,
link: DeepLink
): DeepLink {
if (link.authority == "www.bing.com") {
return UriDeepLink(Uri.parse("myscheme://www.google.com"))
{ TestScheme.MyScheme }
}
return chain.next(mapper, link)
}
}
val chainFactory = ChainFactoryImpl(listOf(interceptor))

val router = DeepLinkRouterImpl(
mappers,
activityLinkRouter,
stackBuilderFactory,
chainFactory
)

router.route(context, UriDeepLink(Uri.parse("myscheme://www.bing.com"))
{ TestScheme.MyScheme })

verify(stackBuilderFactory, times(1)).create(context)
verify(stackBuilder, times(1)).addNextIntent(intentA)
verify(stackBuilder, times(1)).addNextIntent(intentB)
verify(stackBuilder, times(1)).startActivities()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/**
* Copyright (c) 2021, Veepee
*
* Permission to use, copy, modify, and/or distribute this software for any purpose
* with or without fee is hereby granted, provided that the above copyright notice
* and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
* THIS SOFTWARE.
*/
package com.veepee.vpcore.route.deeplink.route

import com.veepee.vpcore.route.activity.route.TestActivityBLink
import com.veepee.vpcore.route.activity.route.TestActivityBParameter
import com.veepee.vpcore.route.deeplink.TestScheme
import com.veepee.vpcore.route.link.activity.ActivityLink
import com.veepee.vpcore.route.link.activity.ActivityName
import com.veepee.vpcore.route.link.deeplink.DeepLink
import com.veepee.vpcore.route.link.deeplink.DeepLinkMapper
import com.veepee.vpcore.route.link.deeplink.Scheme

internal object BingUriDeepLinkMapper : DeepLinkMapper<DeepLink> {
override val supportedSchemes: Array<Scheme> = arrayOf(TestScheme.MyScheme)
override val supportedAuthority: String = "www.bing.com"

override fun stack(deepLink: DeepLink): Array<ActivityLink<ActivityName>> {
return arrayOf(
TestActivityBLink(TestActivityBParameter(deepLink.authority))
)
}

override fun canHandle(deepLink: DeepLink): Boolean {
return deepLink.scheme in supportedSchemes
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import com.veepee.vpcore.route.link.deeplink.DeepLink
import com.veepee.vpcore.route.link.deeplink.DeepLinkMapper
import com.veepee.vpcore.route.link.deeplink.Scheme

internal object TestUriDeepLinkMapper : DeepLinkMapper<DeepLink> {
internal object GoogleUriDeepLinkMapper : DeepLinkMapper<DeepLink> {
override val supportedSchemes: Array<Scheme> = arrayOf(TestScheme.MyScheme)
override val supportedAuthority: String = "www.google.com"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,13 @@ import com.veepee.vpcore.route.fragment.feature.TestFragmentNameMapper
import com.veepee.vpcore.route.fragment.route.TestFragmentALink
import com.veepee.vpcore.route.fragment.route.TestFragmentBLink
import com.veepee.vpcore.route.fragment.route.TestFragmentBParameter
import com.veepee.vpcore.route.link.fragment.FragmentLink
import com.veepee.vpcore.route.link.fragment.FragmentLinkRouterImpl
import com.veepee.vpcore.route.link.fragment.FragmentName
import com.veepee.vpcore.route.link.fragment.FragmentNameMapper
import com.veepee.vpcore.route.link.fragment.NoFragmentNameMapperException
import com.veepee.vpcore.route.link.fragment.chain.FragmentLinkInterceptor
import com.veepee.vpcore.route.link.interceptor.Chain
import com.veepee.vpcore.route.link.interceptor.ChainFactoryImpl
import com.veepee.vpcore.route.requireLinkParameter
import org.junit.Assert
Expand Down Expand Up @@ -61,11 +64,33 @@ class FragmentLinkRouterTest {

@Test
fun `should raise an error when the there is no mapper for a given ActivityLink`() {

val router = FragmentLinkRouterImpl(emptySet(), ChainFactoryImpl(emptyList()))

Assert.assertThrows(NoFragmentNameMapperException::class.java) {
router.fragmentFor(TestFragmentALink)
}
}

@Test
fun `should intercept fragmentA and return fragmentB`() {
val interceptor = object : FragmentLinkInterceptor {
override fun intercept(
chain: Chain<FragmentNameMapper<out FragmentName>, FragmentLink<FragmentName>>,
mapper: FragmentNameMapper<out FragmentName>,
link: FragmentLink<FragmentName>
): FragmentLink<FragmentName> {
if (link is TestFragmentALink) {
return TestFragmentBLink(testFragmentBParameter)
}
return chain.next(mapper, link)
}
}
val router = FragmentLinkRouterImpl(mappers, ChainFactoryImpl(listOf(interceptor)))

val fragment = router.fragmentFor(TestFragmentALink)
assertEquals(
fragment.requireLinkParameter<TestFragmentBParameter>(),
testFragmentBParameter
)
}
}

0 comments on commit 362d1db

Please sign in to comment.