11package com.segment.analytics.kotlin.destinations.adjust
22
3+ import android.app.Activity
4+ import android.app.Application
5+ import android.content.Context
6+ import android.os.Build
7+ import com.adjust.sdk.Adjust
8+ import com.adjust.sdk.AdjustAttribution
9+ import com.adjust.sdk.AdjustInstance
10+ import com.segment.analytics.kotlin.core.*
11+ import com.segment.analytics.kotlin.core.platform.Plugin
12+ import com.segment.analytics.kotlin.core.utilities.LenientJson
13+ import com.segment.analytics.kotlin.core.utilities.getString
14+ import io.mockk.*
15+ import io.mockk.impl.annotations.MockK
16+ import kotlinx.serialization.decodeFromString
17+ import kotlinx.serialization.json.buildJsonObject
18+ import kotlinx.serialization.json.put
19+ import org.junit.Before
20+ import org.junit.Test
21+ import org.junit.jupiter.api.Assertions.*
22+ import org.junit.runner.RunWith
23+ import org.robolectric.RobolectricTestRunner
24+ import org.robolectric.annotation.Config
25+
26+ @RunWith(RobolectricTestRunner ::class )
27+ @Config(sdk = [Build .VERSION_CODES .O_MR1 ])
328class AdjustDestinationTests {
29+ @MockK
30+ lateinit var mockApplication: Application
31+
32+ @MockK
33+ lateinit var mockedContext: Context
34+
35+ @MockK(relaxUnitFun = true )
36+ lateinit var mockedAnalytics: Analytics
37+
38+ @MockK(relaxUnitFun = true )
39+ lateinit var mockedAdjustInstance: AdjustInstance
40+
41+ private lateinit var adjustDestination: AdjustDestination
42+
43+ private val sampleAdjustSettings: Settings = LenientJson .decodeFromString(
44+ """
45+ {
46+ "integrations": {
47+ "Adjust": {
48+ "appToken": "xyz1234",
49+ "setEnvironmentProduction": true,
50+ "setEventBufferingEnabled": true,
51+ "trackAttributionData": true,
52+ "customEvents": {
53+ "foo": "bar"
54+ }
55+ }
56+ }
57+ }
58+ """ .trimIndent()
59+ )
60+
61+ init {
62+ MockKAnnotations .init (this )
63+ }
64+
65+ @Before
66+ fun setUp () {
67+ mockkStatic(Adjust ::class )
68+ every { Adjust .getDefaultInstance() } answers { mockedAdjustInstance }
69+ adjustDestination = AdjustDestination ()
70+ every { mockedAnalytics.configuration.application } returns mockApplication
71+ every { mockApplication.applicationContext } returns mockedContext
72+ mockedAnalytics.configuration.application = mockedContext
73+
74+ adjustDestination.analytics = mockedAnalytics
75+
76+ mockkStatic(Adjust ::class )
77+ }
78+
79+
80+ @Test
81+ fun `settings are updated correctly` () {
82+ // An adjust example settings
83+ val adjustSettings: Settings = sampleAdjustSettings
84+
85+ adjustDestination.update(adjustSettings, Plugin .UpdateType .Initial )
86+
87+ /* assertions Adjust config */
88+ assertNotNull(adjustDestination.settings)
89+ with (adjustDestination.settings!! ) {
90+ assertTrue(adjustDestination.settings!! .setEnvironmentProduction)
91+ assertTrue(adjustDestination.settings!! .setEventBufferingEnabled)
92+ assertTrue(adjustDestination.settings!! .trackAttributionData)
93+ assertEquals(adjustDestination.settings!! .appToken, " xyz1234" )
94+ assertNotNull(adjustDestination.settings!! .customEvents)
95+ }
96+ }
97+
98+ @Test
99+ fun `identify is handled correctly` () {
100+ val sampleIdentifyEvent = IdentifyEvent (
101+ userId = " adjust-UserID-123" ,
102+ traits = buildJsonObject {
103+ put(" email" , " adjustUserID@abc.com" )
104+ put(" firstName" , " adjust" )
105+ put(" lastName" , " user" )
106+ }
107+ ).apply {
108+ messageId = " abc-message-1234"
109+ anonymousId = " adjust-anonId-123"
110+ integrations = emptyJsonObject
111+ context = emptyJsonObject
112+ timestamp = " 2022-11-22T11:16:09"
113+ }
114+
115+ val identifyEvent = adjustDestination.identify(sampleIdentifyEvent)
116+ assertNotNull(identifyEvent)
117+
118+ with (identifyEvent as IdentifyEvent ) {
119+ assertEquals(" adjust-UserID-123" , userId)
120+ with (traits) {
121+ assertEquals(" adjust" , getString(" firstName" ))
122+ assertEquals(" user" , getString(" lastName" ))
123+ assertEquals(" adjustUserID@abc.com" , getString(" email" ))
124+ }
125+ }
126+ }
127+
128+ @Test
129+ fun `identify is handled correctly with userId` () {
130+ val sampleIdentifyEvent = IdentifyEvent (
131+ userId = " adjust-UserID-123" ,
132+ traits = buildJsonObject {
133+ put(" email" , " adjustUserID@abc.com" )
134+ put(" firstName" , " adjust" )
135+ put(" lastName" , " user" )
136+ }
137+ ).apply {
138+ messageId = " abc-message-1234"
139+ anonymousId = " adjust-anonId-123"
140+ integrations = emptyJsonObject
141+ context = emptyJsonObject
142+ timestamp = " 2022-11-22T11:16:09"
143+ }
144+ val identifyEvent = adjustDestination.identify(sampleIdentifyEvent)
145+ assertNotNull(identifyEvent)
146+ verify { mockedAdjustInstance.addSessionPartnerParameter(" userId" , " adjust-UserID-123" ) }
147+ }
148+
149+ @Test
150+ fun `identify is handled correctly with anonymousId` () {
151+ val sampleIdentifyEvent = IdentifyEvent (
152+ userId = " adjust-UserID-123" ,
153+ traits = buildJsonObject {
154+ put(" email" , " adjustUserID@abc.com" )
155+ put(" firstName" , " adjust" )
156+ put(" lastName" , " user" )
157+ }
158+ ).apply {
159+ messageId = " abc-message-1234"
160+ anonymousId = " adjust-anonId-123"
161+ integrations = emptyJsonObject
162+ context = emptyJsonObject
163+ timestamp = " 2022-11-22T11:16:09"
164+ }
165+
166+ val identifyEvent = adjustDestination.identify(sampleIdentifyEvent)
167+ assertNotNull(identifyEvent)
168+ verify {
169+ mockedAdjustInstance.addSessionPartnerParameter(
170+ " anonymousId" ,
171+ " adjust-anonId-123"
172+ )
173+ }
174+ }
175+
176+ @Test
177+ fun `reset is handled correctly` () {
178+ adjustDestination.reset()
179+ verify { mockedAdjustInstance.resetSessionPartnerParameters() }
180+ }
181+
182+ @Test
183+ fun `track is handled correctly` () {
184+ adjustDestination.update(sampleAdjustSettings, Plugin .UpdateType .Initial )
185+
186+ val sampleTrackEvent = TrackEvent (
187+ event = " foo" ,
188+ properties = buildJsonObject {
189+ put(" revenue" , 200.0f )
190+ put(" currency" , " USD" )
191+ }
192+ ).apply {
193+ messageId = " abc-message-1234"
194+ anonymousId = " adjust-anonId-123"
195+ integrations = emptyJsonObject
196+ context = emptyJsonObject
197+ timestamp = " 2022-11-22T11:16:09"
198+ }
199+ val trackEvent = adjustDestination.track(sampleTrackEvent)
200+ assertNotNull(trackEvent)
201+ // verify { mockedAdjustInstance.trackEvent(AdjustEvent("foo")) }
202+ }
203+
204+ @Test
205+ fun `trackAttribution data sent correctly to analytics` () {
206+ val segmentAttributionChangedListener = AdjustDestination .AdjustSegmentAttributionChangedListener (mockedAnalytics)
207+ val attributionData = AdjustAttribution ().apply {
208+ network = " Adjust Network"
209+ campaign = " Adjust Campaign Name"
210+ clickLabel = " Adjust Click Label"
211+ creative = " Adjust creative"
212+ adgroup = " Adjust Ad group"
213+ trackerToken = " foo"
214+ trackerName = " bar"
215+ }
216+ segmentAttributionChangedListener.onAttributionChanged(attributionData)
217+ verify { mockedAnalytics.track(" Install Attributed" , buildJsonObject {
218+ put(" provider" , " Adjust" )
219+ put(" trackerToken" , " foo" )
220+ put(" trackerName" , " bar" )
221+ put(" campaign" , buildJsonObject {
222+ put(" source" , " Adjust Network" )
223+ put(" name" , " Adjust Campaign Name" )
224+ put(" content" , " Adjust Click Label" )
225+ put(" adCreative" , " Adjust creative" )
226+ put(" adGroup" , " Adjust Ad group" )
227+ })
228+ }) }
229+ }
230+
231+ @Test
232+ fun `onActivityResumed() handled correctly` () {
233+ adjustDestination.onActivityResumed(mockkClass(Activity ::class ))
234+ verify { mockedAdjustInstance.onResume() }
235+ }
236+
237+ @Test
238+ fun `onActivityPaused() handled correctly` () {
239+ adjustDestination.onActivityPaused(mockkClass(Activity ::class ))
240+ verify { mockedAdjustInstance.onPause() }
241+ }
4242}
0 commit comments