11package com.klaviyo.pushFcm
22
33import android.content.Intent
4+ import android.net.Uri
45import com.google.firebase.messaging.RemoteMessage
56import com.klaviyo.fixtures.BaseTest
67import com.klaviyo.pushFcm.KlaviyoNotification.Companion.ACTION_BUTTONS_KEY
@@ -22,9 +23,23 @@ import io.mockk.unmockkStatic
2223import io.mockk.verify
2324import org.json.JSONArray
2425import org.json.JSONObject
26+ import org.junit.After
27+ import org.junit.Before
2528import org.junit.Test
2629
2730class KlaviyoRemoteMessageTest : BaseTest () {
31+ @Before
32+ override fun setup () {
33+ super .setup()
34+ mockkStatic(Uri ::class )
35+ }
36+
37+ @After
38+ override fun cleanup () {
39+ unmockkStatic(Uri ::class )
40+ super .cleanup()
41+ }
42+
2843 private val stubKeyValuePairs = mapOf (
2944 " test_key_1" to " test_value_1" ,
3045 " test_key_2" to " test_value_2" ,
@@ -527,10 +542,9 @@ class KlaviyoRemoteMessageTest : BaseTest() {
527542
528543 @Test
529544 fun `webUrl returns Uri when web_url is an https URL` () {
530- val mockUri = mockk< android.net. Uri > (relaxed = true )
545+ val mockUri = mockk<Uri >(relaxed = true )
531546 every { mockUri.scheme } returns " https"
532- mockkStatic(android.net.Uri ::class )
533- every { android.net.Uri .parse(" https://example.com" ) } returns mockUri
547+ every { Uri .parse(" https://example.com" ) } returns mockUri
534548
535549 val msg = mockk<RemoteMessage >()
536550 every { msg.data } returns stubMessage.toMutableMap().apply {
@@ -539,26 +553,21 @@ class KlaviyoRemoteMessageTest : BaseTest() {
539553
540554 val webUrl = msg.webUrl
541555 assert (webUrl != null )
542- verify { android.net.Uri .parse(" https://example.com" ) }
543-
544- unmockkStatic(android.net.Uri ::class )
556+ verify { Uri .parse(" https://example.com" ) }
545557 }
546558
547559 @Test
548560 fun `webUrl returns Uri when web_url is an http URL` () {
549- val mockUri = mockk< android.net. Uri > (relaxed = true )
561+ val mockUri = mockk<Uri >(relaxed = true )
550562 every { mockUri.scheme } returns " http"
551- mockkStatic(android.net.Uri ::class )
552- every { android.net.Uri .parse(" http://example.com" ) } returns mockUri
563+ every { Uri .parse(" http://example.com" ) } returns mockUri
553564
554565 val msg = mockk<RemoteMessage >()
555566 every { msg.data } returns stubMessage.toMutableMap().apply {
556567 put(KlaviyoNotification .WEB_URL_KEY , " http://example.com" )
557568 }
558569
559570 assert (msg.webUrl != null )
560-
561- unmockkStatic(android.net.Uri ::class )
562571 }
563572
564573 @Test
@@ -581,25 +590,20 @@ class KlaviyoRemoteMessageTest : BaseTest() {
581590
582591 @Test
583592 fun `webUrl returns null when web_url has a blocked scheme` () {
584- val mockUri = mockk< android.net. Uri > (relaxed = true )
593+ val mockUri = mockk<Uri >(relaxed = true )
585594 every { mockUri.scheme } returns " javascript"
586- mockkStatic(android.net.Uri ::class )
587- every { android.net.Uri .parse(" javascript:alert(1)" ) } returns mockUri
595+ every { Uri .parse(" javascript:alert(1)" ) } returns mockUri
588596
589597 val msg = mockk<RemoteMessage >()
590598 every { msg.data } returns stubMessage.toMutableMap().apply {
591599 put(KlaviyoNotification .WEB_URL_KEY , " javascript:alert(1)" )
592600 }
593601
594602 assert (msg.webUrl == null )
595-
596- unmockkStatic(android.net.Uri ::class )
597603 }
598604
599605 @Test
600606 fun `webUrl returns url when web_url has an allowlisted communication scheme` () {
601- mockkStatic(android.net.Uri ::class )
602-
603607 val schemes = listOf (
604608 " mailto" to " mailto:user@example.com" ,
605609 " tel" to " tel:+15555550100" ,
@@ -608,9 +612,9 @@ class KlaviyoRemoteMessageTest : BaseTest() {
608612 )
609613
610614 for ((scheme, url) in schemes) {
611- val mockUri = mockk< android.net. Uri > (relaxed = true )
615+ val mockUri = mockk<Uri >(relaxed = true )
612616 every { mockUri.scheme } returns scheme
613- every { android.net. Uri .parse(url) } returns mockUri
617+ every { Uri .parse(url) } returns mockUri
614618
615619 val msg = mockk<RemoteMessage >()
616620 every { msg.data } returns stubMessage.toMutableMap().apply {
@@ -621,16 +625,13 @@ class KlaviyoRemoteMessageTest : BaseTest() {
621625 " Expected webUrl to return '$url ' for scheme $scheme "
622626 }
623627 }
624-
625- unmockkStatic(android.net.Uri ::class )
626628 }
627629
628630 @Test
629631 fun `webUrl returns parsed URL even when url field is also present` () {
630- val mockUri = mockk< android.net. Uri > (relaxed = true )
632+ val mockUri = mockk<Uri >(relaxed = true )
631633 every { mockUri.scheme } returns " https"
632- mockkStatic(android.net.Uri ::class )
633- every { android.net.Uri .parse(" https://example.com" ) } returns mockUri
634+ every { Uri .parse(" https://example.com" ) } returns mockUri
634635
635636 val msg = mockk<RemoteMessage >()
636637 every { msg.data } returns stubMessage.toMutableMap().apply {
@@ -639,16 +640,13 @@ class KlaviyoRemoteMessageTest : BaseTest() {
639640 }
640641
641642 assert (msg.webUrl != null )
642-
643- unmockkStatic(android.net.Uri ::class )
644643 }
645644
646645 @Test
647646 fun `actionButtons parses open_url variant with url` () {
648- val mockUri = mockk< android.net. Uri > (relaxed = true )
647+ val mockUri = mockk<Uri >(relaxed = true )
649648 every { mockUri.scheme } returns " https"
650- mockkStatic(android.net.Uri ::class )
651- every { android.net.Uri .parse(" https://example.com" ) } returns mockUri
649+ every { Uri .parse(" https://example.com" ) } returns mockUri
652650
653651 val actionButtonsData = listOf (
654652 mapOf (
@@ -674,16 +672,13 @@ class KlaviyoRemoteMessageTest : BaseTest() {
674672 assert (button?.id == " open.url" )
675673 assert (button?.label == " Open Website" )
676674 assert ((button as ? ActionButton .OpenUrl )?.url == " https://example.com" )
677-
678- unmockkStatic(android.net.Uri ::class )
679675 }
680676
681677 @Test
682678 fun `actionButtons skips open_url with blocked scheme` () {
683- val mockUri = mockk< android.net. Uri > (relaxed = true )
679+ val mockUri = mockk<Uri >(relaxed = true )
684680 every { mockUri.scheme } returns " intent"
685- mockkStatic(android.net.Uri ::class )
686- every { android.net.Uri .parse(" intent://evil" ) } returns mockUri
681+ every { Uri .parse(" intent://evil" ) } returns mockUri
687682
688683 val actionButtonsData = listOf (
689684 mapOf (
@@ -701,14 +696,10 @@ class KlaviyoRemoteMessageTest : BaseTest() {
701696 every { msg.data } returns messageWithActions
702697
703698 assert (msg.actionButtons == null )
704-
705- unmockkStatic(android.net.Uri ::class )
706699 }
707700
708701 @Test
709702 fun `actionButtons accepts open_url with allowlisted communication schemes` () {
710- mockkStatic(android.net.Uri ::class )
711-
712703 val schemes = listOf (
713704 " mailto" to " mailto:user@example.com" ,
714705 " tel" to " tel:+15555550100" ,
@@ -717,9 +708,9 @@ class KlaviyoRemoteMessageTest : BaseTest() {
717708 )
718709
719710 for ((scheme, url) in schemes) {
720- val mockUri = mockk< android.net. Uri > (relaxed = true )
711+ val mockUri = mockk<Uri >(relaxed = true )
721712 every { mockUri.scheme } returns scheme
722- every { android.net. Uri .parse(url) } returns mockUri
713+ every { Uri .parse(url) } returns mockUri
723714
724715 val actionButtonsData = listOf (
725716 mapOf (
@@ -746,8 +737,6 @@ class KlaviyoRemoteMessageTest : BaseTest() {
746737 " Expected url $url for scheme $scheme "
747738 }
748739 }
749-
750- unmockkStatic(android.net.Uri ::class )
751740 }
752741
753742 @Test
0 commit comments