/* 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.espresso.NoMatchingViewException import androidx.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.By import androidx.test.uiautomator.UiDevice import androidx.test.uiautomator.Until import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.helpers.AndroidAssetDispatcher import org.mozilla.fenix.helpers.HomeActivityTestRule import org.mozilla.fenix.helpers.TestAssetHelper import org.mozilla.fenix.ui.robots.homeScreen import org.mozilla.fenix.ui.robots.navigationToolbar /** * Tests for verifying basic functionality of tab collection * */ class CollectionTest { /* ktlint-disable no-blank-line-before-rbrace */ // This imposes unreadable grouping. private val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) private lateinit var mockWebServer: MockWebServer private val firstCollectionName = "testcollection_1" private val secondCollectionName = "testcollection_2" @get:Rule val activityTestRule = HomeActivityTestRule() @Before fun setUp() { mockWebServer = MockWebServer().apply { setDispatcher(AndroidAssetDispatcher()) start() } } @After fun tearDown() { mockWebServer.shutdown() } @Ignore("Intermittent failures, see: https://github.com/mozilla-mobile/fenix/issues/10587") @Test fun verifyCreateFirstCollectionFlowItems() { val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) val secondWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2) navigationToolbar { }.enterURLAndEnterToBrowser(firstWebPage.url) { }.openHomeScreen { }.openNavigationToolbar { }.enterURLAndEnterToBrowser(secondWebPage.url) { }.openHomeScreen { clickSaveCollectionButton() verifySelectTabsView() selectAllTabsForCollection() verifyTabsSelectedCounterText(2) deselectAllTabsForCollection() verifyTabsSelectedCounterText(0) selectTabForCollection(firstWebPage.title) verifyTabsSelectedCounterText(1) selectAllTabsForCollection() saveTabsSelectedForCollection() verifyNameCollectionView() verifyDefaultCollectionName("Collection 1") typeCollectionName(firstCollectionName) verifySnackBarText("Tabs saved!") verifyExistingOpenTabs(firstWebPage.title) verifyExistingOpenTabs(secondWebPage.title) } } @Ignore("Intermittent failures, see: https://github.com/mozilla-mobile/fenix/issues/10587") @Test // open a webpage, and add currently opened tab to existing collection fun addTabToExistingCollectionTest() { val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) val secondWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2) createCollection(firstCollectionName) homeScreen { verifyExistingTabList() closeTab() }.openNavigationToolbar { }.enterURLAndEnterToBrowser(secondWebPage.url) { verifyPageContent(secondWebPage.content) }.openThreeDotMenu { clickBrowserViewSaveCollectionButton() }.selectExistingCollection(firstCollectionName) { verifySnackBarText("Tab saved!") }.openHomeScreen { verifyExistingTabList() expandCollection(firstCollectionName) verifyItemInCollectionExists(firstWebPage.title) verifyItemInCollectionExists(secondWebPage.title) } } @Ignore("Intermittent failures, see: https://github.com/mozilla-mobile/fenix/issues/10587") @Test fun collectionMenuAddTabButtonTest() { val secondWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2) createCollection(firstCollectionName) homeScreen { closeTab() }.openNavigationToolbar { }.enterURLAndEnterToBrowser(secondWebPage.url) { }.openHomeScreen { expandCollection(firstCollectionName) clickCollectionThreeDotButton() selectAddTabToCollection() verifyTabsSelectedCounterText(1) saveTabsSelectedForCollection() verifySnackBarText("Tab saved!") verifyItemInCollectionExists(secondWebPage.title) } } @Ignore("Intermittent failures, see: https://github.com/mozilla-mobile/fenix/issues/10587") @Test fun collectionMenuOpenAllTabsTest() { val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) createCollection(firstCollectionName) homeScreen { closeTab() expandCollection(firstCollectionName) clickCollectionThreeDotButton() selectOpenTabs() verifyExistingOpenTabs(firstWebPage.title) } } @Ignore("Intermittent failures, see: https://github.com/mozilla-mobile/fenix/issues/10587") @Test fun renameCollectionTest() { createCollection(firstCollectionName) homeScreen { // On homeview, tap the 3-dot button to expand, select rename, rename collection expandCollection(firstCollectionName) clickCollectionThreeDotButton() selectRenameCollection() typeCollectionName("renamed_collection") verifyCollectionIsDisplayed("renamed_collection") } } @Ignore("Intermittent failures, see: https://github.com/mozilla-mobile/fenix/issues/10587") @Test fun deleteCollectionTest() { createCollection(firstCollectionName) homeScreen { expandCollection(firstCollectionName) clickCollectionThreeDotButton() selectDeleteCollection() confirmDeleteCollection() verifyNoCollectionsHeader() } } @Ignore("Intermittent failures, see: https://github.com/mozilla-mobile/fenix/issues/10587") @Test fun createCollectionFromTabTest() { val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) createCollection(firstCollectionName) homeScreen { // swipe to bottom until the collections are shown verifyExistingOpenTabs(firstWebPage.title) try { verifyCollectionIsDisplayed(firstCollectionName) } catch (e: NoMatchingViewException) { scrollToElementByText(firstCollectionName) } } } @Ignore("Intermittent failures, see: https://github.com/mozilla-mobile/fenix/issues/10587") @Test fun verifyExpandedCollectionItemsTest() { val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) createCollection(firstCollectionName) homeScreen { verifyCollectionIsDisplayed(firstCollectionName) verifyCollectionIcon() expandCollection(firstCollectionName) verifyItemInCollectionExists(firstWebPage.title) verifyCollectionItemLogo() verifyCollectionItemUrl() verifyShareCollectionButtonIsVisible(true) verifyCollectionMenuIsVisible(true) verifyCollectionItemRemoveButtonIsVisible(firstWebPage.title, true) collapseCollection(firstCollectionName) verifyItemInCollectionExists(firstWebPage.title, false) verifyShareCollectionButtonIsVisible(false) verifyCollectionMenuIsVisible(false) verifyCollectionItemRemoveButtonIsVisible(firstWebPage.title, false) } } @Ignore("Intermittent failures, see: https://github.com/mozilla-mobile/fenix/issues/10587") @Test fun shareCollectionTest() { createCollection(firstCollectionName) homeScreen { expandCollection(firstCollectionName) clickShareCollectionButton() verifyShareTabsOverlay() } } @Ignore("Intermittent failures, see: https://github.com/mozilla-mobile/fenix/issues/10587") @Test fun removeTabFromCollectionTest() { val webPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) createCollection(firstCollectionName) homeScreen { closeTab() expandCollection(firstCollectionName) removeTabFromCollection(webPage.title) verifyItemInCollectionExists(webPage.title, false) } createCollection(firstCollectionName) homeScreen { closeTab() expandCollection(firstCollectionName) swipeCollectionItemLeft(webPage.title) verifyItemInCollectionExists(webPage.title, false) } createCollection(firstCollectionName) homeScreen { closeTab() expandCollection(firstCollectionName) swipeCollectionItemRight(webPage.title) verifyItemInCollectionExists(webPage.title, false) } } @Ignore("Intermittent failures, see: https://github.com/mozilla-mobile/fenix/issues/10587") @Test fun selectTabOnLongTapTest() { val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) val secondWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2) navigationToolbar { }.enterURLAndEnterToBrowser(firstWebPage.url) { }.openHomeScreen { }.openNavigationToolbar { }.enterURLAndEnterToBrowser(secondWebPage.url) { }.openHomeScreen { longTapSelectTab(firstWebPage.title) verifySelectTabsView() verifyTabsSelectedCounterText(1) selectTabForCollection(secondWebPage.title) verifyTabsSelectedCounterText(2) saveTabsSelectedForCollection() typeCollectionName(firstCollectionName) verifySnackBarText("Tabs saved!") closeTabViaXButton(firstWebPage.title) closeTabViaXButton(secondWebPage.title) expandCollection(firstCollectionName) verifyItemInCollectionExists(firstWebPage.title) verifyItemInCollectionExists(secondWebPage.title) } } @Ignore("Intermittent failures, see: https://github.com/mozilla-mobile/fenix/issues/10587") @Test fun tabsOverflowMenuSaveCollectionTest() { val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) val secondWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2) navigationToolbar { }.enterURLAndEnterToBrowser(firstWebPage.url) { }.openHomeScreen { }.openNavigationToolbar { }.enterURLAndEnterToBrowser(secondWebPage.url) { }.openHomeScreen { }.openTabsListThreeDotMenu { verifySaveCollection() }.clickOpenTabsMenuSaveCollection { verifySelectTabsView() verifyTabsSelectedCounterText(0) selectAllTabsForCollection() verifyTabsSelectedCounterText(2) saveTabsSelectedForCollection() typeCollectionName(firstCollectionName) closeTabViaXButton(firstWebPage.title) closeTabViaXButton(secondWebPage.title) expandCollection(firstCollectionName) verifyItemInCollectionExists(firstWebPage.title) verifyItemInCollectionExists(secondWebPage.title) } } @Ignore("Intermittent failures, see: https://github.com/mozilla-mobile/fenix/issues/10587") @Test fun navigateBackInCollectionFlowTest() { val secondWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2) createCollection(firstCollectionName) navigationToolbar { }.enterURLAndEnterToBrowser(secondWebPage.url) { }.openHomeScreen { longTapSelectTab(secondWebPage.title) verifySelectTabsView() saveTabsSelectedForCollection() verifySelectCollectionView() clickAddNewCollection() verifyNameCollectionView() goBackCollectionFlow() verifySelectCollectionView() goBackCollectionFlow() verifySelectTabsView() goBackCollectionFlow() verifyHomeComponent() } } private fun createCollection(collectionName: String, firstCollection: Boolean = true) { val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) navigationToolbar { }.enterURLAndEnterToBrowser(firstWebPage.url) { verifyPageContent(firstWebPage.content) }.openThreeDotMenu { clickBrowserViewSaveCollectionButton() if (!firstCollection) clickAddNewCollection() }.typeCollectionName(collectionName) { verifySnackBarText("Tab saved!") }.openHomeScreen { mDevice.wait( Until.findObject(By.text(collectionName)), TestAssetHelper.waitingTime ) } } }