/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.mozilla.fenix.ui import android.content.Context import android.hardware.camera2.CameraManager import androidx.compose.ui.test.junit4.AndroidComposeTestRule import androidx.core.net.toUri import androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu import androidx.test.espresso.Espresso.pressBack import mozilla.components.concept.engine.utils.EngineReleaseChannel import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Assume.assumeTrue import org.junit.Before import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.settings import org.mozilla.fenix.helpers.AppAndSystemHelper.assertNativeAppOpens import org.mozilla.fenix.helpers.AppAndSystemHelper.denyPermission import org.mozilla.fenix.helpers.AppAndSystemHelper.grantSystemPermission import org.mozilla.fenix.helpers.AppAndSystemHelper.runWithCondition import org.mozilla.fenix.helpers.AppAndSystemHelper.runWithSystemLocaleChanged import org.mozilla.fenix.helpers.AppAndSystemHelper.verifyKeyboardVisibility import org.mozilla.fenix.helpers.Constants.PackageName.ANDROID_SETTINGS import org.mozilla.fenix.helpers.Constants.searchEngineCodes import org.mozilla.fenix.helpers.HomeActivityTestRule import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText import org.mozilla.fenix.helpers.MatcherHelper.itemWithText import org.mozilla.fenix.helpers.MockBrowserDataHelper.createBookmarkItem import org.mozilla.fenix.helpers.MockBrowserDataHelper.createHistoryItem import org.mozilla.fenix.helpers.MockBrowserDataHelper.createTabItem import org.mozilla.fenix.helpers.MockBrowserDataHelper.setCustomSearchEngine import org.mozilla.fenix.helpers.SearchDispatcher import org.mozilla.fenix.helpers.TestAssetHelper.getGenericAsset import org.mozilla.fenix.helpers.TestHelper.appContext import org.mozilla.fenix.helpers.TestHelper.clickSnackbarButton import org.mozilla.fenix.helpers.TestHelper.exitMenu import org.mozilla.fenix.helpers.TestHelper.longTapSelectItem import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.TestHelper.verifySnackBarText import org.mozilla.fenix.helpers.TestSetup 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 import java.util.Locale /** * Tests for verifying the search fragment * * Including: * - Verify the toolbar, awesomebar, and shortcut bar are displayed * - Select shortcut button * - Select scan button * */ class SearchTest : TestSetup() { private lateinit var searchMockServer: MockWebServer private var queryString = "firefox" private val generalEnginesList = listOf("DuckDuckGo", "Google", "Bing") private val topicEnginesList = listOf("Amazon.com", "Wikipedia", "eBay") @get:Rule val activityTestRule = AndroidComposeTestRule( HomeActivityTestRule( skipOnboarding = true, isPocketEnabled = false, isJumpBackInCFREnabled = false, isRecentTabsFeatureEnabled = false, isTCPCFREnabled = false, isWallpaperOnboardingEnabled = false, tabsTrayRewriteEnabled = false, ), ) { it.activity } @Before override fun setUp() { super.setUp() searchMockServer = MockWebServer().apply { dispatcher = SearchDispatcher() start() } } @After override fun tearDown() { searchMockServer.shutdown() } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2154189 @Test fun verifySearchBarItemsTest() { 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) } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2154190 @Test fun verifySearchSelectorMenuItemsTest() { homeScreen { }.openSearch { verifySearchView() verifySearchToolbar(isDisplayed = true) clickSearchSelectorButton() verifySearchShortcutListContains( "DuckDuckGo", "Google", "Amazon.com", "Wikipedia", "Bing", "eBay", "Bookmarks", "Tabs", "History", "Search settings", ) } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2154194 @Test fun verifySearchPlaceholderForGeneralDefaultSearchEnginesTest() { generalEnginesList.forEach { homeScreen { }.openSearch { clickSearchSelectorButton() }.clickSearchEngineSettings { openDefaultSearchEngineMenu() changeDefaultSearchEngine(it) exitMenu() } navigationToolbar { verifySearchBarPlaceholder("Search or enter address") } } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2154195 @Test fun verifySearchPlaceholderForNotDefaultGeneralSearchEnginesTest() { val generalEnginesList = listOf("DuckDuckGo", "Bing") generalEnginesList.forEach { homeScreen { }.openSearch { clickSearchSelectorButton() selectTemporarySearchMethod(it) verifySearchBarPlaceholder("Search the web") }.dismissSearchBar {} } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2154196 @Test fun verifySearchPlaceholderForTopicSpecificSearchEnginesTest() { val topicEnginesList = listOf("Amazon.com", "Wikipedia", "eBay") topicEnginesList.forEach { homeScreen { }.openSearch { clickSearchSelectorButton() selectTemporarySearchMethod(it) verifySearchBarPlaceholder("Enter search terms") }.dismissSearchBar {} } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1059459 @SmokeTest @Test fun verifyQRScanningCameraAccessDialogTest() { val cameraManager = appContext.getSystemService(Context.CAMERA_SERVICE) as CameraManager assumeTrue(cameraManager.cameraIdList.isNotEmpty()) homeScreen { }.openSearch { clickScanButton() denyPermission() clickScanButton() clickDismissPermissionRequiredDialog() } homeScreen { }.openSearch { clickScanButton() clickGoToPermissionsSettings() assertNativeAppOpens(ANDROID_SETTINGS) } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/235397 @SmokeTest @Test fun scanQRCodeToOpenAWebpageTest() { val cameraManager = appContext.getSystemService(Context.CAMERA_SERVICE) as CameraManager assumeTrue(cameraManager.cameraIdList.isNotEmpty()) homeScreen { }.openSearch { clickScanButton() grantSystemPermission() verifyScannerOpen() } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2154191 @Test fun verifyScanButtonAvailableOnlyForGeneralSearchEnginesTest() { generalEnginesList.forEach { homeScreen { }.openSearch { clickSearchSelectorButton() selectTemporarySearchMethod(it) verifyScanButtonVisibility(visible = true) }.dismissSearchBar {} } topicEnginesList.forEach { homeScreen { }.openSearch { clickSearchSelectorButton() selectTemporarySearchMethod(it) verifyScanButtonVisibility(visible = false) }.dismissSearchBar {} } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/235395 // Verifies a temporary change of search engine from the Search shortcut menu @SmokeTest @Test fun searchEnginesCanBeChangedTemporarilyFromSearchSelectorMenuTest() { 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 {} } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/233589 @Test fun defaultSearchEnginesCanBeSetFromSearchSelectorMenuTest() { searchScreen { clickSearchSelectorButton() }.clickSearchEngineSettings { verifyToolbarText("Search") openDefaultSearchEngineMenu() changeDefaultSearchEngine("DuckDuckGo") exitMenu() } homeScreen { }.openSearch { }.submitQuery(queryString) { verifyUrl(queryString) } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/522918 @Test fun verifyClearSearchButtonTest() { homeScreen { }.openSearch { typeSearch(queryString) clickClearButton() verifySearchBarPlaceholder("Search or enter address") } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1623441 @Ignore("Test run timing out: https://github.com/mozilla-mobile/fenix/issues/27704") @SmokeTest @Test fun searchResultsOpenedInNewTabsGenerateSearchGroupsTest() { // setting our custom mockWebServer search URL val searchEngineName = "TestSearchEngine" setCustomSearchEngine(searchMockServer, searchEngineName) // Performs a search and opens 2 dummy search results links to create a search group homeScreen { }.openSearch { }.submitQuery(queryString) { longClickPageObject(itemWithText("Link 1")) clickContextMenuItem("Open link in new tab") clickSnackbarButton("SWITCH") waitForPageToLoad() pressBack() longClickPageObject(itemWithText("Link 2")) clickContextMenuItem("Open link in new tab") clickSnackbarButton("SWITCH") waitForPageToLoad() }.openTabDrawer { }.openTabsListThreeDotMenu { }.closeAllTabs { verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3) } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1592229 @Ignore("Test run timing out: https://github.com/mozilla-mobile/fenix/issues/27704") @Test fun verifyAPageIsAddedToASearchGroupOnlyOnceTest() { val firstPageUrl = getGenericAsset(searchMockServer, 1).url val secondPageUrl = getGenericAsset(searchMockServer, 2).url val originPageUrl = "http://localhost:${searchMockServer.port}/pages/searchResults.html?search=test%20search".toUri() // setting our custom mockWebServer search URL val searchEngineName = "TestSearchEngine" setCustomSearchEngine(searchMockServer, searchEngineName) // Performs a search and opens 2 dummy search results links to create a search group homeScreen { }.openSearch { }.submitQuery(queryString) { longClickPageObject(itemWithText("Link 1")) clickContextMenuItem("Open link in new tab") clickSnackbarButton("SWITCH") waitForPageToLoad() pressBack() longClickPageObject(itemWithText("Link 1")) clickContextMenuItem("Open link in new tab") clickSnackbarButton("SWITCH") waitForPageToLoad() pressBack() longClickPageObject(itemWithText("Link 2")) clickContextMenuItem("Open link in new tab") clickSnackbarButton("SWITCH") waitForPageToLoad() pressBack() longClickPageObject(itemWithText("Link 1")) clickContextMenuItem("Open link in new tab") clickSnackbarButton("SWITCH") waitForPageToLoad() }.openTabDrawer { }.openTabsListThreeDotMenu { }.closeAllTabs { verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3) }.openRecentlyVisitedSearchGroupHistoryList(queryString) { verifyTestPageUrl(firstPageUrl) verifyTestPageUrl(secondPageUrl) verifyTestPageUrl(originPageUrl) } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1591782 @Ignore("Failing due to known bug, see https://github.com/mozilla-mobile/fenix/issues/23818") @Test fun searchGroupIsGeneratedWhenNavigatingInTheSameTabTest() { // setting our custom mockWebServer search URL val searchEngineName = "TestSearchEngine" setCustomSearchEngine(searchMockServer, searchEngineName) // Performs a search and opens 2 dummy search results links to create a search group homeScreen { }.openSearch { }.submitQuery(queryString) { clickPageObject(itemContainingText("Link 1")) waitForPageToLoad() pressBack() clickPageObject(itemContainingText("Link 2")) waitForPageToLoad() }.openTabDrawer { }.openTabsListThreeDotMenu { }.closeAllTabs { verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3) } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1591781 @SmokeTest @Test fun searchGroupIsNotGeneratedForLinksOpenedInPrivateTabsTest() { // setting our custom mockWebServer search URL val searchEngineName = "TestSearchEngine" setCustomSearchEngine(searchMockServer, searchEngineName) // Performs a search and opens 2 dummy search results links to create a search group homeScreen { }.openSearch { }.submitQuery(queryString) { longClickPageObject(itemWithText("Link 1")) clickContextMenuItem("Open link in private tab") longClickPageObject(itemWithText("Link 2")) clickContextMenuItem("Open link in private tab") }.openTabDrawer { }.toggleToPrivateTabs { }.openTabWithIndex(0) { }.openTabDrawer { }.openTabWithIndex(1) { }.openTabDrawer { }.openTabsListThreeDotMenu { }.closeAllTabs { togglePrivateBrowsingModeOnOff() verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = false, searchTerm = queryString, groupSize = 3) }.openThreeDotMenu { }.openHistory { verifyHistoryItemExists(shouldExist = false, item = "3 sites") } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1592269 @Ignore("Test run timing out: https://github.com/mozilla-mobile/fenix/issues/27704") @SmokeTest @Test fun deleteIndividualHistoryItemsFromSearchGroupTest() { val firstPageUrl = getGenericAsset(searchMockServer, 1).url val secondPageUrl = getGenericAsset(searchMockServer, 2).url // setting our custom mockWebServer search URL val searchEngineName = "TestSearchEngine" setCustomSearchEngine(searchMockServer, searchEngineName) // Performs a search and opens 2 dummy search results links to create a search group homeScreen { }.openSearch { }.submitQuery(queryString) { longClickPageObject(itemWithText("Link 1")) clickContextMenuItem("Open link in new tab") clickSnackbarButton("SWITCH") waitForPageToLoad() mDevice.pressBack() longClickPageObject(itemWithText("Link 2")) clickContextMenuItem("Open link in new tab") clickSnackbarButton("SWITCH") waitForPageToLoad() }.openTabDrawer { }.openTabsListThreeDotMenu { }.closeAllTabs { verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3) }.openRecentlyVisitedSearchGroupHistoryList(queryString) { clickDeleteHistoryButton(firstPageUrl.toString()) longTapSelectItem(secondPageUrl) multipleSelectionToolbar { openActionBarOverflowOrOptionsMenu(activityTestRule.activity) clickMultiSelectionDelete() } exitMenu() } homeScreen { // checking that the group is removed when only 1 item is left verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = false, searchTerm = queryString, groupSize = 1) } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1592242 @Ignore("Test run timing out: https://github.com/mozilla-mobile/fenix/issues/27704") @Test fun deleteSearchGroupFromHomeScreenTest() { val firstPageUrl = getGenericAsset(searchMockServer, 1).url // setting our custom mockWebServer search URL val searchEngineName = "TestSearchEngine" setCustomSearchEngine(searchMockServer, searchEngineName) // Performs a search and opens 2 dummy search results links to create a search group homeScreen { }.openSearch { }.submitQuery(queryString) { longClickPageObject(itemWithText("Link 1")) clickContextMenuItem("Open link in new tab") clickSnackbarButton("SWITCH") waitForPageToLoad() mDevice.pressBack() longClickPageObject(itemWithText("Link 2")) clickContextMenuItem("Open link in new tab") clickSnackbarButton("SWITCH") waitForPageToLoad() }.openTabDrawer { }.openTabsListThreeDotMenu { }.closeAllTabs { verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3) }.openRecentlyVisitedSearchGroupHistoryList(queryString) { clickDeleteAllHistoryButton() confirmDeleteAllHistory() verifySnackBarText("Group deleted") verifyHistoryItemExists(shouldExist = false, firstPageUrl.toString()) }.goBack {} homeScreen { verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = false, queryString, groupSize = 3) }.openThreeDotMenu { }.openHistory { verifySearchGroupDisplayed(shouldBeDisplayed = false, queryString, groupSize = 3) verifyEmptyHistoryView() } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1592235 @Ignore("Test run timing out: https://github.com/mozilla-mobile/fenix/issues/27704") @Test fun openAPageFromHomeScreenSearchGroupTest() { val firstPageUrl = getGenericAsset(searchMockServer, 1).url val secondPageUrl = getGenericAsset(searchMockServer, 2).url // setting our custom mockWebServer search URL val searchEngineName = "TestSearchEngine" setCustomSearchEngine(searchMockServer, searchEngineName) // Performs a search and opens 2 dummy search results links to create a search group homeScreen { }.openSearch { }.submitQuery(queryString) { longClickPageObject(itemWithText("Link 1")) clickContextMenuItem("Open link in new tab") clickSnackbarButton("SWITCH") waitForPageToLoad() mDevice.pressBack() longClickPageObject(itemWithText("Link 2")) clickContextMenuItem("Open link in new tab") clickSnackbarButton("SWITCH") waitForPageToLoad() }.openTabDrawer { }.openTabsListThreeDotMenu { }.closeAllTabs { verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3) }.openRecentlyVisitedSearchGroupHistoryList(queryString) { }.openWebsite(firstPageUrl) { verifyUrl(firstPageUrl.toString()) }.goToHomescreen { }.openRecentlyVisitedSearchGroupHistoryList(queryString) { longTapSelectItem(firstPageUrl) longTapSelectItem(secondPageUrl) openActionBarOverflowOrOptionsMenu(activityTestRule.activity) } multipleSelectionToolbar { }.clickOpenNewTab { verifyNormalModeSelected() }.closeTabDrawer {} openActionBarOverflowOrOptionsMenu(activityTestRule.activity) multipleSelectionToolbar { }.clickOpenPrivateTab { verifyPrivateModeSelected() } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1592238 @Ignore("Test run timing out: https://github.com/mozilla-mobile/fenix/issues/27704") @Test fun shareAPageFromHomeScreenSearchGroupTest() { val firstPageUrl = getGenericAsset(searchMockServer, 1).url // setting our custom mockWebServer search URL val searchEngineName = "TestSearchEngine" setCustomSearchEngine(searchMockServer, searchEngineName) // Performs a search and opens 2 dummy search results links to create a search group homeScreen { }.openSearch { }.submitQuery(queryString) { longClickPageObject(itemWithText("Link 1")) clickContextMenuItem("Open link in new tab") clickSnackbarButton("SWITCH") waitForPageToLoad() mDevice.pressBack() longClickPageObject(itemWithText("Link 2")) clickContextMenuItem("Open link in new tab") clickSnackbarButton("SWITCH") waitForPageToLoad() }.openTabDrawer { }.openTabsListThreeDotMenu { }.closeAllTabs { verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed = true, searchTerm = queryString, groupSize = 3) }.openRecentlyVisitedSearchGroupHistoryList(queryString) { longTapSelectItem(firstPageUrl) } multipleSelectionToolbar { clickShareHistoryButton() verifyShareOverlay() verifyShareTabFavicon() verifyShareTabTitle() verifyShareTabUrl() } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1232633 // Default search code for Google-US @Test fun defaultSearchCodeGoogleUS() { homeScreen { }.openSearch { }.submitQuery(queryString) { 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 Google (probably redirects) try { verifyHistoryItemExists(shouldExist = true, searchEngineCodes["Google"]!!) } catch (e: AssertionError) { openSearchGroup(queryString) verifyHistoryItemExists(shouldExist = true, searchEngineCodes["Google"]!!) } } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1232637 // Default search code for Bing-US @Test fun defaultSearchCodeBingUS() { homeScreen { }.openThreeDotMenu { }.openSettings { }.openSearchSubMenu { openDefaultSearchEngineMenu() changeDefaultSearchEngine("Bing") exitMenu() } homeScreen { }.openSearch { }.submitQuery(queryString) { 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 Bing (probably redirects) try { verifyHistoryItemExists(shouldExist = true, searchEngineCodes["Bing"]!!) } catch (e: AssertionError) { openSearchGroup(queryString) verifyHistoryItemExists(shouldExist = true, searchEngineCodes["Bing"]!!) } } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1232638 // Default search code for DuckDuckGo-US @Test fun defaultSearchCodeDuckDuckGoUS() { homeScreen { }.openThreeDotMenu { }.openSettings { }.openSearchSubMenu { openDefaultSearchEngineMenu() changeDefaultSearchEngine("DuckDuckGo") exitMenu() } homeScreen { }.openSearch { }.submitQuery(queryString) { 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"]!!) } } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2154215 @SmokeTest @Test fun verifyHistorySearchWithBrowsingHistoryTest() { val firstPageUrl = getGenericAsset(searchMockServer, 1) val secondPageUrl = getGenericAsset(searchMockServer, 2) createHistoryItem(firstPageUrl.url.toString()) createHistoryItem(secondPageUrl.url.toString()) navigationToolbar { }.clickUrlbar { clickSearchSelectorButton() selectTemporarySearchMethod(searchEngineName = "History") typeSearch(searchTerm = "Mozilla") verifySuggestionsAreNotDisplayed(rule = activityTestRule, "Mozilla") clickClearButton() typeSearch(searchTerm = "generic") verifyTypedToolbarText("generic") verifySearchEngineSuggestionResults( rule = activityTestRule, searchSuggestions = arrayOf( firstPageUrl.url.toString(), secondPageUrl.url.toString(), ), searchTerm = "generic", ) }.clickSearchSuggestion(firstPageUrl.url.toString()) { verifyUrl(firstPageUrl.url.toString()) } } @SmokeTest @Test fun verifySearchTabsWithOpenTabsTest() { runWithCondition( // This test will run only on Beta and RC builds // The new composable tabs tray is only available in Nightly and Debug. activityTestRule.activity.components.core.engine.version.releaseChannel == EngineReleaseChannel.RELEASE || activityTestRule.activity.components.core.engine.version.releaseChannel == EngineReleaseChannel.BETA, ) { val firstPageUrl = getGenericAsset(searchMockServer, 1) val secondPageUrl = getGenericAsset(searchMockServer, 2) createTabItem(firstPageUrl.url.toString()) createTabItem(secondPageUrl.url.toString()) navigationToolbar { }.clickUrlbar { clickSearchSelectorButton() selectTemporarySearchMethod(searchEngineName = "Tabs") typeSearch(searchTerm = "Mozilla") verifySuggestionsAreNotDisplayed(rule = activityTestRule, "Mozilla") clickClearButton() typeSearch(searchTerm = "generic") verifyTypedToolbarText("generic") verifySearchEngineSuggestionResults( rule = activityTestRule, searchSuggestions = arrayOf( "Firefox Suggest", firstPageUrl.url.toString(), secondPageUrl.url.toString(), ), searchTerm = "generic", ) }.clickSearchSuggestion(firstPageUrl.url.toString()) { verifyTabCounter("2") }.openTabDrawer { verifyOpenTabsOrder(position = 1, title = firstPageUrl.url.toString()) verifyOpenTabsOrder(position = 2, title = secondPageUrl.url.toString()) } } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2230212 @SmokeTest @Test fun searchHistoryNotRememberedInPrivateBrowsingTest() { appContext.settings().shouldShowSearchSuggestionsInPrivate = true val firstPageUrl = getGenericAsset(searchMockServer, 1) val searchEngineName = "TestSearchEngine" setCustomSearchEngine(searchMockServer, searchEngineName) createBookmarkItem(firstPageUrl.url.toString(), firstPageUrl.title, 1u) homeScreen { }.openNavigationToolbar { }.clickUrlbar { }.submitQuery("test page 1") { }.goToHomescreen { }.togglePrivateBrowsingMode() homeScreen { }.openNavigationToolbar { }.clickUrlbar { }.submitQuery("test page 2") { }.openNavigationToolbar { }.clickUrlbar { typeSearch(searchTerm = "test page") verifySearchEngineSuggestionResults( rule = activityTestRule, searchSuggestions = arrayOf( "TestSearchEngine search", "test page 1", "Firefox Suggest", firstPageUrl.url.toString(), ), searchTerm = "test page 1", ) // 2 search engine suggestions and 2 browser suggestions (1 history, 1 bookmark) verifySearchSuggestionsCount(activityTestRule, numberOfSuggestions = 4, searchTerm = "test page") verifySuggestionsAreNotDisplayed( activityTestRule, searchSuggestions = arrayOf( "test page 2", ), ) } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1232631 // Expected for app language set to Arabic @Test fun verifySearchEnginesFunctionalityUsingRTLLocaleTest() { val arabicLocale = Locale("ar", "AR") runWithSystemLocaleChanged(arabicLocale, activityTestRule.activityRule) { homeScreen { }.openSearch { verifyTranslatedFocusedNavigationToolbar("ابحث أو أدخِل عنوانا") clickSearchSelectorButton() verifySearchShortcutListContains( "Google", "Bing", "Amazon.com", "DuckDuckGo", "ويكيبيديا (ar)", ) selectTemporarySearchMethod("ويكيبيديا (ar)") }.submitQuery("firefox") { verifyUrl("firefox") } } } }