package com.contentsquare.rn.csq import com.contentsquare.api.model.Metadata import com.contentsquare.rn.csq.utils.MetadataConverter import com.contentsquare.rn.eventEmitter.CSEventEmitterModuleImpl import com.contentsquare.rn.utils.ReactNativeUiThreadUtil import com.facebook.react.bridge.WritableMap import io.mockk.every import io.mockk.mockk import io.mockk.mockkObject 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 CSQMetadataTest { private val mockReactNativeUiThreadUtil: ReactNativeUiThreadUtil = mockk() private val mockCSEventEmitterModuleImpl: CSEventEmitterModuleImpl = mockk(relaxed = true) private lateinit var underTest: CSQMetadata @Before fun setup() { val slot = slot() every { mockReactNativeUiThreadUtil.runOnUiThread(capture(slot)) } answers { slot.captured.run() Unit } underTest = CSQMetadata(mockReactNativeUiThreadUtil, mockCSEventEmitterModuleImpl) } @After fun tearDown() { unmockkAll() } @Test fun `setOnMetadataChange should run on UI thread`() { // When underTest.setOnMetadataChange() // Then verify { mockReactNativeUiThreadUtil.runOnUiThread(any()) } } @Test fun `metadata callback should convert metadata and send to event emitter`() { // Given mockkObject(MetadataConverter) val mockMetadata = mockk() val mockWritableMap = mockk() every { MetadataConverter.convertCSQMetadataToMap(mockMetadata) } returns mockWritableMap // When - Simulate the callback execution directly val metadataMap = MetadataConverter.convertCSQMetadataToMap(mockMetadata) mockCSEventEmitterModuleImpl.sendMetadataChange(metadataMap) // Then verify { MetadataConverter.convertCSQMetadataToMap(mockMetadata) } verify { mockCSEventEmitterModuleImpl.sendMetadataChange(mockWritableMap) } } }