package com.braze.reactbridge
import com.braze.ui.banners.BannerDismissSnapshot
import com.facebook.react.bridge.WritableArray
import org.json.JSONObject
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test
class BannerUtilTest : BrazeRobolectricTestBase() {
@Test
fun whenCalled_mapBanner_addsFieldsAndPropertiesCorrectly() {
val isTestSend = getRandomBoolean()
val isControl = getRandomBoolean()
val banner = createBanner(
trackingId = "track123",
placementId = "place456",
html = "
Banner
",
isTestSend = isTestSend,
expirationTimestampSeconds = 1234567890L,
isControl = isControl,
stableKey = "stable-abc",
properties = JSONObject(mapOf("key" to "value"))
)
val result = mapBanner(banner)
assertEquals("track123", result.getString("trackingId"))
assertEquals("place456", result.getString("placementId"))
assertEquals("stable-abc", result.getString("stableKey"))
assertEquals(isTestSend, result.getBoolean("isTestSend"))
assertEquals(isControl, result.getBoolean("isControl"))
assertEquals("Banner
", result.getString("html"))
assertEquals(1234567890L, result.getLong("expiresAt"))
val kvp = result.getMap("properties")
ktAssertNotNull(kvp)
assertEquals("value", kvp.getString("key"))
}
@Test
fun whenCalled_mapBanners_addsFieldsAndPropertiesCorrectly() {
val isTestSend = getRandomBoolean()
val isControl = getRandomBoolean()
val banner1 = createBanner(
trackingId = "trackA",
placementId = "placeA",
html = "A
",
isTestSend = isTestSend,
expirationTimestampSeconds = 100L,
isControl = isControl,
stableKey = "stable-A",
properties = JSONObject(mapOf("key" to "value"))
)
val banner2 = createBanner(
trackingId = "trackB",
placementId = "placeB",
html = "B
",
isTestSend = isTestSend,
expirationTimestampSeconds = 200L,
isControl = isControl,
stableKey = "stable-B",
properties = JSONObject(mapOf("key" to "value"))
)
val result: WritableArray = mapBanners(listOf(banner1, banner2))
// Verify mapping for first banner
val map1 = result.getMap(0)
ktAssertNotNull(map1)
assertEquals("trackA", map1.getString("trackingId"))
assertEquals("placeA", map1.getString("placementId"))
assertEquals("stable-A", map1.getString("stableKey"))
assertEquals(isTestSend, map1.getBoolean("isTestSend"))
assertEquals(isControl, map1.getBoolean("isControl"))
assertEquals("A
", map1.getString("html"))
assertEquals(100.0, map1.getDouble("expiresAt"), 0.001)
val kvp1 = map1.getMap("properties")
ktAssertNotNull(kvp1)
assertEquals("value", kvp1.getString("key"))
// Verify mapping for second banner
val map2 = result.getMap(1)
ktAssertNotNull(map2)
assertEquals("trackB", map2.getString("trackingId"))
assertEquals("placeB", map2.getString("placementId"))
assertEquals("stable-B", map2.getString("stableKey"))
assertEquals(isTestSend, map2.getBoolean("isTestSend"))
assertEquals(isControl, map2.getBoolean("isControl"))
assertEquals("B
", map2.getString("html"))
assertEquals(200.0, map2.getDouble("expiresAt"), 0.001)
val kvp2 = map2.getMap("properties")
ktAssertNotNull(kvp2)
assertEquals("value", kvp2.getString("key"))
}
@Test
fun whenCalled_mapBannerDismissSnapshot_addsIdentityFieldsCorrectly() {
val snapshot = BannerDismissSnapshot(
placementId = "place456",
stableKey = "stable-abc",
trackingId = "track123"
)
val result = mapBannerDismissSnapshot(snapshot)
assertEquals("place456", result.getString("placementId"))
assertEquals("stable-abc", result.getString("stableKey"))
assertEquals("track123", result.getString("trackingId"))
assertTrue(canDispatchBannerDismissSnapshot(snapshot))
}
@Test
fun whenCalled_canDispatchBannerDismissSnapshotWithMissingIdentityField_returnsFalse() {
val missingPlacement = BannerDismissSnapshot(
placementId = "",
stableKey = "stable-abc",
trackingId = "track123"
)
val missingStableKey = BannerDismissSnapshot(
placementId = "place456",
stableKey = "",
trackingId = "track123"
)
val missingTrackingId = BannerDismissSnapshot(
placementId = "place456",
stableKey = "stable-abc",
trackingId = ""
)
assertFalse(canDispatchBannerDismissSnapshot(missingPlacement))
assertFalse(canDispatchBannerDismissSnapshot(missingStableKey))
assertFalse(canDispatchBannerDismissSnapshot(missingTrackingId))
}
@Test
fun whenCalled_canDispatchBannerDismissSnapshotWithBlankIdentityField_returnsFalse() {
val blankPlacement = BannerDismissSnapshot(
placementId = " ",
stableKey = "stable-abc",
trackingId = "track123"
)
val blankStableKey = BannerDismissSnapshot(
placementId = "place456",
stableKey = "\t",
trackingId = "track123"
)
val blankTrackingId = BannerDismissSnapshot(
placementId = "place456",
stableKey = "stable-abc",
trackingId = " \n "
)
assertFalse(canDispatchBannerDismissSnapshot(blankPlacement))
assertFalse(canDispatchBannerDismissSnapshot(blankStableKey))
assertFalse(canDispatchBannerDismissSnapshot(blankTrackingId))
}
@Test
fun whenCalled_mapBannerDismissSnapshot_usesPlacementIdKeyExpectedByJavaScript() {
val snapshot = BannerDismissSnapshot(
placementId = "place456",
stableKey = "stable-abc",
trackingId = "track123"
)
val result = mapBannerDismissSnapshot(snapshot)
assertTrue(result.hasKey("placementId"))
assertFalse(result.hasKey("placementID"))
}
@Test
fun whenCalled_getExportedCustomBubblingEventTypeConstants_includesOnBannerDismissEvent() {
val constants = BrazeBannerManagerImpl.getExportedCustomBubblingEventTypeConstants()
ktAssertNotNull(constants)
assertTrue(constants.containsKey(BrazeBannerManagerImpl.EVENT_ON_DISMISS))
val dismissConfig = constants[BrazeBannerManagerImpl.EVENT_ON_DISMISS] as Map<*, *>
val registrationNames = dismissConfig["phasedRegistrationNames"] as Map<*, *>
assertEquals(BrazeBannerManagerImpl.EVENT_ON_DISMISS, registrationNames["bubbled"])
assertEquals(BrazeBannerManagerImpl.EVENT_ON_DISMISS, registrationNames["captured"])
}
}