Bug 1883363 - Add logs to SettingsSubMenuSearchRobot

fenix/125.0
AndiAJ 3 months ago committed by mergify[bot]
parent 690667f1d9
commit fecf2c51a8

@ -6,6 +6,7 @@
package org.mozilla.fenix.ui.robots package org.mozilla.fenix.ui.robots
import android.util.Log
import androidx.compose.ui.test.SemanticsMatcher import androidx.compose.ui.test.SemanticsMatcher
import androidx.compose.ui.test.assert import androidx.compose.ui.test.assert
import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsDisplayed
@ -42,6 +43,7 @@ import org.hamcrest.Matchers.endsWith
import org.junit.Assert.assertFalse import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
import org.mozilla.fenix.R import org.mozilla.fenix.R
import org.mozilla.fenix.helpers.Constants.TAG
import org.mozilla.fenix.helpers.DataGenerationHelper.getAvailableSearchEngines import org.mozilla.fenix.helpers.DataGenerationHelper.getAvailableSearchEngines
import org.mozilla.fenix.helpers.DataGenerationHelper.getRegionSearchEnginesList import org.mozilla.fenix.helpers.DataGenerationHelper.getRegionSearchEnginesList
import org.mozilla.fenix.helpers.DataGenerationHelper.getStringResource import org.mozilla.fenix.helpers.DataGenerationHelper.getStringResource
@ -62,6 +64,7 @@ import org.mozilla.fenix.helpers.isEnabled
*/ */
class SettingsSubMenuSearchRobot { class SettingsSubMenuSearchRobot {
fun verifyToolbarText(title: String) { fun verifyToolbarText(title: String) {
Log.i(TAG, "verifyToolbarText: Trying to verify that the $title toolbar title is visible")
onView( onView(
allOf( allOf(
withId(R.id.navigationToolbar), withId(R.id.navigationToolbar),
@ -69,60 +72,84 @@ class SettingsSubMenuSearchRobot {
hasDescendant(withText(title)), hasDescendant(withText(title)),
), ),
).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) ).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
Log.i(TAG, "verifyToolbarText: Verified that the $title toolbar title is visible")
} }
fun verifySearchEnginesSectionHeader() { fun verifySearchEnginesSectionHeader() {
Log.i(TAG, "verifySearchEnginesSectionHeader: Trying to verify that the \"Search engines\" heading is displayed")
onView(withText("Search engines")).check(matches(isDisplayed())) onView(withText("Search engines")).check(matches(isDisplayed()))
Log.i(TAG, "verifySearchEnginesSectionHeader: Verified that the \"Search engines\" heading is displayed")
} }
fun verifyDefaultSearchEngineHeader() { fun verifyDefaultSearchEngineHeader() {
Log.i(TAG, "verifyDefaultSearchEngineHeader: Trying to verify that the \"Default search engine\" option is displayed")
defaultSearchEngineHeader defaultSearchEngineHeader
.check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
Log.i(TAG, "verifyDefaultSearchEngineHeader: Verified that the \"Default search engine\" option is displayed")
} }
fun verifyDefaultSearchEngineSummary(engineName: String) { fun verifyDefaultSearchEngineSummary(engineName: String) {
Log.i(TAG, "verifyDefaultSearchEngineSummary: Trying to verify that the \"Default search engine\" option has $engineName as summary")
defaultSearchEngineHeader.check(matches(hasSibling(withText(engineName)))) defaultSearchEngineHeader.check(matches(hasSibling(withText(engineName))))
Log.i(TAG, "verifyDefaultSearchEngineSummary: Verified that the \"Default search engine\" option has $engineName as summary")
} }
fun verifyManageSearchShortcutsHeader() { fun verifyManageSearchShortcutsHeader() {
Log.i(TAG, "verifyManageSearchShortcutsHeader: Trying to verify that the \"Manage alternative search engines\" option is displayed")
manageSearchShortcutsHeader.check(matches(isDisplayed())) manageSearchShortcutsHeader.check(matches(isDisplayed()))
Log.i(TAG, "verifyManageSearchShortcutsHeader: Verified that the \"Manage alternative search engines\" option is displayed")
} }
fun verifyManageShortcutsSummary() { fun verifyManageShortcutsSummary() {
Log.i(TAG, "verifyManageShortcutsSummary: Trying to verify that the \"Manage alternative search engines\" option has \"Edit engines visible in the search menu\" as summary")
manageSearchShortcutsHeader manageSearchShortcutsHeader
.check(matches(hasSibling(withText("Edit engines visible in the search menu")))) .check(matches(hasSibling(withText("Edit engines visible in the search menu"))))
Log.i(TAG, "verifyManageShortcutsSummary: Verified that the \"Manage alternative search engines\" option has \"Edit engines visible in the search menu\" as summary")
} }
fun verifyEnginesShortcutsListHeader() = fun verifyEnginesShortcutsListHeader() =
assertUIObjectExists(itemWithText("Engines visible on the search menu")) assertUIObjectExists(itemWithText("Engines visible on the search menu"))
fun verifyAddressBarSectionHeader() { fun verifyAddressBarSectionHeader() {
Log.i(TAG, "verifyAddressBarSectionHeader: Trying to verify that the \"Address bar - Firefox Suggest\" heading is displayed")
onView(withText("Address bar - Firefox Suggest")).check(matches(isDisplayed())) onView(withText("Address bar - Firefox Suggest")).check(matches(isDisplayed()))
Log.i(TAG, "verifyAddressBarSectionHeader: Verified that the \"Address bar - Firefox Suggest\" heading is displayed")
} }
fun verifyDefaultSearchEngineList() { fun verifyDefaultSearchEngineList() {
defaultSearchEngineOption("Google") Log.i(TAG, "verifyDefaultSearchEngineList: Trying to verify that the \"Google\" search engine option has a favicon")
.check(matches(hasSibling(withId(R.id.engine_icon)))) defaultSearchEngineOption("Google").check(matches(hasSibling(withId(R.id.engine_icon))))
.check(matches(isDisplayed())) Log.i(TAG, "verifyDefaultSearchEngineList: Verified that the \"Google\" search engine option has a favicon")
defaultSearchEngineOption("Bing") Log.i(TAG, "verifyDefaultSearchEngineList: Trying to verify that the \"Google\" search engine option is displayed")
.check(matches(hasSibling(withId(R.id.engine_icon)))) defaultSearchEngineOption("Google").check(matches(isDisplayed()))
.check(matches(isDisplayed())) Log.i(TAG, "verifyDefaultSearchEngineList: Verified that the \"Google\" search engine option is displayed")
defaultSearchEngineOption("DuckDuckGo") Log.i(TAG, "verifyDefaultSearchEngineList: Trying to verify that the \"Bing\" search engine option has a favicon")
.check(matches(hasSibling(withId(R.id.engine_icon)))) defaultSearchEngineOption("Bing").check(matches(hasSibling(withId(R.id.engine_icon))))
.check(matches(isDisplayed())) Log.i(TAG, "verifyDefaultSearchEngineList: Verified that the \"Bing\" search engine option has a favicon")
assertUIObjectExists(addSearchEngineButton) Log.i(TAG, "verifyDefaultSearchEngineList: Trying to verify that the \"Bing\" search engine option is displayed")
defaultSearchEngineOption("Bing").check(matches(isDisplayed()))
Log.i(TAG, "verifyDefaultSearchEngineList: Verified that the \"Bing\" search engine option is displayed")
Log.i(TAG, "verifyDefaultSearchEngineList: Trying to verify that the \"DuckDuckGo\" search engine option has a favicon")
defaultSearchEngineOption("DuckDuckGo").check(matches(hasSibling(withId(R.id.engine_icon))))
Log.i(TAG, "verifyDefaultSearchEngineList: Verified that the \"DuckDuckGo\" search engine option has a favicon")
Log.i(TAG, "verifyDefaultSearchEngineList: Trying to verify that the \"DuckDuckGo\" search engine option is displayed")
defaultSearchEngineOption("DuckDuckGo").check(matches(isDisplayed()))
Log.i(TAG, "verifyDefaultSearchEngineList: Verified that the \"DuckDuckGo\" search engine option is displayed")
assertUIObjectExists(addSearchEngineButton())
} }
fun verifyManageShortcutsList(testRule: ComposeTestRule) { fun verifyManageShortcutsList(testRule: ComposeTestRule) {
val availableShortcutsEngines = getRegionSearchEnginesList() + getAvailableSearchEngines() val availableShortcutsEngines = getRegionSearchEnginesList() + getAvailableSearchEngines()
availableShortcutsEngines.forEach { availableShortcutsEngines.forEach {
Log.i(TAG, "verifyManageShortcutsList: Trying to verify that the ${it.name} alternative search engine is displayed")
testRule.onNodeWithText(it.name) testRule.onNodeWithText(it.name)
.assert(hasAnySibling(hasContentDescription("${it.name} search engine"))) .assert(hasAnySibling(hasContentDescription("${it.name} search engine")))
.assertIsDisplayed() .assertIsDisplayed()
Log.i(TAG, "verifyManageShortcutsList: Verify that the ${it.name} alternative search engine is displayed")
} }
assertUIObjectExists(addSearchEngineButton) assertUIObjectExists(addSearchEngineButton())
} }
/** /**
@ -136,24 +163,33 @@ class SettingsSubMenuSearchRobot {
).isChecked ).isChecked
if (it.isChecked) { if (it.isChecked) {
assertTrue(shortcutIsChecked) Log.i(TAG, "verifySearchShortcutChecked: Trying to verify that ${it.name}'s alternative search engine check box is checked")
assertTrue("$TAG: ${it.name} alternative search engine check box is not checked", shortcutIsChecked)
Log.i(TAG, "verifySearchShortcutChecked: Verified that the ${it.name}'s alternative search engine check box is checked")
} else { } else {
assertFalse(shortcutIsChecked) Log.i(TAG, "verifySearchShortcutChecked: Trying to verify that the ${it.name}'s alternative search engine check box is not checked")
assertFalse("$TAG: ${it.name} alternative search engine check box is checked", shortcutIsChecked)
Log.i(TAG, "verifySearchShortcutChecked: Verified that the ${it.name}'s alternative search engine check box is not checked")
} }
} }
} }
fun verifyAutocompleteURlsIsEnabled(enabled: Boolean) { fun verifyAutocompleteURlsIsEnabled(enabled: Boolean) {
Log.i(TAG, "verifyAutocompleteURlsIsEnabled: Trying to verify that the \"Autocomplete URLs\" toggle is checked: $enabled")
autocompleteSwitchButton() autocompleteSwitchButton()
.check(matches(hasCousin(allOf(withClassName(endsWith("Switch")), isChecked(enabled))))) .check(matches(hasCousin(allOf(withClassName(endsWith("Switch")), isChecked(enabled)))))
Log.i(TAG, "verifyAutocompleteURlsIsEnabled: Verified that the \"Autocomplete URLs\" toggle is checked: $enabled")
} }
fun verifyShowSearchSuggestionsEnabled(enabled: Boolean) { fun verifyShowSearchSuggestionsEnabled(enabled: Boolean) {
Log.i(TAG, "verifyShowSearchSuggestionsEnabled: Trying to verify that the \"Show search suggestions\" toggle is checked: $enabled")
showSearchSuggestionSwitchButton() showSearchSuggestionSwitchButton()
.check(matches(hasCousin(allOf(withClassName(endsWith("Switch")), isChecked(enabled))))) .check(matches(hasCousin(allOf(withClassName(endsWith("Switch")), isChecked(enabled)))))
Log.i(TAG, "verifyShowSearchSuggestionsEnabled: Verified that the \"Show search suggestions\" toggle is checked: $enabled")
} }
fun verifyShowSearchSuggestionsInPrivateEnabled(enabled: Boolean) { fun verifyShowSearchSuggestionsInPrivateEnabled(enabled: Boolean) {
Log.i(TAG, "verifyShowSearchSuggestionsInPrivateEnabled: Trying to verify that the \"Show in private sessions\" check box is checked: $enabled")
showSuggestionsInPrivateModeSwitch() showSuggestionsInPrivateModeSwitch()
.check( .check(
matches( matches(
@ -167,118 +203,192 @@ class SettingsSubMenuSearchRobot {
), ),
), ),
) )
Log.i(TAG, "verifyShowSearchSuggestionsInPrivateEnabled: Verified that the \"Show in private sessions\" check box is checked: $enabled")
} }
fun verifyShowClipboardSuggestionsEnabled(enabled: Boolean) { fun verifyShowClipboardSuggestionsEnabled(enabled: Boolean) {
showClipboardSuggestionSwitch() Log.i(TAG, "verifyShowClipboardSuggestionsEnabled: Trying to verify that the \"Show clipboard suggestions\" option is visible")
.check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) showClipboardSuggestionSwitch().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
.check(matches(hasCousin(allOf(withClassName(endsWith("Switch")), isChecked(enabled))))) Log.i(TAG, "verifyShowClipboardSuggestionsEnabled: Verified that the \"Show clipboard suggestions\" option is visible")
Log.i(TAG, "verifyShowClipboardSuggestionsEnabled: Trying to verify that the \"Show clipboard suggestions\" toggle is checked: $enabled")
showClipboardSuggestionSwitch().check(matches(hasCousin(allOf(withClassName(endsWith("Switch")), isChecked(enabled)))))
Log.i(TAG, "verifyShowClipboardSuggestionsEnabled: Verified that the \"Show clipboard suggestions\" toggle is checked: $enabled")
} }
fun verifySearchBrowsingHistoryEnabled(enabled: Boolean) { fun verifySearchBrowsingHistoryEnabled(enabled: Boolean) {
searchHistorySwitchButton() Log.i(TAG, "verifySearchBrowsingHistoryEnabled: Trying to verify that the \"Search browsing history\" option is visible")
.check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) searchHistorySwitchButton().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
.check(matches(hasCousin(allOf(withClassName(endsWith("Switch")), isChecked(enabled))))) Log.i(TAG, "verifySearchBrowsingHistoryEnabled: Verified that the \"Search browsing history\" option is visible")
Log.i(TAG, "verifySearchBrowsingHistoryEnabled: Trying to verify that the \"Search browsing history\" toggle is checked: $enabled")
searchHistorySwitchButton().check(matches(hasCousin(allOf(withClassName(endsWith("Switch")), isChecked(enabled)))))
Log.i(TAG, "verifySearchBrowsingHistoryEnabled: Verified that the \"Search browsing history\" toggle is checked: $enabled")
} }
fun verifySearchBookmarksEnabled(enabled: Boolean) { fun verifySearchBookmarksEnabled(enabled: Boolean) {
searchBookmarksSwitchButton() Log.i(TAG, "verifySearchBookmarksEnabled: Trying to verify that the \"Search bookmarks\" option is visible")
.check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) searchBookmarksSwitchButton().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
.check(matches(hasCousin(allOf(withClassName(endsWith("Switch")), isChecked(enabled))))) Log.i(TAG, "verifySearchBookmarksEnabled: Verified that the \"Search bookmarks\" option is visible")
Log.i(TAG, "verifySearchBookmarksEnabled: Trying to verify that the \"Search bookmarks\" toggle is checked: $enabled")
searchBookmarksSwitchButton().check(matches(hasCousin(allOf(withClassName(endsWith("Switch")), isChecked(enabled)))))
Log.i(TAG, "verifySearchBookmarksEnabled: Verified that the \"Search bookmarks\" toggle is checked: $enabled")
} }
fun verifySearchSyncedTabsEnabled(enabled: Boolean) { fun verifySearchSyncedTabsEnabled(enabled: Boolean) {
searchSyncedTabsSwitchButton() Log.i(TAG, "verifySearchSyncedTabsEnabled: Trying to verify that the \"Search synced tabs\" option is visible")
.check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) searchSyncedTabsSwitchButton().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
.check(matches(hasCousin(allOf(withClassName(endsWith("Switch")), isChecked(enabled))))) Log.i(TAG, "verifySearchSyncedTabsEnabled: Verified that the \"Search synced tabs\" option is visible")
Log.i(TAG, "verifySearchSyncedTabsEnabled: Trying to verify that the \"Search synced tabs\" toggle is checked: $enabled")
searchSyncedTabsSwitchButton().check(matches(hasCousin(allOf(withClassName(endsWith("Switch")), isChecked(enabled)))))
Log.i(TAG, "verifySearchSyncedTabsEnabled: Verified that the \"Search synced tabs\" toggle is checked: $enabled")
} }
fun verifyVoiceSearchEnabled(enabled: Boolean) { fun verifyVoiceSearchEnabled(enabled: Boolean) {
voiceSearchSwitchButton() Log.i(TAG, "verifyVoiceSearchEnabled: Trying to verify that the \"Show voice search\" option is visible")
.check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) voiceSearchSwitchButton().check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
.check(matches(hasCousin(allOf(withClassName(endsWith("Switch")), isChecked(enabled))))) Log.i(TAG, "verifyVoiceSearchEnabled: Verified that the \"Show voice search\" option is visible")
Log.i(TAG, "verifyVoiceSearchEnabled: Trying to verify that the \"Show voice search\" toggle is checked: $enabled")
voiceSearchSwitchButton().check(matches(hasCousin(allOf(withClassName(endsWith("Switch")), isChecked(enabled)))))
Log.i(TAG, "verifyVoiceSearchEnabled: Verified that the \"Show voice search\" toggle is checked: $enabled")
} }
fun openDefaultSearchEngineMenu() { fun openDefaultSearchEngineMenu() {
Log.i(TAG, "openDefaultSearchEngineMenu: Trying to click the \"Default search engine\" button")
defaultSearchEngineHeader.click() defaultSearchEngineHeader.click()
Log.i(TAG, "openDefaultSearchEngineMenu: Clicked the \"Default search engine\" button")
} }
fun openManageShortcutsMenu() { fun openManageShortcutsMenu() {
Log.i(TAG, "openManageShortcutsMenu: Trying to click the \"Manage alternative search engines\" button")
manageSearchShortcutsHeader.click() manageSearchShortcutsHeader.click()
Log.i(TAG, "openManageShortcutsMenu: Clicked the \"Manage alternative search engines\" button")
} }
fun changeDefaultSearchEngine(searchEngineName: String) { fun changeDefaultSearchEngine(searchEngineName: String) {
onView(withText(searchEngineName)) Log.i(TAG, "changeDefaultSearchEngine: Trying to verify that the $searchEngineName option is visible")
.check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) onView(withText(searchEngineName)).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
.perform(click()) Log.i(TAG, "changeDefaultSearchEngine: Verified that the $searchEngineName option is visible")
Log.i(TAG, "changeDefaultSearchEngine: Trying to click the $searchEngineName option")
onView(withText(searchEngineName)).perform(click())
Log.i(TAG, "changeDefaultSearchEngine: Clicked the $searchEngineName option")
} }
fun selectSearchShortcut(shortcut: EngineShortcut) { fun selectSearchShortcut(shortcut: EngineShortcut) {
Log.i(TAG, "selectSearchShortcut: Trying to click ${shortcut.name}'s alternative search engine check box")
mDevice.findObject(UiSelector().text(shortcut.name)) mDevice.findObject(UiSelector().text(shortcut.name))
.getFromParent(UiSelector().index(shortcut.checkboxIndex)) .getFromParent(UiSelector().index(shortcut.checkboxIndex))
.click() .click()
Log.i(TAG, "selectSearchShortcut: Clicked ${shortcut.name}'s alternative search engine check box")
} }
fun toggleAutocomplete() = autocompleteSwitchButton().click() fun toggleAutocomplete() {
Log.i(TAG, "toggleAutocomplete: Trying to click the \"Autocomplete URLs\" toggle")
autocompleteSwitchButton().click()
Log.i(TAG, "toggleAutocomplete: Clicked the \"Autocomplete URLs\" toggle")
}
fun toggleShowSearchSuggestions() = showSearchSuggestionSwitchButton().click() fun toggleShowSearchSuggestions() {
Log.i(TAG, "toggleShowSearchSuggestions: Trying to click the \"Show search suggestions\" toggle")
showSearchSuggestionSwitchButton().click()
Log.i(TAG, "toggleShowSearchSuggestions: Clicked the \"Show search suggestions\" toggle")
}
fun toggleVoiceSearch() { fun toggleVoiceSearch() {
Log.i(TAG, "toggleVoiceSearch: Trying to click the \"Show voice search\" toggle")
voiceSearchSwitchButton().perform(click()) voiceSearchSwitchButton().perform(click())
Log.i(TAG, "toggleVoiceSearch: Clicked the \"Show voice search\" toggle")
} }
fun toggleClipboardSuggestion() { fun toggleClipboardSuggestion() {
Log.i(TAG, "toggleClipboardSuggestion: Trying to click the \"Show clipboard suggestions\" toggle")
showClipboardSuggestionSwitch().click() showClipboardSuggestionSwitch().click()
Log.i(TAG, "toggleClipboardSuggestion: Clicked the \"Show clipboard suggestions\" toggle")
} }
fun switchSearchHistoryToggle() = searchHistorySwitchButton().click() fun switchSearchHistoryToggle() {
Log.i(TAG, "switchSearchHistoryToggle: Trying to click the \"Search browsing history\" toggle")
searchHistorySwitchButton().click()
Log.i(TAG, "switchSearchHistoryToggle: Clicked the \"Search browsing history\" toggle")
}
fun switchSearchBookmarksToggle() = searchBookmarksSwitchButton().click() fun switchSearchBookmarksToggle() {
Log.i(TAG, "switchSearchBookmarksToggle: Trying to click the \"Search bookmarks\" toggle")
searchBookmarksSwitchButton().click()
Log.i(TAG, "switchSearchBookmarksToggle: Clicked the \"Search bookmarks\" toggle")
}
fun switchShowSuggestionsInPrivateSessionsToggle() = fun switchShowSuggestionsInPrivateSessionsToggle() {
Log.i(TAG, "switchShowSuggestionsInPrivateSessionsToggle: Trying to click the \"Show in private sessions\" check box")
showSuggestionsInPrivateModeSwitch().click() showSuggestionsInPrivateModeSwitch().click()
Log.i(TAG, "switchShowSuggestionsInPrivateSessionsToggle: Clicked the \"Show in private sessions\" check box")
}
fun openAddSearchEngineMenu() = addSearchEngineButton.click() fun openAddSearchEngineMenu() {
Log.i(TAG, "openAddSearchEngineMenu: Trying to click the \"Add search engine\" button")
addSearchEngineButton().click()
Log.i(TAG, "openAddSearchEngineMenu: Clicked the \"Add search engine\" button")
}
fun verifyEngineListContains(searchEngineName: String, shouldExist: Boolean) = fun verifyEngineListContains(searchEngineName: String, shouldExist: Boolean) =
assertUIObjectExists(itemWithText(searchEngineName), exists = shouldExist) assertUIObjectExists(itemWithText(searchEngineName), exists = shouldExist)
fun verifyDefaultSearchEngineSelected(searchEngineName: String) { fun verifyDefaultSearchEngineSelected(searchEngineName: String) {
Log.i(TAG, "verifyDefaultSearchEngineSelected: Trying to verify that $searchEngineName's radio button is checked")
defaultSearchEngineOption(searchEngineName).check(matches(isChecked(true))) defaultSearchEngineOption(searchEngineName).check(matches(isChecked(true)))
Log.i(TAG, "verifyDefaultSearchEngineSelected: Verified that $searchEngineName's radio button is checked")
} }
fun verifySaveSearchEngineButtonEnabled(enabled: Boolean) { fun verifySaveSearchEngineButtonEnabled(enabled: Boolean) {
Log.i(TAG, "verifySaveSearchEngineButtonEnabled: Trying to verify that the \"Save\" button is enabled")
addSearchEngineSaveButton().check(matches(isEnabled(enabled))) addSearchEngineSaveButton().check(matches(isEnabled(enabled)))
Log.i(TAG, "verifySaveSearchEngineButtonEnabled: Verified that the \"Save\" button is enabled")
} }
fun saveNewSearchEngine() { fun saveNewSearchEngine() {
Log.i(TAG, "saveNewSearchEngine: Trying to perform \"Close soft keyboard\" action")
closeSoftKeyboard() closeSoftKeyboard()
Log.i(TAG, "saveNewSearchEngine: Performed \"Close soft keyboard\" action")
Log.i(TAG, "saveNewSearchEngine: Trying to click the \"Save\" button")
addSearchEngineSaveButton().click() addSearchEngineSaveButton().click()
Log.i(TAG, "saveNewSearchEngine: Clicked the \"Save\" button")
} }
fun typeCustomEngineDetails(engineName: String, engineURL: String) { fun typeCustomEngineDetails(engineName: String, engineURL: String) {
try { try {
Log.i(TAG, "typeCustomEngineDetails: Trying to clear the \"Search engine name\" text field")
mDevice.findObject(By.res("$packageName:id/edit_engine_name")).clear() mDevice.findObject(By.res("$packageName:id/edit_engine_name")).clear()
Log.i(TAG, "typeCustomEngineDetails: Cleared the \"Search engine name\" text field")
Log.i(TAG, "typeCustomEngineDetails: Trying to set the \"Search engine name\" text field to: $engineName")
mDevice.findObject(By.res("$packageName:id/edit_engine_name")).text = engineName mDevice.findObject(By.res("$packageName:id/edit_engine_name")).text = engineName
Log.i(TAG, "typeCustomEngineDetails: The \"Search engine name\" text field text was set to: $engineName")
assertUIObjectExists( assertUIObjectExists(
itemWithResIdAndText("$packageName:id/edit_engine_name", engineName), itemWithResIdAndText("$packageName:id/edit_engine_name", engineName),
) )
Log.i(TAG, "typeCustomEngineDetails: Trying to clear the \"URL to use for search\" text field")
mDevice.findObject(By.res("$packageName:id/edit_search_string")).clear() mDevice.findObject(By.res("$packageName:id/edit_search_string")).clear()
Log.i(TAG, "typeCustomEngineDetails: Cleared the \"URL to use for search\" text field")
Log.i(TAG, "typeCustomEngineDetails: Trying to set the \"URL to use for search\" text field to: $engineURL")
mDevice.findObject(By.res("$packageName:id/edit_search_string")).text = engineURL mDevice.findObject(By.res("$packageName:id/edit_search_string")).text = engineURL
Log.i(TAG, "typeCustomEngineDetails: The \"URL to use for search\" text field text was set to: $engineURL")
assertUIObjectExists( assertUIObjectExists(
itemWithResIdAndText("$packageName:id/edit_search_string", engineURL), itemWithResIdAndText("$packageName:id/edit_search_string", engineURL),
) )
} catch (e: AssertionError) { } catch (e: AssertionError) {
println("The name or the search string were not set properly") Log.i(TAG, "typeCustomEngineDetails: AssertionError caught, executing fallback methods")
Log.i(TAG, "typeCustomEngineDetails: Trying to clear the \"Search engine name\" text field")
mDevice.findObject(By.res("$packageName:id/edit_engine_name")).clear() mDevice.findObject(By.res("$packageName:id/edit_engine_name")).clear()
Log.i(TAG, "typeCustomEngineDetails: Cleared the \"Search engine name\" text field")
Log.i(TAG, "typeCustomEngineDetails: Trying to set the \"Search engine name\" text field to: $engineName")
mDevice.findObject(By.res("$packageName:id/edit_engine_name")).setText(engineName) mDevice.findObject(By.res("$packageName:id/edit_engine_name")).setText(engineName)
Log.i(TAG, "typeCustomEngineDetails: The \"Search engine name\" text field text was set to: $engineName")
assertUIObjectExists( assertUIObjectExists(
itemWithResIdAndText("$packageName:id/edit_engine_name", engineName), itemWithResIdAndText("$packageName:id/edit_engine_name", engineName),
) )
Log.i(TAG, "typeCustomEngineDetails: Trying to clear the \"URL to use for search\" text field")
mDevice.findObject(By.res("$packageName:id/edit_search_string")).clear() mDevice.findObject(By.res("$packageName:id/edit_search_string")).clear()
Log.i(TAG, "typeCustomEngineDetails: Cleared the \"URL to use for search\" text field")
Log.i(TAG, "typeCustomEngineDetails: Trying to set the \"URL to use for search\" text field to: $engineURL")
mDevice.findObject(By.res("$packageName:id/edit_search_string")).setText(engineURL) mDevice.findObject(By.res("$packageName:id/edit_search_string")).setText(engineURL)
Log.i(TAG, "typeCustomEngineDetails: The \"URL to use for search\" text field text was set to: $engineURL")
assertUIObjectExists( assertUIObjectExists(
itemWithResIdAndText("$packageName:id/edit_search_string", engineURL), itemWithResIdAndText("$packageName:id/edit_search_string", engineURL),
) )
@ -286,76 +396,118 @@ class SettingsSubMenuSearchRobot {
} }
fun typeSearchEngineSuggestionString(searchSuggestionString: String) { fun typeSearchEngineSuggestionString(searchSuggestionString: String) {
onView(withId(R.id.edit_suggest_string)) Log.i(TAG, "typeSearchEngineSuggestionString: Trying to click the \"Search suggestion API URL\" text field")
.click() onView(withId(R.id.edit_suggest_string)).click()
.perform(clearText()) Log.i(TAG, "typeSearchEngineSuggestionString: Clicked the \"Search suggestion API URL\" text field")
.perform(typeText(searchSuggestionString)) Log.i(TAG, "typeSearchEngineSuggestionString: Trying to clear the \"Search suggestion API URL\" text field")
onView(withId(R.id.edit_suggest_string)).perform(clearText())
Log.i(TAG, "typeSearchEngineSuggestionString: Cleared the \"Search suggestion API URL\" text field")
Log.i(TAG, "typeSearchEngineSuggestionString: Trying to type $searchSuggestionString in the \"Search suggestion API URL\" text field")
onView(withId(R.id.edit_suggest_string)).perform(typeText(searchSuggestionString))
Log.i(TAG, "typeSearchEngineSuggestionString: Typed $searchSuggestionString in the \"Search suggestion API URL\" text field")
} }
// Used in the non-Compose Default search engines menu // Used in the non-Compose Default search engines menu
fun openEngineOverflowMenu(searchEngineName: String) { fun openEngineOverflowMenu(searchEngineName: String) {
Log.i(TAG, "openEngineOverflowMenu: Waiting for $waitingTimeShort ms for $searchEngineName's three dot button to exist")
threeDotMenu(searchEngineName).waitForExists(waitingTimeShort) threeDotMenu(searchEngineName).waitForExists(waitingTimeShort)
Log.i(TAG, "openEngineOverflowMenu: Waited for $waitingTimeShort ms for $searchEngineName's three dot button to exist")
Log.i(TAG, "openEngineOverflowMenu: Trying to click $searchEngineName's three dot button")
threeDotMenu(searchEngineName).click() threeDotMenu(searchEngineName).click()
Log.i(TAG, "openEngineOverflowMenu: Clicked $searchEngineName's three dot button")
} }
// Used in the composable Manage shortcuts menu, otherwise the overflow menu is not visible // Used in the composable Manage shortcuts menu, otherwise the overflow menu is not visible
fun openCustomShortcutOverflowMenu(testRule: ComposeTestRule, searchEngineName: String) { fun openCustomShortcutOverflowMenu(testRule: ComposeTestRule, searchEngineName: String) {
Log.i(TAG, "openCustomShortcutOverflowMenu: Trying to click $searchEngineName's three dot button")
testRule.onNode(overflowMenuWithSiblingText(searchEngineName)).performClick() testRule.onNode(overflowMenuWithSiblingText(searchEngineName)).performClick()
Log.i(TAG, "openCustomShortcutOverflowMenu: Clicked $searchEngineName's three dot button")
} }
fun clickEdit() = onView(withText("Edit")).click() fun clickEdit() {
Log.i(TAG, "clickEdit: Trying to click the \"Edit\" button")
onView(withText("Edit")).click()
Log.i(TAG, "clickEdit: Clicked the \"Edit\" button")
}
// Used in the Default search engine menu // Used in the Default search engine menu
fun clickDeleteSearchEngine() = fun clickDeleteSearchEngine() {
Log.i(TAG, "clickDeleteSearchEngine: Trying to click the \"Delete\" button")
mDevice.findObject( mDevice.findObject(
UiSelector().textContains(getStringResource(R.string.search_engine_delete)), UiSelector().textContains(getStringResource(R.string.search_engine_delete)),
).click() ).click()
Log.i(TAG, "clickDeleteSearchEngine: Clicked the \"Delete\" button")
}
// Used in the composable Manage search shortcuts menu, otherwise the overflow menu is not visible // Used in the composable Manage search shortcuts menu, otherwise the overflow menu is not visible
fun clickDeleteSearchEngine(testRule: ComposeTestRule) = fun clickDeleteSearchEngine(testRule: ComposeTestRule) {
Log.i(TAG, "clickDeleteSearchEngine: Trying to click the \"Delete\" button")
testRule.onNodeWithText("Delete").performClick() testRule.onNodeWithText("Delete").performClick()
Log.i(TAG, "clickDeleteSearchEngine: Clicked the \"Delete\" button")
}
fun clickUndoSnackBarButton() = fun clickUndoSnackBarButton() {
Log.i(TAG, "clickUndoSnackBarButton: Trying to click the \"Undo\" snack bar button")
mDevice.findObject( mDevice.findObject(
UiSelector() UiSelector()
.resourceId("$packageName:id/snackbar_btn"), .resourceId("$packageName:id/snackbar_btn"),
).click() ).click()
Log.i(TAG, "clickUndoSnackBarButton: Clicked the \"Undo\" snack bar button")
}
fun saveEditSearchEngine() { fun saveEditSearchEngine() {
Log.i(TAG, "saveEditSearchEngine: Trying to click the \"Save\" button")
onView(withId(R.id.save_button)).click() onView(withId(R.id.save_button)).click()
Log.i(TAG, "saveEditSearchEngine: Clicked the \"Save\" button")
assertUIObjectExists(itemContainingText("Saved")) assertUIObjectExists(itemContainingText("Saved"))
} }
fun verifyInvalidTemplateSearchStringFormatError() { fun verifyInvalidTemplateSearchStringFormatError() {
Log.i(TAG, "verifyInvalidTemplateSearchStringFormatError: Trying to perform \"Close soft keyboard\" action")
closeSoftKeyboard() closeSoftKeyboard()
Log.i(TAG, "verifyInvalidTemplateSearchStringFormatError: Performed \"Close soft keyboard\" action")
Log.i(TAG, "verifyInvalidTemplateSearchStringFormatError: Trying to verify that the \"Check that search string matches Example format\" error message is displayed")
onView(withText(getStringResource(R.string.search_add_custom_engine_error_missing_template))) onView(withText(getStringResource(R.string.search_add_custom_engine_error_missing_template)))
.check(matches(isDisplayed())) .check(matches(isDisplayed()))
Log.i(TAG, "verifyInvalidTemplateSearchStringFormatError: Verified that the \"Check that search string matches Example format\" error message is displayed")
} }
fun verifyErrorConnectingToSearchString(searchEngineName: String) { fun verifyErrorConnectingToSearchString(searchEngineName: String) {
Log.i(TAG, "verifyErrorConnectingToSearchString: Trying to perform \"Close soft keyboard\" action")
closeSoftKeyboard() closeSoftKeyboard()
Log.i(TAG, "verifyErrorConnectingToSearchString: Performed \"Close soft keyboard\" action")
Log.i(TAG, "verifyErrorConnectingToSearchString: Trying to verify that the \"Error connecting to $searchEngineName\" error message is displayed")
onView(withText(getStringResource(R.string.search_add_custom_engine_error_cannot_reach, searchEngineName))) onView(withText(getStringResource(R.string.search_add_custom_engine_error_cannot_reach, searchEngineName)))
.check(matches(isDisplayed())) .check(matches(isDisplayed()))
Log.i(TAG, "verifyErrorConnectingToSearchString: Verified that the \"Error connecting to $searchEngineName\" error message is displayed")
} }
class Transition { class Transition {
fun goBack(interact: SettingsRobot.() -> Unit): SettingsRobot.Transition { fun goBack(interact: SettingsRobot.() -> Unit): SettingsRobot.Transition {
Log.i(TAG, "goBack: Waiting for device to be idle")
mDevice.waitForIdle() mDevice.waitForIdle()
Log.i(TAG, "goBack: Waited for device to be idle")
Log.i(TAG, "goBack: Trying to click the navigate up button")
goBackButton().perform(click()) goBackButton().perform(click())
Log.i(TAG, "goBack: Clicked the navigate up button")
SettingsRobot().interact() SettingsRobot().interact()
return SettingsRobot.Transition() return SettingsRobot.Transition()
} }
fun clickCustomSearchStringLearnMoreLink(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { fun clickCustomSearchStringLearnMoreLink(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition {
Log.i(TAG, "clickCustomSearchStringLearnMoreLink: Trying to click the \"Search string URL\" learn more link")
onView(withId(R.id.custom_search_engines_learn_more)).click() onView(withId(R.id.custom_search_engines_learn_more)).click()
Log.i(TAG, "clickCustomSearchStringLearnMoreLink: Clicked the \"Search string URL\" learn more link")
BrowserRobot().interact() BrowserRobot().interact()
return BrowserRobot.Transition() return BrowserRobot.Transition()
} }
fun clickCustomSearchSuggestionsLearnMoreLink(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { fun clickCustomSearchSuggestionsLearnMoreLink(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition {
Log.i(TAG, "clickCustomSearchSuggestionsLearnMoreLink: Trying to click the \"Search suggestions API\" learn more link")
onView(withId(R.id.custom_search_suggestions_learn_more)).click() onView(withId(R.id.custom_search_suggestions_learn_more)).click()
Log.i(TAG, "clickCustomSearchSuggestionsLearnMoreLink: Clicked the \"Search suggestions API\" learn more link")
BrowserRobot().interact() BrowserRobot().interact()
return BrowserRobot.Transition() return BrowserRobot.Transition()
@ -380,83 +532,97 @@ private val defaultSearchEngineHeader = onView(withText("Default search engine")
private val manageSearchShortcutsHeader = onView(withText("Manage alternative search engines")) private val manageSearchShortcutsHeader = onView(withText("Manage alternative search engines"))
private fun searchHistorySwitchButton(): ViewInteraction { private fun searchHistorySwitchButton(): ViewInteraction {
Log.i(TAG, "searchHistorySwitchButton: Trying to perform scroll action to the \"Search browsing history\" option")
onView(withId(androidx.preference.R.id.recycler_view)).perform( onView(withId(androidx.preference.R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>( RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText("Search browsing history")), hasDescendant(withText("Search browsing history")),
), ),
) )
Log.i(TAG, "searchHistorySwitchButton: Performed scroll action to the \"Search browsing history\" option")
return onView(withText("Search browsing history")) return onView(withText("Search browsing history"))
} }
private fun searchBookmarksSwitchButton(): ViewInteraction { private fun searchBookmarksSwitchButton(): ViewInteraction {
Log.i(TAG, "searchBookmarksSwitchButton: Trying to perform scroll action to the \"Search bookmarks\" option")
onView(withId(androidx.preference.R.id.recycler_view)).perform( onView(withId(androidx.preference.R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>( RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText("Search bookmarks")), hasDescendant(withText("Search bookmarks")),
), ),
) )
Log.i(TAG, "searchBookmarksSwitchButton: Performed scroll action to the \"Search bookmarks\" option")
return onView(withText("Search bookmarks")) return onView(withText("Search bookmarks"))
} }
private fun searchSyncedTabsSwitchButton(): ViewInteraction { private fun searchSyncedTabsSwitchButton(): ViewInteraction {
Log.i(TAG, "searchSyncedTabsSwitchButton: Trying to perform scroll action to the \"Search synced tabs\" option")
onView(withId(androidx.preference.R.id.recycler_view)).perform( onView(withId(androidx.preference.R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>( RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText("Search synced tabs")), hasDescendant(withText("Search synced tabs")),
), ),
) )
Log.i(TAG, "searchSyncedTabsSwitchButton: Performed scroll action to the \"Search synced tabs\" option")
return onView(withText("Search synced tabs")) return onView(withText("Search synced tabs"))
} }
private fun voiceSearchSwitchButton(): ViewInteraction { private fun voiceSearchSwitchButton(): ViewInteraction {
Log.i(TAG, "voiceSearchSwitchButton: Trying to perform scroll action to the \"Show voice search\" option")
onView(withId(androidx.preference.R.id.recycler_view)).perform( onView(withId(androidx.preference.R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>( RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText("Show voice search")), hasDescendant(withText("Show voice search")),
), ),
) )
Log.i(TAG, "voiceSearchSwitchButton: Performed scroll action to the \"Show voice search\" option")
return onView(withText("Show voice search")) return onView(withText("Show voice search"))
} }
private fun autocompleteSwitchButton(): ViewInteraction { private fun autocompleteSwitchButton(): ViewInteraction {
Log.i(TAG, "autocompleteSwitchButton: Trying to perform scroll action to the \"Autocomplete URLs\" option")
onView(withId(androidx.preference.R.id.recycler_view)).perform( onView(withId(androidx.preference.R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>( RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText(getStringResource(R.string.preferences_enable_autocomplete_urls))), hasDescendant(withText(getStringResource(R.string.preferences_enable_autocomplete_urls))),
), ),
) )
Log.i(TAG, "autocompleteSwitchButton: Performed scroll action to the \"Autocomplete URLs\" option")
return onView(withText(getStringResource(R.string.preferences_enable_autocomplete_urls))) return onView(withText(getStringResource(R.string.preferences_enable_autocomplete_urls)))
} }
private fun showSearchSuggestionSwitchButton(): ViewInteraction { private fun showSearchSuggestionSwitchButton(): ViewInteraction {
Log.i(TAG, "showSearchSuggestionSwitchButton: Trying to perform scroll action to the \"Show search suggestions\" option")
onView(withId(androidx.preference.R.id.recycler_view)).perform( onView(withId(androidx.preference.R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>( RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText("Show search suggestions")), hasDescendant(withText("Show search suggestions")),
), ),
) )
Log.i(TAG, "showSearchSuggestionSwitchButton: Performed scroll action to the \"Show search suggestions\" option")
return onView(withText("Show search suggestions")) return onView(withText("Show search suggestions"))
} }
private fun showClipboardSuggestionSwitch(): ViewInteraction { private fun showClipboardSuggestionSwitch(): ViewInteraction {
Log.i(TAG, "showClipboardSuggestionSwitch: Trying to perform scroll action to the \"Show clipboard suggestions\" option")
onView(withId(androidx.preference.R.id.recycler_view)).perform( onView(withId(androidx.preference.R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>( RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText(getStringResource(R.string.preferences_show_clipboard_suggestions))), hasDescendant(withText(getStringResource(R.string.preferences_show_clipboard_suggestions))),
), ),
) )
Log.i(TAG, "showClipboardSuggestionSwitch: Performed scroll action to the \"Show clipboard suggestions\" option")
return onView(withText(getStringResource(R.string.preferences_show_clipboard_suggestions))) return onView(withText(getStringResource(R.string.preferences_show_clipboard_suggestions)))
} }
private fun showSuggestionsInPrivateModeSwitch(): ViewInteraction { private fun showSuggestionsInPrivateModeSwitch(): ViewInteraction {
Log.i(TAG, "showSuggestionsInPrivateModeSwitch: Trying to perform scroll action to the \"Show in private sessions\" option")
onView(withId(androidx.preference.R.id.recycler_view)).perform( onView(withId(androidx.preference.R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>( RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText(getStringResource(R.string.preferences_show_search_suggestions_in_private))), hasDescendant(withText(getStringResource(R.string.preferences_show_search_suggestions_in_private))),
), ),
) )
Log.i(TAG, "showSuggestionsInPrivateModeSwitch: Performed scroll action to the \"Show in private sessions\" option")
return onView(withText(getStringResource(R.string.preferences_show_search_suggestions_in_private))) return onView(withText(getStringResource(R.string.preferences_show_search_suggestions_in_private)))
} }
private fun goBackButton() = private fun goBackButton() =
onView(CoreMatchers.allOf(withContentDescription("Navigate up"))) onView(CoreMatchers.allOf(withContentDescription("Navigate up")))
private val addSearchEngineButton = mDevice.findObject(UiSelector().text("Add search engine")) private fun addSearchEngineButton() = mDevice.findObject(UiSelector().text("Add search engine"))
private fun addSearchEngineSaveButton() = onView(withId(R.id.save_button)) private fun addSearchEngineSaveButton() = onView(withId(R.id.save_button))

Loading…
Cancel
Save