You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iceraven-browser/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAutofillRobo...

647 lines
34 KiB
Kotlin

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.ui.robots
import android.util.Log
import androidx.test.espresso.Espresso.closeSoftKeyboard
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.RootMatchers
import androidx.test.espresso.matcher.ViewMatchers.isChecked
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.isNotChecked
import androidx.test.espresso.matcher.ViewMatchers.withChild
import androidx.test.espresso.matcher.ViewMatchers.withClassName
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.uiautomator.UiSelector
import org.hamcrest.CoreMatchers.allOf
import org.hamcrest.CoreMatchers.endsWith
import org.junit.Assert.assertEquals
import org.mozilla.fenix.R
import org.mozilla.fenix.helpers.Constants.TAG
import org.mozilla.fenix.helpers.DataGenerationHelper.getStringResource
import org.mozilla.fenix.helpers.MatcherHelper.assertUIObjectExists
import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText
import org.mozilla.fenix.helpers.MatcherHelper.itemWithDescription
import org.mozilla.fenix.helpers.MatcherHelper.itemWithResId
import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime
import org.mozilla.fenix.helpers.TestHelper.hasCousin
import org.mozilla.fenix.helpers.TestHelper.mDevice
import org.mozilla.fenix.helpers.TestHelper.packageName
import org.mozilla.fenix.helpers.TestHelper.scrollToElementByText
import org.mozilla.fenix.helpers.click
class SettingsSubMenuAutofillRobot {
fun verifyAutofillToolbarTitle() {
assertUIObjectExists(autofillToolbarTitle())
}
fun verifyManageAddressesToolbarTitle() {
Log.i(TAG, "verifyManageAddressesToolbarTitle: Trying to verify that the \"Manage addresses\" toolbar title is displayed")
onView(
allOf(
withId(R.id.navigationToolbar),
withChild(
withText(R.string.preferences_addresses_manage_addresses),
),
),
).check(matches(isDisplayed()))
Log.i(TAG, "verifyManageAddressesToolbarTitle: Verified that the \"Manage addresses\" toolbar title is displayed")
}
fun verifyAddressAutofillSection(isAddressAutofillEnabled: Boolean, userHasSavedAddress: Boolean) {
assertUIObjectExists(
autofillToolbarTitle(),
addressesSectionTitle(),
saveAndAutofillAddressesOption(),
saveAndAutofillAddressesSummary(),
)
if (userHasSavedAddress) {
assertUIObjectExists(manageAddressesButton())
} else {
assertUIObjectExists(addAddressButton())
}
verifyAddressesAutofillToggle(isAddressAutofillEnabled)
}
fun verifyCreditCardsAutofillSection(isAddressAutofillEnabled: Boolean, userHasSavedCreditCard: Boolean) {
assertUIObjectExists(
autofillToolbarTitle(),
creditCardsSectionTitle(),
saveAndAutofillCreditCardsOption(),
saveAndAutofillCreditCardsSummary(),
syncCreditCardsAcrossDevicesButton(),
)
if (userHasSavedCreditCard) {
assertUIObjectExists(manageSavedCreditCardsButton())
} else {
assertUIObjectExists(addCreditCardButton())
}
verifySaveAndAutofillCreditCardsToggle(isAddressAutofillEnabled)
}
fun verifyManageAddressesSection(vararg savedAddressDetails: String) {
assertUIObjectExists(
navigateBackButton(),
manageAddressesToolbarTitle(),
addAddressButton(),
)
for (savedAddressDetail in savedAddressDetails) {
assertUIObjectExists(itemContainingText(savedAddressDetail))
}
}
fun verifySavedCreditCardsSection(creditCardLastDigits: String, creditCardExpiryDate: String) {
assertUIObjectExists(
navigateBackButton(),
savedCreditCardsToolbarTitle(),
addCreditCardButton(),
itemContainingText(creditCardLastDigits),
itemContainingText(creditCardExpiryDate),
)
}
fun verifyAddressesAutofillToggle(enabled: Boolean) {
Log.i(TAG, "verifyAddressesAutofillToggle: Trying to verify that the \"Save and autofill addresses\" toggle is checked: $enabled")
onView(withText(R.string.preferences_addresses_save_and_autofill_addresses_2))
.check(
matches(
hasCousin(
allOf(
withClassName(endsWith("Switch")),
if (enabled) {
isChecked()
} else {
isNotChecked()
},
),
),
),
)
Log.i(TAG, "verifyAddressesAutofillToggle: Verified that the \"Save and autofill addresses\" toggle is checked: $enabled")
}
fun verifySaveAndAutofillCreditCardsToggle(enabled: Boolean) {
Log.i(TAG, "verifySaveAndAutofillCreditCardsToggle: Trying to verify that the \"Save and autofill cards\" toggle is checked: $enabled")
onView(withText(R.string.preferences_credit_cards_save_and_autofill_cards_2))
.check(
matches(
hasCousin(
allOf(
withClassName(endsWith("Switch")),
if (enabled) {
isChecked()
} else {
isNotChecked()
},
),
),
),
)
Log.i(TAG, "verifySaveAndAutofillCreditCardsToggle: Verified that the \"Save and autofill cards\" toggle is checked: $enabled")
}
fun verifyAddAddressView() {
Log.i(TAG, "verifyAddAddressView: Trying to perform \"Close soft keyboard\" action")
// Closing the keyboard to ensure full visibility of the "Add address" view
closeSoftKeyboard()
Log.i(TAG, "verifyAddAddressView: Performed \"Close soft keyboard\" action")
assertUIObjectExists(
addAddressToolbarTitle(),
navigateBackButton(),
toolbarCheckmarkButton(),
nameTextInput(),
streetAddressTextInput(),
cityTextInput(),
subRegionDropDown(),
)
assertUIObjectExists(
zipCodeTextInput(),
countryDropDown(),
phoneTextInput(),
emailTextInput(),
)
scrollToElementByText(getStringResource(R.string.addresses_save_button))
assertUIObjectExists(
saveButton(),
cancelButton(),
)
}
fun verifyCountryOption(country: String) {
Log.i(TAG, "verifyCountryOption: Trying to perform \"Close soft keyboard\" action")
// Closing the keyboard to ensure full visibility of the "Add address" view
closeSoftKeyboard()
Log.i(TAG, "verifyCountryOption: Performed \"Close soft keyboard\" action")
assertUIObjectExists(itemContainingText(country))
}
fun verifyStateOption(state: String) {
assertUIObjectExists(itemContainingText(state))
}
fun verifyCountryOptions(vararg countries: String) {
Log.i(TAG, "verifyCountryOptions: Trying to click the \"Country or region\" dropdown")
countryDropDown().click()
Log.i(TAG, "verifyCountryOptions: Clicked the \"Country or region\" dropdown")
for (country in countries) {
assertUIObjectExists(itemContainingText(country))
}
}
fun selectCountry(country: String) {
Log.i(TAG, "selectCountry: Trying to click the \"Country or region\" dropdown")
countryDropDown().click()
Log.i(TAG, "selectCountry: Clicked the \"Country or region\" dropdown")
Log.i(TAG, "selectCountry: Trying to select $country dropdown option")
countryOption(country).click()
Log.i(TAG, "selectCountry: Selected $country dropdown option")
}
fun verifyEditAddressView() {
assertUIObjectExists(
editAddressToolbarTitle(),
navigateBackButton(),
toolbarDeleteAddressButton(),
toolbarCheckmarkButton(),
nameTextInput(),
streetAddressTextInput(),
cityTextInput(),
subRegionDropDown(),
)
scrollToElementByText(getStringResource(R.string.addresses_country))
assertUIObjectExists(
zipCodeTextInput(),
countryDropDown(),
phoneTextInput(),
emailTextInput(),
)
scrollToElementByText(getStringResource(R.string.addresses_save_button))
assertUIObjectExists(
saveButton(),
cancelButton(),
)
assertUIObjectExists(deleteAddressButton())
}
fun clickSaveAndAutofillAddressesOption() {
Log.i(TAG, "clickSaveAndAutofillAddressesOption: Trying to click the \"Save and fill addresses\" button")
saveAndAutofillAddressesOption().click()
Log.i(TAG, "clickSaveAndAutofillAddressesOption: Clicked the \"Save and fill addresses\" button")
}
fun clickAddAddressButton() {
Log.i(TAG, "clickAddAddressButton: Trying to click the \"Add address\" button")
addAddressButton().click()
Log.i(TAG, "clickAddAddressButton: Clicked the \"Add address\" button")
}
fun clickManageAddressesButton() {
Log.i(TAG, "clickManageAddressesButton: Trying to click the \"Manage addresses\" button")
manageAddressesButton().click()
Log.i(TAG, "clickManageAddressesButton: Clicked the \"Manage addresses\" button")
}
fun clickSavedAddress(name: String) {
Log.i(TAG, "clickSavedAddress: Trying to click the $name saved address and and wait for $waitingTime ms for a new window")
savedAddress(name).clickAndWaitForNewWindow(waitingTime)
Log.i(TAG, "clickSavedAddress: Clicked the $name saved address and and waited for $waitingTime ms for a new window")
}
fun clickDeleteAddressButton() {
Log.i(TAG, "clickDeleteAddressButton: Waiting for $waitingTime ms for the delete address toolbar button to exist")
toolbarDeleteAddressButton().waitForExists(waitingTime)
Log.i(TAG, "clickDeleteAddressButton: Waited for $waitingTime ms for the delete address toolbar button to exist")
Log.i(TAG, "clickDeleteAddressButton: Trying to click the delete address toolbar button")
toolbarDeleteAddressButton().click()
Log.i(TAG, "clickDeleteAddressButton: Clicked the delete address toolbar button")
}
fun clickCancelDeleteAddressButton() {
Log.i(TAG, "clickCancelDeleteAddressButton: Trying to click the \"CANCEL\" button from the delete address dialog")
cancelDeleteAddressButton().click()
Log.i(TAG, "clickCancelDeleteAddressButton: Clicked the \"CANCEL\" button from the delete address dialog")
}
fun clickConfirmDeleteAddressButton() {
Log.i(TAG, "clickConfirmDeleteAddressButton: Trying to click the \"DELETE\" button from the delete address dialog")
confirmDeleteAddressButton().click()
Log.i(TAG, "clickConfirmDeleteAddressButton: Clicked \"DELETE\" button from the delete address dialog")
}
fun clickSubRegionOption(subRegion: String) {
scrollToElementByText(subRegion)
subRegionOption(subRegion).also {
Log.i(TAG, "clickSubRegionOption: Waiting for $waitingTime ms for the \"State\" $subRegion dropdown option to exist")
it.waitForExists(waitingTime)
Log.i(TAG, "clickSubRegionOption: Waited for $waitingTime ms for the \"State\" $subRegion dropdown option to exist")
Log.i(TAG, "clickSubRegionOption: Trying to click the \"State\" $subRegion dropdown option")
it.click()
Log.i(TAG, "clickSubRegionOption: Clicked the \"State\" $subRegion dropdown option")
}
}
fun clickCountryOption(country: String) {
Log.i(TAG, "clickCountryOption: Waiting for $waitingTime ms for the \"Country or region\" $country dropdown option to exist")
countryOption(country).waitForExists(waitingTime)
Log.i(TAG, "clickCountryOption: Waited for $waitingTime ms for the \"Country or region\" $country dropdown option to exist")
Log.i(TAG, "clickCountryOption: Trying to click \"Country or region\" $country dropdown option")
countryOption(country).click()
Log.i(TAG, "clickCountryOption: Clicked \"Country or region\" $country dropdown option")
}
fun verifyAddAddressButton() = assertUIObjectExists(addAddressButton())
fun fillAndSaveAddress(
navigateToAutofillSettings: Boolean,
isAddressAutofillEnabled: Boolean = true,
userHasSavedAddress: Boolean = false,
name: String,
streetAddress: String,
city: String,
state: String,
zipCode: String,
country: String,
phoneNumber: String,
emailAddress: String,
) {
if (navigateToAutofillSettings) {
homeScreen {
}.openThreeDotMenu {
}.openSettings {
}.openAutofillSubMenu {
verifyAddressAutofillSection(isAddressAutofillEnabled, userHasSavedAddress)
clickAddAddressButton()
}
}
Log.i(TAG, "fillAndSaveAddress: Waiting for $waitingTime ms for \"Name\" text field to exist")
nameTextInput().waitForExists(waitingTime)
Log.i(TAG, "fillAndSaveAddress: Waited for $waitingTime ms for \"Name\" text field to exist")
Log.i(TAG, "fillAndSaveAddress: Trying to click device back button to dismiss keyboard using device back button")
mDevice.pressBack()
Log.i(TAG, "fillAndSaveAddress: Clicked device back button to dismiss keyboard using device back button")
Log.i(TAG, "fillAndSaveAddress: Trying to set \"Name\" to $name")
nameTextInput().setText(name)
Log.i(TAG, "fillAndSaveAddress: \"Name\" was set to $name")
Log.i(TAG, "fillAndSaveAddress: Trying to set \"Street Address\" to $streetAddress")
streetAddressTextInput().setText(streetAddress)
Log.i(TAG, "fillAndSaveAddress: \"Street Address\" was set to $streetAddress")
Log.i(TAG, "fillAndSaveAddress: Trying to set \"City\" to $city")
cityTextInput().setText(city)
Log.i(TAG, "fillAndSaveAddress: \"City\" was set to $city")
Log.i(TAG, "fillAndSaveAddress: Trying to click \"State\" dropdown button")
subRegionDropDown().click()
Log.i(TAG, "fillAndSaveAddress: Clicked \"State\" dropdown button")
Log.i(TAG, "fillAndSaveAddress: Trying to click the $state dropdown option")
clickSubRegionOption(state)
Log.i(TAG, "fillAndSaveAddress: Clicked $state dropdown option")
Log.i(TAG, "fillAndSaveAddress: Trying to set \"Zip\" to $zipCode")
zipCodeTextInput().setText(zipCode)
Log.i(TAG, "fillAndSaveAddress: \"Zip\" was set to $zipCode")
Log.i(TAG, "fillAndSaveAddress: Trying to click \"Country or region\" dropdown button")
countryDropDown().click()
Log.i(TAG, "fillAndSaveAddress: Clicked \"Country or region\" dropdown button")
Log.i(TAG, "fillAndSaveAddress: Trying to click $country dropdown option")
clickCountryOption(country)
Log.i(TAG, "fillAndSaveAddress: Clicked $country dropdown option")
scrollToElementByText(getStringResource(R.string.addresses_save_button))
Log.i(TAG, "fillAndSaveAddress: Trying to set \"Phone\" to $phoneNumber")
phoneTextInput().setText(phoneNumber)
Log.i(TAG, "fillAndSaveAddress: \"Phone\" was set to $phoneNumber")
Log.i(TAG, "fillAndSaveAddress: Trying to set \"Email\" to $emailAddress")
emailTextInput().setText(emailAddress)
Log.i(TAG, "fillAndSaveAddress: \"Email\" was set to $emailAddress")
Log.i(TAG, "fillAndSaveAddress: Trying to click the \"Save\" button")
saveButton().click()
Log.i(TAG, "fillAndSaveAddress: Clicked the \"Save\" button")
Log.i(TAG, "fillAndSaveAddress: Waiting for $waitingTime ms for for \"Manage addresses\" button to exist")
manageAddressesButton().waitForExists(waitingTime)
Log.i(TAG, "fillAndSaveAddress: Waited for $waitingTime ms for for \"Manage addresses\" button to exist")
}
fun clickAddCreditCardButton() {
Log.i(TAG, "clickAddCreditCardButton: Trying to click the \"Add credit card\" button")
addCreditCardButton().click()
Log.i(TAG, "clickAddCreditCardButton: Clicked the \"Add credit card\" button")
}
fun clickManageSavedCreditCardsButton() {
Log.i(TAG, "clickManageSavedCreditCardsButton: Trying to click the \"Manage saved cards\" button")
manageSavedCreditCardsButton().click()
Log.i(TAG, "clickManageSavedCreditCardsButton: Clicked the \"Manage saved cards\" button")
}
fun clickSecuredCreditCardsLaterButton() {
Log.i(TAG, "clickSecuredCreditCardsLaterButton: Trying to click the \"Later\" button")
securedCreditCardsLaterButton().click()
Log.i(TAG, "clickSecuredCreditCardsLaterButton: Clicked the \"Later\" button")
}
fun clickSavedCreditCard() {
Log.i(TAG, "clickSavedCreditCard: Trying to click the saved credit card and and wait for $waitingTime ms for a new window")
savedCreditCardNumber().clickAndWaitForNewWindow(waitingTime)
Log.i(TAG, "clickSavedCreditCard: Clicked the saved credit card and and waited for $waitingTime ms for a new window")
}
fun clickDeleteCreditCardToolbarButton() {
Log.i(TAG, "clickDeleteCreditCardToolbarButton: Waiting for $waitingTime ms for the delete credit card toolbar button to exist")
deleteCreditCardToolbarButton().waitForExists(waitingTime)
Log.i(TAG, "clickDeleteCreditCardToolbarButton: Waited for $waitingTime ms for the delete credit card toolbar button to exist")
Log.i(TAG, "clickDeleteCreditCardToolbarButton: Trying to click the delete credit card toolbar button")
deleteCreditCardToolbarButton().click()
Log.i(TAG, "clickDeleteCreditCardToolbarButton: Clicked the delete credit card toolbar button")
}
fun clickDeleteCreditCardMenuButton() {
Log.i(TAG, "clickDeleteCreditCardMenuButton: Waiting for $waitingTime ms for the delete credit card menu button to exist")
deleteCreditCardMenuButton().waitForExists(waitingTime)
Log.i(TAG, "clickDeleteCreditCardMenuButton: Waited for $waitingTime ms for the delete credit card menu button to exist")
Log.i(TAG, "clickDeleteCreditCardMenuButton: Trying to click the delete credit card menu button")
deleteCreditCardMenuButton().click()
Log.i(TAG, "clickDeleteCreditCardMenuButton: Clicked the delete credit card menu button")
}
fun clickSaveAndAutofillCreditCardsOption() {
Log.i(TAG, "clickSaveAndAutofillCreditCardsOption: Trying to click the \"Save and autofill cards\" option")
saveAndAutofillCreditCardsOption().click()
Log.i(TAG, "clickSaveAndAutofillCreditCardsOption: Clicked the \"Save and autofill cards\" option")
}
fun clickConfirmDeleteCreditCardButton() {
Log.i(TAG, "clickConfirmDeleteCreditCardButton: Trying to click the \"Delete\" credit card dialog button")
confirmDeleteCreditCardButton().click()
Log.i(TAG, "clickConfirmDeleteCreditCardButton: Clicked the \"Delete\" credit card dialog button")
}
fun clickCancelDeleteCreditCardButton() {
Log.i(TAG, "clickCancelDeleteCreditCardButton: Trying to click the \"Cancel\" credit card dialog button")
cancelDeleteCreditCardButton().click()
Log.i(TAG, "clickCancelDeleteCreditCardButton: Clicked the \"Cancel\" credit card dialog button")
}
fun clickExpiryMonthOption(expiryMonth: String) {
Log.i(TAG, "clickExpiryMonthOption: Waiting for $waitingTime ms for the $expiryMonth expiry month option to exist")
expiryMonthOption(expiryMonth).waitForExists(waitingTime)
Log.i(TAG, "clickExpiryMonthOption: Waited for $waitingTime ms for the $expiryMonth expiry month option to exist")
Log.i(TAG, "clickExpiryMonthOption: Trying to click $expiryMonth expiry month option")
expiryMonthOption(expiryMonth).click()
Log.i(TAG, "clickExpiryMonthOption: Clicked $expiryMonth expiry month option")
}
fun clickExpiryYearOption(expiryYear: String) {
Log.i(TAG, "clickExpiryYearOption: Waiting for $waitingTime ms for the $expiryYear expiry year option to exist")
expiryYearOption(expiryYear).waitForExists(waitingTime)
Log.i(TAG, "clickExpiryYearOption: Waited for $waitingTime ms for the $expiryYear expiry year option to exist")
Log.i(TAG, "clickExpiryYearOption: Trying to click $expiryYear expiry year option")
expiryYearOption(expiryYear).click()
Log.i(TAG, "clickExpiryYearOption: Clicked $expiryYear expiry year option")
}
fun verifyAddCreditCardsButton() = assertUIObjectExists(addCreditCardButton())
fun fillAndSaveCreditCard(cardNumber: String, cardName: String, expiryMonth: String, expiryYear: String) {
Log.i(TAG, "fillAndSaveCreditCard: Waiting for $waitingTime ms for the credit card number text field to exist")
creditCardNumberTextInput().waitForExists(waitingTime)
Log.i(TAG, "fillAndSaveCreditCard: Waited for $waitingTime ms for the credit card number text field to exist")
Log.i(TAG, "fillAndSaveCreditCard: Trying to set the credit card number to: $cardNumber")
creditCardNumberTextInput().setText(cardNumber)
Log.i(TAG, "fillAndSaveCreditCard: The credit card number was set to: $cardNumber")
Log.i(TAG, "fillAndSaveCreditCard: Trying to set the name on card to: $cardName")
nameOnCreditCardTextInput().setText(cardName)
Log.i(TAG, "fillAndSaveCreditCard: The credit card name was set to: $cardName")
Log.i(TAG, "fillAndSaveCreditCard: Trying to click the expiry month dropdown")
expiryMonthDropDown().click()
Log.i(TAG, "fillAndSaveCreditCard: Clicked the expiry month dropdown")
Log.i(TAG, "fillAndSaveCreditCard: Trying to click $expiryMonth expiry month option")
clickExpiryMonthOption(expiryMonth)
Log.i(TAG, "fillAndSaveCreditCard: Clicked $expiryMonth expiry month option")
Log.i(TAG, "fillAndSaveCreditCard: Trying to click the expiry year dropdown")
expiryYearDropDown().click()
Log.i(TAG, "fillAndSaveCreditCard: Clicked the expiry year dropdown")
Log.i(TAG, "fillAndSaveCreditCard: Trying to click $expiryYear expiry year option")
clickExpiryYearOption(expiryYear)
Log.i(TAG, "fillAndSaveCreditCard: Clicked $expiryYear expiry year option")
Log.i(TAG, "fillAndSaveCreditCard: Trying to click the \"Save\" button")
saveButton().click()
Log.i(TAG, "fillAndSaveCreditCard: Clicked the \"Save\" button")
Log.i(TAG, "fillAndSaveCreditCard: Waiting for $waitingTime ms for the \"Manage saved cards\" button to exist")
manageSavedCreditCardsButton().waitForExists(waitingTime)
Log.i(TAG, "fillAndSaveCreditCard: Waited for $waitingTime ms for the \"Manage saved cards\" button to exist")
}
fun clearCreditCardNumber() =
creditCardNumberTextInput().also {
Log.i(TAG, "clearCreditCardNumber: Waiting for $waitingTime ms for the credit card number text field to exist")
it.waitForExists(waitingTime)
Log.i(TAG, "clearCreditCardNumber: Waited for $waitingTime ms for the credit card number text field to exist")
Log.i(TAG, "clearCreditCardNumber: Trying to clear the credit card number text field")
it.clearTextField()
Log.i(TAG, "clearCreditCardNumber: Cleared the credit card number text field")
}
fun clearNameOnCreditCard() =
nameOnCreditCardTextInput().also {
Log.i(TAG, "clearNameOnCreditCard: Waiting for $waitingTime ms for name on card text field to exist")
it.waitForExists(waitingTime)
Log.i(TAG, "clearNameOnCreditCard: Waited for $waitingTime ms for name on card text field to exist")
Log.i(TAG, "clearNameOnCreditCard: Trying to clear the name on card text field")
it.clearTextField()
Log.i(TAG, "clearNameOnCreditCard: Cleared the name on card text field")
}
fun clickSaveCreditCardToolbarButton() {
Log.i(TAG, "clickSaveCreditCardToolbarButton: Trying to click the save credit card toolbar button")
saveCreditCardToolbarButton().click()
Log.i(TAG, "clickSaveCreditCardToolbarButton: Clicked the save credit card toolbar button")
}
fun verifyEditCreditCardView(
cardNumber: String,
cardName: String,
expiryMonth: String,
expiryYear: String,
) {
assertUIObjectExists(
editCreditCardToolbarTitle(),
navigateBackButton(),
deleteCreditCardToolbarButton(),
saveCreditCardToolbarButton(),
)
Log.i(TAG, "verifyEditCreditCardView: Trying to verify that the card number text field is set to: $cardNumber")
assertEquals(cardNumber, creditCardNumberTextInput().text)
Log.i(TAG, "verifyEditCreditCardView: Verified that the card number text field was set to: $cardNumber")
Log.i(TAG, "verifyEditCreditCardView: Trying to verify that the card name text field is set to: $cardName")
assertEquals(cardName, nameOnCreditCardTextInput().text)
Log.i(TAG, "verifyEditCreditCardView: Verified that the card card name text field was set to: $cardName")
// Can't get the text from the drop-down items, need to verify them individually
assertUIObjectExists(
expiryYearDropDown(),
expiryMonthDropDown(),
)
assertUIObjectExists(
itemContainingText(expiryMonth),
itemContainingText(expiryYear),
)
assertUIObjectExists(
saveButton(),
cancelButton(),
)
assertUIObjectExists(deleteCreditCardMenuButton())
}
fun verifyEditCreditCardToolbarTitle() = assertUIObjectExists(editCreditCardToolbarTitle())
fun verifyCreditCardNumberErrorMessage() =
assertUIObjectExists(itemContainingText(getStringResource(R.string.credit_cards_number_validation_error_message_2)))
fun verifyNameOnCreditCardErrorMessage() =
assertUIObjectExists(itemContainingText(getStringResource(R.string.credit_cards_name_on_card_validation_error_message_2)))
class Transition {
fun goBack(interact: SettingsRobot.() -> Unit): SettingsRobot.Transition {
Log.i(TAG, "goBack: Trying to click the device back button")
mDevice.pressBack()
Log.i(TAG, "goBack: Clicked the device back button")
SettingsRobot().interact()
return SettingsRobot.Transition()
}
fun goBackToAutofillSettings(interact: SettingsSubMenuAutofillRobot.() -> Unit): SettingsSubMenuAutofillRobot.Transition {
Log.i(TAG, "goBackToAutofillSettings: Trying to click the navigate up toolbar button")
navigateBackButton().click()
Log.i(TAG, "goBackToAutofillSettings: Clicked the navigate up toolbar button")
SettingsSubMenuAutofillRobot().interact()
return SettingsSubMenuAutofillRobot.Transition()
}
fun goBackToSavedCreditCards(interact: SettingsSubMenuAutofillRobot.() -> Unit): SettingsSubMenuAutofillRobot.Transition {
Log.i(TAG, "goBackToSavedCreditCards: Trying to click the navigate up toolbar button")
navigateBackButton().click()
Log.i(TAG, "goBackToSavedCreditCards: Clicked the navigate up toolbar button")
SettingsSubMenuAutofillRobot().interact()
return SettingsSubMenuAutofillRobot.Transition()
}
fun goBackToBrowser(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition {
Log.i(TAG, "goBackToBrowser: Trying to click the device back button")
mDevice.pressBack()
Log.i(TAG, "goBackToBrowser: Clicked the device back button")
BrowserRobot().interact()
return BrowserRobot.Transition()
}
}
}
fun autofillScreen(interact: SettingsSubMenuAutofillRobot.() -> Unit): SettingsSubMenuAutofillRobot.Transition {
SettingsSubMenuAutofillRobot().interact()
return SettingsSubMenuAutofillRobot.Transition()
}
private fun autofillToolbarTitle() = itemContainingText(getStringResource(R.string.preferences_autofill))
private fun addressesSectionTitle() = itemContainingText(getStringResource(R.string.preferences_addresses))
private fun manageAddressesToolbarTitle() =
mDevice.findObject(
UiSelector()
.resourceId("$packageName:id/navigationToolbar")
.childSelector(UiSelector().text(getStringResource(R.string.addresses_manage_addresses))),
)
private fun saveAndAutofillAddressesOption() = itemContainingText(getStringResource(R.string.preferences_addresses_save_and_autofill_addresses_2))
private fun saveAndAutofillAddressesSummary() = itemContainingText(getStringResource(R.string.preferences_addresses_save_and_autofill_addresses_summary_2))
private fun addAddressButton() = itemContainingText(getStringResource(R.string.preferences_addresses_add_address))
private fun manageAddressesButton() =
mDevice.findObject(
UiSelector()
.resourceId("android:id/title")
.text(getStringResource(R.string.preferences_addresses_manage_addresses)),
)
private fun addAddressToolbarTitle() = itemContainingText(getStringResource(R.string.addresses_add_address))
private fun editAddressToolbarTitle() = itemContainingText(getStringResource(R.string.addresses_edit_address))
private fun toolbarCheckmarkButton() = itemWithResId("$packageName:id/save_address_button")
private fun navigateBackButton() = itemWithDescription(getStringResource(R.string.action_bar_up_description))
private fun nameTextInput() = itemWithResId("$packageName:id/name_input")
private fun streetAddressTextInput() = itemWithResId("$packageName:id/street_address_input")
private fun cityTextInput() = itemWithResId("$packageName:id/city_input")
private fun subRegionDropDown() = itemWithResId("$packageName:id/subregion_drop_down")
private fun zipCodeTextInput() = itemWithResId("$packageName:id/zip_input")
private fun countryDropDown() = itemWithResId("$packageName:id/country_drop_down")
private fun phoneTextInput() = itemWithResId("$packageName:id/phone_input")
private fun emailTextInput() = itemWithResId("$packageName:id/email_input")
private fun saveButton() = itemWithResId("$packageName:id/save_button")
private fun cancelButton() = itemWithResId("$packageName:id/cancel_button")
private fun deleteAddressButton() = itemContainingText(getStringResource(R.string.addressess_delete_address_button))
private fun toolbarDeleteAddressButton() = itemWithResId("$packageName:id/delete_address_button")
private fun cancelDeleteAddressButton() = onView(withId(android.R.id.button2)).inRoot(RootMatchers.isDialog())
private fun confirmDeleteAddressButton() = onView(withId(android.R.id.button1)).inRoot(RootMatchers.isDialog())
private fun creditCardsSectionTitle() = itemContainingText(getStringResource(R.string.preferences_credit_cards_2))
private fun saveAndAutofillCreditCardsOption() = itemContainingText(getStringResource(R.string.preferences_credit_cards_save_and_autofill_cards_2))
private fun saveAndAutofillCreditCardsSummary() = itemContainingText(getStringResource(R.string.preferences_credit_cards_save_and_autofill_cards_summary_2))
private fun syncCreditCardsAcrossDevicesButton() = itemContainingText(getStringResource(R.string.preferences_credit_cards_sync_cards_across_devices))
private fun addCreditCardButton() = mDevice.findObject(UiSelector().textContains(getStringResource(R.string.preferences_credit_cards_add_credit_card_2)))
private fun savedCreditCardsToolbarTitle() = itemContainingText(getStringResource(R.string.credit_cards_saved_cards))
private fun editCreditCardToolbarTitle() = itemContainingText(getStringResource(R.string.credit_cards_edit_card))
private fun manageSavedCreditCardsButton() = mDevice.findObject(UiSelector().textContains(getStringResource(R.string.preferences_credit_cards_manage_saved_cards_2)))
private fun creditCardNumberTextInput() = mDevice.findObject(UiSelector().resourceId("$packageName:id/card_number_input"))
private fun nameOnCreditCardTextInput() = mDevice.findObject(UiSelector().resourceId("$packageName:id/name_on_card_input"))
private fun expiryMonthDropDown() = mDevice.findObject(UiSelector().resourceId("$packageName:id/expiry_month_drop_down"))
private fun expiryYearDropDown() = mDevice.findObject(UiSelector().resourceId("$packageName:id/expiry_year_drop_down"))
private fun savedCreditCardNumber() = mDevice.findObject(UiSelector().resourceId("$packageName:id/credit_card_logo"))
private fun deleteCreditCardToolbarButton() = mDevice.findObject(UiSelector().resourceId("$packageName:id/delete_credit_card_button"))
private fun saveCreditCardToolbarButton() = itemWithResId("$packageName:id/save_credit_card_button")
private fun deleteCreditCardMenuButton() = itemContainingText(getStringResource(R.string.credit_cards_delete_card_button))
private fun confirmDeleteCreditCardButton() = onView(withId(android.R.id.button1)).inRoot(RootMatchers.isDialog())
private fun cancelDeleteCreditCardButton() = onView(withId(android.R.id.button2)).inRoot(RootMatchers.isDialog())
private fun securedCreditCardsLaterButton() = onView(withId(android.R.id.button2)).inRoot(RootMatchers.isDialog())
private fun savedAddress(name: String) = mDevice.findObject(UiSelector().textContains(name))
private fun subRegionOption(subRegion: String) = mDevice.findObject(UiSelector().textContains(subRegion))
private fun countryOption(country: String) = mDevice.findObject(UiSelector().textContains(country))
private fun expiryMonthOption(expiryMonth: String) = mDevice.findObject(UiSelector().textContains(expiryMonth))
private fun expiryYearOption(expiryYear: String) = mDevice.findObject(UiSelector().textContains(expiryYear))