Skip to content

Commit 904cbe8

Browse files
PAYLSQUAD3-3449 - [SDK_ANDROID][APM] 1 - Ajout des MdP APM simples à redirection
1 parent f4c20ac commit 904cbe8

39 files changed

+1004
-274
lines changed

monext/src/androidTest/kotlin/com/monext/sdk/SdkTestHelper.kt

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ package com.monext.sdk
22

33
import com.monext.sdk.internal.api.model.response.SessionState
44
import com.monext.sdk.internal.api.model.response.SessionStateType
5+
import com.monext.sdk.internal.data.sessionstate.AdditionalData
6+
import com.monext.sdk.internal.data.sessionstate.FormOption
7+
import com.monext.sdk.internal.data.sessionstate.PaymentForm
8+
import com.monext.sdk.internal.data.sessionstate.PaymentMethodData
59
import com.monext.sdk.internal.preview.PreviewSamples.Companion.posAddress
610
import com.monext.sdk.internal.preview.PreviewSamples.Companion.sessionInfo
711
import com.monext.sdk.internal.threeds.model.PaymentSdkChallenge
@@ -29,9 +33,9 @@ class SdkTestHelper {
2933
acsChallengeMandated = "acsChallengeMandated"
3034
)
3135

32-
internal fun createSessionStateSdkChallenge() = SessionState(
36+
internal fun createSessionState(state: SessionStateType) = SessionState(
3337
token = "fake_token",
34-
type = SessionStateType.SDK_CHALLENGE,
38+
type = state,
3539
creationDate = "Tue Mar 25 12:33:22 CET 2025",
3640
cancelUrl = "https://yourdomain.com:8080/route/1.0/returns?paylinetoken=fake_token",
3741
pointOfSale = "POS_Fake",
@@ -46,5 +50,33 @@ class SdkTestHelper {
4650
paymentFailure = null,
4751
paymentSdkChallenge = PaymentSdkChallenge(createSdkChallengeData())
4852
)
53+
54+
internal fun createPaymentMethodData(cardCode: String, hasForm: Boolean = false, form: PaymentForm? = null): PaymentMethodData =
55+
PaymentMethodData(
56+
cardCode = cardCode,
57+
contractNumber = cardCode,
58+
disabled = false,
59+
hasForm = hasForm,
60+
form = form,
61+
hasLogo = false,
62+
logo = null,
63+
isIsolated = false,
64+
options = listOf(FormOption.SAVE_PAYMENT_DATA),
65+
paymentMethodAction = null,
66+
additionalData = AdditionalData(
67+
merchantCapabilities = null,
68+
networks = null,
69+
applePayMerchantId = null,
70+
applePayMerchantName = null,
71+
savePaymentDataChecked = null,
72+
email = null,
73+
date = null,
74+
holder = null,
75+
pan = null
76+
),
77+
requestContext = null,
78+
shouldBeInTopPosition = null,
79+
state = null
80+
)
4981
}
5082
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
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.assertIsNotEnabled
8+
import androidx.compose.ui.test.junit4.createAndroidComposeRule
9+
import androidx.compose.ui.test.onNodeWithTag
10+
import androidx.compose.ui.test.onNodeWithText
11+
import androidx.compose.ui.test.performClick
12+
import androidx.test.ext.junit.runners.AndroidJUnit4
13+
import com.monext.sdk.Appearance
14+
import com.monext.sdk.FakeTestActivity
15+
import com.monext.sdk.GooglePayConfiguration
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.presentation.common.PayButtonsContainer
20+
import org.junit.Before
21+
import org.junit.Rule
22+
import org.junit.Test
23+
import org.junit.runner.RunWith
24+
25+
@RunWith(AndroidJUnit4::class)
26+
class PayButtonsContainerTest {
27+
28+
private val appearance = Appearance(headerTitle = "Monext Demo")
29+
30+
@get:Rule
31+
val composeTestRule = createAndroidComposeRule<FakeTestActivity>()
32+
33+
@Before
34+
fun setup() {
35+
StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.LAX)
36+
StrictMode.setVmPolicy(StrictMode.VmPolicy.LAX)
37+
}
38+
39+
@Test
40+
fun payButton_isDisplayed_andEnabled_whenCanPayIsTrue() {
41+
composeTestRule.activity.setTestComposable {
42+
CompositionLocalProvider(LocalAppearance provides appearance) {
43+
PayButtonsContainer(
44+
amount = "10.00€",
45+
selectedPaymentMethod = PaymentMethod.AlternativePaymentMethod(
46+
createPaymentMethodData("PAYPAL")
47+
),
48+
canPay = true,
49+
isLoading = false,
50+
showsGooglePay = false,
51+
gPayConfig = GooglePayConfiguration(),
52+
allowedPaymentMethods = "",
53+
onClickGooglePay = {},
54+
onClick = {}
55+
)
56+
}
57+
}
58+
59+
composeTestRule.onNodeWithText("Pay 10.00€")
60+
.assertIsDisplayed()
61+
.assertIsEnabled()
62+
}
63+
64+
@Test
65+
fun payButton_isNotEnabled_whenCanPayIsFalse() {
66+
composeTestRule.activity.setTestComposable {
67+
CompositionLocalProvider(LocalAppearance provides appearance) {
68+
PayButtonsContainer(
69+
amount = "10.00€",
70+
selectedPaymentMethod = PaymentMethod.AlternativePaymentMethod(
71+
createPaymentMethodData("PAYPAL")
72+
),
73+
canPay = false,
74+
isLoading = false,
75+
showsGooglePay = false,
76+
gPayConfig = GooglePayConfiguration(),
77+
allowedPaymentMethods = "",
78+
onClickGooglePay = {},
79+
onClick = {}
80+
)
81+
}
82+
}
83+
84+
composeTestRule.onNodeWithText("Pay 10.00€")
85+
.assertIsDisplayed()
86+
.assertIsNotEnabled()
87+
}
88+
89+
@Test
90+
fun googlePayButton_isNotDisplayed_whenShowsGooglePayIsFalse() {
91+
composeTestRule.activity.setTestComposable {
92+
CompositionLocalProvider(LocalAppearance provides appearance) {
93+
PayButtonsContainer(
94+
amount = "10.00€",
95+
selectedPaymentMethod = PaymentMethod.AlternativePaymentMethod(
96+
createPaymentMethodData("PAYPAL")
97+
),
98+
canPay = true,
99+
isLoading = false,
100+
showsGooglePay = false,
101+
gPayConfig = GooglePayConfiguration(),
102+
allowedPaymentMethods = "CARD, TOKENIZED_CARD",
103+
onClickGooglePay = {},
104+
onClick = {}
105+
)
106+
}
107+
}
108+
109+
composeTestRule.onNodeWithTag("payButton").assertDoesNotExist()
110+
}
111+
}
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
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

Comments
 (0)