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"]) } }