@@ -9,6 +9,7 @@ import com.duckduckgo.js.messaging.api.JsRequestResponse
9
9
import com.duckduckgo.subscriptions.api.SubscriptionStatus.AUTO_RENEWABLE
10
10
import com.duckduckgo.subscriptions.impl.AccessTokenResult
11
11
import com.duckduckgo.subscriptions.impl.AuthTokenResult
12
+ import com.duckduckgo.subscriptions.impl.PrivacyProFeature
12
13
import com.duckduckgo.subscriptions.impl.SubscriptionsChecker
13
14
import com.duckduckgo.subscriptions.impl.SubscriptionsManager
14
15
import com.duckduckgo.subscriptions.impl.pixels.SubscriptionPixelSender
@@ -40,13 +41,15 @@ class SubscriptionMessagingInterfaceTest {
40
41
private val subscriptionsManager: SubscriptionsManager = mock()
41
42
private val pixelSender: SubscriptionPixelSender = mock()
42
43
private val subscriptionsChecker: SubscriptionsChecker = mock()
44
+ private val privacyProFeature: PrivacyProFeature = mock()
43
45
private val messagingInterface = SubscriptionMessagingInterface (
44
46
subscriptionsManager,
45
47
jsMessageHelper,
46
48
coroutineRule.testDispatcherProvider,
47
49
coroutineRule.testScope,
48
50
pixelSender,
49
51
subscriptionsChecker,
52
+ privacyProFeature,
50
53
)
51
54
52
55
private val callback = object : JsMessageCallback () {
@@ -714,6 +717,158 @@ class SubscriptionMessagingInterfaceTest {
714
717
verify(subscriptionsManager, never()).refreshAccessToken()
715
718
}
716
719
720
+ @Test
721
+ fun `when process and get auth access token then return response` () = runTest {
722
+ givenInterfaceIsRegistered()
723
+ givenAccessTokenIsSuccess()
724
+
725
+ val expected = JsRequestResponse .Success (
726
+ context = " subscriptionPages" ,
727
+ featureName = " useSubscription" ,
728
+ method = " getAuthAccessToken" ,
729
+ id = " myId" ,
730
+ result = JSONObject (""" {"accessToken":"accessToken"}""" ),
731
+ )
732
+
733
+ val message = """
734
+ {"context":"subscriptionPages","featureName":"useSubscription","method":"getAuthAccessToken","id":"myId","params":{}}
735
+ """ .trimIndent()
736
+
737
+ messagingInterface.process(message, " duckduckgo-android-messaging-secret" )
738
+
739
+ val captor = argumentCaptor<JsRequestResponse >()
740
+ verify(jsMessageHelper).sendJsResponse(captor.capture(), eq(CALLBACK_NAME ), eq(SECRET ), eq(webView))
741
+ val jsMessage = captor.firstValue
742
+
743
+ assertTrue(jsMessage is JsRequestResponse .Success )
744
+ checkEquals(expected, jsMessage)
745
+ }
746
+
747
+ @Test
748
+ fun `when process and get auth access token message error then return response` () = runTest {
749
+ givenInterfaceIsRegistered()
750
+ givenAccessTokenIsFailure()
751
+
752
+ val expected = JsRequestResponse .Success (
753
+ context = " subscriptionPages" ,
754
+ featureName = " useSubscription" ,
755
+ method = " getAuthAccessToken" ,
756
+ id = " myId" ,
757
+ result = JSONObject (""" {}""" ),
758
+ )
759
+
760
+ val message = """
761
+ {"context":"subscriptionPages","featureName":"useSubscription","method":"getAuthAccessToken","id":"myId","params":{}}
762
+ """ .trimIndent()
763
+
764
+ messagingInterface.process(message, " duckduckgo-android-messaging-secret" )
765
+
766
+ val captor = argumentCaptor<JsRequestResponse >()
767
+ verify(jsMessageHelper).sendJsResponse(captor.capture(), eq(CALLBACK_NAME ), eq(SECRET ), eq(webView))
768
+ val jsMessage = captor.firstValue
769
+
770
+ assertTrue(jsMessage is JsRequestResponse .Success )
771
+ checkEquals(expected, jsMessage)
772
+ }
773
+
774
+ @Test
775
+ fun `when process and get auth access token if no id do nothing` () = runTest {
776
+ givenInterfaceIsRegistered()
777
+ givenAccessTokenIsSuccess()
778
+
779
+ val message = """
780
+ {"context":"subscriptionPages","featureName":"useSubscription","method":"getAuthAccessToken","params":{}}
781
+ """ .trimIndent()
782
+
783
+ messagingInterface.process(message, " duckduckgo-android-messaging-secret" )
784
+
785
+ verifyNoInteractions(jsMessageHelper)
786
+ }
787
+
788
+ @Test
789
+ fun `when process and get feature config and messaging enabled then return response with feature flags` () = runTest {
790
+ givenInterfaceIsRegistered()
791
+ givenSubscriptionMessaging(enabled = true )
792
+ givenAuthV2(enabled = true )
793
+
794
+ val expected = JsRequestResponse .Success (
795
+ context = " subscriptionPages" ,
796
+ featureName = " useSubscription" ,
797
+ method = " getFeatureConfig" ,
798
+ id = " myId" ,
799
+ result = JSONObject (""" {"useSubscriptionsAuthV2":true}""" ),
800
+ )
801
+
802
+ val message = """
803
+ {"context":"subscriptionPages","featureName":"useSubscription","method":"getFeatureConfig","id":"myId","params":{}}
804
+ """ .trimIndent()
805
+
806
+ messagingInterface.process(message, " duckduckgo-android-messaging-secret" )
807
+
808
+ val captor = argumentCaptor<JsRequestResponse >()
809
+ verify(jsMessageHelper).sendJsResponse(captor.capture(), eq(CALLBACK_NAME ), eq(SECRET ), eq(webView))
810
+ val jsMessage = captor.firstValue
811
+
812
+ assertTrue(jsMessage is JsRequestResponse .Success )
813
+ checkEquals(expected, jsMessage)
814
+ }
815
+
816
+ @Test
817
+ fun `when process and get feature config and messaging enabled but auth v2 disabled then return response with auth v2 false` () = runTest {
818
+ givenInterfaceIsRegistered()
819
+ givenSubscriptionMessaging(enabled = true )
820
+ givenAuthV2(enabled = false )
821
+
822
+ val expected = JsRequestResponse .Success (
823
+ context = " subscriptionPages" ,
824
+ featureName = " useSubscription" ,
825
+ method = " getFeatureConfig" ,
826
+ id = " myId" ,
827
+ result = JSONObject (""" {"useSubscriptionsAuthV2":false}""" ),
828
+ )
829
+
830
+ val message = """
831
+ {"context":"subscriptionPages","featureName":"useSubscription","method":"getFeatureConfig","id":"myId","params":{}}
832
+ """ .trimIndent()
833
+
834
+ messagingInterface.process(message, " duckduckgo-android-messaging-secret" )
835
+
836
+ val captor = argumentCaptor<JsRequestResponse >()
837
+ verify(jsMessageHelper).sendJsResponse(captor.capture(), eq(CALLBACK_NAME ), eq(SECRET ), eq(webView))
838
+ val jsMessage = captor.firstValue
839
+
840
+ assertTrue(jsMessage is JsRequestResponse .Success )
841
+ checkEquals(expected, jsMessage)
842
+ }
843
+
844
+ @Test
845
+ fun `when process and get feature config and messaging disabled then do nothing` () = runTest {
846
+ givenInterfaceIsRegistered()
847
+ givenSubscriptionMessaging(enabled = false )
848
+
849
+ val message = """
850
+ {"context":"subscriptionPages","featureName":"useSubscription","method":"getFeatureConfig","id":"myId","params":{}}
851
+ """ .trimIndent()
852
+
853
+ messagingInterface.process(message, " duckduckgo-android-messaging-secret" )
854
+
855
+ verifyNoInteractions(jsMessageHelper)
856
+ }
857
+
858
+ @Test
859
+ fun `when process and get feature config if no id do nothing` () = runTest {
860
+ givenInterfaceIsRegistered()
861
+ givenSubscriptionMessaging(enabled = true )
862
+
863
+ val message = """
864
+ {"context":"subscriptionPages","featureName":"useSubscription","method":"getFeatureConfig","params":{}}
865
+ """ .trimIndent()
866
+
867
+ messagingInterface.process(message, " duckduckgo-android-messaging-secret" )
868
+
869
+ verifyNoInteractions(jsMessageHelper)
870
+ }
871
+
717
872
private fun givenInterfaceIsRegistered () {
718
873
messagingInterface.register(webView, callback)
719
874
whenever(webView.url).thenReturn(" https://duckduckgo.com/test" )
@@ -753,6 +908,18 @@ class SubscriptionMessagingInterfaceTest {
753
908
whenever(subscriptionsManager.getAccessToken()).thenReturn(AccessTokenResult .Failure (message = " something happened" ))
754
909
}
755
910
911
+ private fun givenSubscriptionMessaging (enabled : Boolean ) {
912
+ val subscriptionMessagingToggle = mock< com.duckduckgo.feature.toggles.api.Toggle > ()
913
+ whenever(subscriptionMessagingToggle.isEnabled()).thenReturn(enabled)
914
+ whenever(privacyProFeature.enableNewSubscriptionMessages()).thenReturn(subscriptionMessagingToggle)
915
+ }
916
+
917
+ private fun givenAuthV2 (enabled : Boolean ) {
918
+ val v2SubscriptionFlow = mock< com.duckduckgo.feature.toggles.api.Toggle > ()
919
+ whenever(v2SubscriptionFlow.isEnabled()).thenReturn(enabled)
920
+ whenever(privacyProFeature.enableSubscriptionFlowsV2()).thenReturn(v2SubscriptionFlow)
921
+ }
922
+
756
923
private fun checkEquals (expected : JsRequestResponse , actual : JsRequestResponse ) {
757
924
if (expected is JsRequestResponse .Success && actual is JsRequestResponse .Success ) {
758
925
assertEquals(expected.id, actual.id)
0 commit comments