1
+ package com.segment.analytics.kotlin.android.utilities
2
+
3
+ import android.content.Context
4
+ import android.content.SharedPreferences
5
+ import android.net.Uri
6
+ import androidx.test.platform.app.InstrumentationRegistry
7
+ import com.segment.analytics.kotlin.android.AndroidStorageProvider
8
+ import com.segment.analytics.kotlin.android.plugins.getUniqueID
9
+ import com.segment.analytics.kotlin.android.utils.MemorySharedPreferences
10
+ import com.segment.analytics.kotlin.android.utils.testAnalytics
11
+ import com.segment.analytics.kotlin.core.Analytics
12
+ import com.segment.analytics.kotlin.core.Configuration
13
+ import com.segment.analytics.kotlin.core.emptyJsonObject
14
+ import io.mockk.every
15
+ import io.mockk.mockkStatic
16
+ import io.mockk.spyk
17
+ import kotlinx.coroutines.test.TestScope
18
+ import kotlinx.coroutines.test.UnconfinedTestDispatcher
19
+ import kotlinx.serialization.json.JsonPrimitive
20
+ import kotlinx.serialization.json.buildJsonObject
21
+ import org.junit.Assert.assertEquals
22
+ import org.junit.Before
23
+ import org.junit.Test
24
+ import org.junit.runner.RunWith
25
+ import org.robolectric.RobolectricTestRunner
26
+ import org.robolectric.annotation.Config
27
+
28
+ @RunWith(RobolectricTestRunner ::class )
29
+ @Config(manifest = Config .NONE )
30
+ class DeepLinkUtilsTests {
31
+ lateinit var appContext: Context
32
+ lateinit var analytics: Analytics
33
+ lateinit var deepLinkUtils: DeepLinkUtils
34
+ private val testDispatcher = UnconfinedTestDispatcher ()
35
+ private val testScope = TestScope (testDispatcher)
36
+
37
+
38
+ @Before
39
+ fun setup () {
40
+ appContext = spyk(InstrumentationRegistry .getInstrumentation().targetContext)
41
+ val sharedPreferences: SharedPreferences = MemorySharedPreferences ()
42
+ every { appContext.getSharedPreferences(any(), any()) } returns sharedPreferences
43
+ mockkStatic(" com.segment.analytics.kotlin.android.plugins.AndroidContextPluginKt" )
44
+ every { getUniqueID() } returns " unknown"
45
+
46
+ analytics = testAnalytics(
47
+ Configuration (
48
+ writeKey = " 123" ,
49
+ application = appContext,
50
+ storageProvider = AndroidStorageProvider
51
+ ),
52
+ testScope, testDispatcher
53
+ )
54
+ deepLinkUtils = DeepLinkUtils (analytics)
55
+ }
56
+
57
+ @Test
58
+ fun extractLinkPropertiesTest () {
59
+ val link =
60
+ " https://stockx.com/?utm_source=af&utm_medium=imp&utm_campaign=1310690&impactSiteId=VupTG%3ASM2xyKUReTwuwulVAxUksw710t1yqKR80&clickid=VupTG%3ASM2xyKUReTwuwulVAxUksw710t1yqKR80&utm_term=VupTG%3ASM2xyKUReTwuwulVAxUksw710t1yqKR80&utm_content=1868737_570105&irgwc=1&irclickid=VupTG%3ASM2xyKUReTwuwulVAxUksw710t1yqKR80&ir_campaignid=9060&ir_adid=570105&ir_partnerid=1310690&gad_source=1&referrer=gclid%3DCjwKCAiAiaC-BhBEEiwAjY99qHbSPJ49pAI83Lo4L7bV3GKaUxSyOX4lah88GFkcNGYQ_MLIZGwXcBoCFAwQAvD_BwE&gref=EkQKPAoICICJoL4GEEQSLACNj32odtI8nj2kAjzcujgvttXcYppTFLI5fiVqHzwYWRw0ZhD8wshkbBdwGgIUDBAC8P8HARjt_K_sKQ"
61
+
62
+ val expectedProperties = buildJsonObject {
63
+ put(
64
+ " referrer" ,
65
+ JsonPrimitive (" gclid=CjwKCAiAiaC-BhBEEiwAjY99qHbSPJ49pAI83Lo4L7bV3GKaUxSyOX4lah88GFkcNGYQ_MLIZGwXcBoCFAwQAvD_BwE" )
66
+ )
67
+ put(" utm_source" , JsonPrimitive (" af" ))
68
+ put(" utm_medium" , JsonPrimitive (" imp" ))
69
+ put(" utm_campaign" , JsonPrimitive (" 1310690" ))
70
+ put(" impactSiteId" , JsonPrimitive (" VupTG:SM2xyKUReTwuwulVAxUksw710t1yqKR80" ))
71
+ put(" clickid" , JsonPrimitive (" VupTG:SM2xyKUReTwuwulVAxUksw710t1yqKR80" ))
72
+ put(" utm_term" , JsonPrimitive (" VupTG:SM2xyKUReTwuwulVAxUksw710t1yqKR80" ))
73
+ put(" utm_content" , JsonPrimitive (" 1868737_570105" ))
74
+ put(" irgwc" , JsonPrimitive (" 1" ))
75
+ put(" irclickid" , JsonPrimitive (" VupTG:SM2xyKUReTwuwulVAxUksw710t1yqKR80" ))
76
+ put(" ir_campaignid" , JsonPrimitive (" 9060" ))
77
+ put(" ir_adid" , JsonPrimitive (" 570105" ))
78
+ put(" ir_partnerid" , JsonPrimitive (" 1310690" ))
79
+ put(" gad_source" , JsonPrimitive (" 1" ))
80
+ put(
81
+ " gref" ,
82
+ JsonPrimitive (" EkQKPAoICICJoL4GEEQSLACNj32odtI8nj2kAjzcujgvttXcYppTFLI5fiVqHzwYWRw0ZhD8wshkbBdwGgIUDBAC8P8HARjt_K_sKQ" )
83
+ )
84
+ put(
85
+ " url" ,
86
+ JsonPrimitive (" https://stockx.com/?utm_source=af&utm_medium=imp&utm_campaign=1310690&impactSiteId=VupTG%3ASM2xyKUReTwuwulVAxUksw710t1yqKR80&clickid=VupTG%3ASM2xyKUReTwuwulVAxUksw710t1yqKR80&utm_term=VupTG%3ASM2xyKUReTwuwulVAxUksw710t1yqKR80&utm_content=1868737_570105&irgwc=1&irclickid=VupTG%3ASM2xyKUReTwuwulVAxUksw710t1yqKR80&ir_campaignid=9060&ir_adid=570105&ir_partnerid=1310690&gad_source=1&referrer=gclid%3DCjwKCAiAiaC-BhBEEiwAjY99qHbSPJ49pAI83Lo4L7bV3GKaUxSyOX4lah88GFkcNGYQ_MLIZGwXcBoCFAwQAvD_BwE&gref=EkQKPAoICICJoL4GEEQSLACNj32odtI8nj2kAjzcujgvttXcYppTFLI5fiVqHzwYWRw0ZhD8wshkbBdwGgIUDBAC8P8HARjt_K_sKQ" )
87
+ )
88
+ }
89
+
90
+ // This should extract all query parameters as properties including a value for the referer property
91
+ val properties = deepLinkUtils.extractLinkProperties(" not used" , Uri .parse(link))
92
+
93
+ assertEquals(expectedProperties, properties)
94
+ }
95
+
96
+ @Test
97
+ fun differentUriTest () {
98
+ var properties = deepLinkUtils.extractLinkProperties(null , Uri .parse(" http://example.com?prop1=foo" ))
99
+ assertEquals(
100
+ buildJsonObject {
101
+ put(" prop1" , JsonPrimitive (" foo" ))
102
+ put(" url" , JsonPrimitive (" http://example.com?prop1=foo" ))
103
+ },
104
+ properties
105
+ )
106
+
107
+ properties = deepLinkUtils.extractLinkProperties(null , Uri .parse(" example.com?prop1=foo" ))
108
+ assertEquals(
109
+ buildJsonObject {
110
+ put(" prop1" , JsonPrimitive (" foo" ))
111
+ put(" url" , JsonPrimitive (" example.com?prop1=foo" ))
112
+ },
113
+ properties
114
+ )
115
+
116
+ // Even though this Uri has a "?prop1=foo" string at the end, it's not a known part of
117
+ // the Uri scheme so we won't be able to use it.
118
+ properties
= deepLinkUtils.extractLinkProperties(
null ,
Uri .parse(
" mailto:[email protected] ?prop1=foo" ))
119
+ assertEquals(
120
+ buildJsonObject {
121
+ put(
" url" ,
JsonPrimitive (
" mailto:[email protected] ?prop1=foo" ))
122
+ },
123
+ properties
124
+ )
125
+ }
126
+ }
0 commit comments