/* 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 androidx.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.UiDevice import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test import org.mozilla.fenix.R import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.helpers.AndroidAssetDispatcher import org.mozilla.fenix.helpers.Constants.defaultTopSitesList import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.RetryTestRule import org.mozilla.fenix.helpers.TestAssetHelper.getGenericAsset import org.mozilla.fenix.helpers.TestHelper.generateRandomString import org.mozilla.fenix.helpers.TestHelper.getStringResource import org.mozilla.fenix.helpers.TestHelper.waitUntilSnackbarGone import org.mozilla.fenix.ui.robots.browserScreen import org.mozilla.fenix.ui.robots.homeScreen import org.mozilla.fenix.ui.robots.navigationToolbar /** * Tests Top Sites functionality * * - Verifies 'Add to Firefox Home' UI functionality * - Verifies 'Top Sites' context menu UI functionality * - Verifies 'Top Site' usage UI functionality * - Verifies existence of default top sites available on the home-screen */ class TopSitesTest { private lateinit var mDevice: UiDevice private lateinit var mockWebServer: MockWebServer @get:Rule val activityIntentTestRule = HomeActivityIntentTestRule.withDefaultSettingsOverrides(skipOnboarding = true) @get:Rule val retryTestRule = RetryTestRule(3) @Before fun setUp() { mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) mockWebServer = MockWebServer().apply { dispatcher = AndroidAssetDispatcher() start() } } @After fun tearDown() { mockWebServer.shutdown() } @SmokeTest @Test fun verifyAddToFirefoxHome() { val defaultWebPage = getGenericAsset(mockWebServer, 1) navigationToolbar { }.enterURLAndEnterToBrowser(defaultWebPage.url) { }.openThreeDotMenu { expandMenu() verifyAddToShortcutsButton() }.addToFirefoxHome { verifySnackBarText(getStringResource(R.string.snackbar_added_to_shortcuts)) }.goToHomescreen { verifyExistingTopSitesList() verifyExistingTopSitesTabs(defaultWebPage.title) } } @Test fun verifyOpenTopSiteNormalTab() { val defaultWebPage = getGenericAsset(mockWebServer, 1) navigationToolbar { }.enterURLAndEnterToBrowser(defaultWebPage.url) { }.openThreeDotMenu { expandMenu() verifyAddToShortcutsButton() }.addToFirefoxHome { verifySnackBarText(getStringResource(R.string.snackbar_added_to_shortcuts)) }.goToHomescreen { verifyExistingTopSitesList() verifyExistingTopSitesTabs(defaultWebPage.title) }.openTopSiteTabWithTitle(title = defaultWebPage.title) { verifyUrl(defaultWebPage.url.toString().replace("http://", "")) }.goToHomescreen { verifyExistingTopSitesList() verifyExistingTopSitesTabs(defaultWebPage.title) }.openContextMenuOnTopSitesWithTitle(defaultWebPage.title) { verifyTopSiteContextMenuItems() } // Dismiss context menu popup mDevice.pressBack() } @Test fun verifyOpenTopSitePrivateTab() { val defaultWebPage = getGenericAsset(mockWebServer, 1) navigationToolbar { }.enterURLAndEnterToBrowser(defaultWebPage.url) { }.openThreeDotMenu { expandMenu() verifyAddToShortcutsButton() }.addToFirefoxHome { verifySnackBarText(getStringResource(R.string.snackbar_added_to_shortcuts)) }.goToHomescreen { verifyExistingTopSitesList() verifyExistingTopSitesTabs(defaultWebPage.title) }.openContextMenuOnTopSitesWithTitle(defaultWebPage.title) { verifyTopSiteContextMenuItems() }.openTopSiteInPrivateTab { verifyCurrentPrivateSession(activityIntentTestRule.activity.applicationContext) } } @Test fun verifyRenameTopSite() { val defaultWebPage = getGenericAsset(mockWebServer, 1) val newPageTitle = generateRandomString(5) navigationToolbar { }.enterURLAndEnterToBrowser(defaultWebPage.url) { waitForPageToLoad() }.openThreeDotMenu { expandMenu() verifyAddToShortcutsButton() }.addToFirefoxHome { verifySnackBarText(getStringResource(R.string.snackbar_added_to_shortcuts)) }.goToHomescreen { verifyExistingTopSitesList() verifyExistingTopSitesTabs(defaultWebPage.title) }.openContextMenuOnTopSitesWithTitle(defaultWebPage.title) { verifyTopSiteContextMenuItems() }.renameTopSite(newPageTitle) { verifyExistingTopSitesList() verifyExistingTopSitesTabs(newPageTitle) } } @Test fun verifyRemoveTopSite() { val defaultWebPage = getGenericAsset(mockWebServer, 1) navigationToolbar { }.enterURLAndEnterToBrowser(defaultWebPage.url) { }.openThreeDotMenu { expandMenu() verifyAddToShortcutsButton() }.addToFirefoxHome { verifySnackBarText(getStringResource(R.string.snackbar_added_to_shortcuts)) }.goToHomescreen { verifyExistingTopSitesList() verifyExistingTopSitesTabs(defaultWebPage.title) }.openContextMenuOnTopSitesWithTitle(defaultWebPage.title) { verifyTopSiteContextMenuItems() }.removeTopSite { verifyNotExistingTopSitesList(defaultWebPage.title) } } @Test fun verifyUndoRemoveTopSite() { val defaultWebPage = getGenericAsset(mockWebServer, 1) navigationToolbar { }.enterURLAndEnterToBrowser(defaultWebPage.url) { }.openThreeDotMenu { expandMenu() verifyAddToShortcutsButton() }.addToFirefoxHome { verifySnackBarText(getStringResource(R.string.snackbar_added_to_shortcuts)) }.goToHomescreen { verifyExistingTopSitesList() verifyExistingTopSitesTabs(defaultWebPage.title) }.openContextMenuOnTopSitesWithTitle(defaultWebPage.title) { verifyTopSiteContextMenuItems() }.removeTopSite { clickUndoSnackBarButton() verifyExistingTopSitesTabs(defaultWebPage.title) } } @Test fun verifyRemoveTopSiteFromMainMenu() { val defaultWebPage = getGenericAsset(mockWebServer, 1) navigationToolbar { }.enterURLAndEnterToBrowser(defaultWebPage.url) { }.openThreeDotMenu { expandMenu() verifyAddToShortcutsButton() }.addToFirefoxHome { verifySnackBarText(getStringResource(R.string.snackbar_added_to_shortcuts)) }.goToHomescreen { verifyExistingTopSitesList() verifyExistingTopSitesTabs(defaultWebPage.title) }.openTopSiteTabWithTitle(defaultWebPage.title) { }.openThreeDotMenu { verifyRemoveFromShortcutsButton() }.clickRemoveFromShortcuts { }.goToHomescreen { verifyNotExistingTopSitesList(defaultWebPage.title) } } // Expected for en-us defaults @Test fun verifyDefaultTopSitesList() { homeScreen { }.dismissOnboarding() homeScreen { verifyExistingTopSitesList() defaultTopSitesList.values.forEach { value -> verifyExistingTopSitesTabs(value) } } } @SmokeTest @Test fun addAndRemoveMostViewedTopSiteTest() { val defaultWebPage = getGenericAsset(mockWebServer, 1) for (i in 0..1) { navigationToolbar { }.enterURLAndEnterToBrowser(defaultWebPage.url) { waitForPageToLoad() } } browserScreen { }.goToHomescreen { verifyExistingTopSitesList() verifyExistingTopSitesTabs(defaultWebPage.title) }.openContextMenuOnTopSitesWithTitle(defaultWebPage.title) { }.deleteTopSiteFromHistory { verifySnackBarText(getStringResource(R.string.snackbar_top_site_removed)) waitUntilSnackbarGone() }.openThreeDotMenu { }.openHistory { verifyEmptyHistoryView() } } }