From e52c7a0ed382aebb2b0e9e21e5268e5dfbf0d061 Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Wed, 17 Aug 2022 15:31:59 +0300 Subject: [PATCH] [fenix] For https://github.com/mozilla-mobile/fenix/issues/26144 new address autofill UI smoke tests --- .../androidTest/assets/pages/addressForm.html | 17 +++ .../mozilla/fenix/helpers/TestAssetHelper.kt | 6 + .../mozilla/fenix/ui/SettingsBasicsTest.kt | 68 ++++++++++++ .../mozilla/fenix/ui/robots/BrowserRobot.kt | 37 ++++++ .../mozilla/fenix/ui/robots/SettingsRobot.kt | 9 ++ .../ui/robots/SettingsSubMenuAutofillRobot.kt | 105 ++++++++++++++++++ 6 files changed, 242 insertions(+) create mode 100644 app/src/androidTest/assets/pages/addressForm.html create mode 100644 app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAutofillRobot.kt diff --git a/app/src/androidTest/assets/pages/addressForm.html b/app/src/androidTest/assets/pages/addressForm.html new file mode 100644 index 0000000000..f88f731749 --- /dev/null +++ b/app/src/androidTest/assets/pages/addressForm.html @@ -0,0 +1,17 @@ + + + + Address_Form + + + +
+

Street Address:

+

City:

+

Zip Code:

+

Country:

+

Telephone:

+

Email:

