Bug 1840837 - Update Bookmarks and History search tests with Unified search UI

fenix/116.0
oana.horvath 12 months ago committed by mergify[bot]
parent f813ec1e8b
commit c17e7685af

@ -82,6 +82,11 @@ interface FeatureSettingsHelper {
*/
var tabsTrayRewriteEnabled: Boolean
/**
* Enable or disable the Unified search feature.
*/
var isUnifiedSearchEnabled: Boolean
fun applyFlagUpdates()
fun resetAllFeatureFlags()

@ -17,7 +17,7 @@ import org.mozilla.fenix.utils.Settings
/**
* Helper for querying the status and modifying various features and settings in the application.
*/
class FeatureSettingsHelperDelegate : FeatureSettingsHelper {
class FeatureSettingsHelperDelegate() : FeatureSettingsHelper {
/**
* The current feature flags used inside the app before the tests start.
* These will be restored when the tests end.
@ -56,6 +56,8 @@ class FeatureSettingsHelperDelegate : FeatureSettingsHelper {
false -> 0
}
}
override var isUnifiedSearchEnabled: Boolean by updatedFeatureFlags::isUnifiedSearchEnabled
override var isPocketEnabled: Boolean by updatedFeatureFlags::isPocketEnabled
override var isJumpBackInCFREnabled: Boolean by updatedFeatureFlags::isJumpBackInCFREnabled
override var isWallpaperOnboardingEnabled: Boolean by updatedFeatureFlags::isWallpaperOnboardingEnabled
@ -107,7 +109,7 @@ private data class FeatureFlags(
var isRecentlyVisitedFeatureEnabled: Boolean,
var isPWAsPromptEnabled: Boolean,
var isTCPCFREnabled: Boolean,
val isUnifiedSearchEnabled: Boolean,
var isUnifiedSearchEnabled: Boolean,
var isWallpaperOnboardingEnabled: Boolean,
var isDeleteSitePermissionsEnabled: Boolean,
var isCookieBannerReductionDialogEnabled: Boolean,

@ -55,6 +55,7 @@ class HomeActivityTestRule(
isOpenInAppBannerEnabled: Boolean = settings.shouldShowOpenInAppBanner,
etpPolicy: ETPPolicy = getETPPolicy(settings),
tabsTrayRewriteEnabled: Boolean = false,
isUnifiedSearchEnabled: Boolean = false,
) : this(initialTouchMode, launchActivity, skipOnboarding) {
this.isHomeOnboardingDialogEnabled = isHomeOnboardingDialogEnabled
this.isPocketEnabled = isPocketEnabled
@ -69,6 +70,7 @@ class HomeActivityTestRule(
this.isOpenInAppBannerEnabled = isOpenInAppBannerEnabled
this.etpPolicy = etpPolicy
this.tabsTrayRewriteEnabled = tabsTrayRewriteEnabled
this.isUnifiedSearchEnabled = isUnifiedSearchEnabled
}
/**
@ -124,6 +126,7 @@ class HomeActivityTestRule(
isWallpaperOnboardingEnabled = false,
isCookieBannerReductionDialogEnabled = false,
isOpenInAppBannerEnabled = false,
isUnifiedSearchEnabled = false,
)
}
}
@ -157,6 +160,7 @@ class HomeActivityIntentTestRule internal constructor(
isRecentlyVisitedFeatureEnabled: Boolean = settings.historyMetadataUIFeature,
isPWAsPromptEnabled: Boolean = !settings.userKnowsAboutPwas,
isTCPCFREnabled: Boolean = settings.shouldShowTotalCookieProtectionCFR,
isUnifiedSearchEnabled: Boolean = false,
isWallpaperOnboardingEnabled: Boolean = settings.showWallpaperOnboarding,
isDeleteSitePermissionsEnabled: Boolean = settings.deleteSitePermissions,
isCookieBannerReductionDialogEnabled: Boolean = !settings.userOptOutOfReEngageCookieBannerDialog,
@ -171,6 +175,7 @@ class HomeActivityIntentTestRule internal constructor(
this.isRecentlyVisitedFeatureEnabled = isRecentlyVisitedFeatureEnabled
this.isPWAsPromptEnabled = isPWAsPromptEnabled
this.isTCPCFREnabled = isTCPCFREnabled
this.isUnifiedSearchEnabled = isUnifiedSearchEnabled
this.isWallpaperOnboardingEnabled = isWallpaperOnboardingEnabled
this.isDeleteSitePermissionsEnabled = isDeleteSitePermissionsEnabled
this.isCookieBannerReductionDialogEnabled = isCookieBannerReductionDialogEnabled
@ -258,6 +263,7 @@ class HomeActivityIntentTestRule internal constructor(
launchActivity: Boolean = true,
skipOnboarding: Boolean = false,
tabsTrayRewriteEnabled: Boolean = false,
isUnifiedSearchEnabled: Boolean = false,
) = HomeActivityIntentTestRule(
initialTouchMode = initialTouchMode,
launchActivity = launchActivity,
@ -266,6 +272,7 @@ class HomeActivityIntentTestRule internal constructor(
isJumpBackInCFREnabled = false,
isPWAsPromptEnabled = false,
isTCPCFREnabled = false,
isUnifiedSearchEnabled = isUnifiedSearchEnabled,
isWallpaperOnboardingEnabled = false,
isCookieBannerReductionDialogEnabled = false,
isOpenInAppBannerEnabled = false,

@ -4,8 +4,9 @@
package org.mozilla.fenix.ui
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.espresso.Espresso.pressBack
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
import androidx.test.uiautomator.UiDevice
import kotlinx.coroutines.runBlocking
@ -33,7 +34,6 @@ import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.robots.multipleSelectionToolbar
import org.mozilla.fenix.ui.robots.navigationToolbar
import org.mozilla.fenix.ui.robots.searchScreen
/**
* Tests for verifying basic functionality of bookmarks
@ -47,16 +47,19 @@ class BookmarksTest {
var url: String = "https://www.example.com"
}
@get:Rule
val activityTestRule = HomeActivityIntentTestRule.withDefaultSettingsOverrides()
@get:Rule(order = 0)
val activityTestRule =
AndroidComposeTestRule(
HomeActivityIntentTestRule.withDefaultSettingsOverrides(isUnifiedSearchEnabled = true),
) { it.activity }
@Rule
@Rule(order = 1)
@JvmField
val retryTestRule = RetryTestRule(3)
@Before
fun setUp() {
mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
mDevice = UiDevice.getInstance(getInstrumentation())
mockWebServer = MockWebServer().apply {
dispatcher = AndroidAssetDispatcher()
start()
@ -233,7 +236,7 @@ class BookmarksTest {
registerAndCleanupIdlingResources(
RecyclerViewIdlingResource(activityTestRule.activity.findViewById(R.id.bookmark_list), 2),
) {}
}.openThreeDotMenu(defaultWebPage.url) {
}.openThreeDotMenu(defaultWebPage.title) {
}.clickCopy {
verifyCopySnackBarText()
navigateUp()
@ -259,7 +262,7 @@ class BookmarksTest {
registerAndCleanupIdlingResources(
RecyclerViewIdlingResource(activityTestRule.activity.findViewById(R.id.bookmark_list), 2),
) {}
}.openThreeDotMenu(defaultWebPage.url) {
}.openThreeDotMenu(defaultWebPage.title) {
}.clickShare {
verifyShareOverlay()
verifyShareBookmarkFavicon()
@ -279,7 +282,7 @@ class BookmarksTest {
registerAndCleanupIdlingResources(
RecyclerViewIdlingResource(activityTestRule.activity.findViewById(R.id.bookmark_list), 2),
) {}
}.openThreeDotMenu(defaultWebPage.url) {
}.openThreeDotMenu(defaultWebPage.title) {
}.clickOpenInNewTab {
verifyTabTrayIsOpened()
verifyNormalModeSelected()
@ -374,7 +377,7 @@ class BookmarksTest {
registerAndCleanupIdlingResources(
RecyclerViewIdlingResource(activityTestRule.activity.findViewById(R.id.bookmark_list), 2),
) {}
}.openThreeDotMenu(defaultWebPage.url) {
}.openThreeDotMenu(defaultWebPage.title) {
}.clickOpenInPrivateTab {
verifyTabTrayIsOpened()
verifyPrivateModeSelected()
@ -393,7 +396,7 @@ class BookmarksTest {
registerAndCleanupIdlingResources(
RecyclerViewIdlingResource(activityTestRule.activity.findViewById(R.id.bookmark_list), 2),
) {}
}.openThreeDotMenu(defaultWebPage.url) {
}.openThreeDotMenu(defaultWebPage.title) {
}.clickDelete {
verifyDeleteSnackBarText()
verifyUndoDeleteSnackBarButton()
@ -412,7 +415,7 @@ class BookmarksTest {
registerAndCleanupIdlingResources(
RecyclerViewIdlingResource(activityTestRule.activity.findViewById(R.id.bookmark_list), 2),
) {}
}.openThreeDotMenu(defaultWebPage.url) {
}.openThreeDotMenu(defaultWebPage.title) {
}.clickDelete {
verifyUndoDeleteSnackBarButton()
clickUndoDeleteButton()
@ -706,7 +709,7 @@ class BookmarksTest {
registerAndCleanupIdlingResources(
RecyclerViewIdlingResource(activityTestRule.activity.findViewById(R.id.bookmark_list), 2),
) {}
}.openThreeDotMenu(defaultWebPage.url) {
}.openThreeDotMenu(defaultWebPage.title) {
}.clickEdit {
clickDeleteInEditModeButton()
cancelDeletion()
@ -750,11 +753,17 @@ class BookmarksTest {
createBookmark(defaultWebPage.url)
}.openThreeDotMenu {
}.openBookmarks {
clickSearchButton()
verifyBookmarksSearchBar(true)
verifyBookmarksSearchBarPosition(true)
clickOutsideTheSearchBar()
verifyBookmarksSearchBar(false)
}.clickSearchButton {
verifySearchView()
verifySearchToolbar(true)
verifySearchSelectorButton()
verifySearchEngineIcon("Bookmarks")
verifySearchBarPlaceholder("Search bookmarks")
verifySearchBarPosition(true)
tapOutsideToDismissSearchBar()
verifySearchToolbar(false)
}
bookmarksMenu {
}.goBackToBrowserScreen {
}.openThreeDotMenu {
}.openSettings {
@ -767,11 +776,12 @@ class BookmarksTest {
browserScreen {
}.openThreeDotMenu {
}.openBookmarks {
clickSearchButton()
verifyBookmarksSearchBar(true)
verifyBookmarksSearchBarPosition(false)
dismissBookmarksSearchBarUsingBackButton()
verifyBookmarksSearchBar(false)
}.clickSearchButton {
verifySearchToolbar(true)
verifySearchEngineIcon("Bookmarks")
verifySearchBarPosition(false)
pressBack()
verifySearchToolbar(false)
}
}
@ -793,15 +803,15 @@ class BookmarksTest {
createBookmark(secondWebPage.url)
}.openThreeDotMenu {
}.openBookmarks {
clickSearchButton()
}.clickSearchButton {
// Search for a valid term
searchBookmarkedItem(firstWebPage.title)
verifySearchedBookmarkExists(firstWebPage.url.toString(), true)
verifySearchedBookmarkExists(secondWebPage.url.toString(), false)
typeSearch(firstWebPage.title)
verifySearchEngineSuggestionResults(activityTestRule, firstWebPage.url.toString())
verifyNoSuggestionsAreDisplayed(activityTestRule, secondWebPage.url.toString())
// Search for invalid term
searchBookmarkedItem("Android")
verifySearchedBookmarkExists(firstWebPage.url.toString(), false)
verifySearchedBookmarkExists(secondWebPage.url.toString(), false)
typeSearch("Android")
verifyNoSuggestionsAreDisplayed(activityTestRule, firstWebPage.url.toString())
verifyNoSuggestionsAreDisplayed(activityTestRule, secondWebPage.url.toString())
}
}
@ -813,10 +823,9 @@ class BookmarksTest {
createBookmark(defaultWebPage.url)
}.openThreeDotMenu {
}.openBookmarks {
clickSearchButton()
verifyBookmarksSearchBar(true)
}
searchScreen {
}.clickSearchButton {
verifySearchToolbar(true)
verifySearchEngineIcon("Bookmarks")
startVoiceSearch()
}
}
@ -833,24 +842,28 @@ class BookmarksTest {
createBookmark(thirdWebPage.url)
}.openThreeDotMenu {
}.openBookmarks {
}.openThreeDotMenu(firstWebPage.url) {
}.openThreeDotMenu(firstWebPage.title) {
}.clickDelete {
verifyBookmarkIsDeleted(firstWebPage.title)
}.openThreeDotMenu(secondWebPage.url) {
}.openThreeDotMenu(secondWebPage.title) {
}.clickDelete {
verifyBookmarkIsDeleted(secondWebPage.title)
clickSearchButton()
searchBookmarkedItem("generic")
verifySearchedBookmarkExists(firstWebPage.url.toString(), false)
verifySearchedBookmarkExists(secondWebPage.url.toString(), false)
verifySearchedBookmarkExists(thirdWebPage.url.toString(), true)
dismissBookmarksSearchBar()
}.openThreeDotMenu(thirdWebPage.url) {
}.clickSearchButton {
// Search for a valid term
typeSearch("generic")
verifyNoSuggestionsAreDisplayed(activityTestRule, firstWebPage.url.toString())
verifyNoSuggestionsAreDisplayed(activityTestRule, secondWebPage.url.toString())
verifySearchEngineSuggestionResults(activityTestRule, thirdWebPage.url.toString())
pressBack()
}
bookmarksMenu {
}.openThreeDotMenu(thirdWebPage.title) {
}.clickDelete {
verifyBookmarkIsDeleted(thirdWebPage.title)
clickSearchButton()
searchBookmarkedItem("generic")
verifySearchedBookmarkExists(thirdWebPage.url.toString(), false)
}.clickSearchButton {
// Search for a valid term
typeSearch("generic")
verifyNoSuggestionsAreDisplayed(activityTestRule, thirdWebPage.url.toString())
}
}
}

@ -5,7 +5,9 @@
package org.mozilla.fenix.ui
import android.content.Context
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu
import androidx.test.espresso.Espresso.pressBack
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
import kotlinx.coroutines.runBlocking
@ -31,7 +33,6 @@ import org.mozilla.fenix.ui.robots.historyMenu
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.robots.multipleSelectionToolbar
import org.mozilla.fenix.ui.robots.navigationToolbar
import org.mozilla.fenix.ui.robots.searchScreen
/**
* Tests for verifying basic functionality of history
@ -42,7 +43,10 @@ class HistoryTest {
private lateinit var mDevice: UiDevice
@get:Rule
val activityTestRule = HomeActivityIntentTestRule.withDefaultSettingsOverrides()
val activityTestRule =
AndroidComposeTestRule(
HomeActivityIntentTestRule.withDefaultSettingsOverrides(isUnifiedSearchEnabled = true),
) { it.activity }
@Before
fun setUp() {
@ -341,12 +345,18 @@ class HistoryTest {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
}.openThreeDotMenu {
}.openHistory {
clickSearchButton()
verifyHistorySearchBar(true)
verifyHistorySearchBarPosition(true)
}.clickSearchButton {
verifySearchView()
verifySearchToolbar(true)
verifySearchSelectorButton()
verifySearchEngineIcon("history")
verifySearchBarPlaceholder("Search history")
verifySearchBarPosition(true)
tapOutsideToDismissSearchBar()
verifyHistorySearchBar(false)
}.goBack {
verifySearchToolbar(false)
exitMenu()
}
homeScreen {
}.openThreeDotMenu {
}.openSettings {
}.openCustomizeSubMenu {
@ -358,11 +368,14 @@ class HistoryTest {
browserScreen {
}.openThreeDotMenu {
}.openHistory {
clickSearchButton()
verifyHistorySearchBar(true)
verifyHistorySearchBarPosition(false)
dismissHistorySearchBarUsingBackButton()
verifyHistorySearchBar(false)
}.clickSearchButton {
verifySearchView()
verifySearchToolbar(true)
verifySearchBarPosition(false)
pressBack()
}
historyMenu {
verifyHistoryMenuView()
}
}
@ -371,10 +384,9 @@ class HistoryTest {
homeScreen {
}.openThreeDotMenu {
}.openHistory {
clickSearchButton()
verifyHistorySearchBar(true)
}
searchScreen {
}.clickSearchButton {
verifySearchToolbar(true)
verifySearchEngineIcon("history")
startVoiceSearch()
}
}
@ -391,15 +403,16 @@ class HistoryTest {
}.enterURLAndEnterToBrowser(secondWebPage.url) {
}.openThreeDotMenu {
}.openHistory {
clickSearchButton()
}.clickSearchButton {
// Search for a valid term
searchForHistoryItem(firstWebPage.title)
verifySearchedHistoryItemExists(firstWebPage.url.toString(), true)
verifySearchedHistoryItemExists(secondWebPage.url.toString(), false)
typeSearch(firstWebPage.title)
verifySearchEngineSuggestionResults(activityTestRule, firstWebPage.url.toString())
verifyNoSuggestionsAreDisplayed(activityTestRule, secondWebPage.url.toString())
clickClearButton()
// Search for invalid term
searchForHistoryItem("Android")
verifySearchedHistoryItemExists(firstWebPage.url.toString(), false)
verifySearchedHistoryItemExists(secondWebPage.url.toString(), false)
typeSearch("Android")
verifyNoSuggestionsAreDisplayed(activityTestRule, firstWebPage.url.toString())
verifyNoSuggestionsAreDisplayed(activityTestRule, secondWebPage.url.toString())
}
}
@ -411,12 +424,15 @@ class HistoryTest {
navigationToolbar {
}.enterURLAndEnterToBrowser(firstWebPage.url) {
verifyPageContent(firstWebPage.content)
}
navigationToolbar {
}.enterURLAndEnterToBrowser(secondWebPage.url) {
verifyPageContent(secondWebPage.content)
}
navigationToolbar {
}.enterURLAndEnterToBrowser(thirdWebPage.url) {
verifyPageContent(thirdWebPage.content)
}.openThreeDotMenu {
}.openHistory {
verifyHistoryListExists()
@ -424,17 +440,21 @@ class HistoryTest {
verifyHistoryItemExists(false, firstWebPage.title)
clickDeleteHistoryButton(secondWebPage.title)
verifyHistoryItemExists(false, secondWebPage.title)
clickSearchButton()
searchForHistoryItem("generic")
verifySearchedHistoryItemExists(firstWebPage.url.toString(), false)
verifySearchedHistoryItemExists(secondWebPage.url.toString(), false)
verifySearchedHistoryItemExists(thirdWebPage.url.toString(), true)
dismissHistorySearchBarUsingBackButton()
}.clickSearchButton {
// Search for a valid term
typeSearch("generic")
verifyNoSuggestionsAreDisplayed(activityTestRule, firstWebPage.url.toString())
verifyNoSuggestionsAreDisplayed(activityTestRule, secondWebPage.url.toString())
verifySearchEngineSuggestionResults(activityTestRule, thirdWebPage.url.toString())
pressBack()
}
historyMenu {
clickDeleteHistoryButton(thirdWebPage.title)
verifyHistoryItemExists(false, firstWebPage.title)
clickSearchButton()
searchForHistoryItem("generic")
verifySearchedHistoryItemExists(thirdWebPage.url.toString(), false)
}.clickSearchButton {
// Search for a valid term
typeSearch("generic")
verifyNoSuggestionsAreDisplayed(activityTestRule, thirdWebPage.url.toString())
}
}
}

@ -87,7 +87,7 @@ class SearchTest {
homeScreen {
}.openSearch {
verifySearchView()
verifyBrowserToolbar()
verifySearchToolbar(true)
verifyScanButton()
verifySearchEngineButton()
}

@ -12,11 +12,11 @@ import androidx.test.espresso.action.ViewActions.clearText
import androidx.test.espresso.action.ViewActions.longClick
import androidx.test.espresso.action.ViewActions.replaceText
import androidx.test.espresso.action.ViewActions.typeText
import androidx.test.espresso.assertion.PositionAssertions
import androidx.test.espresso.assertion.ViewAssertions.doesNotExist
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.RootMatchers
import androidx.test.espresso.matcher.ViewMatchers
import androidx.test.espresso.matcher.ViewMatchers.hasSibling
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withChild
import androidx.test.espresso.matcher.ViewMatchers.withContentDescription
@ -32,12 +32,9 @@ import org.hamcrest.Matchers.allOf
import org.hamcrest.Matchers.containsString
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.mozilla.fenix.R
import org.mozilla.fenix.helpers.Constants.RETRY_COUNT
import org.mozilla.fenix.helpers.MatcherHelper.assertItemContainingTextExists
import org.mozilla.fenix.helpers.MatcherHelper.assertItemWithDescriptionExists
import org.mozilla.fenix.helpers.MatcherHelper.assertItemWithResIdAndTextExists
import org.mozilla.fenix.helpers.MatcherHelper.assertItemWithResIdExists
import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText
import org.mozilla.fenix.helpers.MatcherHelper.itemWithDescription
@ -247,59 +244,6 @@ class BookmarksRobot {
fun clickDeleteInEditModeButton() = deleteInEditModeButton().click()
fun clickSearchButton() = itemWithResId("$packageName:id/bookmark_search").click()
fun verifyBookmarksSearchBarPosition(defaultPosition: Boolean) {
onView(withId(R.id.toolbar))
.check(
if (defaultPosition) {
PositionAssertions.isCompletelyBelow(withId(R.id.pill_wrapper_divider))
} else {
PositionAssertions.isCompletelyAbove(withId(R.id.pill_wrapper_divider))
},
)
}
fun clickOutsideTheSearchBar() {
itemWithResId("$packageName:id/search_wrapper").click()
itemWithResId("$packageName:id/mozac_browser_toolbar_edit_url_view")
.waitUntilGone(waitingTime)
}
fun dismissBookmarksSearchBarUsingBackButton() {
for (i in 1..RETRY_COUNT) {
try {
mDevice.pressBack()
assertTrue(
itemWithResId("$packageName:id/mozac_browser_toolbar_edit_url_view")
.waitUntilGone(waitingTime),
)
break
} catch (e: AssertionError) {
if (i == RETRY_COUNT) {
throw e
}
}
}
}
fun verifyBookmarksSearchBar(exists: Boolean) {
assertItemWithResIdExists(
itemWithResId("$packageName:id/toolbar"),
itemWithResId("$packageName:id/mozac_browser_toolbar_edit_icon"),
exists = exists,
)
assertItemWithResIdAndTextExists(
itemWithResId("$packageName:id/mozac_browser_toolbar_edit_url_view"),
itemContainingText(getStringResource(R.string.bookmark_search)),
exists = exists,
)
assertItemWithDescriptionExists(
itemWithDescription(getStringResource(R.string.voice_search_content_description)),
exists = exists,
)
}
fun searchBookmarkedItem(bookmarkedItem: String) {
itemWithResId("$packageName:id/mozac_browser_toolbar_edit_url_view").also {
it.waitForExists(waitingTime)
@ -321,16 +265,9 @@ class BookmarksRobot {
return Transition()
}
fun openThreeDotMenu(bookmarkTitle: String, interact: ThreeDotMenuBookmarksRobot.() -> Unit): ThreeDotMenuBookmarksRobot.Transition {
fun openThreeDotMenu(bookmark: String, interact: ThreeDotMenuBookmarksRobot.() -> Unit): ThreeDotMenuBookmarksRobot.Transition {
mDevice.waitNotNull(Until.findObject(res("$packageName:id/overflow_menu")))
threeDotMenu(bookmarkTitle).click()
ThreeDotMenuBookmarksRobot().interact()
return ThreeDotMenuBookmarksRobot.Transition()
}
fun openThreeDotMenu(bookmarkUrl: Uri, interact: ThreeDotMenuBookmarksRobot.() -> Unit): ThreeDotMenuBookmarksRobot.Transition {
threeDotMenu(bookmarkUrl).click()
threeDotMenu(bookmark).click()
ThreeDotMenuBookmarksRobot().interact()
return ThreeDotMenuBookmarksRobot.Transition()
@ -357,11 +294,11 @@ class BookmarksRobot {
return BrowserRobot.Transition()
}
fun closeEditBookmarkSection(interact: BookmarksRobot.() -> Unit): BookmarksRobot.Transition {
fun closeEditBookmarkSection(interact: BookmarksRobot.() -> Unit): Transition {
goBackButton().click()
BookmarksRobot().interact()
return BookmarksRobot.Transition()
return Transition()
}
fun openBookmarkWithTitle(bookmarkTitle: String, interact: BrowserRobot.() -> Unit): BrowserRobot.Transition {
@ -374,6 +311,13 @@ class BookmarksRobot {
BrowserRobot().interact()
return BrowserRobot.Transition()
}
fun clickSearchButton(interact: SearchRobot.() -> Unit): SearchRobot.Transition {
itemWithResId("$packageName:id/bookmark_search").click()
SearchRobot().interact()
return SearchRobot.Transition()
}
}
}
@ -405,17 +349,10 @@ private fun addFolderTitleField() = onView(withId(R.id.bookmarkNameEdit))
private fun saveFolderButton() = onView(withId(R.id.confirm_add_folder_button))
private fun threeDotMenu(bookmarkUrl: Uri) = onView(
allOf(
withId(R.id.overflow_menu),
withParent(withChild(allOf(withId(R.id.url), withText(bookmarkUrl.toString())))),
),
)
private fun threeDotMenu(bookmarkTitle: String) = onView(
private fun threeDotMenu(bookmark: String) = onView(
allOf(
withId(R.id.overflow_menu),
withParent(withChild(allOf(withId(R.id.title), withText(bookmarkTitle)))),
hasSibling(withText(bookmark)),
),
)

@ -6,7 +6,6 @@ package org.mozilla.fenix.ui.robots
import android.net.Uri
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.assertion.PositionAssertions
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.RootMatchers.isDialog
import androidx.test.espresso.matcher.ViewMatchers
@ -27,11 +26,7 @@ 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.assertItemWithDescriptionExists
import org.mozilla.fenix.helpers.MatcherHelper.assertItemWithResIdAndTextExists
import org.mozilla.fenix.helpers.MatcherHelper.assertItemWithResIdExists
import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText
import org.mozilla.fenix.helpers.MatcherHelper.itemWithDescription
import org.mozilla.fenix.helpers.MatcherHelper.itemWithResId
import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime
import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeShort
@ -127,42 +122,6 @@ class HistoryRobot {
}
}
fun clickSearchButton() = itemWithResId("$packageName:id/history_search").click()
fun verifyHistorySearchBar(exists: Boolean) {
assertItemWithResIdExists(
itemWithResId("$packageName:id/toolbar"),
itemWithResId("$packageName:id/mozac_browser_toolbar_edit_icon"),
exists = exists,
)
assertItemWithResIdAndTextExists(
itemWithResId("$packageName:id/mozac_browser_toolbar_edit_url_view"),
itemContainingText(getStringResource(R.string.history_search_1)),
exists = exists,
)
assertItemWithDescriptionExists(
itemWithDescription(getStringResource(R.string.voice_search_content_description)),
exists = exists,
)
}
fun verifyHistorySearchBarPosition(defaultPosition: Boolean) {
onView(withId(R.id.toolbar))
.check(
if (defaultPosition) {
PositionAssertions.isCompletelyBelow(withId(R.id.pill_wrapper_divider))
} else {
PositionAssertions.isCompletelyAbove(withId(R.id.pill_wrapper_divider))
},
)
}
fun tapOutsideToDismissSearchBar() {
itemWithResId("$packageName:id/search_wrapper").click()
itemWithResId("$packageName:id/mozac_browser_toolbar_edit_url_view")
.waitUntilGone(waitingTime)
}
fun dismissHistorySearchBarUsingBackButton() {
for (i in 1..Constants.RETRY_COUNT) {
try {
@ -216,6 +175,13 @@ class HistoryRobot {
RecentlyClosedTabsRobot().interact()
return RecentlyClosedTabsRobot.Transition()
}
fun clickSearchButton(interact: SearchRobot.() -> Unit): SearchRobot.Transition {
itemWithResId("$packageName:id/history_search").click()
SearchRobot().interact()
return SearchRobot.Transition()
}
}
}

@ -19,6 +19,7 @@ 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
import androidx.test.espresso.assertion.PositionAssertions
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.intent.Intents
import androidx.test.espresso.intent.matcher.IntentMatchers
@ -38,6 +39,8 @@ import org.mozilla.fenix.helpers.Constants
import org.mozilla.fenix.helpers.Constants.LONG_CLICK_DURATION
import org.mozilla.fenix.helpers.Constants.RETRY_COUNT
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
@ -55,8 +58,19 @@ import org.mozilla.fenix.helpers.click
* Implementation of Robot Pattern for the search fragment.
*/
class SearchRobot {
fun verifySearchView() = assertSearchView()
fun verifyBrowserToolbar() = assertBrowserToolbarEditView()
fun verifySearchView() =
assertTrue(
mDevice.findObject(
UiSelector().resourceId("$packageName:id/search_wrapper"),
).waitForExists(waitingTime),
)
fun verifySearchToolbar(isDisplayed: Boolean) =
assertItemWithResIdExists(
itemWithResId("$packageName:id/mozac_browser_toolbar_edit_url_view"),
exists = isDisplayed,
)
fun verifyScanButton() = assertScanButton()
fun verifyVoiceSearchButtonVisibility(enabled: Boolean) {
@ -127,9 +141,9 @@ class SearchRobot {
fun verifyNoSuggestionsAreDisplayed(rule: ComposeTestRule, vararg searchSuggestions: String) {
rule.waitForIdle()
for (searchSuggestion in searchSuggestions) {
assertFalse(
assertTrue(
mDevice.findObject(UiSelector().textContains(searchSuggestion))
.waitForExists(waitingTimeShort),
.waitUntilGone(waitingTimeShort),
)
}
}
@ -180,9 +194,21 @@ class SearchRobot {
fun verifyKeyboardVisibility() = assertKeyboardVisibility(isExpectedToBeVisible = true)
fun verifySearchEngineList(rule: ComposeTestRule) = rule.assertSearchEngineList()
fun verifySearchEngineIcon(expectedText: String) {
onView(withContentDescription(expectedText))
fun verifySearchSelectorButton() {
assertTrue(itemWithResId("$packageName:id/search_selector").waitForExists(waitingTime))
}
fun verifySearchEngineIcon(name: String) =
assertTrue(itemWithDescription(name).waitForExists(waitingTime))
fun verifySearchBarPlaceholder(text: String) {
assertTrue(
itemWithResIdAndText("$packageName:id/mozac_browser_toolbar_edit_url_view", text)
.waitForExists(waitingTime),
)
}
fun verifyDefaultSearchEngine(expectedText: String) = assertDefaultSearchEngine(expectedText)
fun verifyEnginesListShortcutContains(rule: ComposeTestRule, searchEngineName: String) = assertEngineListShortcutContains(rule, searchEngineName)
@ -249,6 +275,12 @@ class SearchRobot {
clearButton().click()
}
fun tapOutsideToDismissSearchBar() {
itemWithResId("$packageName:id/search_wrapper").click()
itemWithResId("$packageName:id/mozac_browser_toolbar_edit_url_view")
.waitUntilGone(waitingTime)
}
fun longClickToolbar() {
mDevice.waitForWindowUpdate(packageName, waitingTime)
mDevice.findObject(UiSelector().resourceId("$packageName:id/awesomeBar"))
@ -309,6 +341,17 @@ class SearchRobot {
).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)))
}
fun verifySearchBarPosition(bottomPosition: Boolean) {
onView(withId(R.id.toolbar))
.check(
if (bottomPosition) {
PositionAssertions.isCompletelyBelow(withId(R.id.pill_wrapper_divider))
} else {
PositionAssertions.isCompletelyAbove(withId(R.id.pill_wrapper_divider))
},
)
}
class Transition {
private lateinit var sessionLoadedIdlingResource: SessionLoadedIdlingResource
@ -404,20 +447,6 @@ private fun assertSearchEnginePrompt(rule: ComposeTestRule, searchEngineName: St
).assertIsDisplayed()
}
private fun assertSearchView() =
assertTrue(
mDevice.findObject(
UiSelector().resourceId("$packageName:id/search_wrapper"),
).waitForExists(waitingTime),
)
private fun assertBrowserToolbarEditView() =
assertTrue(
mDevice.findObject(
UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_edit_url_view"),
).waitForExists(waitingTime),
)
private fun assertScanButton() =
assertTrue(
scanButton.waitForExists(waitingTime),

Loading…
Cancel
Save