Bug 1842177 - Update search engines tests with new unified search UI

fenix/117.0
oana.horvath 11 months ago committed by mergify[bot]
parent c12f7e6c03
commit 4a1ece8611

@ -57,6 +57,7 @@ import org.hamcrest.CoreMatchers
import org.hamcrest.CoreMatchers.allOf
import org.hamcrest.Matcher
import org.junit.Assert
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.mozilla.fenix.Config
@ -485,4 +486,16 @@ object TestHelper {
mDevice.pressRecentApps()
mDevice.findObject(UiSelector().resourceId("$packageName:id/container")).waitForExists(waitingTime)
}
fun verifyKeyboardVisibility(isExpectedToBeVisible: Boolean = true) {
mDevice.waitForIdle()
assertEquals(
"Keyboard not shown",
isExpectedToBeVisible,
mDevice
.executeShellCommand("dumpsys input_method | grep mInputShown")
.contains("mInputShown=true"),
)
}
}

@ -18,6 +18,7 @@ import org.mozilla.fenix.helpers.HomeActivityTestRule
import org.mozilla.fenix.helpers.RetryTestRule
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper.clickSnackbarButton
import org.mozilla.fenix.helpers.TestHelper.verifyKeyboardVisibility
import org.mozilla.fenix.helpers.TestHelper.verifySnackBarText
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.homeScreen
@ -355,10 +356,10 @@ class ComposeTabbedBrowsingTest {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
}.openTabButtonShortcutsMenu {
}.openNewPrivateTabFromShortcutsMenu {
verifyKeyboardVisible()
verifyFocusedNavigationToolbar()
verifyKeyboardVisibility()
verifySearchBarPlaceholder("Search or enter address")
// dismiss search dialog
homeScreen { }.pressBack()
}.dismissSearchBar {
verifyCommonMythsLink()
verifyNavigationToolbar()
}
@ -366,10 +367,10 @@ class ComposeTabbedBrowsingTest {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
}.openTabButtonShortcutsMenu {
}.openTabFromShortcutsMenu {
verifyKeyboardVisible()
verifyFocusedNavigationToolbar()
verifyKeyboardVisibility()
verifySearchBarPlaceholder("Search or enter address")
// dismiss search dialog
homeScreen { }.pressBack()
}.dismissSearchBar {
verifyHomeWordmark()
verifyNavigationToolbar()
}

