1+ package com.monext.sdk.presentation.common
2+
3+ import android.os.StrictMode
4+ import androidx.compose.runtime.CompositionLocalProvider
5+ import androidx.compose.ui.test.assertIsDisplayed
6+ import androidx.compose.ui.test.assertIsEnabled
7+ import androidx.compose.ui.test.assertIsNotDisplayed
8+ import androidx.compose.ui.test.assertIsNotEnabled
9+ import androidx.compose.ui.test.assertTextContains
10+ import androidx.compose.ui.test.junit4.createAndroidComposeRule
11+ import androidx.compose.ui.test.onNodeWithTag
12+ import androidx.compose.ui.test.performClick
13+ import androidx.test.ext.junit.runners.AndroidJUnit4
14+ import com.monext.sdk.Appearance
15+ import com.monext.sdk.FakeTestActivity
16+ import com.monext.sdk.LocalAppearance
17+ import com.monext.sdk.SdkTestHelper.Companion.createPaymentMethodData
18+ import com.monext.sdk.internal.data.PaymentMethod
19+ import com.monext.sdk.internal.data.sessionstate.PaymentForm
20+ import com.monext.sdk.internal.presentation.common.PaymentButton
21+ import org.junit.Before
22+ import org.junit.Rule
23+ import org.junit.Test
24+ import org.junit.runner.RunWith
25+
26+ @RunWith(AndroidJUnit4 ::class )
27+ class PaymentButtonTest {
28+
29+ private val appearance = Appearance (headerTitle = " Monext Demo" )
30+
31+ @get:Rule
32+ val composeTestRule = createAndroidComposeRule<FakeTestActivity >()
33+
34+ @Before
35+ fun setup () {
36+ StrictMode .setThreadPolicy(StrictMode .ThreadPolicy .LAX )
37+ StrictMode .setVmPolicy(StrictMode .VmPolicy .LAX )
38+ }
39+
40+ @Test
41+ fun paymentButton_without_selectedPaymentMethod_disabled_noLoader () {
42+ composeTestRule.activity.setTestComposable {
43+ CompositionLocalProvider (LocalAppearance provides appearance) {
44+ PaymentButton (" 100€" , null , canPay = false , isLoading = false ) {}
45+ }
46+ }
47+ composeTestRule.onNodeWithTag(" PaymentButtonText" , useUnmergedTree = true )
48+ .assertIsDisplayed()
49+ .assertTextContains(" Pay 100€" )
50+ composeTestRule.onNodeWithTag(" PaymentButton" ).assertIsNotEnabled()
51+ composeTestRule.onNodeWithTag(" PaymentButtonLoader" ).assertIsNotDisplayed()
52+ }
53+
54+ @Test
55+ fun paymentButton_without_selectedPaymentMethod_enabled_noLoader () {
56+ composeTestRule.activity.setTestComposable {
57+ CompositionLocalProvider (LocalAppearance provides appearance) {
58+ PaymentButton (" 100€" , null , canPay = true , isLoading = false ) {}
59+ }
60+ }
61+ composeTestRule.onNodeWithTag(" PaymentButtonText" , useUnmergedTree = true )
62+ .assertIsDisplayed()
63+ .assertTextContains(" Pay 100€" )
64+ composeTestRule.onNodeWithTag(" PaymentButton" ).assertIsEnabled()
65+ composeTestRule.onNodeWithTag(" PaymentButtonLoader" ).assertDoesNotExist()
66+ }
67+
68+ @Test
69+ fun paymentButton_without_selectedPaymentMethod_enabled_withLoader () {
70+ composeTestRule.activity.setTestComposable {
71+ CompositionLocalProvider (LocalAppearance provides appearance) {
72+ PaymentButton (" 100€" , null , canPay = true , isLoading = true ) {}
73+ }
74+ }
75+ composeTestRule.onNodeWithTag(" PaymentButtonLoader" ).assertIsDisplayed()
76+ composeTestRule.onNodeWithTag(" PaymentButtonText" , useUnmergedTree = true ).assertIsNotDisplayed()
77+ }
78+
79+ @Test
80+ fun paymentButton_with_selectedPaymentMethod_enabled_noLoader () {
81+ val paymentForm = PaymentForm (
82+ displayButton = true ,
83+ buttonText = " Continue with Paypal"
84+ )
85+ val paymentMethodData = createPaymentMethodData(" PAYPAL" , true , paymentForm)
86+ val paymentMethod = PaymentMethod .AlternativePaymentMethod (paymentMethodData)
87+ composeTestRule.activity.setTestComposable {
88+ CompositionLocalProvider (LocalAppearance provides appearance) {
89+ PaymentButton (" 100€" , paymentMethod, canPay = true , isLoading = false ) {}
90+ }
91+ }
92+ composeTestRule.onNodeWithTag(" PaymentButtonText" , useUnmergedTree = true )
93+ .assertIsDisplayed()
94+ .assertTextContains(" Continue with Paypal" )
95+ composeTestRule.onNodeWithTag(" PaymentButton" ).assertIsEnabled()
96+ composeTestRule.onNodeWithTag(" PaymentButtonLoader" ).assertDoesNotExist()
97+ }
98+
99+ @Test
100+ fun paymentButton_with_selectedPaymentMethod_disabled_noLoader () {
101+ val paymentForm = PaymentForm (
102+ displayButton = true ,
103+ buttonText = " Continue with Paypal"
104+ )
105+ val paymentMethodData = createPaymentMethodData(" PAYPAL" , true , paymentForm)
106+ val paymentMethod = PaymentMethod .AlternativePaymentMethod (paymentMethodData)
107+ composeTestRule.activity.setTestComposable {
108+ CompositionLocalProvider (LocalAppearance provides appearance) {
109+ PaymentButton (" 100€" , paymentMethod, canPay = false , isLoading = false ) {}
110+ }
111+ }
112+ composeTestRule.onNodeWithTag(" PaymentButtonText" , useUnmergedTree = true )
113+ .assertIsDisplayed()
114+ .assertTextContains(" Continue with Paypal" )
115+ composeTestRule.onNodeWithTag(" PaymentButton" ).assertIsNotEnabled()
116+ }
117+
118+ @Test
119+ fun paymentButton_clickCallback_invoked_whenEnabled () {
120+ var clicked = false
121+ composeTestRule.activity.setTestComposable {
122+ CompositionLocalProvider (LocalAppearance provides appearance) {
123+ PaymentButton (" 100" , null , canPay = true , isLoading = false ) { clicked = true }
124+ }
125+ }
126+ composeTestRule.onNodeWithTag(" PaymentButton" ).performClick()
127+ assert (clicked)
128+ }
129+ }
0 commit comments