diff --git a/payment-method-messaging/build.gradle b/payment-method-messaging/build.gradle index f6cf2d2bc86..f11c8b5d99c 100644 --- a/payment-method-messaging/build.gradle +++ b/payment-method-messaging/build.gradle @@ -61,8 +61,12 @@ dependencies { androidTestUtil testLibs.testOrchestrator + androidTestImplementation project(':network-testing') + androidTestImplementation project(':payments-core-testing') + androidTestImplementation testLibs.androidx.composeUi androidTestImplementation testLibs.androidx.junit androidTestImplementation testLibs.androidx.junitKtx + androidTestImplementation testLibs.androidx.testRules androidTestImplementation testLibs.androidx.testRunner androidTestImplementation testLibs.espresso.core androidTestImplementation testLibs.espresso.intents diff --git a/payment-method-messaging/src/androidTest/AndroidManifest.xml b/payment-method-messaging/src/androidTest/AndroidManifest.xml new file mode 100644 index 00000000000..7afaf5a388d --- /dev/null +++ b/payment-method-messaging/src/androidTest/AndroidManifest.xml @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/payment-method-messaging/src/androidTest/java/com/stripe/android/paymentmethodmessaging/element/AdvancedFraudSignalsTestRule.kt b/payment-method-messaging/src/androidTest/java/com/stripe/android/paymentmethodmessaging/element/AdvancedFraudSignalsTestRule.kt new file mode 100644 index 00000000000..50c32aa4abd --- /dev/null +++ b/payment-method-messaging/src/androidTest/java/com/stripe/android/paymentmethodmessaging/element/AdvancedFraudSignalsTestRule.kt @@ -0,0 +1,17 @@ +package com.stripe.android.paymentmethodmessaging.element + +import com.stripe.android.Stripe +import org.junit.rules.TestWatcher +import org.junit.runner.Description + +class AdvancedFraudSignalsTestRule : TestWatcher() { + override fun starting(description: Description?) { + super.starting(description) + Stripe.advancedFraudSignalsEnabled = false + } + + override fun finished(description: Description?) { + Stripe.advancedFraudSignalsEnabled = true + super.finished(description) + } +} diff --git a/payment-method-messaging/src/androidTest/java/com/stripe/android/paymentmethodmessaging/element/MainActivity.kt b/payment-method-messaging/src/androidTest/java/com/stripe/android/paymentmethodmessaging/element/MainActivity.kt new file mode 100644 index 00000000000..4ce19940944 --- /dev/null +++ b/payment-method-messaging/src/androidTest/java/com/stripe/android/paymentmethodmessaging/element/MainActivity.kt @@ -0,0 +1,5 @@ +package com.stripe.android.paymentmethodmessaging.element + +import androidx.activity.ComponentActivity + +class MainActivity : ComponentActivity() diff --git a/payment-method-messaging/src/androidTest/java/com/stripe/android/paymentmethodmessaging/element/PaymentMethodMessagingElementAnalyticsTest.kt b/payment-method-messaging/src/androidTest/java/com/stripe/android/paymentmethodmessaging/element/PaymentMethodMessagingElementAnalyticsTest.kt new file mode 100644 index 00000000000..c14d5dd8770 --- /dev/null +++ b/payment-method-messaging/src/androidTest/java/com/stripe/android/paymentmethodmessaging/element/PaymentMethodMessagingElementAnalyticsTest.kt @@ -0,0 +1,297 @@ +@file:OptIn(PaymentMethodMessagingElementPreview::class) + +package com.stripe.android.paymentmethodmessaging.element + +import android.net.Uri +import androidx.compose.ui.test.junit4.createEmptyComposeRule +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import com.stripe.android.core.networking.AnalyticsRequest +import com.stripe.android.model.PaymentMethod +import com.stripe.android.networktesting.NetworkRule +import com.stripe.android.networktesting.RequestMatcher +import com.stripe.android.networktesting.RequestMatchers.host +import com.stripe.android.networktesting.RequestMatchers.method +import com.stripe.android.networktesting.RequestMatchers.path +import com.stripe.android.networktesting.RequestMatchers.query +import com.stripe.android.networktesting.testBodyFromFile +import com.stripe.android.testing.RetryRule +import org.junit.Rule +import org.junit.Test +import org.junit.rules.RuleChain +import kotlin.time.Duration.Companion.seconds + +internal class PaymentMethodMessagingElementAnalyticsTest { + private val networkRule = NetworkRule( + hostsToTrack = listOf(AnalyticsRequest.HOST, "https://ppm.stripe.com"), + validationTimeout = 1.seconds + ) + + private val composeTestRule = createEmptyComposeRule() + + @get:Rule + val testRule: RuleChain = RuleChain.emptyRuleChain() + .around(composeTestRule) + .around(networkRule) + .around(RetryRule(5)) + .around(AdvancedFraudSignalsTestRule()) + + @Test + fun testNoContent() = runPaymentMethodMessageAnalyticTest(networkRule = networkRule) { testContext -> + networkRule.enqueue( + host("ppm.stripe.com"), + method("GET"), + path("/config"), + ) { response -> + response.testBodyFromFile("no-content.json") + } + + networkRule.validateAnalyticsRequest( + eventName = "payment_method_messaging_element_load_started", + query("amount", "0"), + query("currency", "usd"), + query("locale", "en"), + query("payment_methods", Uri.encode("klarna,affirm,afterpay_clearpay")), + query("country_code", "US") + ) + + networkRule.validateAnalyticsRequest( + eventName = "payment_method_messaging_element_load_succeeded", + query("payment_methods", ""), + query("content_type", "no_content") + ) + + testContext.configure( + PaymentMethodMessagingElement.Configuration() + .amount(0) + .currency("usd") + .locale("en") + .countryCode("US") + .paymentMethodTypes( + listOf(PaymentMethod.Type.Klarna, PaymentMethod.Type.Affirm, PaymentMethod.Type.AfterpayClearpay) + ) + ) + } + + @Test + fun testSinglePartner() = runPaymentMethodMessageAnalyticTest(networkRule = networkRule) { testContext -> + networkRule.enqueue( + host("ppm.stripe.com"), + method("GET"), + path("/config"), + ) { response -> + response.testBodyFromFile("single-partner.json") + } + + networkRule.validateAnalyticsRequest( + eventName = "payment_method_messaging_element_load_started", + query("amount", "5000"), + query("currency", "usd"), + query("locale", "en"), + query("payment_methods", Uri.encode("klarna,affirm,afterpay_clearpay")), + query("country_code", "US") + ) + + networkRule.validateAnalyticsRequest( + eventName = "payment_method_messaging_element_load_succeeded", + query("payment_methods", "klarna"), + query("content_type", "single_partner") + ) + + testContext.configure( + PaymentMethodMessagingElement.Configuration() + .amount(5000) + .currency("usd") + .locale("en") + .countryCode("US") + .paymentMethodTypes( + listOf(PaymentMethod.Type.Klarna, PaymentMethod.Type.Affirm, PaymentMethod.Type.AfterpayClearpay) + ) + ) + } + + @Test + fun testMultiPartner() = runPaymentMethodMessageAnalyticTest(networkRule = networkRule) { testContext -> + networkRule.enqueue( + host("ppm.stripe.com"), + method("GET"), + path("/config"), + ) { response -> + response.testBodyFromFile("multi-partner.json") + } + + networkRule.validateAnalyticsRequest( + eventName = "payment_method_messaging_element_load_started", + query("amount", "5000"), + query("currency", "usd"), + query("locale", "en"), + query("payment_methods", Uri.encode("klarna,affirm,afterpay_clearpay")), + query("country_code", "US") + ) + + networkRule.validateAnalyticsRequest( + eventName = "payment_method_messaging_element_load_succeeded", + query("payment_methods", Uri.encode("klarna,affirm,afterpay_clearpay")), + query("content_type", "multi_partner") + ) + + testContext.configure( + PaymentMethodMessagingElement.Configuration() + .amount(5000) + .currency("usd") + .locale("en") + .countryCode("US") + .paymentMethodTypes( + listOf(PaymentMethod.Type.Klarna, PaymentMethod.Type.Affirm, PaymentMethod.Type.AfterpayClearpay) + ) + ) + } + + @Test + fun testLoadFailed() = runPaymentMethodMessageAnalyticTest(networkRule = networkRule) { testContext -> + networkRule.enqueue( + host("ppm.stripe.com"), + method("GET"), + path("/config"), + ) { response -> + response.setResponseCode(400) + response.testBodyFromFile("error-invalid-currency.json") + } + + networkRule.validateAnalyticsRequest( + eventName = "payment_method_messaging_element_load_started", + query("amount", "0"), + query("currency", "gel"), + query("locale", "en"), + query("payment_methods", Uri.encode("klarna,affirm,afterpay_clearpay")), + query("country_code", "US") + ) + + networkRule.validateAnalyticsRequest( + eventName = "payment_method_messaging_element_load_failed", + query("error_message", "unsupported_currency"), + ) + + testContext.configure( + PaymentMethodMessagingElement.Configuration() + .amount(0) + .currency("gel") + .locale("en") + .countryCode("US") + .paymentMethodTypes( + listOf(PaymentMethod.Type.Klarna, PaymentMethod.Type.Affirm, PaymentMethod.Type.AfterpayClearpay) + ) + ) + } + + @Test + fun testElementTapped() = runPaymentMethodMessageAnalyticTest(networkRule = networkRule) { testContext -> + networkRule.enqueue( + host("ppm.stripe.com"), + method("GET"), + path("/config"), + ) { response -> + response.testBodyFromFile("multi-partner.json") + } + + networkRule.validateAnalyticsRequest( + eventName = "payment_method_messaging_element_load_started", + query("amount", "0"), + query("currency", "gel"), + query("locale", "en"), + query("payment_methods", Uri.encode("klarna,affirm,afterpay_clearpay")), + query("country_code", "US") + ) + + networkRule.validateAnalyticsRequest( + eventName = "payment_method_messaging_element_load_succeeded", + query("payment_methods", Uri.encode("klarna,affirm,afterpay_clearpay")), + query("content_type", "multi_partner") + ) + + testContext.configure( + PaymentMethodMessagingElement.Configuration() + .amount(0) + .currency("gel") + .locale("en") + .countryCode("US") + .paymentMethodTypes( + listOf(PaymentMethod.Type.Klarna, PaymentMethod.Type.Affirm, PaymentMethod.Type.AfterpayClearpay) + ) + ) + + networkRule.validateAnalyticsRequest( + eventName = "payment_method_messaging_element_tapped" + ) + + composeTestRule.waitForIdle() + composeTestRule.onNodeWithText(text = "4 interest-free payments", substring = true).performClick() + } + + @Test + fun testUnexpectedError() = runPaymentMethodMessageAnalyticTest(networkRule = networkRule) { testContext -> + networkRule.enqueue( + host("ppm.stripe.com"), + method("GET"), + path("/config"), + ) { response -> + response.setBody("{}") + } + + networkRule.validateAnalyticsRequest( + eventName = "payment_method_messaging_element_load_started", + query("amount", "0"), + query("currency", "gel"), + query("locale", "en"), + query("payment_methods", Uri.encode("klarna,affirm,afterpay_clearpay")), + query("country_code", "US") + ) + + networkRule.validateAnalyticsRequest( + eventName = "unexpected_error.paymentmethodmessaging.element.unable_to_parse_response", + ) + + testContext.configure( + PaymentMethodMessagingElement.Configuration() + .amount(0) + .currency("gel") + .locale("en") + .countryCode("US") + .paymentMethodTypes( + listOf(PaymentMethod.Type.Klarna, PaymentMethod.Type.Affirm, PaymentMethod.Type.AfterpayClearpay) + ) + ) + } + + private fun runPaymentMethodMessageAnalyticTest( + networkRule: NetworkRule, + block: suspend (PaymentMethodMessagingElementTestRunnerContext) -> Unit + ) { + networkRule.validateAnalyticsRequest( + eventName = "payment_method_messaging_element_init" + ) + + networkRule.validateAnalyticsRequest( + eventName = "payment_method_messaging_element_displayed" + ) + + runPaymentMethodMessagingElementTest( + networkRule = networkRule, + block = block + ) + } + + private fun NetworkRule.validateAnalyticsRequest( + eventName: String, + vararg requestMatchers: RequestMatcher, + ) { + enqueue( + host("q.stripe.com"), + method("GET"), + query("event", eventName), + *requestMatchers, + ) { response -> + response.status = "HTTP/1.1 200 OK" + } + } +} diff --git a/payment-method-messaging/src/androidTest/java/com/stripe/android/paymentmethodmessaging/element/PaymentMethodMessagingElementTestRunner.kt b/payment-method-messaging/src/androidTest/java/com/stripe/android/paymentmethodmessaging/element/PaymentMethodMessagingElementTestRunner.kt new file mode 100644 index 00000000000..518c8d19a1e --- /dev/null +++ b/payment-method-messaging/src/androidTest/java/com/stripe/android/paymentmethodmessaging/element/PaymentMethodMessagingElementTestRunner.kt @@ -0,0 +1,62 @@ +@file:OptIn(PaymentMethodMessagingElementPreview::class) + +package com.stripe.android.paymentmethodmessaging.element + +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.Column +import androidx.lifecycle.Lifecycle +import androidx.test.core.app.ActivityScenario +import com.stripe.android.PaymentConfiguration +import com.stripe.android.networktesting.NetworkRule +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runTest + +internal class PaymentMethodMessagingElementTestRunnerContext( + val paymentMethodMessagingElement: PaymentMethodMessagingElement +) { + suspend fun configure( + configuration: PaymentMethodMessagingElement.Configuration + ) { + paymentMethodMessagingElement.configure(configuration) + } +} + +@OptIn(ExperimentalCoroutinesApi::class) +internal fun runPaymentMethodMessagingElementTest( + networkRule: NetworkRule, + block: suspend (PaymentMethodMessagingElementTestRunnerContext) -> Unit +) { + val factory: (ComponentActivity) -> PaymentMethodMessagingElement = { + lateinit var element: PaymentMethodMessagingElement + it.setContent { + element = PaymentMethodMessagingElement.create(it.application) + Column { + element.Content() + } + } + element + } + + ActivityScenario.launch(MainActivity::class.java).use { scenario -> + scenario.moveToState(Lifecycle.State.CREATED) + + lateinit var paymentMethodMessagingElement: PaymentMethodMessagingElement + scenario.onActivity { + PaymentConfiguration.init(it, "pk_test_123") + paymentMethodMessagingElement = factory(it) + } + + scenario.moveToState(Lifecycle.State.RESUMED) + + val testContext = PaymentMethodMessagingElementTestRunnerContext( + paymentMethodMessagingElement = paymentMethodMessagingElement + ) + + runTest { + block(testContext) + } + + networkRule.validate() + } +} diff --git a/payment-method-messaging/src/androidTest/resources/error-invalid-currency.json b/payment-method-messaging/src/androidTest/resources/error-invalid-currency.json new file mode 100644 index 00000000000..afddba84bd7 --- /dev/null +++ b/payment-method-messaging/src/androidTest/resources/error-invalid-currency.json @@ -0,0 +1,7 @@ +{ + "error": { + "param": "currency", + "message": "unsupported_currency", + "type": "invalid_request_error" + } +} \ No newline at end of file diff --git a/payment-method-messaging/src/androidTest/resources/multi-partner.json b/payment-method-messaging/src/androidTest/resources/multi-partner.json new file mode 100644 index 00000000000..27ed646a1df --- /dev/null +++ b/payment-method-messaging/src/androidTest/resources/multi-partner.json @@ -0,0 +1,573 @@ +{ + "country" : "US", + "merchant_id" : "acct_1HvTI7Lu5o3P18Zp", + "payment_methods" : [ "klarna", "affirm", "afterpay_clearpay" ], + "partner_configs" : { + "affirm" : { + "summary" : { + "public_key" : "JHTPBPHS018OII2S" + } + } + }, + "payment_plan_groups" : [ { + "content" : { + "images" : [ { + "dark_theme_png" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-logo-dark.png", + "width" : 144 + }, + "dark_theme_svg" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-logo-dark.svg", + "width" : 144 + }, + "flat_theme_png" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-logo-flat.png", + "width" : 144 + }, + "flat_theme_svg" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-logo-flat.svg", + "width" : 144 + }, + "light_theme_png" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-logo.png", + "width" : 144 + }, + "light_theme_svg" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-logo.svg", + "width" : 144 + }, + "payment_method_type" : "afterpay_clearpay", + "role" : "logo", + "text" : "Cash App Afterpay" + }, { + "dark_theme_png" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-icon.png", + "width" : 16 + }, + "dark_theme_svg" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-icon.svg", + "width" : 16 + }, + "flat_theme_png" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-icon-flat.png", + "width" : 16 + }, + "flat_theme_svg" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-icon-flat.svg", + "width" : 16 + }, + "light_theme_png" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-icon.png", + "width" : 16 + }, + "light_theme_svg" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-icon.svg", + "width" : 16 + }, + "payment_method_type" : "afterpay_clearpay", + "role" : "icon", + "text" : "Cash App Afterpay" + } ], + "inline_partner_promotion" : { + "message" : "4 interest-free payments of ${'$'}22.50 with {partner}", + "url" : null + }, + "learn_more" : { + "message" : "Learn more", + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/learn-more/index.html?amount=9000&country=US¤cy=USD&key=pk_test_51HvTI7Lu5o3P18Zp6t5AgBSkMvWoTtA0nyA7pVYDqpfLkRtWun7qZTYCOHCReprfLM464yaBeF72UFfB7cY9WG4a00ZnDtiC2C&locale=en&payment_methods%5B0%5D=afterpay_clearpay" + }, + "promotion" : { + "message" : "4 interest-free payments of ${'$'}22.50", + "url" : null + }, + "summary" : { + "message" : "Pay in 4 interest-free payments of ${'$'}22.50.", + "url" : null + } + }, + "payment_plans" : [ { + "id" : "9e4ebba3-60b0-40f0-9778-f23e90ee7e99", + "due_days" : null, + "installment_amount" : 2250, + "interest_rate" : 0, + "interval" : { + "frequency" : 2, + "unit" : "week" + }, + "number_of_installments" : 4, + "terms" : "For Cash App Afterpay in 4 users, you must be over 18, a resident of the U.S. and meet additional eligibility criteria to qualify. Late fees may apply. Estimated payment amounts shown on product pages exclude taxes and shipping charges, which are added at checkout. Click [here](https://www.afterpay.com/en-US/installment-agreement) for complete terms. Loans to California residents made or arranged pursuant to a California Finance Lenders Law license.", + "total_amount" : 9000, + "type" : "INSTALLMENTS" + } ], + "type" : "AFTERPAY_CLEARPAY" + }, { + "content" : { + "images" : [ { + "dark_theme_png" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-logo-dark.png", + "width" : 75 + }, + "dark_theme_svg" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-logo-dark.svg", + "width" : 75 + }, + "flat_theme_png" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-logo-flat.png", + "width" : 75 + }, + "flat_theme_svg" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-logo-flat.svg", + "width" : 75 + }, + "light_theme_png" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-logo.png", + "width" : 75 + }, + "light_theme_svg" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-logo.svg", + "width" : 75 + }, + "payment_method_type" : "affirm", + "role" : "logo", + "text" : "Affirm" + }, { + "dark_theme_png" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-icon-dark.png", + "width" : 16 + }, + "dark_theme_svg" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-icon-dark.svg", + "width" : 16 + }, + "flat_theme_png" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-icon-flat.png", + "width" : 16 + }, + "flat_theme_svg" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-icon-flat.svg", + "width" : 16 + }, + "light_theme_png" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-icon.png", + "width" : 16 + }, + "light_theme_svg" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-icon.svg", + "width" : 16 + }, + "payment_method_type" : "affirm", + "role" : "icon", + "text" : "Affirm" + } ], + "inline_partner_promotion" : { + "message" : "4 interest-free payments of ${'$'}22.50 with {partner}", + "url" : null + }, + "learn_more" : { + "message" : "Learn more", + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/learn-more/index.html?amount=9000&country=US¤cy=USD&key=pk_test_51HvTI7Lu5o3P18Zp6t5AgBSkMvWoTtA0nyA7pVYDqpfLkRtWun7qZTYCOHCReprfLM464yaBeF72UFfB7cY9WG4a00ZnDtiC2C&locale=en&payment_methods%5B0%5D=affirm" + }, + "promotion" : { + "message" : "4 interest-free payments of ${'$'}22.50", + "url" : null + }, + "summary" : { + "message" : "Pay in 4 interest-free payments of ${'$'}22.50.", + "url" : null + } + }, + "payment_plans" : [ { + "id" : "e2864a04-dfc5-4646-80c6-04f5a3b20e60", + "due_days" : null, + "installment_amount" : 2250, + "interest_rate" : 0, + "interval" : { + "frequency" : 2, + "unit" : "week" + }, + "number_of_installments" : 4, + "terms" : "Rates from 0-36% APR. Payment options may be subject to an eligibility check and may not be available in all states. While Affirm doesn’t charge late fees, other payment methods may do so. Options depend on your purchase amount, and a down payment may be required. Estimated payment amounts exclude taxes and shipping charges, which are added at checkout. Loans to California residents made or arranged pursuant to a California Finance Lenders Law license. Financing options through Affirm are provided by these lending partners: affirm.com/lenders. CA residents: Loans by Affirm Loan Services, LLC are made or arranged pursuant to a California Finance Lender license. For licenses and disclosures, see affirm.com/licenses.", + "total_amount" : 9000, + "type" : "INSTALLMENTS" + } ], + "type" : "AFFIRM" + }, { + "content" : { + "images" : [ { + "dark_theme_png" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo-dark.png", + "width" : 78 + }, + "dark_theme_svg" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo-dark.svg", + "width" : 78 + }, + "flat_theme_png" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo-flat.png", + "width" : 78 + }, + "flat_theme_svg" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo-flat.svg", + "width" : 78 + }, + "light_theme_png" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo.png", + "width" : 98 + }, + "light_theme_svg" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo.svg", + "width" : 98 + }, + "payment_method_type" : "klarna", + "role" : "logo", + "text" : "Klarna" + }, { + "dark_theme_png" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon.png", + "width" : 16 + }, + "dark_theme_svg" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon.svg", + "width" : 16 + }, + "flat_theme_png" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon-flat.png", + "width" : 16 + }, + "flat_theme_svg" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon-flat.svg", + "width" : 16 + }, + "light_theme_png" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon.png", + "width" : 16 + }, + "light_theme_svg" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon.svg", + "width" : 16 + }, + "payment_method_type" : "klarna", + "role" : "icon", + "text" : "Klarna" + } ], + "inline_partner_promotion" : { + "message" : "4 interest-free payments of ${'$'}22.50 with {partner}", + "url" : null + }, + "learn_more" : { + "message" : "Learn more", + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/learn-more/index.html?amount=9000&country=US¤cy=USD&key=pk_test_51HvTI7Lu5o3P18Zp6t5AgBSkMvWoTtA0nyA7pVYDqpfLkRtWun7qZTYCOHCReprfLM464yaBeF72UFfB7cY9WG4a00ZnDtiC2C&locale=en&payment_methods%5B0%5D=klarna" + }, + "promotion" : { + "message" : "4 interest-free payments of ${'$'}22.50", + "url" : null + }, + "summary" : { + "message" : "Pay now, or in 4 interest-free payments of ${'$'}22.50.", + "url" : null + } + }, + "payment_plans" : [ { + "id" : "4c7096ad-f906-4a2e-a298-9c0d286dc7f9", + "due_days" : null, + "installment_amount" : 2250, + "interest_rate" : 0, + "interval" : { + "frequency" : 2, + "unit" : "week" + }, + "number_of_installments" : 4, + "terms" : "Pay in 4 is offered by Klarna, Inc. It’s available to eligible US residents in most states. Initial payments may be higher. Missed payments are subject to late fees. For CA residents, loans made or arranged by Klarna, Inc. pursuant to a California Financing Law license. [Review the Pay in 4 terms](https://cdn.klarna.com/1.0/shared/content/legal/terms/0/en_us/sliceitinx).", + "total_amount" : 9000, + "type" : "INSTALLMENTS" + }, { + "id" : "b7185417-6c03-4033-b74f-6745ab3fbcb9", + "due_days" : null, + "installment_amount" : null, + "interest_rate" : 0, + "interval" : null, + "number_of_installments" : null, + "terms" : "[Terms](https://www.klarna.com/us/legal/).", + "total_amount" : 9000, + "type" : "PAY_NOW" + }, { + "id" : "4946b6d4-00e2-489d-8ba6-2595e437799b", + "due_days" : null, + "installment_amount" : null, + "interest_rate" : 0, + "interval" : null, + "number_of_installments" : null, + "terms" : "[Terms](https://www.klarna.com/us/legal/).", + "total_amount" : 9000, + "type" : "PAY_NOW" + } ], + "type" : "KLARNA" + } ], + "api_feature_flags" : [ { + "key" : "enable_pmme_api_content", + "result" : true + } ], + "experiments" : { + "experiment_assignments" : { + "ocs_buyer_xp_pmme_affirm_solo_prequal" : "control", + "ocs_buyer_xp_pmme_affirm_multi_prequal" : "control" + }, + "event_id" : "42e17fef-6b66-43d8-a45d-53cf2bd651b4" + }, + "content" : { + "images" : [ { + "dark_theme_png" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-logo-dark.png", + "width" : 144 + }, + "dark_theme_svg" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-logo-dark.svg", + "width" : 144 + }, + "flat_theme_png" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-logo-flat.png", + "width" : 144 + }, + "flat_theme_svg" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-logo-flat.svg", + "width" : 144 + }, + "light_theme_png" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-logo.png", + "width" : 144 + }, + "light_theme_svg" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-logo.svg", + "width" : 144 + }, + "payment_method_type" : "afterpay_clearpay", + "role" : "logo", + "text" : "Cash App Afterpay" + }, { + "dark_theme_png" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-icon.png", + "width" : 16 + }, + "dark_theme_svg" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-icon.svg", + "width" : 16 + }, + "flat_theme_png" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-icon-flat.png", + "width" : 16 + }, + "flat_theme_svg" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-icon-flat.svg", + "width" : 16 + }, + "light_theme_png" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-icon.png", + "width" : 16 + }, + "light_theme_svg" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/cashapp-afterpay-icon.svg", + "width" : 16 + }, + "payment_method_type" : "afterpay_clearpay", + "role" : "icon", + "text" : "Cash App Afterpay" + }, { + "dark_theme_png" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-logo-dark.png", + "width" : 75 + }, + "dark_theme_svg" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-logo-dark.svg", + "width" : 75 + }, + "flat_theme_png" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-logo-flat.png", + "width" : 75 + }, + "flat_theme_svg" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-logo-flat.svg", + "width" : 75 + }, + "light_theme_png" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-logo.png", + "width" : 75 + }, + "light_theme_svg" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-logo.svg", + "width" : 75 + }, + "payment_method_type" : "affirm", + "role" : "logo", + "text" : "Affirm" + }, { + "dark_theme_png" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-icon-dark.png", + "width" : 16 + }, + "dark_theme_svg" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-icon-dark.svg", + "width" : 16 + }, + "flat_theme_png" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-icon-flat.png", + "width" : 16 + }, + "flat_theme_svg" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-icon-flat.svg", + "width" : 16 + }, + "light_theme_png" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-icon.png", + "width" : 16 + }, + "light_theme_svg" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/affirm-icon.svg", + "width" : 16 + }, + "payment_method_type" : "affirm", + "role" : "icon", + "text" : "Affirm" + }, { + "dark_theme_png" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo-dark.png", + "width" : 78 + }, + "dark_theme_svg" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo-dark.svg", + "width" : 78 + }, + "flat_theme_png" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo-flat.png", + "width" : 78 + }, + "flat_theme_svg" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo-flat.svg", + "width" : 78 + }, + "light_theme_png" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo.png", + "width" : 98 + }, + "light_theme_svg" : { + "height" : 40, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo.svg", + "width" : 98 + }, + "payment_method_type" : "klarna", + "role" : "logo", + "text" : "Klarna" + }, { + "dark_theme_png" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon.png", + "width" : 16 + }, + "dark_theme_svg" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon.svg", + "width" : 16 + }, + "flat_theme_png" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon-flat.png", + "width" : 16 + }, + "flat_theme_svg" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon-flat.svg", + "width" : 16 + }, + "light_theme_png" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon.png", + "width" : 16 + }, + "light_theme_svg" : { + "height" : 16, + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon.svg", + "width" : 16 + }, + "payment_method_type" : "klarna", + "role" : "icon", + "text" : "Klarna" + } ], + "inline_partner_promotion" : null, + "learn_more" : { + "message" : "Learn more", + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/learn-more/index.html?amount=9000&country=US¤cy=USD&key=pk_test_51HvTI7Lu5o3P18Zp6t5AgBSkMvWoTtA0nyA7pVYDqpfLkRtWun7qZTYCOHCReprfLM464yaBeF72UFfB7cY9WG4a00ZnDtiC2C&locale=en&payment_methods%5B0%5D=afterpay_clearpay&payment_methods%5B1%5D=affirm&payment_methods%5B2%5D=klarna" + }, + "promotion" : { + "message" : "4 interest-free payments of ${'$'}22.50", + "url" : null + }, + "summary" : { + "message" : "Pay now, or in 4 interest-free payments of ${'$'}22.50.", + "url" : null + } + } +} \ No newline at end of file diff --git a/payment-method-messaging/src/androidTest/resources/no-content.json b/payment-method-messaging/src/androidTest/resources/no-content.json new file mode 100644 index 00000000000..f7d2ecf6e18 --- /dev/null +++ b/payment-method-messaging/src/androidTest/resources/no-content.json @@ -0,0 +1,28 @@ +{ + "country" : "US", + "merchant_id" : "acct_1HvTI7Lu5o3P18Zp", + "payment_methods" : [ ], + "partner_configs" : { }, + "payment_plan_groups" : [ ], + "api_feature_flags" : [ { + "key" : "enable_pmme_api_content", + "result" : true + } ], + "experiments" : { + "experiment_assignments" : { }, + "event_id" : "" + }, + "content" : { + "images" : [ ], + "inline_partner_promotion" : null, + "learn_more" : { + "message" : "Learn more", + "url" : "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/learn-more/index.html?amount=0&country=US¤cy=USD&key=pk_test_51HvTI7Lu5o3P18Zp6t5AgBSkMvWoTtA0nyA7pVYDqpfLkRtWun7qZTYCOHCReprfLM464yaBeF72UFfB7cY9WG4a00ZnDtiC2C&locale=en" + }, + "promotion" : null, + "summary" : { + "message" : "Buy now pay later", + "url" : null + } + } +} \ No newline at end of file diff --git a/payment-method-messaging/src/androidTest/resources/single-partner.json b/payment-method-messaging/src/androidTest/resources/single-partner.json new file mode 100644 index 00000000000..5d2593ea1fb --- /dev/null +++ b/payment-method-messaging/src/androidTest/resources/single-partner.json @@ -0,0 +1,238 @@ +{ + "country": "US", + "merchant_id": "acct_1HvTI7Lu5o3P18Zp", + "payment_methods": [ + "klarna" + ], + "partner_configs": {}, + "payment_plan_groups": [ + { + "content": { + "images": [ + { + "dark_theme_png": { + "height": 40, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo-dark.png", + "width": 78 + }, + "dark_theme_svg": { + "height": 40, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo-dark.svg", + "width": 78 + }, + "flat_theme_png": { + "height": 40, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo-flat.png", + "width": 78 + }, + "flat_theme_svg": { + "height": 40, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo-flat.svg", + "width": 78 + }, + "light_theme_png": { + "height": 40, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo.png", + "width": 98 + }, + "light_theme_svg": { + "height": 40, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo.svg", + "width": 98 + }, + "payment_method_type": "klarna", + "role": "logo", + "text": "Klarna" + }, + { + "dark_theme_png": { + "height": 16, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon.png", + "width": 16 + }, + "dark_theme_svg": { + "height": 16, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon.svg", + "width": 16 + }, + "flat_theme_png": { + "height": 16, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon-flat.png", + "width": 16 + }, + "flat_theme_svg": { + "height": 16, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon-flat.svg", + "width": 16 + }, + "light_theme_png": { + "height": 16, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon.png", + "width": 16 + }, + "light_theme_svg": { + "height": 16, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon.svg", + "width": 16 + }, + "payment_method_type": "klarna", + "role": "icon", + "text": "Klarna" + } + ], + "inline_partner_promotion": { + "message": "4 interest-free payments of ${'$'}25.00 with {partner}", + "url": null + }, + "learn_more": { + "message": "Learn more", + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/learn-more/index.html?amount=10000&country=US¤cy=USD&key=pk_test_51HvTI7Lu5o3P18Zp6t5AgBSkMvWoTtA0nyA7pVYDqpfLkRtWun7qZTYCOHCReprfLM464yaBeF72UFfB7cY9WG4a00ZnDtiC2C&locale=en&payment_methods%5B0%5D=klarna" + }, + "promotion": { + "message": "4 interest-free payments of ${'$'}25.00", + "url": null + }, + "summary": { + "message": "Pay now, or in 4 interest-free payments of ${'$'}25.00.", + "url": null + } + }, + "payment_plans": [ + { + "id": "106bbe62-f77d-4ee6-85b2-bbbc071c4a0a", + "due_days": null, + "installment_amount": 2500, + "interest_rate": 0, + "interval": { + "frequency": 2, + "unit": "week" + }, + "number_of_installments": 4, + "terms": "Pay in 4 is offered by Klarna, Inc. It’s available to eligible US residents in most states. Initial payments may be higher. Missed payments are subject to late fees. For CA residents, loans made or arranged by Klarna, Inc. pursuant to a California Financing Law license. [Review the Pay in 4 terms](https://cdn.klarna.com/1.0/shared/content/legal/terms/0/en_us/sliceitinx).", + "total_amount": 10000, + "type": "INSTALLMENTS" + }, + { + "id": "f95acff9-0473-40db-982a-d81284e67438", + "due_days": null, + "installment_amount": null, + "interest_rate": 0, + "interval": null, + "number_of_installments": null, + "terms": "[Terms](https://www.klarna.com/us/legal/).", + "total_amount": 10000, + "type": "PAY_NOW" + }, + { + "id": "4af3d10b-22b8-494c-ace3-97ce2b479253", + "due_days": null, + "installment_amount": null, + "interest_rate": 0, + "interval": null, + "number_of_installments": null, + "terms": "[Terms](https://www.klarna.com/us/legal/).", + "total_amount": 10000, + "type": "PAY_NOW" + } + ], + "type": "KLARNA" + } + ], + "api_feature_flags": [ + { + "key": "enable_pmme_api_content", + "result": true + } + ], + "experiments": { + "experiment_assignments": {}, + "event_id": "" + }, + "content": { + "images": [ + { + "dark_theme_png": { + "height": 40, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo-dark.png", + "width": 78 + }, + "dark_theme_svg": { + "height": 40, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo-dark.svg", + "width": 78 + }, + "flat_theme_png": { + "height": 40, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo-flat.png", + "width": 78 + }, + "flat_theme_svg": { + "height": 40, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo-flat.svg", + "width": 78 + }, + "light_theme_png": { + "height": 40, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo.png", + "width": 98 + }, + "light_theme_svg": { + "height": 40, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-logo.svg", + "width": 98 + }, + "payment_method_type": "klarna", + "role": "logo", + "text": "Klarna" + }, + { + "dark_theme_png": { + "height": 16, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon.png", + "width": 16 + }, + "dark_theme_svg": { + "height": 16, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon.svg", + "width": 16 + }, + "flat_theme_png": { + "height": 16, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon-flat.png", + "width": 16 + }, + "flat_theme_svg": { + "height": 16, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon-flat.svg", + "width": 16 + }, + "light_theme_png": { + "height": 16, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon.png", + "width": 16 + }, + "light_theme_svg": { + "height": 16, + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/images/klarna-icon.svg", + "width": 16 + }, + "payment_method_type": "klarna", + "role": "icon", + "text": "Klarna" + } + ], + "inline_partner_promotion": null, + "learn_more": { + "message": "Learn more", + "url": "https://b.stripecdn.com/payment-method-messaging-statics-srv/assets/learn-more/index.html?amount=10000&country=US¤cy=USD&key=pk_test_51HvTI7Lu5o3P18Zp6t5AgBSkMvWoTtA0nyA7pVYDqpfLkRtWun7qZTYCOHCReprfLM464yaBeF72UFfB7cY9WG4a00ZnDtiC2C&locale=en&payment_methods%5B0%5D=klarna" + }, + "promotion": { + "message": "4 interest-free payments of ${'$'}25.00", + "url": null + }, + "summary": { + "message": "Pay now, or in 4 interest-free payments of ${'$'}25.00.", + "url": null + } + } +} \ No newline at end of file