@ -14,6 +14,7 @@ import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.HomeActivityTestRule
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper.verifyDarkThemeApplied
import org.mozilla.fenix.helpers.TestHelper.verifyKeyboardVisibility
import org.mozilla.fenix.helpers.TestHelper.verifyLightThemeApplied
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.robots.navigationToolbar
@ -131,7 +132,6 @@ class OnboardingTest {
homeScreen {
verifyStartBrowsingButton()
}.openSearch {
verifyScanButton()
verifySearchEngineButton()
verifyKeyboardVisibility()
}.dismissSearchBar {

@ -37,11 +37,14 @@ import org.mozilla.fenix.helpers.TestHelper.grantSystemPermission
import org.mozilla.fenix.helpers.TestHelper.longTapSelectItem
import org.mozilla.fenix.helpers.TestHelper.mDevice
import org.mozilla.fenix.helpers.TestHelper.setCustomSearchEngine
import org.mozilla.fenix.helpers.TestHelper.verifyKeyboardVisibility
import org.mozilla.fenix.ui.robots.clickContextMenuItem
import org.mozilla.fenix.ui.robots.clickPageObject
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.robots.longClickPageObject
import org.mozilla.fenix.ui.robots.multipleSelectionToolbar
import org.mozilla.fenix.ui.robots.navigationToolbar
import org.mozilla.fenix.ui.robots.searchScreen
/**
* Tests for verifying the search fragment
@ -66,6 +69,8 @@ class SearchTest {
isRecentTabsFeatureEnabled = false,
isTCPCFREnabled = false,
isWallpaperOnboardingEnabled = false,
isUnifiedSearchEnabled = true,
newSearchSettingsEnabled = true,
),
) { it.activity }
@ -83,13 +88,37 @@ class SearchTest {
}
@Test
fun searchScreenItemsTest() {
fun searchBarItemsTest() {
navigationToolbar {
verifyDefaultSearchEngine("Google")
verifySearchBarPlaceholder("Search or enter address")
}.clickUrlbar {
verifyKeyboardVisibility(isExpectedToBeVisible = true)
verifyScanButtonVisibility(visible = true)
verifyVoiceSearchButtonVisibility(enabled = true)
verifySearchBarPlaceholder("Search or enter address")
typeSearch("mozilla ")
verifyScanButtonVisibility(visible = false)
verifyVoiceSearchButtonVisibility(enabled = true)
clickClearButton()
clickSearchSelectorButton()
selectTemporarySearchMethod("Amazon.com")
verifyScanButtonVisibility(visible = false)
verifyVoiceSearchButtonVisibility(enabled = true)
}
}
@Test
fun searchSelectorMenuItemsTest() {
homeScreen {
}.openSearch {
verifySearchView()
verifySearchToolbar(true)
verifyScanButton()
verifySearchEngineButton()
verifySearchToolbar(isDisplayed = true)
clickSearchSelectorButton()
verifySearchShortcutListContains(
"DuckDuckGo", "Google", "Amazon.com", "Wikipedia", "Bing", "eBay",
"Bookmarks", "Tabs", "History", "Search settings",
)
}
}
@ -128,29 +157,41 @@ class SearchTest {
}
}
// Verifies a temporary change of search engine from the Search shortcut menu
@SmokeTest
@Test
fun selectSearchEnginesShortcutTest() {
val enginesList = listOf("DuckDuckGo", "Google", "Amazon.com", "Wikipedia", "Bing", "eBay")
enginesList.forEach {
homeScreen {
}.openSearch {
clickSearchSelectorButton()
verifySearchShortcutListContains(it)
selectTemporarySearchMethod(it)
verifySearchEngineIcon(it)
}.submitQuery("mozilla ") {
verifyUrl("mozilla")
}.goToHomescreen {}
}
}
@Test
fun setDefaultSearchEngineFromShortcutsTest() {
fun accessSearchSettingFromSearchSelectorMenuTest() {
queryString = "firefox"
homeScreen {
}.openThreeDotMenu {
}.openSettings {
}.openSearchSubMenu {
toggleShowSearchShortcuts()
}.goBack {
}.goBack {
}.openSearch {
scrollToSearchEngineSettings(activityTestRule)
}.clickSearchEngineSettings(activityTestRule) {
searchScreen {
clickSearchSelectorButton()
}.clickSearchEngineSettings {
verifySearchSettingsToolbar()
openDefaultSearchEngineMenu()
changeDefaultSearchEngine("DuckDuckGo")
exitMenu()
}
exitMenu()
homeScreen {
}.openSearch {
}.submitQuery(queryString) {
verifyUrl("duckduckgo.com/?q=firefox")
verifyUrl("firefox")
}
}
@ -162,7 +203,7 @@ class SearchTest {
}.openSearch {
typeSearch(queryString)
clickClearButton()
verifySearchBarEmpty()
verifySearchBarPlaceholder("Search or enter address")
}
}
@ -197,7 +238,7 @@ class SearchTest {
}.openTabDrawer {
}.openTabsListThreeDotMenu {
}.closeAllTabs {
verifyRecentlyVisitedSearchGroupDisplayed(true, queryString, 3)
verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3)
}
}
@ -245,7 +286,7 @@ class SearchTest {
}.openTabDrawer {
}.openTabsListThreeDotMenu {
}.closeAllTabs {
verifyRecentlyVisitedSearchGroupDisplayed(true, queryString, 3)
verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3)
}.openRecentlyVisitedSearchGroupHistoryList(queryString) {
verifyTestPageUrl(firstPageUrl)
verifyTestPageUrl(secondPageUrl)
@ -279,7 +320,7 @@ class SearchTest {
}.openTabDrawer {
}.openTabsListThreeDotMenu {
}.closeAllTabs {
verifyRecentlyVisitedSearchGroupDisplayed(true, queryString, 3)
verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3)
}
}
@ -314,10 +355,10 @@ class SearchTest {
}.openTabsListThreeDotMenu {
}.closeAllTabs {
togglePrivateBrowsingModeOnOff()
verifyRecentlyVisitedSearchGroupDisplayed(false, queryString, 3)
verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = false, searchTerm = queryString, groupSize = 3)
}.openThreeDotMenu {
}.openHistory {
verifyHistoryItemExists(false, "3 sites")
verifyHistoryItemExists(shouldExist = false, item = "3 sites")
}
}
@ -354,7 +395,7 @@ class SearchTest {
}.openTabDrawer {
}.openTabsListThreeDotMenu {
}.closeAllTabs {
verifyRecentlyVisitedSearchGroupDisplayed(true, queryString, 3)
verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3)
}.openRecentlyVisitedSearchGroupHistoryList(queryString) {
clickDeleteHistoryButton(firstPageUrl.toString())
longTapSelectItem(secondPageUrl)
@ -366,7 +407,7 @@ class SearchTest {
}
homeScreen {
// checking that the group is removed when only 1 item is left
verifyRecentlyVisitedSearchGroupDisplayed(false, queryString, 1)
verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = false, searchTerm = queryString, groupSize = 1)
}
}
@ -401,18 +442,18 @@ class SearchTest {
}.openTabDrawer {
}.openTabsListThreeDotMenu {
}.closeAllTabs {
verifyRecentlyVisitedSearchGroupDisplayed(true, queryString, 3)
verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3)
}.openRecentlyVisitedSearchGroupHistoryList(queryString) {
clickDeleteAllHistoryButton()
confirmDeleteAllHistory()
verifyDeleteSnackbarText("Group deleted")
verifyHistoryItemExists(false, firstPageUrl.toString())
verifyHistoryItemExists(shouldExist = false, firstPageUrl.toString())
}.goBack {}
homeScreen {
verifyRecentlyVisitedSearchGroupDisplayed(false, queryString, 3)
verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = false, queryString, groupSize = 3)
}.openThreeDotMenu {
}.openHistory {
verifySearchGroupDisplayed(false, queryString, 3)
verifySearchGroupDisplayed(shouldBeDisplayed = false, queryString, groupSize = 3)
verifyEmptyHistoryView()
}
}
@ -449,7 +490,7 @@ class SearchTest {
}.openTabDrawer {
}.openTabsListThreeDotMenu {
}.closeAllTabs {
verifyRecentlyVisitedSearchGroupDisplayed(true, queryString, 3)
verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3)
}.openRecentlyVisitedSearchGroupHistoryList(queryString) {
}.openWebsite(firstPageUrl) {
verifyUrl(firstPageUrl.toString())
@ -502,7 +543,7 @@ class SearchTest {
}.openTabDrawer {
}.openTabsListThreeDotMenu {
}.closeAllTabs {
verifyRecentlyVisitedSearchGroupDisplayed(true, queryString, 3)
verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3)
}.openRecentlyVisitedSearchGroupHistoryList(queryString) {
longTapSelectItem(firstPageUrl)
}
@ -524,7 +565,11 @@ class SearchTest {
homeScreen {
}.openSearch {
}.submitQuery(queryString) {
verifyUrl(searchEngineCodes["Google"]!!)
waitForPageToLoad()
}.openThreeDotMenu {
}.openHistory {
// Full URL no longer visible in the nav bar, so we'll check the history record
verifyHistoryItemExists(shouldExist = true, searchEngineCodes["Google"]!!)
}
}
@ -537,15 +582,19 @@ class SearchTest {
}.openThreeDotMenu {
}.openSettings {
}.openSearchSubMenu {
openDefaultSearchEngineMenu()
changeDefaultSearchEngine("Bing")
exitMenu()
}
exitMenu()
homeScreen {
}.openSearch {
}.submitQuery(queryString) {
verifyUrl(searchEngineCodes["Bing"]!!)
waitForPageToLoad()
}.openThreeDotMenu {
}.openHistory {
// Full URL no longer visible in the nav bar, so we'll check the history record
verifyHistoryItemExists(shouldExist = true, searchEngineCodes["Bing"]!!)
}
}
@ -558,28 +607,24 @@ class SearchTest {
}.openThreeDotMenu {
}.openSettings {
}.openSearchSubMenu {
openDefaultSearchEngineMenu()
changeDefaultSearchEngine("DuckDuckGo")
exitMenu()
}
exitMenu()
homeScreen {
}.openSearch {
}.submitQuery(queryString) {
verifyUrl(searchEngineCodes["DuckDuckGo"]!!)
}
}
// Expected for en-us defaults
@Test
fun changeSearchEnginesBasedOnTextTest() {
homeScreen {
}.openSearch {
typeSearch("D")
verifySearchEnginePrompt(activityTestRule, "DuckDuckGo")
clickSearchEnginePrompt(activityTestRule, "DuckDuckGo")
}.submitQuery("firefox") {
verifyUrl("duckduckgo.com/?q=firefox")
waitForPageToLoad()
}.openThreeDotMenu {
}.openHistory {
// Full URL no longer visible in the nav bar, so we'll check the history record
// A search group is sometimes created when searching with DuckDuckGo
try {
verifyHistoryItemExists(shouldExist = true, item = searchEngineCodes["DuckDuckGo"]!!)
} catch (e: AssertionError) {
openSearchGroup(queryString)
verifyHistoryItemExists(shouldExist = true, item = searchEngineCodes["DuckDuckGo"]!!)
}
}
}
}

@ -129,25 +129,6 @@ class SmokeTest {
}
}
// Verifies changing the default engine from the Search Shortcut menu
@Test
fun selectSearchEnginesShortcutTest() {
val enginesList = listOf("DuckDuckGo", "Google", "Amazon.com", "Wikipedia", "Bing", "eBay")
for (searchEngine in enginesList) {
homeScreen {
}.openSearch {
verifyKeyboardVisibility()
clickSearchEngineShortcutButton()
verifySearchEngineList(activityTestRule)
changeDefaultSearchEngine(activityTestRule, searchEngine)
verifySearchEngineIcon(searchEngine)
}.submitQuery("mozilla ") {
verifyUrl(searchEngine)
}.goToHomescreen { }
}
}
// Verifies that deleting a Bookmarks folder also removes the item from inside it.
@Test
fun deleteNonEmptyBookmarkFolderTest() {

@ -16,6 +16,7 @@ import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.HomeActivityTestRule
import org.mozilla.fenix.helpers.RetryTestRule
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper.verifyKeyboardVisibility
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.robots.navigationToolbar
@ -343,10 +344,10 @@ class TabbedBrowsingTest {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
}.openTabButtonShortcutsMenu {
}.openNewPrivateTabFromShortcutsMenu {
verifyKeyboardVisible()
verifyFocusedNavigationToolbar()
verifyKeyboardVisibility()
verifySearchBarPlaceholder("Search or enter address")
// dismiss search dialog
homeScreen { }.pressBack()
}.dismissSearchBar {
verifyCommonMythsLink()
verifyNavigationToolbar()
}
@ -354,10 +355,10 @@ class TabbedBrowsingTest {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
}.openTabButtonShortcutsMenu {
}.openTabFromShortcutsMenu {
verifyKeyboardVisible()
verifyFocusedNavigationToolbar()
verifyKeyboardVisibility()
verifySearchBarPlaceholder("Search or enter address")
// dismiss search dialog
homeScreen { }.pressBack()
}.dismissSearchBar {
verifyHomeWordmark()
verifyNavigationToolbar()
}

@ -24,9 +24,6 @@ import org.hamcrest.Matchers.allOf
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.mozilla.fenix.R
import org.mozilla.fenix.helpers.Constants
import org.mozilla.fenix.helpers.MatcherHelper.assertItemContainingTextExists
import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText
import org.mozilla.fenix.helpers.MatcherHelper.itemWithResId
import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime
import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeShort
@ -63,7 +60,13 @@ class HistoryRobot {
assertVisitedTimeTitle()
}
fun verifyHistoryItemExists(shouldExist: Boolean, item: String) = assertHistoryItemExists(shouldExist, item)
fun verifyHistoryItemExists(shouldExist: Boolean, item: String) {
if (shouldExist) {
assertTrue(mDevice.findObject(UiSelector().textContains(item)).waitForExists(waitingTime))
} else {
assertFalse(mDevice.findObject(UiSelector().textContains(item)).waitForExists(waitingTimeShort))
}
}
fun verifyFirstTestPageTitle(title: String) = assertTestPageTitle(title)
@ -122,36 +125,11 @@ class HistoryRobot {
}
}
fun dismissHistorySearchBarUsingBackButton() {
for (i in 1..Constants.RETRY_COUNT) {
try {
mDevice.pressBack()
assertTrue(
itemWithResId("$packageName:id/mozac_browser_toolbar_edit_url_view")
.waitUntilGone(waitingTime),
)
break
} catch (e: AssertionError) {
if (i == Constants.RETRY_COUNT) {
throw e
}
}
}
fun openSearchGroup(searchTerm: String) {
mDevice.findObject(UiSelector().text(searchTerm)).waitForExists(waitingTime)
mDevice.findObject(UiSelector().text(searchTerm)).click()
}
fun searchForHistoryItem(vararg historyItems: String) {
for (historyItem in historyItems) {
itemWithResId("$packageName:id/mozac_browser_toolbar_edit_url_view").also {
it.waitForExists(waitingTime)
it.setText(historyItem)
}
mDevice.waitForWindowUpdate(packageName, waitingTimeShort)
}
}
fun verifySearchedHistoryItemExists(historyItemUrl: String, exists: Boolean = true) =
assertItemContainingTextExists(itemContainingText(historyItemUrl), exists = exists)
class Transition {
fun goBack(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition {
onView(withContentDescription("Navigate up")).click()
@ -220,14 +198,6 @@ private fun assertEmptyHistoryView() =
private fun assertHistoryListExists() =
mDevice.findObject(UiSelector().resourceId("$packageName:id/history_list")).waitForExists(waitingTime)
private fun assertHistoryItemExists(shouldExist: Boolean, item: String) {
if (shouldExist) {
assertTrue(mDevice.findObject(UiSelector().textContains(item)).waitForExists(waitingTime))
} else {
assertFalse(mDevice.findObject(UiSelector().textContains(item)).waitForExists(waitingTimeShort))
}
}
private fun assertVisitedTimeTitle() =
onView(withId(R.id.header_title)).check(matches(withText("Today")))

@ -35,7 +35,6 @@ import androidx.test.espresso.matcher.ViewMatchers.Visibility
import androidx.test.espresso.matcher.ViewMatchers.hasDescendant
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility
import androidx.test.espresso.matcher.ViewMatchers.withHint
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.uiautomator.By
@ -94,7 +93,7 @@ class HomeScreenRobot {
" else who uses this device."
fun verifyNavigationToolbar() = assertItemWithResIdExists(navigationToolbar)
fun verifyFocusedNavigationToolbar() = assertFocusedNavigationToolbar()
fun verifyHomeScreen() = assertItemWithResIdExists(homeScreen)
fun verifyPrivateBrowsingHomeScreen() {
@ -919,10 +918,6 @@ private fun assertKeyboardVisibility(isExpectedToBeVisible: Boolean) =
.contains("mInputShown=true"),
)
private fun assertFocusedNavigationToolbar() =
onView(allOf(withHint("Search or enter address")))
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
private fun assertTabButton() =
onView(allOf(withId(R.id.tab_button), isDisplayed()))
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))

@ -117,6 +117,24 @@ class NavigationToolbarRobot {
getStringResource(R.string.search_hint),
)
// New unified search UI selector
fun verifySearchBarPlaceholder(text: String) {
urlBar().waitForExists(waitingTime)
assertTrue(
urlBar().text == text,
)
}
// New unified search UI selector
fun verifyDefaultSearchEngine(engineName: String) =
assertTrue(
mDevice.findObject(
UiSelector()
.resourceId("$packageName:id/search_selector")
.childSelector(UiSelector().description(engineName)),
).waitForExists(waitingTime),
)
fun verifyTextSelectionOptions(vararg textSelectionOptions: String) {
for (textSelectionOption in textSelectionOptions) {
mDevice.waitNotNull(Until.findObject(textContains(textSelectionOption)), waitingTime)
@ -257,7 +275,7 @@ class NavigationToolbarRobot {
return NavigationToolbarRobot.Transition()
}
fun openTabFromShortcutsMenu(interact: HomeScreenRobot.() -> Unit): HomeScreenRobot.Transition {
fun openTabFromShortcutsMenu(interact: SearchRobot.() -> Unit): SearchRobot.Transition {
mDevice.waitForIdle(waitingTime)
onView(withId(R.id.mozac_browser_menu_recyclerView))
@ -270,11 +288,11 @@ class NavigationToolbarRobot {
),
)
HomeScreenRobot().interact()
return HomeScreenRobot.Transition()
SearchRobot().interact()
return SearchRobot.Transition()
}
fun openNewPrivateTabFromShortcutsMenu(interact: HomeScreenRobot.() -> Unit): HomeScreenRobot.Transition {
fun openNewPrivateTabFromShortcutsMenu(interact: SearchRobot.() -> Unit): SearchRobot.Transition {
mDevice.waitForIdle(waitingTime)
onView(withId(R.id.mozac_browser_menu_recyclerView))
@ -287,8 +305,8 @@ class NavigationToolbarRobot {
),
)
HomeScreenRobot().interact()
return HomeScreenRobot.Transition()
SearchRobot().interact()
return SearchRobot.Transition()
}
fun clickUrlbar(interact: SearchRobot.() -> Unit): SearchRobot.Transition {

@ -6,14 +6,9 @@
package org.mozilla.fenix.ui.robots
import androidx.compose.ui.test.ExperimentalTestApi
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.hasText
import androidx.compose.ui.test.junit4.ComposeTestRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollToIndex
import androidx.compose.ui.test.performScrollToNode
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.closeSoftKeyboard
@ -28,7 +23,6 @@ import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.uiautomator.By
import androidx.test.uiautomator.UiSelector
import org.hamcrest.CoreMatchers.allOf
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.mozilla.fenix.R
@ -39,7 +33,6 @@ import org.mozilla.fenix.helpers.Constants.SPEECH_RECOGNITION
import org.mozilla.fenix.helpers.MatcherHelper.assertItemWithResIdExists
import org.mozilla.fenix.helpers.MatcherHelper.itemWithDescription
import org.mozilla.fenix.helpers.MatcherHelper.itemWithResId
import org.mozilla.fenix.helpers.MatcherHelper.itemWithResIdAndText
import org.mozilla.fenix.helpers.SessionLoadedIdlingResource
import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime
import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeShort
@ -49,7 +42,6 @@ import org.mozilla.fenix.helpers.TestHelper.isPackageInstalled
import org.mozilla.fenix.helpers.TestHelper.mDevice
import org.mozilla.fenix.helpers.TestHelper.packageName
import org.mozilla.fenix.helpers.TestHelper.waitForObjects
import org.mozilla.fenix.helpers.click
/**
* Implementation of Robot Pattern for the search fragment.
@ -68,7 +60,17 @@ class SearchRobot {
exists = isDisplayed,
)
fun verifyScanButton() = assertScanButton()
fun verifyScanButtonVisibility(visible: Boolean = true) {
if (visible) {
assertTrue(
scanButton.waitForExists(waitingTime),
)
} else {
assertTrue(
scanButton.waitUntilGone(waitingTime),
)
}
}
fun verifyVoiceSearchButtonVisibility(enabled: Boolean) {
if (enabled) {
@ -185,19 +187,6 @@ class SearchRobot {
).click()
}
fun verifySearchEnginePrompt(rule: ComposeTestRule, searchEngineName: String) {
rule.waitForIdle()
rule.onNodeWithText("Search $searchEngineName").assertIsDisplayed()
rule.onNodeWithText(
getStringResource(R.string.search_engine_suggestions_description),
).assertIsDisplayed()
}
fun verifySearchBarEmpty() = assertSearchBarEmpty()
fun verifyKeyboardVisibility() = assertKeyboardVisibility(isExpectedToBeVisible = true)
fun verifySearchEngineList(rule: ComposeTestRule) = rule.assertSearchEngineList()
fun verifySearchSelectorButton() {
assertTrue(searchSelectorButton.waitForExists(waitingTime))
}
@ -211,9 +200,9 @@ class SearchRobot {
assertTrue(itemWithDescription(name).waitForExists(waitingTime))
fun verifySearchBarPlaceholder(text: String) {
browserToolbarEditView().waitForExists(waitingTime)
assertTrue(
itemWithResIdAndText("$packageName:id/mozac_browser_toolbar_edit_url_view", text)
.waitForExists(waitingTime),
browserToolbarEditView().text == text,
)
}
@ -226,24 +215,11 @@ class SearchRobot {
}
}
// Old search UI shortcut selector - to be removed.
fun changeDefaultSearchEngine(rule: ComposeTestRule, searchEngineName: String) =
rule.selectDefaultSearchEngine(searchEngineName)
// New unified search UI search selector.
fun selectTemporarySearchMethod(searchEngineName: String) {
searchShortcutList.getChild(UiSelector().text(searchEngineName)).click()
}
// Old search UI shortcut selector - to be removed.
fun clickSearchEngineShortcutButton() {
itemWithResId("$packageName:id/search_engines_shortcut_button").also {
it.waitForExists(waitingTime)
it.click()
}
mDevice.waitForIdle(waitingTimeShort)
}
fun clickScanButton() =
scanButton.also {
it.waitForExists(waitingTime)
@ -263,7 +239,10 @@ class SearchRobot {
fun verifyScannerOpen() {
assertTrue(
mDevice.findObject(UiSelector().resourceId("$packageName:id/view_finder"))
.waitForExists(waitingTime),
.waitForExists(waitingTime) ||
// In case there is no camera available, an error will be shown.
mDevice.findObject(UiSelector().resourceId("$packageName:id/camera_error"))
.exists(),
)
}
@ -277,20 +256,6 @@ class SearchRobot {
mDevice.waitForIdle()
}
@OptIn(ExperimentalTestApi::class)
fun scrollToSearchEngineSettings(rule: ComposeTestRule) {
// Soft keyboard is visible on screen on view access; hide it
onView(allOf(withId(R.id.search_wrapper))).perform(
closeSoftKeyboard(),
)
mDevice.findObject(UiSelector().text("Google"))
.waitForExists(waitingTime)
rule.onNodeWithTag("mozac.awesomebar.suggestions")
.performScrollToIndex(5)
}
fun clickClearButton() {
clearButton().click()
}
@ -317,25 +282,15 @@ class SearchRobot {
pasteText.click()
}
fun clickSearchEnginePrompt(rule: ComposeTestRule, searchEngineName: String) =
rule.onNodeWithText("Search $searchEngineName").performClick()
fun expandSearchSuggestionsList() {
onView(allOf(withId(R.id.search_wrapper))).perform(
closeSoftKeyboard(),
)
awesomeBar.swipeUp(2)
browserToolbarEditView().swipeUp(2)
}
fun verifyTranslatedFocusedNavigationToolbar(toolbarHintString: String) =
assertTranslatedFocusedNavigationToolbar(toolbarHintString)
fun verifySearchEngineShortcuts(rule: ComposeTestRule, vararg searchEngines: String) {
for (searchEngine in searchEngines) {
rule.waitForIdle()
rule.onNodeWithText(searchEngine).assertIsDisplayed()
}
}
assertTrue(browserToolbarEditView().text.contains(toolbarHintString))
fun verifyTypedToolbarText(expectedText: String) {
mDevice.findObject(UiSelector().resourceId("$packageName:id/toolbar"))
@ -406,11 +361,8 @@ class SearchRobot {
return BrowserRobot.Transition()
}
fun clickSearchEngineSettings(
rule: ComposeTestRule,
interact: SettingsSubMenuSearchRobot.() -> Unit,
): SettingsSubMenuSearchRobot.Transition {
rule.onNodeWithText("Search engine settings").performClick()
fun clickSearchEngineSettings(interact: SettingsSubMenuSearchRobot.() -> Unit): SettingsSubMenuSearchRobot.Transition {
searchShortcutList.getChild(UiSelector().text("Search settings")).click()
SettingsSubMenuSearchRobot().interact()
return SettingsSubMenuSearchRobot.Transition()
@ -428,6 +380,11 @@ class SearchRobot {
}
}
fun searchScreen(interact: SearchRobot.() -> Unit): SearchRobot.Transition {
SearchRobot().interact()
return SearchRobot.Transition()
}
private fun browserToolbarEditView() =
mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_edit_url_view"))
@ -437,22 +394,13 @@ private val dismissPermissionButton =
private val goToPermissionsSettingsButton =
mDevice.findObject(UiSelector().text("GO TO SETTINGS"))
private val scanButton =
itemWithResIdAndText(
"$packageName:id/qr_scan_button",
getStringResource(R.string.search_scan_button),
)
private val scanButton = itemWithDescription("Scan")
private fun clearButton() =
mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_clear_view"))
private fun searchWrapper() = mDevice.findObject(UiSelector().resourceId("$packageName:id/search_wrapper"))
private fun assertScanButton() =
assertTrue(
scanButton.waitForExists(waitingTime),
)
private fun assertSearchButton() =
assertTrue(
mDevice.findObject(
@ -462,80 +410,7 @@ private fun assertSearchButton() =
private val searchSelectorButton = itemWithResId("$packageName:id/search_selector")
private fun assertSearchBarEmpty() =
assertTrue(
mDevice.findObject(
UiSelector()
.resourceId("$packageName:id/mozac_browser_toolbar_edit_url_view")
.textContains(""),
).waitForExists(waitingTime),
)
fun searchScreen(interact: SearchRobot.() -> Unit): SearchRobot.Transition {
SearchRobot().interact()
return SearchRobot.Transition()
}
private fun assertKeyboardVisibility(isExpectedToBeVisible: Boolean): () -> Unit = {
searchWrapper().waitForExists(waitingTime)
assertEquals(
"Keyboard not shown",
isExpectedToBeVisible,
mDevice
.executeShellCommand("dumpsys input_method | grep mInputShown")
.contains("mInputShown=true"),
)
}
private fun ComposeTestRule.assertSearchEngineList() {
onView(withId(R.id.mozac_browser_toolbar_edit_icon)).click()
onNodeWithText("Google")
.assertExists()
.assertIsDisplayed()
onNodeWithText("Amazon.com")
.assertExists()
.assertIsDisplayed()
onNodeWithText("Bing")
.assertExists()
.assertIsDisplayed()
onNodeWithText("DuckDuckGo")
.assertExists()
.assertIsDisplayed()
onNodeWithText("Wikipedia")
.assertExists()
.assertIsDisplayed()
onNodeWithText("eBay")
.assertExists()
.assertIsDisplayed()
}
private val searchShortcutList =
mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_menu_recyclerView"))
private fun ComposeTestRule.selectDefaultSearchEngine(searchEngine: String) {
onNodeWithText(searchEngine)
.assertExists()
.assertIsDisplayed()
.performClick()
}
private fun assertTranslatedFocusedNavigationToolbar(toolbarHintString: String) =
assertTrue(
mDevice.findObject(
UiSelector()
.resourceId("$packageName:id/mozac_browser_toolbar_edit_url_view")
.textContains(toolbarHintString),
).waitForExists(waitingTime),
)
private val awesomeBar =
mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_edit_url_view"))
private val voiceSearchButton = mDevice.findObject(UiSelector().description("Voice search"))

@ -162,8 +162,11 @@ class SettingsSubMenuSearchRobot {
manageSearchShortcutsHeader.click()
}
fun changeDefaultSearchEngine(searchEngineName: String) =
selectSearchEngine(searchEngineName)
fun changeDefaultSearchEngine(searchEngineName: String) {
onView(withText(searchEngineName))
.check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
.perform(click())
}
fun toggleAutocomplete() = autocompleteSwitchButton().click()
@ -411,12 +414,6 @@ private fun showSuggestionsInPrivateModeSwitch(): ViewInteraction {
return onView(withText(getStringResource(R.string.preferences_show_search_suggestions_in_private)))
}
private fun selectSearchEngine(searchEngine: String) {
onView(withText(searchEngine))
.check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
.perform(click())
}
private fun goBackButton() =
onView(CoreMatchers.allOf(withContentDescription("Navigate up")))

Loading…
Cancel
Save