+
+ + \ No newline at end of file diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/TestAssetHelper.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/TestAssetHelper.kt index cf9aaf27f3..586ca8a342 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/TestAssetHelper.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/TestAssetHelper.kt @@ -87,6 +87,12 @@ object TestAssetHelper { return TestAsset(url, "", "") } + fun getAddressFormAsset(server: MockWebServer): TestAsset { + val url = server.url("pages/addressForm.html").toString().toUri()!! + + return TestAsset(url, "", "") + } + fun getAudioPageAsset(server: MockWebServer): TestAsset { val url = server.url("pages/audioMediaPage.html").toString().toUri()!! val title = "Audio_Test_Page" diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsBasicsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsBasicsTest.kt index 0611210f50..4f6aa65ecc 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsBasicsTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsBasicsTest.kt @@ -11,12 +11,15 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.mozilla.fenix.FenixApplication +import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.helpers.AndroidAssetDispatcher import org.mozilla.fenix.helpers.FeatureSettingsHelper import org.mozilla.fenix.helpers.HomeActivityIntentTestRule +import org.mozilla.fenix.helpers.TestAssetHelper import org.mozilla.fenix.helpers.TestAssetHelper.getLoremIpsumAsset import org.mozilla.fenix.ui.robots.checkTextSizeOnWebsite import org.mozilla.fenix.ui.robots.homeScreen +import org.mozilla.fenix.ui.robots.navigationToolbar /** * Tests for verifying the General section of the Settings menu @@ -122,4 +125,69 @@ class SettingsBasicsTest { verifyMenuItemsAreDisabled() } } + + @SmokeTest + @Test + fun verifyAddressAutofillTest() { + val addressFormPage = + TestAssetHelper.getAddressFormAsset(mockWebServer) + + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openAutofillSubMenu { + clickAddAddressButton() + fillAndSaveAddress( + "Mozilla", + "Fenix", + "Firefox", + "Harrison Street", + "San Francisco", + "Alaska", + "94105", + "United States", + "555-5555", + "foo@bar.com" + ) + }.goBack { + }.goBack { + } + navigationToolbar { + }.enterURLAndEnterToBrowser(addressFormPage.url) { + clickStreetAddressTextBox() + clickSelectAddressButton() + clickAddressSuggestion("Harrison Street") + verifyAutofilledAddress("Harrison Street") + } + } + + @SmokeTest + @Test + fun deleteSavedAddressTest() { + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openAutofillSubMenu { + clickAddAddressButton() + fillAndSaveAddress( + "Mozilla", + "Fenix", + "Firefox", + "Harrison Street", + "San Francisco", + "Alaska", + "94105", + "United States", + "555-5555", + "foo@bar.com" + ) + clickManageAddressesButton() + clickSavedAddress("Mozilla") + clickDeleteAddressButton() + clickCancelDeleteAddressButton() + clickDeleteAddressButton() + clickConfirmDeleteAddressButton() + verifyAddAddressButton() + } + } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt index dc37b3eaf1..87b1746d72 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt @@ -599,6 +599,16 @@ class BrowserRobot { } } + fun clickStreetAddressTextBox() { + streetAddressTextBox().waitForExists(waitingTime) + streetAddressTextBox().click() + } + + fun clickSelectAddressButton() { + selectAddressButton.waitForExists(waitingTime) + selectAddressButton.clickAndWaitForNewWindow(waitingTime) + } + fun clickLoginSuggestion(userName: String) { val loginSuggestion = mDevice.findObject( @@ -610,6 +620,11 @@ class BrowserRobot { loginSuggestion.click() } + fun clickAddressSuggestion(streetName: String) { + addressSuggestion(streetName).waitForExists(waitingTime) + addressSuggestion(streetName).click() + } + fun verifySuggestedUserName(userName: String) { mDevice.findObject( UiSelector() @@ -645,6 +660,11 @@ class BrowserRobot { assertTrue(userNameTextBox.text.equals(userName)) } + fun verifyAutofilledAddress(streetAddress: String) { + mDevice.waitForObjects(streetAddressTextBox(streetAddress)) + assertTrue(streetAddressTextBox(streetAddress).waitForExists(waitingTime)) + } + fun verifyPrefilledPWALoginCredentials(userName: String, shortcutTitle: String) { mDevice.waitForIdle(waitingTime) @@ -906,6 +926,23 @@ private var progressBar = ) private val suggestedLogins = mDevice.findObject(UiSelector().resourceId("$packageName:id/loginSelectBar")) +private val selectAddressButton = mDevice.findObject(UiSelector().resourceId("$packageName:id/select_address_header")) + +private fun addressSuggestion(streetName: String) = + mDevice.findObject( + UiSelector() + .resourceId("$packageName:id/address_name") + .textContains(streetName) + ) + +private fun streetAddressTextBox(streetAddress: String = "") = + mDevice.findObject( + UiSelector() + .resourceId("streetAddress") + .textContains(streetAddress) + .className("android.widget.EditText") + .packageName("$packageName") + ) // Permissions test page elements & prompts // Test page used located at https://mozilla-mobile.github.io/testapp/permissions diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsRobot.kt index d528055d80..1855cbaa9e 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsRobot.kt @@ -171,6 +171,15 @@ class SettingsRobot { return SettingsSubMenuHomepageRobot.Transition() } + fun openAutofillSubMenu(interact: SettingsSubMenuAutofillRobot.() -> Unit): SettingsSubMenuAutofillRobot.Transition { + + mDevice.findObject(UiSelector().textContains(getStringResource(R.string.preferences_autofill))).waitForExists(waitingTime) + onView(withText(R.string.preferences_autofill)).click() + + SettingsSubMenuAutofillRobot().interact() + return SettingsSubMenuAutofillRobot.Transition() + } + fun openAccessibilitySubMenu(interact: SettingsSubMenuAccessibilityRobot.() -> Unit): SettingsSubMenuAccessibilityRobot.Transition { scrollToElementByText("Accessibility") diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAutofillRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAutofillRobot.kt new file mode 100644 index 0000000000..c99e893898 --- /dev/null +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAutofillRobot.kt @@ -0,0 +1,105 @@ +/* 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 androidx.test.uiautomator.UiSelector +import org.junit.Assert.assertTrue +import org.mozilla.fenix.R +import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime +import org.mozilla.fenix.helpers.TestHelper.getStringResource +import org.mozilla.fenix.helpers.TestHelper.mDevice +import org.mozilla.fenix.helpers.TestHelper.packageName +import org.mozilla.fenix.helpers.TestHelper.scrollToElementByText + +class SettingsSubMenuAutofillRobot { + + fun clickAddAddressButton() = addAddressButton.click() + fun clickManageAddressesButton() = manageAddressesButton.click() + fun clickSavedAddress(firstName: String) = savedAddress(firstName).clickAndWaitForNewWindow(waitingTime) + fun clickDeleteAddressButton() { + deleteAddressButton.waitForExists(waitingTime) + deleteAddressButton.click() + } + fun clickCancelDeleteAddressButton() { + cancelDeleteAddressButton.waitForExists(waitingTime) + cancelDeleteAddressButton.click() + } + fun clickConfirmDeleteAddressButton() { + confirmDeleteAddressButton.waitForExists(waitingTime) + confirmDeleteAddressButton.click() + } + fun clickSubRegionOption(subRegion: String) { + subRegionOption(subRegion).waitForExists(waitingTime) + subRegionOption(subRegion).click() + } + fun clickCountryOption(country: String) { + countryOption(country).waitForExists(waitingTime) + countryOption(country).click() + } + fun verifyAddAddressButton() = assertTrue(addAddressButton.waitForExists(waitingTime)) + + fun fillAndSaveAddress( + firstName: String, + middleName: String, + lastName: String, + streetAddress: String, + city: String, + state: String, + zipCode: String, + country: String, + phoneNumber: String, + emailAddress: String + ) { + firstNameTextInput.waitForExists(waitingTime) + firstNameTextInput.setText(firstName) + middleNameTextInput.setText(middleName) + lastNameTextInput.setText(lastName) + streetAddressTextInput.setText(streetAddress) + scrollToElementByText(getStringResource(R.string.addresses_city)) + cityTextInput.setText(city) + subRegionDropDown.click() + clickSubRegionOption(state) + zipCodeTextInput.setText(zipCode) + countryDropDown.click() + clickCountryOption(country) + scrollToElementByText(getStringResource(R.string.addresses_phone)) + phoneTextInput.setText(phoneNumber) + emailTextInput.setText(emailAddress) + scrollToElementByText(getStringResource(R.string.addresses_save_button)) + saveButton.click() + manageAddressesButton.waitForExists(waitingTime) + } + + class Transition { + fun goBack(interact: SettingsRobot.() -> Unit): SettingsRobot.Transition { + mDevice.pressBack() + + SettingsRobot().interact() + return SettingsRobot.Transition() + } + } +} + +private val addAddressButton = mDevice.findObject(UiSelector().textContains(getStringResource(R.string.preferences_addresses_add_address))) +private val manageAddressesButton = mDevice.findObject(UiSelector().textContains(getStringResource(R.string.preferences_addresses_manage_addresses))) + +private val firstNameTextInput = mDevice.findObject(UiSelector().resourceId("$packageName:id/first_name_input")) +private val middleNameTextInput = mDevice.findObject(UiSelector().resourceId("$packageName:id/middle_name_input")) +private val lastNameTextInput = mDevice.findObject(UiSelector().resourceId("$packageName:id/last_name_input")) +private val streetAddressTextInput = mDevice.findObject(UiSelector().resourceId("$packageName:id/street_address_input")) +private val cityTextInput = mDevice.findObject(UiSelector().resourceId("$packageName:id/city_input")) +private val subRegionDropDown = mDevice.findObject(UiSelector().resourceId("$packageName:id/subregion_drop_down")) +private val zipCodeTextInput = mDevice.findObject(UiSelector().resourceId("$packageName:id/zip_input")) +private val countryDropDown = mDevice.findObject(UiSelector().resourceId("$packageName:id/country_drop_down")) +private val phoneTextInput = mDevice.findObject(UiSelector().resourceId("$packageName:id/phone_input")) +private val emailTextInput = mDevice.findObject(UiSelector().resourceId("$packageName:id/email_input")) +private val saveButton = mDevice.findObject(UiSelector().resourceId("$packageName:id/save_button")) +private val deleteAddressButton = mDevice.findObject(UiSelector().resourceId("$packageName:id/delete_address_button")) +private val cancelDeleteAddressButton = mDevice.findObject(UiSelector().resourceId("android:id/button2")) +private val confirmDeleteAddressButton = mDevice.findObject(UiSelector().resourceId("android:id/button1")) + +private fun savedAddress(firstName: String) = mDevice.findObject(UiSelector().textContains(firstName)) +private fun subRegionOption(subRegion: String) = mDevice.findObject(UiSelector().textContains(subRegion)) +private fun countryOption(country: String) = mDevice.findObject(UiSelector().textContains(country))