diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt index d75a58608..9265b1b8c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt @@ -4,6 +4,7 @@ package org.mozilla.fenix.ui +import androidx.core.net.toUri import androidx.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.UiDevice import okhttp3.mockwebserver.MockWebServer @@ -62,4 +63,158 @@ class SmokeTest { } } } + + @Test + fun verifyPageMainMenuItemsListInPortraitNormalModeTest() { + val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + // Add this to check openInApp and youtube is a default app available in every Android emulator/device + val youtubeUrl = "www.youtube.com" + + navigationToolbar { + }.enterURLAndEnterToBrowser(defaultWebPage.url) { + }.openThreeDotMenu { + verifyThreeDotMainMenuItems() + verifySaveCollection() + }.clickAddOnsReportSiteIssue { + verifyUrl("webcompat.com/issues/new") + }.openTabDrawer { + }.openTab(defaultWebPage.title) { + }.openThreeDotMenu { + }.openHistory { + verifyTestPageUrl(defaultWebPage.url) + }.goBackToBrowser { + }.openThreeDotMenu { + }.openBookmarks { + verifyBookmarksMenuView() + verifyEmptyBookmarksList() + }.goBackToBrowser { + }.openThreeDotMenu { + }.openSyncedTabs { + verifyNavigationToolBarHeader() + verifySyncedTabsStatus() + }.goBack { + }.openThreeDotMenu { + }.openSettings { + verifySettingsView() + }.goBackToBrowser { + }.openThreeDotMenu { + }.openFindInPage { + verifyFindInPageSearchBarItems() + }.closeFindInPage { + }.openThreeDotMenu { + }.addToFirefoxHome { + verifySnackBarText("Added to top sites!") + }.openTabDrawer { + }.openHomeScreen { + verifyExistingTopSitesTabs(defaultWebPage.title) + }.openTabDrawer { + }.openTab(defaultWebPage.title) { + }.openThreeDotMenu { + }.openAddToHomeScreen { + verifyShortcutNameField(defaultWebPage.title) + clickAddShortcutButton() + clickAddAutomaticallyButton() + }.openHomeScreenShortcut(defaultWebPage.title) { + }.openThreeDotMenu { + }.openSaveToCollection { + verifyCollectionNameTextField() + }.goBackToBrowser { + }.openThreeDotMenu { + }.bookmarkPage { + verifySnackBarText("Bookmark saved!") + }.openThreeDotMenu { + }.sharePage { + verifyShareAppsLayout() + }.closeShareDialogReturnToPage { + }.openThreeDotMenu { + }.refreshPage { + verifyUrl(defaultWebPage.url.toString()) + }.openTabDrawer { + closeTabViaXButton(defaultWebPage.title) + }.openHomeScreen { + navigationToolbar { + }.enterURLAndEnterToBrowser(youtubeUrl.toUri()) { + verifyBlueDot() + }.openThreeDotMenu { + verifyOpenInAppButton() + } + } + } + + @Test + fun verifyPageMainMenuItemsListInPortraitPrivateModeTest() { + val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + // Add this to check openInApp and also youtube is a default app available in every Android emulator/device + val youtubeUrl = "www.youtube.com" + + homeScreen { + togglePrivateBrowsingModeOnOff() + navigationToolbar { + }.enterURLAndEnterToBrowser(defaultWebPage.url) { + }.openThreeDotMenu { + verifyThreeDotMainMenuItems() + }.clickAddOnsReportSiteIssue { + verifyUrl("webcompat.com/issues/new") + }.openTabDrawer { + }.openTab(defaultWebPage.title) { + }.openThreeDotMenu { + }.openHistory { + verifyEmptyHistoryView() + }.goBackToBrowser { + }.openThreeDotMenu { + }.openBookmarks { + verifyBookmarksMenuView() + verifyEmptyBookmarksList() + }.goBackToBrowser { + }.openThreeDotMenu { + }.openSyncedTabs { + verifyNavigationToolBarHeader() + verifySyncedTabsStatus() + }.goBack { + }.openThreeDotMenu { + }.openSettings { + verifySettingsView() + }.goBackToBrowser { + }.openThreeDotMenu { + }.openFindInPage { + verifyFindInPageSearchBarItems() + }.closeFindInPage { + }.openThreeDotMenu { + }.addToFirefoxHome { + verifySnackBarText("Added to top sites!") + }.openTabDrawer { + }.openHomeScreen { + togglePrivateBrowsingModeOnOff() + verifyExistingTopSitesTabs(defaultWebPage.title) + togglePrivateBrowsingModeOnOff() + }.openTabDrawer { + }.openTab(defaultWebPage.title) { + }.openThreeDotMenu { + }.openAddToHomeScreen { + verifyShortcutNameField(defaultWebPage.title) + clickAddShortcutButton() + clickAddAutomaticallyButton() + }.openHomeScreenShortcut(defaultWebPage.title) { + }.openThreeDotMenu { + }.bookmarkPage { + verifySnackBarText("Bookmark saved!") + }.openThreeDotMenu { + }.sharePage { + verifyShareAppsLayout() + }.closeShareDialogReturnToPage { + }.openThreeDotMenu { + }.refreshPage { + verifyUrl(defaultWebPage.url.toString()) + }.openTabDrawer { + closeTabViaXButton(defaultWebPage.title) + }.openHomeScreen { + navigationToolbar { + }.enterURLAndEnterToBrowser(youtubeUrl.toUri()) { + verifyBlueDot() + }.openThreeDotMenu { + verifyOpenInAppButton() + } + } + } + } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/AddToHomeScreenRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/AddToHomeScreenRobot.kt index 14c0ffaf7..bfb6b1ce9 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/AddToHomeScreenRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/AddToHomeScreenRobot.kt @@ -8,14 +8,19 @@ import android.os.Build import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.clearText import androidx.test.espresso.action.ViewActions.typeText +import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.uiautomator.By +import androidx.test.uiautomator.By.text import androidx.test.uiautomator.By.textContains import androidx.test.uiautomator.UiScrollable import androidx.test.uiautomator.UiSelector import androidx.test.uiautomator.Until +import org.hamcrest.CoreMatchers.allOf import org.hamcrest.CoreMatchers.anyOf +import org.junit.Assert import org.mozilla.fenix.R import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.click @@ -26,6 +31,8 @@ import org.mozilla.fenix.helpers.ext.waitNotNull */ class AddToHomeScreenRobot { + fun verifyShortcutIcon() = assertShortcutIcon() + fun addShortcutName(title: String) { mDevice.waitNotNull(Until.findObject(By.text("Add to Home screen")), waitingTime) shortcutNameField() @@ -33,6 +40,8 @@ class AddToHomeScreenRobot { .perform(typeText(title)) } + fun verifyShortcutNameField(expectedText: String) = assertShortcutNameField(expectedText) + fun clickAddShortcutButton() = addButton().click() fun clickAddAutomaticallyButton() { @@ -77,7 +86,21 @@ fun addToHomeScreen(interact: AddToHomeScreenRobot.() -> Unit): AddToHomeScreenR private fun shortcutNameField() = onView(withId(R.id.shortcut_text)) +private fun assertShortcutNameField(expectedText: String) { + onView(allOf(withId(R.id.shortcut_text), + withText(expectedText))) + .check(matches(isCompletelyDisplayed())) +} + private fun addButton() = onView(anyOf(withText("ADD"))) private fun addAutomaticallyButton() = mDevice.findObject(UiSelector().textContains("add automatically")) + +private fun assertShortcutIcon() { + mDevice.wait( + Until.findObject(text("Firefox Preview")), + waitingTime + ) + Assert.assertTrue(mDevice.hasObject(By.text("Firefox Preview"))) +} diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt index 0255f7c0a..3a37b6978 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt @@ -132,6 +132,8 @@ class BookmarksRobot { addFolderButton().click() } + fun clickdeleteBookmarkButton() = deleteBookmarkButton().click() + fun addNewFolderName(name: String) { addFolderTitleField() .click() @@ -188,6 +190,23 @@ class BookmarksRobot { return Transition() } + fun goBackToBrowser(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + closeButton().click() + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + + fun confirmBookmarkFolderDeletionAndGoBackToBrowser(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + onView(withText(R.string.delete_browsing_data_prompt_allow)) + .inRoot(RootMatchers.isDialog()) + .check(matches(isDisplayed())) + .click() + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + fun openThreeDotMenu(interact: ThreeDotMenuBookmarksRobot.() -> Unit): ThreeDotMenuBookmarksRobot.Transition { mDevice.waitNotNull(Until.findObject(res("org.mozilla.fenix.debug:id/overflow_menu"))) threeDotMenu().click() @@ -248,6 +267,8 @@ private fun addFolderTitleField() = onView(withId(R.id.bookmarkNameEdit)) private fun saveFolderButton() = onView(withId(R.id.confirm_add_folder_button)) +private fun deleteBookmarkButton() = onView(withId(R.id.delete_bookmark_button)) + private fun threeDotMenu(bookmarkUrl: Uri) = onView( allOf( withId(R.id.overflow_menu), diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt index 5ec323f8a..02d1d4e67 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt @@ -157,6 +157,8 @@ class BrowserRobot { fun verifyMenuButton() = assertMenuButton() + fun verifyBlueDot() = assertBlueDot() + fun verifyNavURLBarItems() { verifyEnhancedTrackingOptions() pressBack() @@ -448,3 +450,10 @@ private fun mediaPlayerPlayButton() = .clazz("android.widget.Button") .textContains("Play") ) + +private fun assertBlueDot() { + onView(withId(R.id.notification_dot)) + .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) +} + +private fun addOnsReportSiteIssue() = onView(withText("Report Site Issue")) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/FindInPageRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/FindInPageRobot.kt index ea53de5a1..9472a20a3 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/FindInPageRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/FindInPageRobot.kt @@ -29,10 +29,18 @@ class FindInPageRobot { val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())!! + fun verifyFindInPageQuery() = assertFindInPageQuery()!! fun verifyFindInPageNextButton() = assertFindInPageNextButton()!! fun verifyFindInPagePrevButton() = assertFindInPagePrevButton()!! fun verifyFindInPageCloseButton() = assertFindInPageCloseButton()!! + fun verifyFindInPageSearchBarItems() { + verifyFindInPageQuery() + verifyFindInPageNextButton() + verifyFindInPagePrevButton() + verifyFindInPageCloseButton() + } + fun enterFindInPageQuery(expectedText: String) { mDevice.waitNotNull(Until.findObject(By.res("org.mozilla.fenix.debug:id/find_in_page_query_text")), waitingTime) findInPageQuery().perform(clearText()) @@ -73,6 +81,9 @@ private fun findInPageNextButton() = onView(withId(R.id.find_in_page_next_btn)) private fun findInPagePrevButton() = onView(withId(R.id.find_in_page_prev_btn)) private fun findInPageCloseButton() = onView(withId(R.id.find_in_page_close_btn)) +private fun assertFindInPageQuery() = findInPageQuery() + .check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + private fun assertFindInPageNextButton() = findInPageNextButton() .check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HistoryRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HistoryRobot.kt index 5ca48ee5a..792ad6e6e 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HistoryRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HistoryRobot.kt @@ -90,6 +90,13 @@ class HistoryRobot { return Transition() } + fun goBackToBrowser(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + closeButton().click() + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + fun openThreeDotMenu(interact: ThreeDotMenuHistoryItemRobot.() -> Unit): ThreeDotMenuHistoryItemRobot.Transition { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/LibrarySubMenusMultipleSelectionToolbarRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/LibrarySubMenusMultipleSelectionToolbarRobot.kt index e12c5242f..483ad546f 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/LibrarySubMenusMultipleSelectionToolbarRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/LibrarySubMenusMultipleSelectionToolbarRobot.kt @@ -5,6 +5,7 @@ package org.mozilla.fenix.ui.robots import android.net.Uri +import android.widget.TextView import androidx.test.espresso.Espresso.onView import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.isDisplayed @@ -14,12 +15,14 @@ import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.espresso.matcher.ViewMatchers.withParent import androidx.test.espresso.matcher.ViewMatchers.withChild import androidx.test.uiautomator.By +import androidx.test.uiautomator.UiSelector import androidx.test.uiautomator.Until import org.mozilla.fenix.R import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.click import org.mozilla.fenix.helpers.ext.waitNotNull import org.hamcrest.Matchers.allOf +import org.mozilla.fenix.helpers.TestAssetHelper /* * Implementation of Robot Pattern for the multiple selection toolbar of History and Bookmarks menus. @@ -38,6 +41,8 @@ class LibrarySubMenusMultipleSelectionToolbarRobot { fun verifyShareOverlay() = assertShareOverlay() + fun verifyShareAppsLayout() = assertShareAppsLayout() + fun verifyShareTabFavicon() = assertShareTabFavicon() fun verifyShareTabTitle() = assertShareTabTitle() @@ -71,6 +76,12 @@ class LibrarySubMenusMultipleSelectionToolbarRobot { } class Transition { + fun closeShareDialogReturnToPage(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + fun closeToolbarReturnToHistory(interact: HistoryRobot.() -> Unit): HistoryRobot.Transition { closeToolbarButton().click() @@ -158,6 +169,15 @@ private fun assertShareBookmarksButton() = private fun assertShareOverlay() = onView(withId(R.id.shareWrapper)).check(matches(isDisplayed())) +private fun assertShareAppsLayout() = { + val sendToDeviceTitle = mDevice.findObject( + UiSelector() + .instance(0) + .className(TextView::class.java) + ) + sendToDeviceTitle.waitForExists(TestAssetHelper.waitingTime) +} + private fun assertShareTabTitle() = onView(withId(R.id.share_tab_title)).check(matches(isDisplayed())) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsRobot.kt index 2087f7c62..18b413c3c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsRobot.kt @@ -96,6 +96,13 @@ class SettingsRobot { return HomeScreenRobot.Transition() } + fun goBackToBrowser(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + goBackButton().click() + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + fun openAboutFirefoxPreview(interact: SettingsSubMenuAboutRobot.() -> Unit): SettingsSubMenuAboutRobot.Transition { diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SyncedTabsRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SyncedTabsRobot.kt new file mode 100644 index 000000000..facf6ebb0 --- /dev/null +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SyncedTabsRobot.kt @@ -0,0 +1,52 @@ +/* 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.robots + +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.ViewMatchers.withContentDescription +import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility +import androidx.test.espresso.matcher.ViewMatchers.withResourceName +import androidx.test.espresso.matcher.ViewMatchers.withText +import androidx.test.espresso.matcher.ViewMatchers.Visibility +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.uiautomator.UiDevice +import org.hamcrest.CoreMatchers.allOf +import org.mozilla.fenix.R +import org.mozilla.fenix.helpers.click + +/** + * Implementation of Robot Pattern for Synced Tabs sub menu. + */ +class SyncedTabsRobot { + + fun verifyNavigationToolBarHeader() = assertNavigationToolBarHeader() + + fun verifySyncedTabsStatus() = assertSyncedTabsStatus() + + class Transition { + val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())!! + + fun goBack(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + goBackButton().click() + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + } +} + +private fun goBackButton() = + onView(allOf(withContentDescription("Navigate up"))) + +private fun assertNavigationToolBarHeader() { + onView(withText(R.string.synced_tabs)) + .check((matches(withEffectiveVisibility(Visibility.VISIBLE)))) +} + +private fun assertSyncedTabsStatus() { + onView(withResourceName("sync_tabs_status")) + .check((matches(withEffectiveVisibility(Visibility.VISIBLE)))) +} diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt index 3f1a44b6f..c1a207379 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt @@ -9,6 +9,7 @@ package org.mozilla.fenix.ui.robots import android.view.View import androidx.recyclerview.widget.RecyclerView import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.Espresso.pressBack import androidx.test.espresso.UiController import androidx.test.espresso.ViewAction import androidx.test.espresso.action.ViewActions @@ -44,8 +45,10 @@ import org.mozilla.fenix.share.ShareFragment */ class ThreeDotMenuMainRobot { fun verifySettingsButton() = assertSettingsButton() + fun verifyAddOnsButton() = assertAddOnsButton() fun verifyHistoryButton() = assertHistoryButton() fun verifyBookmarksButton() = assertBookmarksButton() + fun verifySyncedTabsButton() = assertSyncedTabsButton() fun verifyHelpButton() = assertHelpButton() fun verifyThreeDotMenuExists() = threeDotMenuRecyclerViewExists() fun verifyForwardButton() = assertForwardButton() @@ -106,12 +109,40 @@ class ThreeDotMenuMainRobot { fun verifyShareALinkTitle() = assertShareALinkTitle() fun verifyWhatsNewButton() = assertWhatsNewButton() fun verifyAddFirefoxHome() = assertAddToFirefoxHome() + fun verifyAddToMobileHome() = assertAddToMobileHome() + fun verifyDesktopSite() = assertDesktopSite() + fun verifyOpenInAppButton() = assertOpenInAppButton() + + fun verifyThreeDotMainMenuItems() { + verifyAddOnsButton() + verifyHistoryButton() + verifyBookmarksButton() + verifySyncedTabsButton() + verifySettingsButton() + verifyFindInPageButton() + verifyAddFirefoxHome() + verifyAddToMobileHome() + verifyDesktopSite() + verifyAddBookmarkButton() + verifyShareButton() + verifyForwardButton() + verifyRefreshButton() + } class Transition { private val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) + fun clickAddOnsReportSiteIssue(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + addOnsButton().click() + addOnsReportSiteIssueButton().click() + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + fun openSettings(interact: SettingsRobot.() -> Unit): SettingsRobot.Transition { + onView(withId(R.id.mozac_browser_menu_recyclerView)).perform(ViewActions.swipeDown()) onView(allOf(withResourceName("text"), withText(R.string.browser_menu_settings))) .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) .check(matches(isCompletelyDisplayed())) @@ -121,7 +152,17 @@ class ThreeDotMenuMainRobot { return SettingsRobot.Transition() } + fun openSyncedTabs(interact: SyncedTabsRobot.() -> Unit): SyncedTabsRobot.Transition { + onView(withId(R.id.mozac_browser_menu_recyclerView)).perform(ViewActions.swipeDown()) + mDevice.waitNotNull(Until.findObject(By.text("Synced tabs")), waitingTime) + syncedTabsButton().click() + + SyncedTabsRobot().interact() + return SyncedTabsRobot.Transition() + } + fun openBookmarks(interact: BookmarksRobot.() -> Unit): BookmarksRobot.Transition { + onView(withId(R.id.mozac_browser_menu_recyclerView)).perform(ViewActions.swipeDown()) mDevice.waitNotNull(Until.findObject(By.text("Bookmarks")), waitingTime) bookmarksButton().click() @@ -130,6 +171,7 @@ class ThreeDotMenuMainRobot { } fun openHistory(interact: HistoryRobot.() -> Unit): HistoryRobot.Transition { + onView(withId(R.id.mozac_browser_menu_recyclerView)).perform(ViewActions.swipeDown()) mDevice.waitNotNull(Until.findObject(By.text("History")), waitingTime) historyButton().click() @@ -137,6 +179,23 @@ class ThreeDotMenuMainRobot { return HistoryRobot.Transition() } + fun bookmarkPage(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + mDevice.waitNotNull(Until.findObject(By.desc("Bookmark")), waitingTime) + addBookmarkButton().click() + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + + fun sharePage(interact: LibrarySubMenusMultipleSelectionToolbarRobot.() -> Unit): LibrarySubMenusMultipleSelectionToolbarRobot.Transition { + mDevice.waitNotNull(Until.findObject(By.desc("Share")), waitingTime) + shareButton().click() + pressBack() + + LibrarySubMenusMultipleSelectionToolbarRobot().interact() + return LibrarySubMenusMultipleSelectionToolbarRobot.Transition() + } + fun openHelp(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { mDevice.waitNotNull(Until.findObject(By.text("Help")), waitingTime) helpButton().click() @@ -163,6 +222,13 @@ class ThreeDotMenuMainRobot { return BrowserRobot.Transition() } + fun goBackToBrowser(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + mDevice.pressBack() + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + fun close(interact: HomeScreenRobot.() -> Unit): HomeScreenRobot.Transition { // Close three dot mDevice.pressBack() @@ -196,6 +262,7 @@ class ThreeDotMenuMainRobot { } fun openFindInPage(interact: FindInPageRobot.() -> Unit): FindInPageRobot.Transition { + onView(withId(R.id.mozac_browser_menu_recyclerView)).perform(ViewActions.swipeDown()) mDevice.waitNotNull(Until.findObject(By.text("Find in page")), waitingTime) findInPageButton().click() @@ -274,6 +341,13 @@ class ThreeDotMenuMainRobot { HomeScreenRobot().interact() return HomeScreenRobot.Transition() } + + fun openSaveToCollection(interact: ThreeDotMenuMainRobot.() -> Unit): ThreeDotMenuMainRobot.Transition { + mDevice.waitNotNull(Until.findObject(By.text("Save to collection")), waitingTime) + saveCollectionButton().click() + ThreeDotMenuMainRobot().interact() + return ThreeDotMenuMainRobot.Transition() + } } } @@ -286,6 +360,11 @@ private fun assertSettingsButton() = settingsButton() .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) .check(matches(isCompletelyDisplayed())) +private fun addOnsButton() = onView(allOf(withText("Add-ons"))) +private fun assertAddOnsButton() = addOnsButton() + .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) +private fun addOnsReportSiteIssueButton() = onView(allOf(withText("Report Site Issue…"))) + private fun historyButton() = onView(allOf(withText(R.string.library_history))) private fun assertHistoryButton() = historyButton() .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) @@ -294,6 +373,10 @@ private fun bookmarksButton() = onView(allOf(withText(R.string.library_bookmarks private fun assertBookmarksButton() = bookmarksButton() .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) +private fun syncedTabsButton() = onView(allOf(withText(R.string.library_synced_tabs))) +private fun assertSyncedTabsButton() = syncedTabsButton() + .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) + private fun helpButton() = onView(allOf(withText(R.string.browser_menu_help))) private fun assertHelpButton() = helpButton() .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) @@ -399,3 +482,36 @@ private fun assertAddToFirefoxHome() { ) ).check(matches(withEffectiveVisibility(Visibility.VISIBLE))) } + +private fun addToMobileHomeButton() = + onView(allOf(withText(R.string.browser_menu_add_to_homescreen))) +private fun assertAddToMobileHome() { + onView(withId(R.id.mozac_browser_menu_recyclerView)) + .perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText(R.string.browser_menu_add_to_homescreen)) + ) + ).check(matches(withEffectiveVisibility(Visibility.VISIBLE))) +} + +private fun desktopSiteButton() = + onView(allOf(withText(R.string.browser_menu_desktop_site))) +private fun assertDesktopSite() { + onView(withId(R.id.mozac_browser_menu_recyclerView)) + .perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText(R.string.browser_menu_desktop_site)) + ) + ).check(matches(withEffectiveVisibility(Visibility.VISIBLE))) +} + +private fun openInAppButton() = + onView(allOf(withText(R.string.browser_menu_open_app_link))) +private fun assertOpenInAppButton() { + onView(withId(R.id.mozac_browser_menu_recyclerView)) + .perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText(R.string.browser_menu_open_app_link)) + ) + ).check(matches(withEffectiveVisibility(Visibility.VISIBLE))) +}