Skip to content

Commit

Permalink
Merge branch 'master' into SUITEDEV-35599-MultiID-for-predict
Browse files Browse the repository at this point in the history
  • Loading branch information
megamegax committed Oct 16, 2024
2 parents 7e7bb4c + 3b6daa5 commit eabe4b3
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 18 deletions.
3 changes: 2 additions & 1 deletion changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@

### [Emarsys SDK](https://github.com/emartech/android-emarsys-sdk

* Fix an issue when encrypting nullable Strings
* Fix automatic contact setting during SDK initialization
* Fix activity lifecycle tracking to track app:start event
Original file line number Diff line number Diff line change
@@ -1,41 +1,97 @@
package com.emarsys.core.activity

import android.app.Activity
import com.emarsys.getCurrentActivity
import com.emarsys.testUtil.AnnotationSpec
import org.mockito.kotlin.mock
import org.mockito.kotlin.verify
import io.mockk.coEvery
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkStatic
import io.mockk.unmockkAll
import io.mockk.verify
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.resetMain
import kotlinx.coroutines.test.runTest
import kotlinx.coroutines.test.setMain
import java.util.concurrent.CountDownLatch

@OptIn(ExperimentalCoroutinesApi::class)
class ActivityLifecycleWatchdogTest : AnnotationSpec() {
private lateinit var watchdog: ActivityLifecycleWatchdog
private lateinit var mockRegistry: ActivityLifecycleActionRegistry
private lateinit var mockActivity: Activity


@Before
fun setUp() {
mockRegistry = mock()
mockActivity = mock()
Dispatchers.setMain(StandardTestDispatcher())
mockkStatic("com.emarsys.EmarsysSdkInitializerKt")
mockRegistry = mockk(relaxed = true)
mockActivity = mockk(relaxed = true)

watchdog = ActivityLifecycleWatchdog(mockRegistry)
}

@After
fun tearDown() {
unmockkAll()
Dispatchers.resetMain()
}

@Test
fun testOnCreate_shouldInvokeRegistry_withCreateLifecycle() {
watchdog.onActivityCreated(mockActivity, null)

verify(mockRegistry).execute(
mockActivity,
listOf(ActivityLifecycleAction.ActivityLifecycle.CREATE)
)
verify {
mockRegistry.execute(
mockActivity,
listOf(ActivityLifecycleAction.ActivityLifecycle.CREATE)
)
}
}

@Test
fun testOnResume_shouldInvokeRegistry_withResumeLifecycle() {
watchdog.onActivityResumed(mockActivity)

verify(mockRegistry).execute(
mockActivity,
listOf(ActivityLifecycleAction.ActivityLifecycle.RESUME)
)
verify {
mockRegistry.execute(
mockActivity,
listOf(ActivityLifecycleAction.ActivityLifecycle.RESUME)
)
}
}

@Test
fun testInit_shouldInvokeRegistry_withCreateAndResumeLifecycle() = runTest {
val latch = CountDownLatch(2)
coEvery { getCurrentActivity() } returns mockActivity
every { mockRegistry.execute(any(), any()) } answers {
latch.countDown()
nothing
}

ActivityLifecycleWatchdog(mockRegistry)

latch.await()

verify(exactly = 1) {
mockRegistry.execute(
mockActivity,
listOf(
ActivityLifecycleAction.ActivityLifecycle.CREATE
)
)
}

verify(exactly = 1) {
mockRegistry.execute(
mockActivity,
listOf(
ActivityLifecycleAction.ActivityLifecycle.RESUME
)
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,24 @@ import android.app.Application.ActivityLifecycleCallbacks
import android.os.Bundle
import com.emarsys.core.Mockable
import com.emarsys.core.activity.ActivityLifecycleAction.ActivityLifecycle
import com.emarsys.getCurrentActivity
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch

@Mockable
class ActivityLifecycleWatchdog(
val activityLifecycleActionRegistry: ActivityLifecycleActionRegistry
) : ActivityLifecycleCallbacks {

init {
CoroutineScope(Dispatchers.Default + SupervisorJob()).launch {
onActivityCreated(getCurrentActivity(), null)
onActivityResumed(getCurrentActivity())
}
}

override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
activityLifecycleActionRegistry.execute(activity, listOf(ActivityLifecycle.CREATE))
}
Expand Down
6 changes: 3 additions & 3 deletions emarsys-sdk/src/androidTest/java/com/emarsys/EmarsysTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -589,7 +589,7 @@ class EmarsysTest : AnnotationSpec() {
}

@Test
fun testSetup_sendAnonymousContact() {
fun testSetup_shouldSetAnonymousContact_withClearContactCall() {
every { mockContactTokenStorage.get() } returns null
every { mockRequestContext.hasContactIdentification() } returns false
every { mockClientStateStorage.get() } returns null
Expand All @@ -598,7 +598,7 @@ class EmarsysTest : AnnotationSpec() {
setup(mobileEngageConfig)

runBlockingOnCoreSdkThread()
verify { mockMobileEngageApi.setContact(null, null, null) }
verify { mockMobileEngageApi.clearContact(null) }
}

@Test
Expand All @@ -615,7 +615,7 @@ class EmarsysTest : AnnotationSpec() {

verifyOrder {
mockClientServiceApi.trackDeviceInfo(null)
mockMobileEngageApi.setContact(null, null, null)
mockMobileEngageApi.clearContact(null)
}
confirmVerified(mockMobileEngageApi, mockClientServiceApi)
}
Expand Down
2 changes: 1 addition & 1 deletion emarsys-sdk/src/main/java/com/emarsys/Emarsys.kt
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@ object Emarsys {
}
EmarsysDependencyInjection.mobileEngageApi()
.proxyWithLogExceptions()
.setContact()
.clearContact(null)
}
}

Expand Down

0 comments on commit eabe4b3

Please sign in to comment.