package com.contentsquare.rn import androidx.test.ext.junit.runners.AndroidJUnit4 import com.contentsquare.android.Contentsquare import com.contentsquare.rn.eventEmitter.CSEventEmitterModuleImpl import com.contentsquare.rn.utils.ReactNativeUiThreadUtil import com.contentsquare.rn.utils.ReactNativeViewFinder import com.contentsquare.rn.webview.WebViewInjector import com.facebook.react.bridge.ReactApplicationContext import io.mockk.clearAllMocks import io.mockk.clearMocks import io.mockk.every import io.mockk.just import io.mockk.mockk import io.mockk.mockkStatic import io.mockk.runs import io.mockk.slot import io.mockk.verify import org.junit.After import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.robolectric.annotation.Config /* TODO: Add tests to test for other User related methods */ @RunWith(AndroidJUnit4::class) @Config(manifest = Config.NONE) class UserTest { // mocks private val mockReactApplicationContext = mockk() private val mockWebViewInjector = mockk() private val mockCSEventEmitter = mockk() private val mockReactNativeUiThreadUtil = mockk() private val mockReactNativeViewFinder = mockk() private lateinit var module: ContentsquareModule @Before fun setUp() { // Set up ReactNativeUiThreadUtil mock before creating the module val runnableSlot = slot() every { mockReactNativeUiThreadUtil.runOnUiThread(capture(runnableSlot)) } answers { runnableSlot.captured.run() } module = ContentsquareModule( mockReactApplicationContext, mockWebViewInjector, mockCSEventEmitter, mockReactNativeUiThreadUtil, mockReactNativeViewFinder ) mockkStatic(Contentsquare::class) } @After fun tearDown() { clearAllMocks() } @Test fun `When calling sendUserIdentifier calls SDK method sendUserIdentifier`() { // Clear previous calls from setup clearMocks(mockReactNativeUiThreadUtil, answers = false) val runnableSlot = slot() every { mockReactNativeUiThreadUtil.runOnUiThread(capture(runnableSlot)) } answers { runnableSlot.captured.run() } // Arrange val slot = slot() every { Contentsquare.sendUserIdentifier(capture(slot)) } just runs // Act module.sendUserIdentifier("any_identifier") verify(exactly = 1) { mockReactNativeUiThreadUtil.runOnUiThread(withArg { assertTrue(it is Runnable) // Assert verify { Contentsquare.sendUserIdentifier(capture(slot)) } }) } } }