package com.contentsquare.rn.csq import com.contentsquare.CSQ import com.contentsquare.rn.utils.ReactNativeUiThreadUtil import io.mockk.every import io.mockk.mockk import io.mockk.mockkStatic import io.mockk.slot import io.mockk.unmockkAll import io.mockk.verify import org.junit.After import org.junit.Before import org.junit.Test class CSQMaskingTest { private val mockReactNativeUiThreadUtil: ReactNativeUiThreadUtil = mockk() private lateinit var underTest: CSQMasking @Before fun setup() { mockkStatic(CSQ::class) val slot = slot() every { mockReactNativeUiThreadUtil.runOnUiThread(capture(slot)) } answers { slot.captured.run() Unit } underTest = CSQMasking(mockReactNativeUiThreadUtil) } @After fun tearDown() { unmockkAll() } private fun verifySetDefaultMasking(isMasked: Boolean) { // Given every { CSQ.setDefaultMasking(any()) } returns Unit // When underTest.setDefaultMasking(isMasked) // Then verify(exactly = 1) { CSQ.setDefaultMasking(isMasked) } verify(exactly = 1) { mockReactNativeUiThreadUtil.runOnUiThread(any()) } } @Test fun `setDefaultMasking should execute CSQ setDefaultMasking with masking true on UI thread`() { verifySetDefaultMasking(true) } @Test fun `setDefaultMasking should execute CSQ setDefaultMasking with masking false on UI thread`() { verifySetDefaultMasking(false) } @Test fun `mask should execute CSQ mask with view type on UI thread`() { // Given every { CSQ.mask(any>()) } returns Unit val testClass = String::class.java // When underTest.mask(testClass) // Then verify(exactly = 1) { CSQ.mask(testClass) } verify(exactly = 1) { mockReactNativeUiThreadUtil.runOnUiThread(any()) } } @Test fun `unmask should execute CSQ unmask with view type on UI thread`() { // Given every { CSQ.unmask(any>()) } returns Unit val testClass = String::class.java // When underTest.unmask(testClass) // Then verify(exactly = 1) { CSQ.unmask(testClass) } verify(exactly = 1) { mockReactNativeUiThreadUtil.runOnUiThread(any()) } } }