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
+
+
+
+
+
+
\ 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))