From 905b5477955d46437d5ec1601f033759522bc7f4 Mon Sep 17 00:00:00 2001 From: TyreseWp Date: Thu, 8 Aug 2024 10:21:37 +0100 Subject: [PATCH 01/10] US1955755: add refactored tests under new card config integration test class --- demo-app/build.gradle | 1 + .../testutil/NewCardFragmentTestUtils.kt | 197 ++++++++++++++++++ .../testutil/NewAbstractFragmentTestUtils.kt | 151 ++++++++++++++ .../checkout/sample/testutil/UITestUtils.kt | 30 ++- .../utils/CustomScreenCaptureProcessor.kt | 86 ++++++++ .../checkout/sample/utils/CustomTestRule.kt | 15 ++ .../sample/utils/ScreenshotTestRule.kt | 39 ++++ .../sample/NewDiscoveryIntegrationTest.kt | 69 ++++++ .../NewCardConfigurationIntegrationTest.kt | 84 ++++++++ .../testutil/NewAbstractCardFragmentTest.kt | 55 +++++ .../sample/cvc/NewCvcFragmentTestUtils.kt | 79 +++++++ .../checkout/sample/images/SVGImageLoader.kt | 1 + .../sample/images/SVGImageRenderer.kt | 3 +- 13 files changed, 806 insertions(+), 4 deletions(-) create mode 100644 demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/NewCardFragmentTestUtils.kt create mode 100644 demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/testutil/NewAbstractFragmentTestUtils.kt create mode 100644 demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/CustomScreenCaptureProcessor.kt create mode 100644 demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/CustomTestRule.kt create mode 100644 demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/ScreenshotTestRule.kt create mode 100644 demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/NewDiscoveryIntegrationTest.kt create mode 100644 demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/NewCardConfigurationIntegrationTest.kt create mode 100644 demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/standard/testutil/NewAbstractCardFragmentTest.kt create mode 100644 demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/cvc/NewCvcFragmentTestUtils.kt diff --git a/demo-app/build.gradle b/demo-app/build.gradle index b1048982..eba3f74a 100644 --- a/demo-app/build.gradle +++ b/demo-app/build.gradle @@ -38,6 +38,7 @@ android { } testOptions { + animationsDisabled = true unitTests { includeAndroidResources = true returnDefaultValues = true diff --git a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/NewCardFragmentTestUtils.kt b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/NewCardFragmentTestUtils.kt new file mode 100644 index 00000000..8a1ce29d --- /dev/null +++ b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/NewCardFragmentTestUtils.kt @@ -0,0 +1,197 @@ +package com.worldpay.access.checkout.sample.card.standard.testutil + +import android.view.View +import androidx.test.core.app.ActivityScenario +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.action.ViewActions.click +import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.ViewMatchers.isChecked +import androidx.test.espresso.matcher.ViewMatchers.isDisplayed +import androidx.test.espresso.matcher.ViewMatchers.isEnabled +import androidx.test.espresso.matcher.ViewMatchers.isNotChecked +import androidx.test.espresso.matcher.ViewMatchers.isNotEnabled +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.espresso.matcher.ViewMatchers.withParent +import androidx.test.espresso.matcher.ViewMatchers.withTagValue +import androidx.test.espresso.matcher.ViewMatchers.withText +import androidx.test.ext.junit.rules.ActivityScenarioRule +import com.worldpay.access.checkout.sample.MainActivity +import com.worldpay.access.checkout.sample.R +import com.worldpay.access.checkout.sample.testutil.NewAbstractFragmentTestUtils +import com.worldpay.access.checkout.sample.testutil.UITestUtils.uiObjectWithId +import com.worldpay.access.checkout.ui.AccessCheckoutEditText +import org.hamcrest.Matcher +import org.hamcrest.Matchers + +class NewCardFragmentTestUtils(activityRule: ActivityScenarioRule) : NewAbstractFragmentTestUtils(activityRule) { + + enum class Input { + PAN, CVC, EXPIRY_DATE + } + + fun isInInitialState() = apply { + progressBarNotVisible() + enabledStateIs(pan = true, cvc = true, expiryDate = true, submitButton = false) + cardDetailsAre(pan = "", cvc = "", expiryDate = "") + hasNoBrand() + paymentsCvcSessionCheckedState(checked = false) + } + + fun setPaymentsCvcSwitchState(checked: Boolean) = apply { + wait2 { onView(withId(R.id.card_flow_payments_cvc_switch)).check(matches(isDisplayed())) } + + if (checked != withId(R.id.card_flow_payments_cvc_switch).matches(isChecked())) + uiObjectWithId(R.id.card_flow_payments_cvc_switch).click() + } + + fun paymentsCvcSessionCheckedState(checked: Boolean) = apply { + val checkedViewMatcher = if (checked) isChecked() else isNotChecked() + wait2 { onView(withId(R.id.card_flow_payments_cvc_switch)).check(matches(isDisplayed())) } + wait2 { onView(withId(R.id.card_flow_payments_cvc_switch)).check(matches(checkedViewMatcher)) } + } + + fun requestIsInProgress() = apply { + progressBarIsVisible() + enabledStateIs(pan = false, cvc = false, expiryDate = false, paymentsCvcSwitch = false, submitButton = false) + } + + fun hasResponseDialogWithMessage(response: String) = apply { + dialogHasText(response) + } + + fun hasErrorDialogWithMessage(error: String) = apply { + dialogHasText(error) + } + + fun closeDialog() = apply { + onView(withId(android.R.id.button1)).perform(click()) + } + + fun isInErrorState(pan: String? = null, cvc: String? = null, expiryDate: String? = null) = apply { + progressBarNotVisible() + enabledStateIs(pan = true, cvc = true, expiryDate = true, paymentsCvcSwitch = true, submitButton = true) + cardDetailsAre(pan, cvc, expiryDate) + } + + fun enabledStateIs( + pan: Boolean? = null, + cvc: Boolean? = null, + expiryDate: Boolean? = null, + paymentsCvcSwitch: Boolean? = null, + submitButton: Boolean? = null + ) = apply { + lateinit var enabledViewMatcher: Matcher + lateinit var viewMatcher: Matcher + + val accessCheckoutFieldViewMatcher: AccessCheckoutFieldViewMatcher = when { + pan != null -> AccessCheckoutFieldViewMatcher.PanViewMatcher(pan) + cvc != null -> AccessCheckoutFieldViewMatcher.CvcViewMatcher(cvc) + expiryDate != null -> AccessCheckoutFieldViewMatcher.ExpiryDateViewMatcher(expiryDate) + paymentsCvcSwitch != null -> AccessCheckoutFieldViewMatcher.SwitchViewMatcher(paymentsCvcSwitch) + submitButton != null -> AccessCheckoutFieldViewMatcher.SubmitButtonViewMatcher(submitButton) + else -> throw RuntimeException("field view matcher not recognised") + } + + wait2 { onView(accessCheckoutFieldViewMatcher.viewMatcher).check(matches(isDisplayed())) } + wait2 { onView(accessCheckoutFieldViewMatcher.viewMatcher).check(matches(accessCheckoutFieldViewMatcher.enabledViewMatcher)) } + + } + + fun clickSubmitButton() = apply { + enabledStateIs(submitButton = true) + uiObjectWithId(R.id.card_flow_btn_submit).click() + } + + fun focusOn(input: Input) = apply { + when (input) { + Input.PAN -> uiObjectWithId(R.id.card_flow_text_pan).click() + Input.CVC -> uiObjectWithId(R.id.cvc_flow_text_cvc).click() + Input.EXPIRY_DATE -> uiObjectWithId(R.id.card_flow_expiry_date).click() + } + } + + fun enterCardDetails( + pan: String? = null, + cvc: String? = null, + expiryDate: String? = null, + assertText: Boolean = false + ) = apply { + if (pan != null) enterText(R.id.card_flow_text_pan, pan) + if (cvc != null) enterText(R.id.card_flow_text_cvc, cvc) + if (expiryDate != null) enterText(R.id.card_flow_expiry_date, expiryDate) + + if (assertText) { + cardDetailsAre(pan, cvc, expiryDate) + } + } + + fun enterPanCvcExpirydate(pan: String, cvc: String, expiryDate: String) = apply { + assertViewIsVisible(R.id.card_flow_text_pan) + assertViewIsVisible(R.id.card_flow_text_cvc) + assertViewIsVisible(R.id.card_flow_expiry_date) + enterTextOnViewWithId(pan, R.id.card_flow_text_pan) + enterTextOnViewWithId(cvc, R.id.card_flow_text_cvc) + enterTextOnViewWithId(expiryDate, R.id.card_flow_expiry_date) + } + + fun clearCardDetails( + pan: Boolean? = null, + cvc: Boolean? = null, + expiryDate: Boolean? = null + ) { + if (pan == true) clearText(R.id.card_flow_text_pan) + if (expiryDate == true) clearText(R.id.card_flow_expiry_date) + if (cvc == true) clearText(R.id.card_flow_text_cvc) + } + + fun setCursorPositionOnPan(position: Int) = apply { + setCursorPosition(R.id.card_flow_text_pan, position, position) + } + + fun cursorPositionIs(position: Int) = apply { + wait2 { onView(withId(R.id.card_flow_text_pan)).check { view, noViewFoundException -> + val isPosition = (view as AccessCheckoutEditText).selectionEnd == position + isPosition + } + } + } + + fun cardDetailsAre(pan: String? = null, cvc: String? = null, expiryDate: String? = null) = apply { + if (pan != null) wait2 { onView(withText(pan)).check(matches(isDisplayed())) } + if (pan != null) wait2 { onView(withText(cvc)).check(matches(isDisplayed())) } + if (pan != null) wait2 { onView(withText(expiryDate)).check(matches(isDisplayed())) } + } + + fun validationStateIs( + pan: Boolean? = null, + cvc: Boolean? = null, + expiryDate: Boolean? = null + ) = apply { +// if (pan != null) checkValidationState(R.id.card_flow_text_pan, pan, "pan") + if (pan != null) checkValidationState(withParent(withId(R.id.card_flow_text_pan)), pan, "pan") + if (cvc != null) checkValidationState(withParent(withId(R.id.card_flow_text_cvc)), cvc, "cvc") + if (expiryDate != null) checkValidationState(withParent(withId(R.id.card_flow_expiry_date)), expiryDate, "expiry date") + } + + fun hasNoBrand() = apply { + var resourceEntryName = "" + activityRule.scenario.onActivity(ActivityScenario.ActivityAction { activity -> + resourceEntryName = activity.resources.getResourceEntryName(R.drawable.card_unknown_logo) + }) + wait2 { onView(withId(R.id.card_flow_brand_logo)).check(matches(withTagValue(Matchers.`is`(resourceEntryName)))) } + } + + fun hasBrand(cardBrand: CardBrand) = apply { + wait2(20000) { onView(withId(R.id.card_flow_brand_logo)).check(matches(withTagValue(Matchers.`is`(cardBrand.cardBrandName)))) } + } + + sealed class AccessCheckoutFieldViewMatcher(val viewMatcher: Matcher, val isEnabled: Boolean) { + val enabledViewMatcher: Matcher = if (isEnabled) isEnabled() else isNotEnabled() + class PanViewMatcher(isEnabled: Boolean) : AccessCheckoutFieldViewMatcher(withParent(withId(R.id.card_flow_text_pan)), isEnabled) + class CvcViewMatcher(isEnabled: Boolean) : AccessCheckoutFieldViewMatcher(withParent(withId(R.id.card_flow_text_cvc)), isEnabled) + class ExpiryDateViewMatcher(isEnabled: Boolean) : AccessCheckoutFieldViewMatcher(withParent(withId(R.id.card_flow_expiry_date)), isEnabled) + class SwitchViewMatcher(isEnabled: Boolean) : AccessCheckoutFieldViewMatcher(withId(R.id.card_flow_payments_cvc_switch), isEnabled) + class SubmitButtonViewMatcher(isEnabled: Boolean) : AccessCheckoutFieldViewMatcher(withId(R.id.card_flow_btn_submit), isEnabled) + } + +} diff --git a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/testutil/NewAbstractFragmentTestUtils.kt b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/testutil/NewAbstractFragmentTestUtils.kt new file mode 100644 index 00000000..9271115e --- /dev/null +++ b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/testutil/NewAbstractFragmentTestUtils.kt @@ -0,0 +1,151 @@ +package com.worldpay.access.checkout.sample.testutil + +import android.util.Log +import android.view.View +import android.widget.EditText +import androidx.core.content.res.ResourcesCompat +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.UiController +import androidx.test.espresso.ViewAction +import androidx.test.espresso.action.ViewActions +import androidx.test.espresso.action.ViewActions.closeSoftKeyboard +import androidx.test.espresso.action.ViewActions.typeText +import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.RootMatchers.isDialog +import androidx.test.espresso.matcher.ViewMatchers +import androidx.test.espresso.matcher.ViewMatchers.hasTextColor +import androidx.test.espresso.matcher.ViewMatchers.isDisplayed +import androidx.test.espresso.matcher.ViewMatchers.isEnabled +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.espresso.matcher.ViewMatchers.withText +import androidx.test.ext.junit.rules.ActivityScenarioRule +import com.worldpay.access.checkout.sample.MainActivity +import com.worldpay.access.checkout.sample.R +import org.hamcrest.Matcher +import kotlin.test.assertTrue + +abstract class NewAbstractFragmentTestUtils(protected val activityRule: ActivityScenarioRule) { + private fun progressBar() = UITestUtils.uiObjectWithId(R.id.loading_bar) + + protected fun progressBarIsVisible(msToWait: Long = 3000L): Boolean { + return progressBar().waitForExists(msToWait) + } + + protected fun progressBarNotVisible() { + wait2 { assertTrue(progressBar().waitUntilGone(3000)) } + } + + protected fun checkValidationState( + viewMatcher: Matcher, + isValid: Boolean, + field: String + ) = also { + wait2 { + onView(viewMatcher).check(matches(hasTextColor( + when (isValid) { + true -> R.color.SUCCESS + false -> R.color.FAIL + } + ))) + } + } + + protected fun enterText(id: Int, text: String) { + wait2 { onView(withId(id)).check(matches(isDisplayed())) } + wait2 { onView(withId(id)).check(matches(isEnabled())) } + + val editTextUI = UITestUtils.uiObjectWithId(id) + editTextUI.click() + + onView(ViewMatchers.withParent(withId(id))).perform(typeText(text)) + Log.i("msg", "edit text ui") + + onView(ViewMatchers.withParent(withId(id))).perform(closeSoftKeyboard()) + } + + protected fun enterTextOnViewWithId(text: String, id: Int) = also { + onView(withId(id)) + .perform(typeText(text)) + } + + protected fun assertViewIsVisible(id: Int) { + wait2 { onView(withId(id)) + .check(matches(isDisplayed())) } + } + + protected fun clearText(id: Int) { + wait2 { onView(withId(id)).check(matches(isDisplayed())) } + wait2 { onView(withId(id)).check(matches(isEnabled())) } + + val editTextUI = UITestUtils.uiObjectWithId(id) + editTextUI.click() + onView(withId(id)).perform(ViewActions.clearText()) + } + + protected fun setCursorPosition( + id: Int, + startSelection: Int, + endSelection: Int + ) { + activityRule.scenario.onActivity { mainActivity -> + mainActivity.runOnUiThread { + onView(withId(id)).perform( + object : ViewAction { + override fun getConstraints(): Matcher { + return withId(id) + } + + override fun getDescription(): String { + return "set selection for view with $id" + } + + override fun perform(uiController: UiController?, view: View?) { + if (view is EditText) { + view.setSelection(startSelection, endSelection) + } + } + + } + ) + } + } + } + + protected fun dialogHasText(text: String) { + onView(withText(text)) + .inRoot(isDialog()) + .check(matches(isDisplayed())) + } + + private fun color(colorId: Int) : Int { + var colorInt = 0 + activityRule.scenario.onActivity { mainActivity -> + colorInt = ResourcesCompat.getColor(mainActivity.resources, colorId, mainActivity.theme) + } + return colorInt + } + + protected inline fun wait2(maxWaitTimeInMillis: Int = 1000, assertions: () -> Unit) { + val pauseInterval = 100 + val maxTimes = maxWaitTimeInMillis / pauseInterval + + for (i in 0..maxTimes) { + try { + assertions() + } catch (exception: RuntimeException) { + if (i == maxTimes) { + val seconds = maxWaitTimeInMillis / 1000 + throw RuntimeException( + "Failed assertion after waiting $seconds seconds: ${exception.message}", + exception + ) + } else { + Thread.sleep(pauseInterval.toLong()) + Log.d(javaClass.simpleName, "Retrying assertion with pause interval: $pauseInterval") + continue + } + } + break + } + } +} diff --git a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/testutil/UITestUtils.kt b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/testutil/UITestUtils.kt index 01883b73..1493e469 100644 --- a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/testutil/UITestUtils.kt +++ b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/testutil/UITestUtils.kt @@ -14,8 +14,8 @@ import androidx.test.espresso.contrib.DrawerActions.open import androidx.test.espresso.contrib.DrawerMatchers.isOpen import androidx.test.espresso.contrib.NavigationViewActions import androidx.test.espresso.matcher.RootMatchers.isDialog -import androidx.test.espresso.matcher.ViewMatchers import androidx.test.espresso.matcher.ViewMatchers.* +import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation import androidx.test.rule.ActivityTestRule import androidx.test.uiautomator.UiDevice.getInstance @@ -72,6 +72,30 @@ object UITestUtils { } } + fun rotatePortrait(activityRule: ActivityScenarioRule) { + activityRule.scenario.onActivity { activity -> + activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT + + await().atMost(10, TimeUnit.SECONDS).until { + + val drawerIsVisible = + activity.findViewById(R.id.drawer_layout).isVisible + val progressBarIsVisible = + activity.findViewById(R.id.loading_bar).isVisible + + if (!drawerIsVisible && !progressBarIsVisible) { + onView(withId(android.R.id.button1)) + .inRoot(isDialog()) + .check(matches(isDisplayed())) + } + + Thread.sleep(2000) + + true + } + } + } + fun rotatePortrait(activityRule: ActivityTestRule) { activityRule.activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT @@ -160,10 +184,10 @@ object UITestUtils { } fun onCardPanView(): ViewInteraction { - return onView(ViewMatchers.withParent(withId(R.id.card_flow_text_pan))) + return onView(withParent(withId(R.id.card_flow_text_pan))) } fun onCvcOnlyCvcView(): ViewInteraction { - return onView(ViewMatchers.withParent(withId(R.id.cvc_flow_text_cvc))) + return onView(withParent(withId(R.id.cvc_flow_text_cvc))) } } diff --git a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/CustomScreenCaptureProcessor.kt b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/CustomScreenCaptureProcessor.kt new file mode 100644 index 00000000..f82f164a --- /dev/null +++ b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/CustomScreenCaptureProcessor.kt @@ -0,0 +1,86 @@ +//package com.worldpay.access.checkout.sample.utils +// +//import android.os.Build +//import android.util.Log +//import androidx.annotation.VisibleForTesting +//import androidx.test.runner.screenshot.ScreenCapture +//import androidx.test.runner.screenshot.ScreenCaptureProcessor +//import java.io.BufferedOutputStream +//import java.io.File +//import java.io.FileOutputStream +//import java.io.IOException +//import java.util.Locale +//import java.util.UUID +// +//class CustomScreenCaptureProcessor(val defaultScreenshotPath: File) : ScreenCaptureProcessor { +// private val sAndroidRuntimeVersion = Build.VERSION.SDK_INT +// private val sAndroidDeviceName = Build.DEVICE +// +// val mTag = "CustomScreenCaptureProcessor" +// val mFileNameDelimiter = "-" +// val mDefaultFilenamePrefix = "screenshot" +// val mDefaultScreenshotPath = defaultScreenshotPath +// +// @Throws(IOException::class) +// override fun process(capture: ScreenCapture): String? { +// var filename = if (capture.name == null) getDefaultFilename() else getFilename(capture.name) +// filename += "." + capture.format.toString().lowercase(Locale.getDefault()) +// val imageFolder: File = mDefaultScreenshotPath +// imageFolder.mkdirs() +// if (!imageFolder.isDirectory && !imageFolder.canWrite()) { +// throw IOException( +// String.format( +// "The directory %s does not exist and could not be created or is not " + "writable.", +// imageFolder +// ) +// ) +// } +// val imageFile = File(imageFolder, filename) +// var out: BufferedOutputStream? = null +// try { +// out = BufferedOutputStream(FileOutputStream(imageFile)) +// capture.bitmap.compress(capture.format, 100, out) +// out.flush() +// } finally { +// try { +// out?.close() +// } catch (e: IOException) { +// Log.e(mTag, "Could not close output steam.", e) +// } +// } +// return filename +// } +// +// /** Returns the default filename for this class suffixed with a UUID. */ +// protected fun getDefaultFilename(): String? { +// return getFilename( +// mDefaultFilenamePrefix +// + mFileNameDelimiter +// + Companion.sAndroidDeviceName +// + mFileNameDelimiter +// + Companion.sAndroidRuntimeVersion +// ) +// } +// +// /** Returns the filename created from the given prifix and suffixed with a UUID. */ +// protected fun getFilename(prefix: String): String? { +// return prefix + mFileNameDelimiter + UUID.randomUUID() +// } +// +// @VisibleForTesting +// fun setAndroidDeviceName(deviceName: String?) { +// Companion.sAndroidDeviceName = deviceName +// } +// +// @VisibleForTesting +// fun setAndroidRuntimeVersion(sdkInt: Int) { +// Companion.sAndroidRuntimeVersion = sdkInt +// } +// +// companion object { +// var sAndroidDeviceName: String? = "" +// var sAndroidRuntimeVersion: Int? = 0 +// } +// +//} +// diff --git a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/CustomTestRule.kt b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/CustomTestRule.kt new file mode 100644 index 00000000..b4e8ec1c --- /dev/null +++ b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/CustomTestRule.kt @@ -0,0 +1,15 @@ +//package com.worldpay.access.checkout.sample.utils +// +//import org.junit.Rule +//import org.junit.rules.RuleChain +//import org.junit.rules.TestRule +// +// +//class CustomTestRule { +// private val _activityRule: ActivityTestRule = ActivityTestRule() +// +// @Rule +// val activityAndScreenshotRule: TestRule = RuleChain +// .outerRule(_activityRule) +// .around(ScreenshotTestRule()) +//} diff --git a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/ScreenshotTestRule.kt b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/ScreenshotTestRule.kt new file mode 100644 index 00000000..8730bb4e --- /dev/null +++ b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/ScreenshotTestRule.kt @@ -0,0 +1,39 @@ +//package com.worldpay.access.checkout.sample.utils +// +//import android.content.Context +//import android.graphics.Bitmap.CompressFormat +//import android.os.Environment.DIRECTORY_PICTURES +//import androidx.test.core.app.ApplicationProvider.getApplicationContext +//import androidx.test.runner.screenshot.ScreenCaptureProcessor +//import androidx.test.runner.screenshot.Screenshot +//import org.junit.rules.TestWatcher +//import org.junit.runner.Description +//import java.io.File +//import java.io.IOException +// +// +//class ScreenshotTestRule : TestWatcher() { +// override fun failed(e: Throwable?, description: Description) { +// super.failed(e, description) +// val filename: String = +// description.testClass.simpleName + "-" + description.methodName +// val capture = Screenshot.capture() +// capture.name = filename +// capture.format = CompressFormat.PNG +// val processors = HashSet() +// processors.add( +// CustomScreenCaptureProcessor( +// File( +//// InstrumentationRegistry.getTargetContext().getExternalFilesDir(DIRECTORY_PICTURES), +// getApplicationContext().getExternalFilesDir(DIRECTORY_PICTURES), +// "test_run_screenshots" +// ) +// ) +// ) +// try { +// capture.process(processors) +// } catch (e: IOException) { +// e.printStackTrace() +// } +// } +//} \ No newline at end of file diff --git a/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/NewDiscoveryIntegrationTest.kt b/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/NewDiscoveryIntegrationTest.kt new file mode 100644 index 00000000..1a9544f3 --- /dev/null +++ b/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/NewDiscoveryIntegrationTest.kt @@ -0,0 +1,69 @@ +package com.worldpay.access.checkout.sample + +import androidx.test.ext.junit.rules.ActivityScenarioRule +import com.worldpay.access.checkout.client.session.model.SessionType.CARD +import com.worldpay.access.checkout.client.session.model.SessionType.CVC +import com.worldpay.access.checkout.sample.card.standard.testutil.NewCardFragmentTestUtils +import com.worldpay.access.checkout.sample.cvc.NewCvcFragmentTestUtils +import com.worldpay.access.checkout.sample.stub.RootResourseMockStub.simulateRootResourceTemporaryServerError +import com.worldpay.access.checkout.sample.testutil.UITestUtils.navigateTo +import org.junit.Before +import org.junit.Rule +import org.junit.Test + +class NewDiscoveryIntegrationTest { + // WIP + + private val amexCard = "343434343434343" + private val amexCvc = "1234" + private val expiryDate = "1299" + + @get:Rule + var activityTestRule = ActivityScenarioRule(MainActivity::class.java) + + @Before + fun setup() { + simulateRootResourceTemporaryServerError() + } + + @Test + fun shouldRetryDiscoveryAndReturnSuccessfulResponse_whenDiscoveryFailsFirstTime_cardFlow() { + navigateTo(R.id.nav_card_flow) + + val cardFragmentTestUtils = NewCardFragmentTestUtils(activityTestRule) + + activityTestRule.scenario.onActivity { activity -> + cardFragmentTestUtils + .isInInitialState() + .enterCardDetails(pan = amexCard, cvc = amexCvc, expiryDate = expiryDate) + .enabledStateIs(submitButton = true) + .clickSubmitButton() + .requestIsInProgress() + .hasResponseDialogWithMessage( + mapOf(CARD to activity.getString(R.string.card_session_reference)).toString() + ) + .closeDialog() + .isInInitialState() + } + } + + @Test + fun shouldRetryDiscoveryAndReturnSuccessfulResponse_whenDiscoveryFailsFirstTime_cvcFlow() { + navigateTo(R.id.nav_cvc_flow) + + val cvcFragmentTestUtils = NewCvcFragmentTestUtils(activityTestRule) + + activityTestRule.scenario.onActivity { activity -> + cvcFragmentTestUtils + .isInInitialState() + .enterCardDetails(cvc = "123") + .clickSubmitButton() + .requestIsInProgress() + .hasResponseDialogWithMessage( + mapOf(CVC to activity.getString(R.string.cvc_session_reference)).toString() + ) + .closeDialog() + .isInInitialState() + } + } +} diff --git a/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/NewCardConfigurationIntegrationTest.kt b/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/NewCardConfigurationIntegrationTest.kt new file mode 100644 index 00000000..27433198 --- /dev/null +++ b/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/NewCardConfigurationIntegrationTest.kt @@ -0,0 +1,84 @@ +package com.worldpay.access.checkout.sample.card + +import androidx.test.ext.junit.rules.ActivityScenarioRule +import com.worldpay.access.checkout.client.session.model.SessionType.CARD +import com.worldpay.access.checkout.sample.MainActivity +import com.worldpay.access.checkout.sample.R +import com.worldpay.access.checkout.sample.card.CardNumberUtil.MASTERCARD_PAN +import com.worldpay.access.checkout.sample.card.CardNumberUtil.MASTERCARD_PAN_FORMATTED +import com.worldpay.access.checkout.sample.card.CardNumberUtil.VALID_UNKNOWN_LUHN +import com.worldpay.access.checkout.sample.card.CardNumberUtil.VALID_UNKNOWN_LUHN_FORMATTED +import com.worldpay.access.checkout.sample.card.standard.testutil.NewCardFragmentTestUtils +import com.worldpay.access.checkout.sample.stub.CardConfigurationMockStub.simulateCardConfigurationServerError +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.rules.ExternalResource +import org.junit.runner.Description +import org.junit.runners.model.Statement + +class NewCardConfigurationIntegrationTest { + + @get:Rule + var cardConfigurationErrorRule = NewCardConfigurationErrorRule(ActivityScenarioRule(MainActivity::class.java)) + + private lateinit var cardFragmentTestUtils: NewCardFragmentTestUtils + + @Before + fun setup() { + cardFragmentTestUtils = NewCardFragmentTestUtils(cardConfigurationErrorRule.innerRule) + } + + @Test + fun givenCardConfigCallFails_validKnownBrandCardDetails_returnsSuccessfulResponse() { + cardFragmentTestUtils + .enterCardDetails(pan = MASTERCARD_PAN, cvc = "1234", expiryDate = "1299") + .cardDetailsAre(pan = MASTERCARD_PAN_FORMATTED, cvc = "1234", expiryDate = "12/99") + .hasNoBrand() + .validationStateIs(pan = true, cvc = true, expiryDate = true) + .enabledStateIs(submitButton = true) + .clickSubmitButton() + .requestIsInProgress() + .hasResponseDialogWithMessage( run { + var ref = "" + cardConfigurationErrorRule.innerRule.scenario.onActivity { activity -> + ref = activity.getString(R.string.card_session_reference) + } + mapOf(CARD to ref).toString() + }) + } + + @Test + fun givenCardConfigCallFails_validUnknownBrandCardDetails_returnsSuccessfulResponse() { + cardFragmentTestUtils + .enterCardDetails(pan = VALID_UNKNOWN_LUHN, cvc = "1234", expiryDate = "1299") + .cardDetailsAre(pan = VALID_UNKNOWN_LUHN_FORMATTED, cvc = "1234", expiryDate = "12/99") + .hasNoBrand() + .validationStateIs(pan = true, cvc = true, expiryDate = true) + .enabledStateIs(submitButton = true) + .clickSubmitButton() + .requestIsInProgress() + .hasResponseDialogWithMessage( run { + var ref = "" + cardConfigurationErrorRule.innerRule.scenario.onActivity { activity -> + ref = activity.getString(R.string.card_session_reference) + } + mapOf(CARD to ref).toString() + }) + } +} + +class NewCardConfigurationErrorRule(val innerRule: ActivityScenarioRule) : ExternalResource() { + + override fun apply(base: Statement, description: Description): Statement { + return super.apply(innerRule.apply(base, description), description) + } + + override fun before() { + super.before() + // This card configuration rule adds stubs to mockserver to simulate a server error condition on the card configuration endpoint. + // On initialisation of our SDK, the SDK will trigger a card configuration call which will get back this error + // response. + simulateCardConfigurationServerError() + } +} diff --git a/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/standard/testutil/NewAbstractCardFragmentTest.kt b/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/standard/testutil/NewAbstractCardFragmentTest.kt new file mode 100644 index 00000000..082c459b --- /dev/null +++ b/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/standard/testutil/NewAbstractCardFragmentTest.kt @@ -0,0 +1,55 @@ +package com.worldpay.access.checkout.sample.card.standard.testutil + +import android.content.Intent +import androidx.test.espresso.action.ViewActions.closeSoftKeyboard +import androidx.test.ext.junit.rules.ActivityScenarioRule +import com.worldpay.access.checkout.sample.MainActivity +import com.worldpay.access.checkout.sample.MockServer.defaultStubMappings +import com.worldpay.access.checkout.sample.testutil.UITestUtils.rotatePortrait +import java.util.concurrent.TimeUnit +import org.awaitility.kotlin.await +import org.junit.Before +import org.junit.Rule + +abstract class NewAbstractCardFragmentTest { + + @get:Rule + var activityRule = ActivityScenarioRule(MainActivity::class.java) + + lateinit var cardFragmentTestUtils: NewCardFragmentTestUtils + + @Before + fun setup() { + cardFragmentTestUtils = NewCardFragmentTestUtils(activityRule) + activityRule.scenario.onActivity { activity -> + defaultStubMappings(activity) + closeSoftKeyboard() + rotatePortrait(activityRule) + } + } + + fun clearPan() { + cardFragmentTestUtils.clearCardDetails(pan = true) + } + + fun restartApp() { + activityRule.scenario.onActivity { activity -> + val intent = Intent(activity::class.java.name) + activity.finish() + activity.startActivity(intent) + } + + await.atMost(5, TimeUnit.SECONDS).until { + applicationIsVisible() + } + } + + private fun applicationIsVisible(): Boolean { + return try { + cardFragmentTestUtils.isInInitialState() + true + } catch (e: Exception) { + false + } + } +} diff --git a/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/cvc/NewCvcFragmentTestUtils.kt b/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/cvc/NewCvcFragmentTestUtils.kt new file mode 100644 index 00000000..bb0df996 --- /dev/null +++ b/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/cvc/NewCvcFragmentTestUtils.kt @@ -0,0 +1,79 @@ +package com.worldpay.access.checkout.sample.cvc + +import android.R +import androidx.test.espresso.Espresso +import androidx.test.espresso.action.ViewActions +import androidx.test.espresso.assertion.ViewAssertions +import androidx.test.espresso.matcher.ViewMatchers +import androidx.test.espresso.matcher.ViewMatchers.withId +import androidx.test.espresso.matcher.ViewMatchers.withParent +import androidx.test.ext.junit.rules.ActivityScenarioRule +import com.worldpay.access.checkout.sample.MainActivity +import com.worldpay.access.checkout.sample.testutil.NewAbstractFragmentTestUtils +import com.worldpay.access.checkout.sample.testutil.UITestUtils + +class NewCvcFragmentTestUtils(activityRule: ActivityScenarioRule) : NewAbstractFragmentTestUtils(activityRule) { + fun isInInitialState() = also { + progressBarNotVisible() + enabledStateIs(cvc = true, submitButton = false) + cardDetailsAre(cvc = "") + } + + fun requestIsInProgress() = also { + progressBarIsVisible() + enabledStateIs(cvc = false, submitButton = false) + } + + fun hasResponseDialogWithMessage(response: String) = also { + dialogHasText(response) + } + + fun closeDialog() = also { + Espresso.onView(ViewMatchers.withId(R.id.button1)).perform(ViewActions.click()) + } + + fun enabledStateIs(cvc: Boolean? = null, submitButton: Boolean? = null) = also { + val visibleMsg = "visibility state" + val enableMsg = "enabled state" + + if (cvc != null) { + wait2 { Espresso.onView(ViewMatchers.withId(com.worldpay.access.checkout.sample.R.id.cvc_flow_text_cvc)) + .check(ViewAssertions.matches(ViewMatchers.isDisplayed())) } + wait2 { Espresso.onView(ViewMatchers.withId(com.worldpay.access.checkout.sample.R.id.cvc_flow_text_cvc)) + .check(ViewAssertions.matches(ViewMatchers.isEnabled())) } + } + + if (submitButton != null) { + wait2 { Espresso.onView(ViewMatchers.withId(com.worldpay.access.checkout.sample.R.id.cvc_flow_btn_submit)) + .check(ViewAssertions.matches(ViewMatchers.isDisplayed())) } + wait2 { Espresso.onView(ViewMatchers.withId(com.worldpay.access.checkout.sample.R.id.cvc_flow_btn_submit)) + .check(ViewAssertions.matches(ViewMatchers.isEnabled())) } + } + } + + fun validationStateIs(cvv: Boolean) = also { + checkValidationState(withParent(withId(com.worldpay.access.checkout.sample.R.id.cvc_flow_text_cvc)), cvv, "cvv") + } + + fun focusOff() = also { + Espresso.onView(ViewMatchers.withId(com.worldpay.access.checkout.sample.R.id.cvc_flow_text_cvc)) + .perform() + } + + fun clickSubmitButton() = also { + enabledStateIs(submitButton = true) + UITestUtils.uiObjectWithId(com.worldpay.access.checkout.sample.R.id.cvc_flow_btn_submit).click() + } + + fun enterCardDetails(cvc: String, assertText: Boolean = false) = also { + enterText(com.worldpay.access.checkout.sample.R.id.cvc_flow_text_cvc, cvc) + if (assertText) { + cardDetailsAre(cvc) + } + } + + fun cardDetailsAre(cvc: String) = also { + wait2 { Espresso.onView(ViewMatchers.withId(com.worldpay.access.checkout.sample.R.id.cvc_flow_text_cvc)) + .check(ViewAssertions.matches(ViewMatchers.withText(cvc))) } + } +} \ No newline at end of file diff --git a/demo-app/src/main/java/com/worldpay/access/checkout/sample/images/SVGImageLoader.kt b/demo-app/src/main/java/com/worldpay/access/checkout/sample/images/SVGImageLoader.kt index 7ffc92f1..63673348 100644 --- a/demo-app/src/main/java/com/worldpay/access/checkout/sample/images/SVGImageLoader.kt +++ b/demo-app/src/main/java/com/worldpay/access/checkout/sample/images/SVGImageLoader.kt @@ -119,5 +119,6 @@ class SVGImageLoader @JvmOverloads constructor( target.setImageResource(R.drawable.card_unknown_logo) val resourceEntryName = target.resources.getResourceEntryName(R.drawable.card_unknown_logo) target.setTag(R.integer.card_tag, resourceEntryName) + target.tag = resourceEntryName } } diff --git a/demo-app/src/main/java/com/worldpay/access/checkout/sample/images/SVGImageRenderer.kt b/demo-app/src/main/java/com/worldpay/access/checkout/sample/images/SVGImageRenderer.kt index a54f3b9a..b7daecd8 100644 --- a/demo-app/src/main/java/com/worldpay/access/checkout/sample/images/SVGImageRenderer.kt +++ b/demo-app/src/main/java/com/worldpay/access/checkout/sample/images/SVGImageRenderer.kt @@ -38,7 +38,8 @@ class SVGImageRendererImpl( Log.d("SVGImageRendererImpl", "Applying $brandName logo to target view") targetView.setLayerType(View.LAYER_TYPE_SOFTWARE, null) targetView.setImageDrawable(drawable) - targetView.setTag(R.integer.card_tag, brandName) +// targetView.setTag(R.integer.card_tag, brandName) + targetView.tag = brandName } ) } catch (e: Exception) { From 46ee43e9f28862f43a1002304fa24e1fa35b2c6c Mon Sep 17 00:00:00 2001 From: TyreseWp Date: Thu, 8 Aug 2024 10:27:07 +0100 Subject: [PATCH 02/10] US1955755: remove commented code --- .../utils/CustomScreenCaptureProcessor.kt | 86 ------------------- .../checkout/sample/utils/CustomTestRule.kt | 15 ---- .../sample/utils/ScreenshotTestRule.kt | 39 --------- 3 files changed, 140 deletions(-) delete mode 100644 demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/CustomScreenCaptureProcessor.kt delete mode 100644 demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/CustomTestRule.kt delete mode 100644 demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/ScreenshotTestRule.kt diff --git a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/CustomScreenCaptureProcessor.kt b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/CustomScreenCaptureProcessor.kt deleted file mode 100644 index f82f164a..00000000 --- a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/CustomScreenCaptureProcessor.kt +++ /dev/null @@ -1,86 +0,0 @@ -//package com.worldpay.access.checkout.sample.utils -// -//import android.os.Build -//import android.util.Log -//import androidx.annotation.VisibleForTesting -//import androidx.test.runner.screenshot.ScreenCapture -//import androidx.test.runner.screenshot.ScreenCaptureProcessor -//import java.io.BufferedOutputStream -//import java.io.File -//import java.io.FileOutputStream -//import java.io.IOException -//import java.util.Locale -//import java.util.UUID -// -//class CustomScreenCaptureProcessor(val defaultScreenshotPath: File) : ScreenCaptureProcessor { -// private val sAndroidRuntimeVersion = Build.VERSION.SDK_INT -// private val sAndroidDeviceName = Build.DEVICE -// -// val mTag = "CustomScreenCaptureProcessor" -// val mFileNameDelimiter = "-" -// val mDefaultFilenamePrefix = "screenshot" -// val mDefaultScreenshotPath = defaultScreenshotPath -// -// @Throws(IOException::class) -// override fun process(capture: ScreenCapture): String? { -// var filename = if (capture.name == null) getDefaultFilename() else getFilename(capture.name) -// filename += "." + capture.format.toString().lowercase(Locale.getDefault()) -// val imageFolder: File = mDefaultScreenshotPath -// imageFolder.mkdirs() -// if (!imageFolder.isDirectory && !imageFolder.canWrite()) { -// throw IOException( -// String.format( -// "The directory %s does not exist and could not be created or is not " + "writable.", -// imageFolder -// ) -// ) -// } -// val imageFile = File(imageFolder, filename) -// var out: BufferedOutputStream? = null -// try { -// out = BufferedOutputStream(FileOutputStream(imageFile)) -// capture.bitmap.compress(capture.format, 100, out) -// out.flush() -// } finally { -// try { -// out?.close() -// } catch (e: IOException) { -// Log.e(mTag, "Could not close output steam.", e) -// } -// } -// return filename -// } -// -// /** Returns the default filename for this class suffixed with a UUID. */ -// protected fun getDefaultFilename(): String? { -// return getFilename( -// mDefaultFilenamePrefix -// + mFileNameDelimiter -// + Companion.sAndroidDeviceName -// + mFileNameDelimiter -// + Companion.sAndroidRuntimeVersion -// ) -// } -// -// /** Returns the filename created from the given prifix and suffixed with a UUID. */ -// protected fun getFilename(prefix: String): String? { -// return prefix + mFileNameDelimiter + UUID.randomUUID() -// } -// -// @VisibleForTesting -// fun setAndroidDeviceName(deviceName: String?) { -// Companion.sAndroidDeviceName = deviceName -// } -// -// @VisibleForTesting -// fun setAndroidRuntimeVersion(sdkInt: Int) { -// Companion.sAndroidRuntimeVersion = sdkInt -// } -// -// companion object { -// var sAndroidDeviceName: String? = "" -// var sAndroidRuntimeVersion: Int? = 0 -// } -// -//} -// diff --git a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/CustomTestRule.kt b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/CustomTestRule.kt deleted file mode 100644 index b4e8ec1c..00000000 --- a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/CustomTestRule.kt +++ /dev/null @@ -1,15 +0,0 @@ -//package com.worldpay.access.checkout.sample.utils -// -//import org.junit.Rule -//import org.junit.rules.RuleChain -//import org.junit.rules.TestRule -// -// -//class CustomTestRule { -// private val _activityRule: ActivityTestRule = ActivityTestRule() -// -// @Rule -// val activityAndScreenshotRule: TestRule = RuleChain -// .outerRule(_activityRule) -// .around(ScreenshotTestRule()) -//} diff --git a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/ScreenshotTestRule.kt b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/ScreenshotTestRule.kt deleted file mode 100644 index 8730bb4e..00000000 --- a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/utils/ScreenshotTestRule.kt +++ /dev/null @@ -1,39 +0,0 @@ -//package com.worldpay.access.checkout.sample.utils -// -//import android.content.Context -//import android.graphics.Bitmap.CompressFormat -//import android.os.Environment.DIRECTORY_PICTURES -//import androidx.test.core.app.ApplicationProvider.getApplicationContext -//import androidx.test.runner.screenshot.ScreenCaptureProcessor -//import androidx.test.runner.screenshot.Screenshot -//import org.junit.rules.TestWatcher -//import org.junit.runner.Description -//import java.io.File -//import java.io.IOException -// -// -//class ScreenshotTestRule : TestWatcher() { -// override fun failed(e: Throwable?, description: Description) { -// super.failed(e, description) -// val filename: String = -// description.testClass.simpleName + "-" + description.methodName -// val capture = Screenshot.capture() -// capture.name = filename -// capture.format = CompressFormat.PNG -// val processors = HashSet() -// processors.add( -// CustomScreenCaptureProcessor( -// File( -//// InstrumentationRegistry.getTargetContext().getExternalFilesDir(DIRECTORY_PICTURES), -// getApplicationContext().getExternalFilesDir(DIRECTORY_PICTURES), -// "test_run_screenshots" -// ) -// ) -// ) -// try { -// capture.process(processors) -// } catch (e: IOException) { -// e.printStackTrace() -// } -// } -//} \ No newline at end of file From 4dbfb5884e05d7b35c409485ed6beda584744ed2 Mon Sep 17 00:00:00 2001 From: TyreseWp Date: Thu, 8 Aug 2024 10:28:36 +0100 Subject: [PATCH 03/10] US1955755: remove more commented code --- .../worldpay/access/checkout/sample/images/SVGImageRenderer.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/demo-app/src/main/java/com/worldpay/access/checkout/sample/images/SVGImageRenderer.kt b/demo-app/src/main/java/com/worldpay/access/checkout/sample/images/SVGImageRenderer.kt index b7daecd8..a413db9b 100644 --- a/demo-app/src/main/java/com/worldpay/access/checkout/sample/images/SVGImageRenderer.kt +++ b/demo-app/src/main/java/com/worldpay/access/checkout/sample/images/SVGImageRenderer.kt @@ -38,7 +38,6 @@ class SVGImageRendererImpl( Log.d("SVGImageRendererImpl", "Applying $brandName logo to target view") targetView.setLayerType(View.LAYER_TYPE_SOFTWARE, null) targetView.setImageDrawable(drawable) -// targetView.setTag(R.integer.card_tag, brandName) targetView.tag = brandName } ) From 46e610e14c38684b74284958eb92bb853a98a1f4 Mon Sep 17 00:00:00 2001 From: TyreseWp Date: Thu, 8 Aug 2024 10:43:34 +0100 Subject: [PATCH 04/10] US1955755: throw assertion error instead of runtime exception --- .../checkout/sample/testutil/NewAbstractFragmentTestUtils.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/testutil/NewAbstractFragmentTestUtils.kt b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/testutil/NewAbstractFragmentTestUtils.kt index 9271115e..f6cf670e 100644 --- a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/testutil/NewAbstractFragmentTestUtils.kt +++ b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/testutil/NewAbstractFragmentTestUtils.kt @@ -132,10 +132,10 @@ abstract class NewAbstractFragmentTestUtils(protected val activityRule: Activity for (i in 0..maxTimes) { try { assertions() - } catch (exception: RuntimeException) { + } catch (exception: AssertionError) { if (i == maxTimes) { val seconds = maxWaitTimeInMillis / 1000 - throw RuntimeException( + throw AssertionError( "Failed assertion after waiting $seconds seconds: ${exception.message}", exception ) From ef6103cca3ebaf3f6fe183e5de55cccb315a7496 Mon Sep 17 00:00:00 2001 From: TyreseWp Date: Fri, 9 Aug 2024 11:10:35 +0100 Subject: [PATCH 05/10] US1955755: refactor set tag to call tag in tests --- .../access/checkout/sample/images/SVGImageLoader.kt | 2 +- .../access/checkout/sample/images/SVGImageLoaderTest.kt | 6 ++++-- .../checkout/sample/images/SVGImageRendererImplTest.kt | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/demo-app/src/main/java/com/worldpay/access/checkout/sample/images/SVGImageLoader.kt b/demo-app/src/main/java/com/worldpay/access/checkout/sample/images/SVGImageLoader.kt index 63673348..30f2e93a 100644 --- a/demo-app/src/main/java/com/worldpay/access/checkout/sample/images/SVGImageLoader.kt +++ b/demo-app/src/main/java/com/worldpay/access/checkout/sample/images/SVGImageLoader.kt @@ -118,7 +118,7 @@ class SVGImageLoader @JvmOverloads constructor( Log.d("SVGImageLoader", "Applying card unknown logo to target view") target.setImageResource(R.drawable.card_unknown_logo) val resourceEntryName = target.resources.getResourceEntryName(R.drawable.card_unknown_logo) - target.setTag(R.integer.card_tag, resourceEntryName) +// target.setTag(R.integer.card_tag, resourceEntryName) target.tag = resourceEntryName } } diff --git a/demo-app/src/test/java/com/worldpay/access/checkout/sample/images/SVGImageLoaderTest.kt b/demo-app/src/test/java/com/worldpay/access/checkout/sample/images/SVGImageLoaderTest.kt index 28b54d49..0c21a2ff 100644 --- a/demo-app/src/test/java/com/worldpay/access/checkout/sample/images/SVGImageLoaderTest.kt +++ b/demo-app/src/test/java/com/worldpay/access/checkout/sample/images/SVGImageLoaderTest.kt @@ -86,7 +86,8 @@ class SVGImageLoaderTest { verifyZeroInteractions(client) verify(targetImageView).setImageResource(R.drawable.card_unknown_logo) - verify(targetImageView).setTag(R.integer.card_tag, "card_unknown_logo") +// verify(targetImageView).setTag(R.integer.card_tag, "card_unknown_logo") + verify(targetImageView).tag = "card_unknown_logo" } @Test @@ -114,7 +115,8 @@ class SVGImageLoaderTest { verifyZeroInteractions(client) verify(targetImageView).setImageResource(R.drawable.card_unknown_logo) - verify(targetImageView).setTag(R.integer.card_tag, "card_unknown_logo") +// verify(targetImageView).setTag(R.integer.card_tag, "card_unknown_logo") + verify(targetImageView).tag = "card_unknown_logo" } @Test diff --git a/demo-app/src/test/java/com/worldpay/access/checkout/sample/images/SVGImageRendererImplTest.kt b/demo-app/src/test/java/com/worldpay/access/checkout/sample/images/SVGImageRendererImplTest.kt index 3ee11220..bd44d3b2 100644 --- a/demo-app/src/test/java/com/worldpay/access/checkout/sample/images/SVGImageRendererImplTest.kt +++ b/demo-app/src/test/java/com/worldpay/access/checkout/sample/images/SVGImageRendererImplTest.kt @@ -54,7 +54,8 @@ class SVGImageRendererImplTest { verify(target).setImageDrawable(ArgumentMatchers.any(PictureDrawable::class.java)) verify(target).setLayerType(View.LAYER_TYPE_SOFTWARE, null) - verify(target).setTag(R.integer.card_tag, "someName") +// verify(target).setTag(R.integer.card_tag, "someName") + verify(target).tag = "someName" } @Test From 043ba67779b4a34ebe3e955a695824ee2ece1cf4 Mon Sep 17 00:00:00 2001 From: TyreseWp Date: Fri, 9 Aug 2024 11:51:38 +0100 Subject: [PATCH 06/10] US1955755: refactor get tag to not use a key --- .../sample/card/standard/testutil/CardFragmentTestUtils.kt | 6 ++++-- .../card/restricted/RestrictedCardFragmentTestUtils.kt | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/CardFragmentTestUtils.kt b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/CardFragmentTestUtils.kt index 4e03234a..0e92c2e2 100644 --- a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/CardFragmentTestUtils.kt +++ b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/CardFragmentTestUtils.kt @@ -202,12 +202,14 @@ class CardFragmentTestUtils(activityRule: ActivityTestRule) : Abst fun hasNoBrand(): CardFragmentTestUtils { val resourceEntryName = activity().resources.getResourceEntryName(R.drawable.card_unknown_logo) - wait { assertEquals(resourceEntryName, brandLogo().getTag(R.integer.card_tag)) } +// wait { assertEquals(resourceEntryName, brandLogo().getTag(R.integer.card_tag)) } + wait { assertEquals(resourceEntryName, brandLogo().tag) } return this } fun hasBrand(cardBrand: CardBrand): CardFragmentTestUtils { - wait(maxWaitTimeInMillis = 20000) { assertEquals(cardBrand.cardBrandName, brandLogo().getTag(R.integer.card_tag)) } +// wait(maxWaitTimeInMillis = 20000) { assertEquals(cardBrand.cardBrandName, brandLogo().getTag(R.integer.card_tag)) } + wait(maxWaitTimeInMillis = 20000) { assertEquals(cardBrand.cardBrandName, brandLogo().tag) } return this } } diff --git a/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/restricted/RestrictedCardFragmentTestUtils.kt b/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/restricted/RestrictedCardFragmentTestUtils.kt index 640147f8..039fd3f1 100644 --- a/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/restricted/RestrictedCardFragmentTestUtils.kt +++ b/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/restricted/RestrictedCardFragmentTestUtils.kt @@ -55,12 +55,14 @@ class RestrictedCardFragmentTestUtils(activityRule: ActivityTestRule Date: Mon, 12 Aug 2024 09:28:51 +0100 Subject: [PATCH 07/10] US1955755: remove unused class --- .../sample/NewDiscoveryIntegrationTest.kt | 69 ------------------- 1 file changed, 69 deletions(-) delete mode 100644 demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/NewDiscoveryIntegrationTest.kt diff --git a/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/NewDiscoveryIntegrationTest.kt b/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/NewDiscoveryIntegrationTest.kt deleted file mode 100644 index 1a9544f3..00000000 --- a/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/NewDiscoveryIntegrationTest.kt +++ /dev/null @@ -1,69 +0,0 @@ -package com.worldpay.access.checkout.sample - -import androidx.test.ext.junit.rules.ActivityScenarioRule -import com.worldpay.access.checkout.client.session.model.SessionType.CARD -import com.worldpay.access.checkout.client.session.model.SessionType.CVC -import com.worldpay.access.checkout.sample.card.standard.testutil.NewCardFragmentTestUtils -import com.worldpay.access.checkout.sample.cvc.NewCvcFragmentTestUtils -import com.worldpay.access.checkout.sample.stub.RootResourseMockStub.simulateRootResourceTemporaryServerError -import com.worldpay.access.checkout.sample.testutil.UITestUtils.navigateTo -import org.junit.Before -import org.junit.Rule -import org.junit.Test - -class NewDiscoveryIntegrationTest { - // WIP - - private val amexCard = "343434343434343" - private val amexCvc = "1234" - private val expiryDate = "1299" - - @get:Rule - var activityTestRule = ActivityScenarioRule(MainActivity::class.java) - - @Before - fun setup() { - simulateRootResourceTemporaryServerError() - } - - @Test - fun shouldRetryDiscoveryAndReturnSuccessfulResponse_whenDiscoveryFailsFirstTime_cardFlow() { - navigateTo(R.id.nav_card_flow) - - val cardFragmentTestUtils = NewCardFragmentTestUtils(activityTestRule) - - activityTestRule.scenario.onActivity { activity -> - cardFragmentTestUtils - .isInInitialState() - .enterCardDetails(pan = amexCard, cvc = amexCvc, expiryDate = expiryDate) - .enabledStateIs(submitButton = true) - .clickSubmitButton() - .requestIsInProgress() - .hasResponseDialogWithMessage( - mapOf(CARD to activity.getString(R.string.card_session_reference)).toString() - ) - .closeDialog() - .isInInitialState() - } - } - - @Test - fun shouldRetryDiscoveryAndReturnSuccessfulResponse_whenDiscoveryFailsFirstTime_cvcFlow() { - navigateTo(R.id.nav_cvc_flow) - - val cvcFragmentTestUtils = NewCvcFragmentTestUtils(activityTestRule) - - activityTestRule.scenario.onActivity { activity -> - cvcFragmentTestUtils - .isInInitialState() - .enterCardDetails(cvc = "123") - .clickSubmitButton() - .requestIsInProgress() - .hasResponseDialogWithMessage( - mapOf(CVC to activity.getString(R.string.cvc_session_reference)).toString() - ) - .closeDialog() - .isInInitialState() - } - } -} From 722064a69fb8eeb3320483e61a56e375a7c039ee Mon Sep 17 00:00:00 2001 From: TyreseWp Date: Mon, 12 Aug 2024 10:19:54 +0100 Subject: [PATCH 08/10] US1955755: refactor to action out comments --- .../testutil/NewCardFragmentTestUtils.kt | 33 ++++++++----------- .../testutil/NewAbstractFragmentTestUtils.kt | 18 +++++----- .../sample/cvc/NewCvcFragmentTestUtils.kt | 10 +++--- 3 files changed, 27 insertions(+), 34 deletions(-) diff --git a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/NewCardFragmentTestUtils.kt b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/NewCardFragmentTestUtils.kt index 8a1ce29d..9400579b 100644 --- a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/NewCardFragmentTestUtils.kt +++ b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/NewCardFragmentTestUtils.kt @@ -34,20 +34,20 @@ class NewCardFragmentTestUtils(activityRule: ActivityScenarioRule) enabledStateIs(pan = true, cvc = true, expiryDate = true, submitButton = false) cardDetailsAre(pan = "", cvc = "", expiryDate = "") hasNoBrand() - paymentsCvcSessionCheckedState(checked = false) + paymentsCvcSwitchIs(checked = false) } fun setPaymentsCvcSwitchState(checked: Boolean) = apply { - wait2 { onView(withId(R.id.card_flow_payments_cvc_switch)).check(matches(isDisplayed())) } + waitForAssertion { onView(withId(R.id.card_flow_payments_cvc_switch)).check(matches(isDisplayed())) } if (checked != withId(R.id.card_flow_payments_cvc_switch).matches(isChecked())) uiObjectWithId(R.id.card_flow_payments_cvc_switch).click() } - fun paymentsCvcSessionCheckedState(checked: Boolean) = apply { + fun paymentsCvcSwitchIs(checked: Boolean) = apply { val checkedViewMatcher = if (checked) isChecked() else isNotChecked() - wait2 { onView(withId(R.id.card_flow_payments_cvc_switch)).check(matches(isDisplayed())) } - wait2 { onView(withId(R.id.card_flow_payments_cvc_switch)).check(matches(checkedViewMatcher)) } + waitForAssertion { onView(withId(R.id.card_flow_payments_cvc_switch)).check(matches(isDisplayed())) } + waitForAssertion { onView(withId(R.id.card_flow_payments_cvc_switch)).check(matches(checkedViewMatcher)) } } fun requestIsInProgress() = apply { @@ -92,8 +92,8 @@ class NewCardFragmentTestUtils(activityRule: ActivityScenarioRule) else -> throw RuntimeException("field view matcher not recognised") } - wait2 { onView(accessCheckoutFieldViewMatcher.viewMatcher).check(matches(isDisplayed())) } - wait2 { onView(accessCheckoutFieldViewMatcher.viewMatcher).check(matches(accessCheckoutFieldViewMatcher.enabledViewMatcher)) } + waitForAssertion { onView(accessCheckoutFieldViewMatcher.viewMatcher).check(matches(isDisplayed())) } + waitForAssertion { onView(accessCheckoutFieldViewMatcher.viewMatcher).check(matches(accessCheckoutFieldViewMatcher.enabledViewMatcher)) } } @@ -149,7 +149,7 @@ class NewCardFragmentTestUtils(activityRule: ActivityScenarioRule) } fun cursorPositionIs(position: Int) = apply { - wait2 { onView(withId(R.id.card_flow_text_pan)).check { view, noViewFoundException -> + waitForAssertion { onView(withId(R.id.card_flow_text_pan)).check { view, noViewFoundException -> val isPosition = (view as AccessCheckoutEditText).selectionEnd == position isPosition } @@ -157,17 +157,12 @@ class NewCardFragmentTestUtils(activityRule: ActivityScenarioRule) } fun cardDetailsAre(pan: String? = null, cvc: String? = null, expiryDate: String? = null) = apply { - if (pan != null) wait2 { onView(withText(pan)).check(matches(isDisplayed())) } - if (pan != null) wait2 { onView(withText(cvc)).check(matches(isDisplayed())) } - if (pan != null) wait2 { onView(withText(expiryDate)).check(matches(isDisplayed())) } + if (pan != null) waitForAssertion { onView(withText(pan)).check(matches(isDisplayed())) } + if (pan != null) waitForAssertion { onView(withText(cvc)).check(matches(isDisplayed())) } + if (pan != null) waitForAssertion { onView(withText(expiryDate)).check(matches(isDisplayed())) } } - fun validationStateIs( - pan: Boolean? = null, - cvc: Boolean? = null, - expiryDate: Boolean? = null - ) = apply { -// if (pan != null) checkValidationState(R.id.card_flow_text_pan, pan, "pan") + fun validationStateIs(pan: Boolean? = null, cvc: Boolean? = null, expiryDate: Boolean? = null) = apply { if (pan != null) checkValidationState(withParent(withId(R.id.card_flow_text_pan)), pan, "pan") if (cvc != null) checkValidationState(withParent(withId(R.id.card_flow_text_cvc)), cvc, "cvc") if (expiryDate != null) checkValidationState(withParent(withId(R.id.card_flow_expiry_date)), expiryDate, "expiry date") @@ -178,11 +173,11 @@ class NewCardFragmentTestUtils(activityRule: ActivityScenarioRule) activityRule.scenario.onActivity(ActivityScenario.ActivityAction { activity -> resourceEntryName = activity.resources.getResourceEntryName(R.drawable.card_unknown_logo) }) - wait2 { onView(withId(R.id.card_flow_brand_logo)).check(matches(withTagValue(Matchers.`is`(resourceEntryName)))) } + waitForAssertion { onView(withId(R.id.card_flow_brand_logo)).check(matches(withTagValue(Matchers.`is`(resourceEntryName)))) } } fun hasBrand(cardBrand: CardBrand) = apply { - wait2(20000) { onView(withId(R.id.card_flow_brand_logo)).check(matches(withTagValue(Matchers.`is`(cardBrand.cardBrandName)))) } + waitForAssertion(20000) { onView(withId(R.id.card_flow_brand_logo)).check(matches(withTagValue(Matchers.`is`(cardBrand.cardBrandName)))) } } sealed class AccessCheckoutFieldViewMatcher(val viewMatcher: Matcher, val isEnabled: Boolean) { diff --git a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/testutil/NewAbstractFragmentTestUtils.kt b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/testutil/NewAbstractFragmentTestUtils.kt index f6cf670e..e1713173 100644 --- a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/testutil/NewAbstractFragmentTestUtils.kt +++ b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/testutil/NewAbstractFragmentTestUtils.kt @@ -32,7 +32,7 @@ abstract class NewAbstractFragmentTestUtils(protected val activityRule: Activity } protected fun progressBarNotVisible() { - wait2 { assertTrue(progressBar().waitUntilGone(3000)) } + waitForAssertion { assertTrue(progressBar().waitUntilGone(3000)) } } protected fun checkValidationState( @@ -40,7 +40,7 @@ abstract class NewAbstractFragmentTestUtils(protected val activityRule: Activity isValid: Boolean, field: String ) = also { - wait2 { + waitForAssertion { onView(viewMatcher).check(matches(hasTextColor( when (isValid) { true -> R.color.SUCCESS @@ -51,15 +51,13 @@ abstract class NewAbstractFragmentTestUtils(protected val activityRule: Activity } protected fun enterText(id: Int, text: String) { - wait2 { onView(withId(id)).check(matches(isDisplayed())) } - wait2 { onView(withId(id)).check(matches(isEnabled())) } + waitForAssertion { onView(withId(id)).check(matches(isDisplayed())) } + waitForAssertion { onView(withId(id)).check(matches(isEnabled())) } val editTextUI = UITestUtils.uiObjectWithId(id) editTextUI.click() onView(ViewMatchers.withParent(withId(id))).perform(typeText(text)) - Log.i("msg", "edit text ui") - onView(ViewMatchers.withParent(withId(id))).perform(closeSoftKeyboard()) } @@ -69,13 +67,13 @@ abstract class NewAbstractFragmentTestUtils(protected val activityRule: Activity } protected fun assertViewIsVisible(id: Int) { - wait2 { onView(withId(id)) + waitForAssertion { onView(withId(id)) .check(matches(isDisplayed())) } } protected fun clearText(id: Int) { - wait2 { onView(withId(id)).check(matches(isDisplayed())) } - wait2 { onView(withId(id)).check(matches(isEnabled())) } + waitForAssertion { onView(withId(id)).check(matches(isDisplayed())) } + waitForAssertion { onView(withId(id)).check(matches(isEnabled())) } val editTextUI = UITestUtils.uiObjectWithId(id) editTextUI.click() @@ -125,7 +123,7 @@ abstract class NewAbstractFragmentTestUtils(protected val activityRule: Activity return colorInt } - protected inline fun wait2(maxWaitTimeInMillis: Int = 1000, assertions: () -> Unit) { + protected inline fun waitForAssertion(maxWaitTimeInMillis: Int = 1000, assertions: () -> Unit) { val pauseInterval = 100 val maxTimes = maxWaitTimeInMillis / pauseInterval diff --git a/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/cvc/NewCvcFragmentTestUtils.kt b/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/cvc/NewCvcFragmentTestUtils.kt index bb0df996..24ad12a6 100644 --- a/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/cvc/NewCvcFragmentTestUtils.kt +++ b/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/cvc/NewCvcFragmentTestUtils.kt @@ -37,16 +37,16 @@ class NewCvcFragmentTestUtils(activityRule: ActivityScenarioRule) val enableMsg = "enabled state" if (cvc != null) { - wait2 { Espresso.onView(ViewMatchers.withId(com.worldpay.access.checkout.sample.R.id.cvc_flow_text_cvc)) + waitForAssertion { Espresso.onView(ViewMatchers.withId(com.worldpay.access.checkout.sample.R.id.cvc_flow_text_cvc)) .check(ViewAssertions.matches(ViewMatchers.isDisplayed())) } - wait2 { Espresso.onView(ViewMatchers.withId(com.worldpay.access.checkout.sample.R.id.cvc_flow_text_cvc)) + waitForAssertion { Espresso.onView(ViewMatchers.withId(com.worldpay.access.checkout.sample.R.id.cvc_flow_text_cvc)) .check(ViewAssertions.matches(ViewMatchers.isEnabled())) } } if (submitButton != null) { - wait2 { Espresso.onView(ViewMatchers.withId(com.worldpay.access.checkout.sample.R.id.cvc_flow_btn_submit)) + waitForAssertion { Espresso.onView(ViewMatchers.withId(com.worldpay.access.checkout.sample.R.id.cvc_flow_btn_submit)) .check(ViewAssertions.matches(ViewMatchers.isDisplayed())) } - wait2 { Espresso.onView(ViewMatchers.withId(com.worldpay.access.checkout.sample.R.id.cvc_flow_btn_submit)) + waitForAssertion { Espresso.onView(ViewMatchers.withId(com.worldpay.access.checkout.sample.R.id.cvc_flow_btn_submit)) .check(ViewAssertions.matches(ViewMatchers.isEnabled())) } } } @@ -73,7 +73,7 @@ class NewCvcFragmentTestUtils(activityRule: ActivityScenarioRule) } fun cardDetailsAre(cvc: String) = also { - wait2 { Espresso.onView(ViewMatchers.withId(com.worldpay.access.checkout.sample.R.id.cvc_flow_text_cvc)) + waitForAssertion { Espresso.onView(ViewMatchers.withId(com.worldpay.access.checkout.sample.R.id.cvc_flow_text_cvc)) .check(ViewAssertions.matches(ViewMatchers.withText(cvc))) } } } \ No newline at end of file From 42dab7ee241b389e51f1c7dc08268bcd880030bf Mon Sep 17 00:00:00 2001 From: TyreseWp Date: Mon, 12 Aug 2024 10:27:15 +0100 Subject: [PATCH 09/10] US1955755: omit commented code --- .../sample/card/standard/testutil/CardFragmentTestUtils.kt | 2 -- .../sample/card/restricted/RestrictedCardFragmentTestUtils.kt | 2 -- .../worldpay/access/checkout/sample/images/SVGImageLoader.kt | 1 - .../access/checkout/sample/images/SVGImageLoaderTest.kt | 2 -- .../access/checkout/sample/images/SVGImageRendererImplTest.kt | 1 - 5 files changed, 8 deletions(-) diff --git a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/CardFragmentTestUtils.kt b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/CardFragmentTestUtils.kt index 0e92c2e2..544617e0 100644 --- a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/CardFragmentTestUtils.kt +++ b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/CardFragmentTestUtils.kt @@ -202,13 +202,11 @@ class CardFragmentTestUtils(activityRule: ActivityTestRule) : Abst fun hasNoBrand(): CardFragmentTestUtils { val resourceEntryName = activity().resources.getResourceEntryName(R.drawable.card_unknown_logo) -// wait { assertEquals(resourceEntryName, brandLogo().getTag(R.integer.card_tag)) } wait { assertEquals(resourceEntryName, brandLogo().tag) } return this } fun hasBrand(cardBrand: CardBrand): CardFragmentTestUtils { -// wait(maxWaitTimeInMillis = 20000) { assertEquals(cardBrand.cardBrandName, brandLogo().getTag(R.integer.card_tag)) } wait(maxWaitTimeInMillis = 20000) { assertEquals(cardBrand.cardBrandName, brandLogo().tag) } return this } diff --git a/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/restricted/RestrictedCardFragmentTestUtils.kt b/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/restricted/RestrictedCardFragmentTestUtils.kt index 039fd3f1..0ee4248b 100644 --- a/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/restricted/RestrictedCardFragmentTestUtils.kt +++ b/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/restricted/RestrictedCardFragmentTestUtils.kt @@ -55,13 +55,11 @@ class RestrictedCardFragmentTestUtils(activityRule: ActivityTestRule Date: Thu, 15 Aug 2024 16:08:26 +0100 Subject: [PATCH 10/10] US1955755: refactor function names --- .../sample/card/standard/testutil/CardFragmentTestUtils.kt | 2 +- .../card/standard/testutil/NewCardFragmentTestUtils.kt | 2 +- .../sample/card/CardConfigurationIntegrationTest.kt | 4 ++-- .../access/checkout/sample/card/CardFlowIntegrationTest.kt | 6 +++--- .../sample/card/NewCardConfigurationIntegrationTest.kt | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/CardFragmentTestUtils.kt b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/CardFragmentTestUtils.kt index 544617e0..d9188ac9 100644 --- a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/CardFragmentTestUtils.kt +++ b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/CardFragmentTestUtils.kt @@ -85,7 +85,7 @@ class CardFragmentTestUtils(activityRule: ActivityTestRule) : Abst return this } - fun isInErrorState(pan: String? = null, cvc: String? = null, expiryDate: String? = null): CardFragmentTestUtils { + fun areFieldsEnabledAndAssertCardDetails(pan: String? = null, cvc: String? = null, expiryDate: String? = null): CardFragmentTestUtils { progressBarNotVisible() enabledStateIs(pan = true, cvc = true, expiryDate = true, paymentsCvcSwitch = true, submitButton = true) cardDetailsAre(pan, cvc, expiryDate) diff --git a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/NewCardFragmentTestUtils.kt b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/NewCardFragmentTestUtils.kt index 9400579b..027a34c9 100644 --- a/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/NewCardFragmentTestUtils.kt +++ b/demo-app/src/androidTest/java/com/worldpay/access/checkout/sample/card/standard/testutil/NewCardFragmentTestUtils.kt @@ -67,7 +67,7 @@ class NewCardFragmentTestUtils(activityRule: ActivityScenarioRule) onView(withId(android.R.id.button1)).perform(click()) } - fun isInErrorState(pan: String? = null, cvc: String? = null, expiryDate: String? = null) = apply { + fun areFieldsEnabledAndAssertCardDetails(pan: String? = null, cvc: String? = null, expiryDate: String? = null) = apply { progressBarNotVisible() enabledStateIs(pan = true, cvc = true, expiryDate = true, paymentsCvcSwitch = true, submitButton = true) cardDetailsAre(pan, cvc, expiryDate) diff --git a/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/CardConfigurationIntegrationTest.kt b/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/CardConfigurationIntegrationTest.kt index e3f36523..9644f3c0 100644 --- a/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/CardConfigurationIntegrationTest.kt +++ b/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/CardConfigurationIntegrationTest.kt @@ -27,7 +27,7 @@ class CardConfigurationIntegrationTest { } @Test - fun givenCardConfigCallFails_validKnownBrandCardDetails_returnsSuccessfulResponse() { + fun givenCardConfigCallFails_validKnownBrandCardDetails_returnsSuccessfulSession() { cardFragmentTestUtils .enterCardDetails(pan = MASTERCARD_PAN, cvc = "1234", expiryDate = "1299") .cardDetailsAre(pan = MASTERCARD_PAN_FORMATTED, cvc = "1234", expiryDate = "12/99") @@ -42,7 +42,7 @@ class CardConfigurationIntegrationTest { } @Test - fun givenCardConfigCallFails_validUnknownBrandCardDetails_returnsSuccessfulResponse() { + fun givenCardConfigCallFails_validUnknownBrandCardDetails_returnsSuccessfulSession() { cardFragmentTestUtils .enterCardDetails(pan = VALID_UNKNOWN_LUHN, cvc = "1234", expiryDate = "1299") .cardDetailsAre(pan = VALID_UNKNOWN_LUHN_FORMATTED, cvc = "1234", expiryDate = "12/99") diff --git a/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/CardFlowIntegrationTest.kt b/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/CardFlowIntegrationTest.kt index 5b0e0cbb..433ee41d 100644 --- a/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/CardFlowIntegrationTest.kt +++ b/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/CardFlowIntegrationTest.kt @@ -65,7 +65,7 @@ class CardFlowIntegrationTest : AbstractCardFragmentTest() { "bodyDoesNotMatchSchema : The json body provided does not match the expected schema" ) .closeDialog() - .isInErrorState(pan = unknownCardErrorFormatted, cvc = amexCvc, expiryDate = "12/99") + .areFieldsEnabledAndAssertCardDetails(pan = unknownCardErrorFormatted, cvc = amexCvc, expiryDate = "12/99") .paymentsCvcSessionCheckedState(checked = true) // passing scenario with single session @@ -110,7 +110,7 @@ class CardFlowIntegrationTest : AbstractCardFragmentTest() { "bodyDoesNotMatchSchema : The json body provided does not match the expected schema" ) .closeDialog() - .isInErrorState(pan = unknownCardErrorFormatted, cvc = amexCvc, expiryDate = "12/99") + .areFieldsEnabledAndAssertCardDetails(pan = unknownCardErrorFormatted, cvc = amexCvc, expiryDate = "12/99") } @Test @@ -129,7 +129,7 @@ class CardFlowIntegrationTest : AbstractCardFragmentTest() { "bodyDoesNotMatchSchema : The json body provided does not match the expected schema" ) .closeDialog() - .isInErrorState(pan = unknownCardErrorFormatted, cvc = amexCvc, expiryDate = "12/99") + .areFieldsEnabledAndAssertCardDetails(pan = unknownCardErrorFormatted, cvc = amexCvc, expiryDate = "12/99") .paymentsCvcSessionCheckedState(checked = true) } diff --git a/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/NewCardConfigurationIntegrationTest.kt b/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/NewCardConfigurationIntegrationTest.kt index 27433198..d438cc69 100644 --- a/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/NewCardConfigurationIntegrationTest.kt +++ b/demo-app/src/androidTestMock/java/com/worldpay/access/checkout/sample/card/NewCardConfigurationIntegrationTest.kt @@ -30,7 +30,7 @@ class NewCardConfigurationIntegrationTest { } @Test - fun givenCardConfigCallFails_validKnownBrandCardDetails_returnsSuccessfulResponse() { + fun givenCardConfigCallFails_validKnownBrandCardDetails_returnsSuccessfulSession() { cardFragmentTestUtils .enterCardDetails(pan = MASTERCARD_PAN, cvc = "1234", expiryDate = "1299") .cardDetailsAre(pan = MASTERCARD_PAN_FORMATTED, cvc = "1234", expiryDate = "12/99") @@ -49,7 +49,7 @@ class NewCardConfigurationIntegrationTest { } @Test - fun givenCardConfigCallFails_validUnknownBrandCardDetails_returnsSuccessfulResponse() { + fun givenCardConfigCallFails_validUnknownBrandCardDetails_returnsSuccessfulSession() { cardFragmentTestUtils .enterCardDetails(pan = VALID_UNKNOWN_LUHN, cvc = "1234", expiryDate = "1299") .cardDetailsAre(pan = VALID_UNKNOWN_LUHN_FORMATTED, cvc = "1234", expiryDate = "12/99")