package com.amplitude.pluginengagementreactnative import com.facebook.react.bridge.JavaOnlyMap import org.junit.Assert.assertEquals import org.junit.Assert.assertNull import org.junit.Test class EventMappingTest { /** A payload carrying only the one field `readableMapToBaseEvent` requires. */ private fun eventMap(build: JavaOnlyMap.() -> Unit = {}): JavaOnlyMap = JavaOnlyMap().apply { putString("event_type", "Button Clicked") build() } @Test fun `reads event_id when present`() { val baseEvent = readableMapToBaseEvent(eventMap { putDouble("event_id", 42.0) }) assertEquals(42L, baseEvent?.eventId) } // GSM-1258: events forwarded from the JS plugin have not been through the analytics // pipeline yet, so they carry no event_id. Reading it unguarded threw NoSuchKeyException // and took down forwardEvent for every event the host app tracked. @Test fun `leaves event_id null when the key is absent`() { val baseEvent = readableMapToBaseEvent(eventMap()) assertNull(baseEvent?.eventId) } @Test fun `leaves event_id null when the value is null`() { val baseEvent = readableMapToBaseEvent(eventMap { putNull("event_id") }) assertNull(baseEvent?.eventId) } @Test fun `returns null when event_type is missing`() { val baseEvent = readableMapToBaseEvent(JavaOnlyMap().apply { putDouble("event_id", 42.0) }) assertNull(baseEvent) } @Test fun `maps the remaining fields`() { val baseEvent = readableMapToBaseEvent( eventMap { putString("platform", "android") putString("os_name", "Android") putString("os_version", "15") putMap("event_properties", JavaOnlyMap().apply { putString("label", "checkout") }) putMap("user_properties", JavaOnlyMap().apply { putString("plan", "pro") }) putMap("groups", JavaOnlyMap().apply { putString("org", "amplitude") }) putMap("group_properties", JavaOnlyMap().apply { putString("tier", "enterprise") }) }, ) assertEquals("Button Clicked", baseEvent?.eventType) assertEquals("android", baseEvent?.platform) assertEquals("Android", baseEvent?.osName) assertEquals("15", baseEvent?.osVersion) assertEquals(mapOf("label" to "checkout"), baseEvent?.eventProperties) assertEquals(mapOf("plan" to "pro"), baseEvent?.userProperties) assertEquals(mapOf("org" to "amplitude"), baseEvent?.groups) assertEquals(mapOf("tier" to "enterprise"), baseEvent?.groupProperties) } /** Like `event_id`, every other field is optional and must not throw when absent. */ @Test fun `tolerates the absence of every optional field`() { val baseEvent = readableMapToBaseEvent(eventMap()) assertEquals("Button Clicked", baseEvent?.eventType) assertNull(baseEvent?.platform) assertNull(baseEvent?.osName) assertNull(baseEvent?.osVersion) assertNull(baseEvent?.eventProperties) assertNull(baseEvent?.userProperties) assertNull(baseEvent?.groups) assertNull(baseEvent?.groupProperties) } }