Bug 1858438 - Tabs Tray TestRail matching

fenix/120.0
oana.horvath 7 months ago committed by mergify[bot]
parent 542b37e4b5
commit 2c6401dc63

@ -88,7 +88,7 @@ class ComposeHomeScreenTest {
homeScreen { }.togglePrivateBrowsingMode()
homeScreen {
verifyPrivateBrowsingHomeScreen()
verifyPrivateBrowsingHomeScreenItems()
}.openCommonMythsLink {
verifyUrl("common-myths-about-private-browsing")
}

@ -69,6 +69,7 @@ class ComposeMediaNotificationTest {
mockWebServer.shutdown()
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1347033
@SmokeTest
@Test
fun verifyVideoPlaybackSystemNotificationTest() {
@ -103,6 +104,7 @@ class ComposeMediaNotificationTest {
mDevice.pressBack()
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2316010
@SmokeTest
@Test
fun verifyAudioPlaybackSystemNotificationTest() {
@ -137,6 +139,7 @@ class ComposeMediaNotificationTest {
mDevice.pressBack()
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903595
@Test
fun mediaSystemNotificationInPrivateModeTest() {
val audioTestPage = TestAssetHelper.getAudioPageAsset(mockWebServer)

@ -12,8 +12,6 @@ import androidx.core.net.toUri
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.ActivityTestRule
import androidx.test.uiautomator.UiDevice
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.concept.engine.mediasession.MediaSession
import okhttp3.mockwebserver.MockWebServer
import org.junit.After
import org.junit.Before
@ -22,17 +20,13 @@ import org.junit.Test
import org.mozilla.fenix.IntentReceiverActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.MatcherHelper.itemWithText
import org.mozilla.fenix.helpers.RetryTestRule
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper.registerAndCleanupIdlingResources
import org.mozilla.fenix.helpers.ViewVisibilityIdlingResource
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.clickPageObject
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.robots.navigationToolbar
/**
@ -46,8 +40,6 @@ import org.mozilla.fenix.ui.robots.navigationToolbar
class ComposeSmokeTest {
private lateinit var mDevice: UiDevice
private lateinit var mockWebServer: MockWebServer
private val customMenuItem = "TestMenuItem"
private lateinit var browserStore: BrowserStore
@get:Rule(order = 0)
val activityTestRule = AndroidComposeTestRule(
@ -69,10 +61,6 @@ class ComposeSmokeTest {
@Before
fun setUp() {
// Initializing this as part of class construction, below the rule would throw a NPE
// So we are initializing this here instead of in all related tests.
browserStore = activityTestRule.activity.components.core.store
mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
mockWebServer = MockWebServer().apply {
dispatcher = AndroidAssetDispatcher()
@ -85,62 +73,6 @@ class ComposeSmokeTest {
mockWebServer.shutdown()
}
@Test
fun shareTabsFromTabsTrayTest() {
val firstWebsite = TestAssetHelper.getGenericAsset(mockWebServer, 1)
val secondWebsite = TestAssetHelper.getGenericAsset(mockWebServer, 2)
val firstWebsiteTitle = firstWebsite.title
val secondWebsiteTitle = secondWebsite.title
val sharingApp = "Gmail"
val sharedUrlsString = "${firstWebsite.url}\n\n${secondWebsite.url}"
homeScreen {
}.openNavigationToolbar {
}.enterURLAndEnterToBrowser(firstWebsite.url) {
verifyPageContent(firstWebsite.content)
}.openComposeTabDrawer(activityTestRule) {
}.openNewTab {
}.submitQuery(secondWebsite.url.toString()) {
verifyPageContent(secondWebsite.content)
}.openComposeTabDrawer(activityTestRule) {
verifyExistingOpenTabs("Test_Page_1")
verifyExistingOpenTabs("Test_Page_2")
}.openThreeDotMenu {
verifyShareAllTabsButton()
}.clickShareAllTabsButton {
verifyShareTabsOverlay(firstWebsiteTitle, secondWebsiteTitle)
verifySharingWithSelectedApp(
sharingApp,
sharedUrlsString,
"$firstWebsiteTitle, $secondWebsiteTitle",
)
}
}
@Test
fun privateTabsTrayWithOpenedTabTest() {
val website = TestAssetHelper.getGenericAsset(mockWebServer, 1)
homeScreen {
}.togglePrivateBrowsingMode()
homeScreen {
}.openNavigationToolbar {
}.enterURLAndEnterToBrowser(website.url) {
}.openComposeTabDrawer(activityTestRule) {
verifyNormalBrowsingButtonIsSelected(false)
verifyPrivateBrowsingButtonIsSelected(true)
verifySyncedTabsButtonIsSelected(false)
verifyThreeDotButton()
verifyNormalTabCounter()
verifyPrivateTabsList()
verifyExistingOpenTabs(website.title)
verifyTabCloseButton()
verifyTabThumbnail()
verifyFab()
}
}
@Test
fun mainMenuInstallPWATest() {
val pwaPage = "https://mozilla-mobile.github.io/testapp/"
@ -198,22 +130,4 @@ class ComposeSmokeTest {
verifyAppearanceColorSepia(true)
}
}
@Test
fun tabMediaControlButtonTest() {
val audioTestPage = TestAssetHelper.getAudioPageAsset(mockWebServer)
navigationToolbar {
}.enterURLAndEnterToBrowser(audioTestPage.url) {
mDevice.waitForIdle()
clickPageObject(itemWithText("Play"))
assertPlaybackState(browserStore, MediaSession.PlaybackState.PLAYING)
}.openComposeTabDrawer(activityTestRule) {
verifyTabMediaControlButtonState("Pause")
clickTabMediaControlButton("Pause")
verifyTabMediaControlButtonState("Play")
}.openTab(audioTestPage.title) {
assertPlaybackState(browserStore, MediaSession.PlaybackState.PAUSED)
}
}
}

@ -8,14 +8,18 @@ import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
import com.google.android.material.bottomsheet.BottomSheetBehavior
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.concept.engine.mediasession.MediaSession
import okhttp3.mockwebserver.MockWebServer
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.MatcherHelper
import org.mozilla.fenix.helpers.RetryTestRule
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper.clickSnackbarButton
@ -24,6 +28,7 @@ import org.mozilla.fenix.helpers.TestHelper.restartApp
import org.mozilla.fenix.helpers.TestHelper.verifyKeyboardVisibility
import org.mozilla.fenix.helpers.TestHelper.verifySnackBarText
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.clickPageObject
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.robots.navigationToolbar
import org.mozilla.fenix.ui.robots.notificationShade
@ -48,6 +53,7 @@ import org.mozilla.fenix.ui.robots.notificationShade
class ComposeTabbedBrowsingTest {
private lateinit var mDevice: UiDevice
private lateinit var mockWebServer: MockWebServer
private lateinit var browserStore: BrowserStore
@get:Rule(order = 0)
val composeTestRule =
@ -64,6 +70,10 @@ class ComposeTabbedBrowsingTest {
@Before
fun setUp() {
// Initializing this as part of class construction, below the rule would throw a NPE
// So we are initializing this here instead of in all related tests.
browserStore = composeTestRule.activity.components.core.store
mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
mockWebServer = MockWebServer().apply {
dispatcher = AndroidAssetDispatcher()
@ -76,52 +86,7 @@ class ComposeTabbedBrowsingTest {
mockWebServer.shutdown()
}
@Test
fun openNewTabTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
mDevice.waitForIdle()
verifyTabCounter("1")
}.openComposeTabDrawer(composeTestRule) {
verifyNormalBrowsingButtonIsSelected()
verifyExistingOpenTabs("Test_Page_1")
closeTab()
}
homeScreen {
}.openComposeTabDrawer(composeTestRule) {
verifyNoOpenTabsInNormalBrowsing()
}.openNewTab {
}.submitQuery(defaultWebPage.url.toString()) {
verifyPageContent(defaultWebPage.content)
verifyTabCounter("1")
}.openComposeTabDrawer(composeTestRule) {
verifyNormalBrowsingButtonIsSelected()
verifyExistingOpenTabs("Test_Page_1")
}
}
@Test
fun openNewPrivateTabTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
homeScreen {
}.togglePrivateBrowsingMode()
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
mDevice.waitForIdle()
verifyTabCounter("1")
}.openComposeTabDrawer(composeTestRule) {
verifyPrivateTabsList()
verifyPrivateBrowsingButtonIsSelected()
}.toggleToNormalTabs {
verifyNoOpenTabsInNormalBrowsing()
}.toggleToPrivateTabs {
verifyPrivateTabsList()
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903599
@Test
fun closeAllTabsTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -153,8 +118,9 @@ class ComposeTabbedBrowsingTest {
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903604
@Test
fun closeTabTest() {
fun closingTabsMethodsTest() {
val genericURL = TestAssetHelper.getGenericAsset(mockWebServer, 1)
navigationToolbar {
@ -162,6 +128,13 @@ class ComposeTabbedBrowsingTest {
}.openComposeTabDrawer(composeTestRule) {
verifyExistingOpenTabs("Test_Page_1")
closeTab()
verifySnackBarText("Tab closed")
clickSnackbarButton("UNDO")
}
browserScreen {
verifyTabCounter("1")
}.openComposeTabDrawer(composeTestRule) {
closeTab()
}
homeScreen {
verifyTabCounter("0")
@ -184,42 +157,23 @@ class ComposeTabbedBrowsingTest {
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903591
@Test
fun verifyUndoSnackBarTest() {
// disabling these features because they interfere with the snackbar visibility
composeTestRule.activityRule.applySettingsExceptions {
it.isPocketEnabled = false
it.isRecentTabsFeatureEnabled = false
it.isRecentlyVisitedFeatureEnabled = false
}
fun closingPrivateTabsMethodsTest() {
val genericURL = TestAssetHelper.getGenericAsset(mockWebServer, 1)
homeScreen { }.togglePrivateBrowsingMode()
navigationToolbar {
}.enterURLAndEnterToBrowser(genericURL.url) {
}.openComposeTabDrawer(composeTestRule) {
verifyExistingOpenTabs("Test_Page_1")
closeTab()
verifySnackBarText("Tab closed")
verifySnackBarText("Private tab closed")
clickSnackbarButton("UNDO")
}
browserScreen {
verifyTabCounter("1")
}.openComposeTabDrawer(composeTestRule) {
verifyExistingOpenTabs("Test_Page_1")
}
}
@Test
fun closePrivateTabTest() {
val genericURL = TestAssetHelper.getGenericAsset(mockWebServer, 1)
homeScreen { }.togglePrivateBrowsingMode()
navigationToolbar {
}.enterURLAndEnterToBrowser(genericURL.url) {
}.openComposeTabDrawer(composeTestRule) {
verifyExistingOpenTabs("Test_Page_1")
closeTab()
}
homeScreen {
@ -229,6 +183,7 @@ class ComposeTabbedBrowsingTest {
}.openComposeTabDrawer(composeTestRule) {
verifyExistingOpenTabs("Test_Page_1")
swipeTabRight("Test_Page_1")
verifySnackBarText("Private tab closed")
}
homeScreen {
verifyTabCounter("0")
@ -237,36 +192,34 @@ class ComposeTabbedBrowsingTest {
}.openComposeTabDrawer(composeTestRule) {
verifyExistingOpenTabs("Test_Page_1")
swipeTabLeft("Test_Page_1")
verifySnackBarText("Private tab closed")
}
homeScreen {
verifyTabCounter("0")
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903606
@SmokeTest
@Test
fun verifyPrivateTabUndoSnackBarTest() {
val genericURL = TestAssetHelper.getGenericAsset(mockWebServer, 1)
fun tabMediaControlButtonTest() {
val audioTestPage = TestAssetHelper.getAudioPageAsset(mockWebServer)
homeScreen { }.togglePrivateBrowsingMode()
navigationToolbar {
}.enterURLAndEnterToBrowser(genericURL.url) {
verifyPageContent(genericURL.content)
}.openComposeTabDrawer(composeTestRule) {
verifyExistingOpenTabs("Test_Page_1")
closeTab()
verifySnackBarText("Private tab closed")
clickSnackbarButton("UNDO")
}
browserScreen {
verifyPageContent(genericURL.content)
verifyTabCounter("1")
}.enterURLAndEnterToBrowser(audioTestPage.url) {
mDevice.waitForIdle()
clickPageObject(MatcherHelper.itemWithText("Play"))
assertPlaybackState(browserStore, MediaSession.PlaybackState.PLAYING)
}.openComposeTabDrawer(composeTestRule) {
verifyExistingOpenTabs("Test_Page_1")
verifyPrivateBrowsingButtonIsSelected()
verifyTabMediaControlButtonState("Pause")
clickTabMediaControlButton("Pause")
verifyTabMediaControlButtonState("Play")
}.openTab(audioTestPage.title) {
assertPlaybackState(browserStore, MediaSession.PlaybackState.PAUSED)
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903592
@SmokeTest
@Test
fun verifyCloseAllPrivateTabsNotificationTest() {
@ -310,6 +263,7 @@ class ComposeTabbedBrowsingTest {
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903600
@Test
fun verifyEmptyTabTray() {
homeScreen {
@ -326,8 +280,9 @@ class ComposeTabbedBrowsingTest {
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903585
@Test
fun emptyTabsTrayViewPrivateBrowsingTest() {
fun verifyEmptyPrivateTabsTrayTest() {
homeScreen {
}.openComposeTabDrawer(composeTestRule) {
}.toggleToPrivateTabs {
@ -343,8 +298,9 @@ class ComposeTabbedBrowsingTest {
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903601
@Test
fun verifyOpenTabDetails() {
fun verifyTabsTrayWithOpenTabTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
navigationToolbar {
@ -366,29 +322,57 @@ class ComposeTabbedBrowsingTest {
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903587
@SmokeTest
@Test
fun verifyPrivateTabsTrayWithOpenTabTest() {
val website = TestAssetHelper.getGenericAsset(mockWebServer, 1)
homeScreen {
}.openComposeTabDrawer(composeTestRule) {
}.toggleToPrivateTabs {
}.openNewTab {
}.submitQuery(website.url.toString()) {
}.openComposeTabDrawer(composeTestRule) {
verifyNormalBrowsingButtonIsSelected(false)
verifyPrivateBrowsingButtonIsSelected(true)
verifySyncedTabsButtonIsSelected(false)
verifyThreeDotButton()
verifyNormalTabCounter()
verifyPrivateTabsList()
verifyExistingOpenTabs(website.title)
verifyTabCloseButton()
verifyTabThumbnail()
verifyFab()
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/927314
@Test
fun verifyContextMenuShortcuts() {
fun tabsCounterShortcutMenuTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {}
navigationToolbar {
}.openTabButtonShortcutsMenu {
verifyTabButtonShortcutMenuItems()
}.closeTabFromShortcutsMenu {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {}
navigationToolbar {
}.openTabButtonShortcutsMenu {
}.openNewPrivateTabFromShortcutsMenu {
verifyKeyboardVisibility()
verifySearchBarPlaceholder("Search or enter address")
// dismiss search dialog
}.dismissSearchBar {
verifyCommonMythsLink()
verifyNavigationToolbar()
verifyPrivateBrowsingHomeScreenItems()
}
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {}
navigationToolbar {
}.openTabButtonShortcutsMenu {
}.openTabFromShortcutsMenu {
}.openNewTabFromShortcutsMenu {
verifyKeyboardVisibility()
verifySearchBarPlaceholder("Search or enter address")
// dismiss search dialog
@ -398,6 +382,43 @@ class ComposeTabbedBrowsingTest {
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/927314
@Test
fun privateTabsCounterShortcutMenuTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
homeScreen {}.togglePrivateBrowsingMode()
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {}
navigationToolbar {
}.openTabButtonShortcutsMenu {
verifyTabButtonShortcutMenuItems()
}.closeTabFromShortcutsMenu {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {}
navigationToolbar {
}.openTabButtonShortcutsMenu {
}.openNewPrivateTabFromShortcutsMenu {
verifyKeyboardVisibility()
verifySearchBarPlaceholder("Search or enter address")
// dismiss search dialog
}.dismissSearchBar {
verifyCommonMythsLink()
}
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {}
navigationToolbar {
}.openTabButtonShortcutsMenu {
}.openNewTabFromShortcutsMenu {
verifyKeyboardVisibility()
verifySearchBarPlaceholder("Search or enter address")
// dismiss search dialog
}.dismissSearchBar {
// Verify normal browsing homescreen
verifyExistingTopSitesList()
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/1046683
@Test
fun verifySyncedTabsWhenUserIsNotSignedInTest() {
navigationToolbar {
@ -411,6 +432,41 @@ class ComposeTabbedBrowsingTest {
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903598
@SmokeTest
@Test
fun shareTabsFromTabsTrayTest() {
val firstWebsite = TestAssetHelper.getGenericAsset(mockWebServer, 1)
val secondWebsite = TestAssetHelper.getGenericAsset(mockWebServer, 2)
val firstWebsiteTitle = firstWebsite.title
val secondWebsiteTitle = secondWebsite.title
val sharingApp = "Gmail"
val sharedUrlsString = "${firstWebsite.url}\n\n${secondWebsite.url}"
homeScreen {
}.openNavigationToolbar {
}.enterURLAndEnterToBrowser(firstWebsite.url) {
verifyPageContent(firstWebsite.content)
}.openComposeTabDrawer(composeTestRule) {
}.openNewTab {
}.submitQuery(secondWebsite.url.toString()) {
verifyPageContent(secondWebsite.content)
}.openComposeTabDrawer(composeTestRule) {
verifyExistingOpenTabs("Test_Page_1")
verifyExistingOpenTabs("Test_Page_2")
}.openThreeDotMenu {
verifyShareAllTabsButton()
}.clickShareAllTabsButton {
verifyShareTabsOverlay(firstWebsiteTitle, secondWebsiteTitle)
verifySharingWithSelectedApp(
sharingApp,
sharedUrlsString,
"$firstWebsiteTitle, $secondWebsiteTitle",
)
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/526244
@Test
fun privateModeStaysAsDefaultAfterRestartTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -424,13 +480,14 @@ class ComposeTabbedBrowsingTest {
restartApp(composeTestRule.activityRule)
homeScreen {
verifyPrivateBrowsingHomeScreen()
verifyPrivateBrowsingHomeScreenItems()
}.openComposeTabDrawer(composeTestRule) {
}.toggleToNormalTabs {
verifyExistingOpenTabs(defaultWebPage.title)
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2228470
@SmokeTest
@Test
fun privateTabsDoNotPersistAfterClosingAppTest() {
@ -449,7 +506,7 @@ class ComposeTabbedBrowsingTest {
closeApp(composeTestRule.activityRule)
restartApp(composeTestRule.activityRule)
homeScreen {
verifyPrivateBrowsingHomeScreen()
verifyPrivateBrowsingHomeScreenItems()
}.openComposeTabDrawer(composeTestRule) {
verifyNoOpenTabsInPrivateBrowsing()
}

@ -86,7 +86,7 @@ class HomeScreenTest {
homeScreen { }.togglePrivateBrowsingMode()
homeScreen {
verifyPrivateBrowsingHomeScreen()
verifyPrivateBrowsingHomeScreenItems()
}.openCommonMythsLink {
verifyUrl("common-myths-about-private-browsing")
}

@ -132,6 +132,7 @@ class MediaNotificationTest {
mDevice.pressBack()
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903595
@Test
fun mediaSystemNotificationInPrivateModeTest() {
val audioTestPage = TestAssetHelper.getAudioPageAsset(mockWebServer)

@ -12,8 +12,6 @@ import androidx.core.net.toUri
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.ActivityTestRule
import androidx.test.uiautomator.UiDevice
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.concept.engine.mediasession.MediaSession
import okhttp3.mockwebserver.MockWebServer
import org.junit.After
import org.junit.Before
@ -22,16 +20,13 @@ import org.junit.Test
import org.mozilla.fenix.IntentReceiverActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.MatcherHelper.itemWithText
import org.mozilla.fenix.helpers.RetryTestRule
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper.registerAndCleanupIdlingResources
import org.mozilla.fenix.helpers.ViewVisibilityIdlingResource
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.clickPageObject
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.robots.navigationToolbar
@ -46,7 +41,6 @@ import org.mozilla.fenix.ui.robots.navigationToolbar
class SmokeTest {
private lateinit var mDevice: UiDevice
private lateinit var mockWebServer: MockWebServer
private lateinit var browserStore: BrowserStore
@get:Rule(order = 0)
val activityTestRule = AndroidComposeTestRule(
@ -67,10 +61,6 @@ class SmokeTest {
@Before
fun setUp() {
// Initializing this as part of class construction, below the rule would throw a NPE
// So we are initializing this here instead of in all related tests.
browserStore = activityTestRule.activity.components.core.store
mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
mockWebServer = MockWebServer().apply {
dispatcher = AndroidAssetDispatcher()
@ -115,30 +105,6 @@ class SmokeTest {
}
}
@Test
fun privateTabsTrayWithOpenedTabTest() {
val website = TestAssetHelper.getGenericAsset(mockWebServer, 1)
homeScreen {
}.togglePrivateBrowsingMode()
homeScreen {
}.openNavigationToolbar {
}.enterURLAndEnterToBrowser(website.url) {
}.openTabDrawer {
verifyNormalBrowsingButtonIsSelected(false)
verifyPrivateBrowsingButtonIsSelected(true)
verifySyncedTabsButtonIsSelected(false)
verifyTabTrayOverflowMenu(true)
verifyTabsTrayCounter()
verifyExistingTabList()
verifyExistingOpenTabs(website.title)
verifyCloseTabsButton(website.title)
verifyOpenedTabThumbnail()
verifyPrivateBrowsingNewTabButton()
}
}
@Test
fun mainMenuInstallPWATest() {
val pwaPage = "https://mozilla-mobile.github.io/testapp/"
@ -196,22 +162,4 @@ class SmokeTest {
verifyAppearanceColorSepia(true)
}
}
@Test
fun tabMediaControlButtonTest() {
val audioTestPage = TestAssetHelper.getAudioPageAsset(mockWebServer)
navigationToolbar {
}.enterURLAndEnterToBrowser(audioTestPage.url) {
mDevice.waitForIdle()
clickPageObject(itemWithText("Play"))
assertPlaybackState(browserStore, MediaSession.PlaybackState.PLAYING)
}.openTabDrawer {
verifyTabMediaControlButtonState("Pause")
clickTabMediaControlButton("Pause")
verifyTabMediaControlButtonState("Play")
}.openTab(audioTestPage.title) {
assertPlaybackState(browserStore, MediaSession.PlaybackState.PAUSED)
}
}
}

@ -7,20 +7,25 @@ package org.mozilla.fenix.ui
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
import com.google.android.material.bottomsheet.BottomSheetBehavior
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.concept.engine.mediasession.MediaSession
import okhttp3.mockwebserver.MockWebServer
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.customannotations.SmokeTest
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.MatcherHelper
import org.mozilla.fenix.helpers.RetryTestRule
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper.closeApp
import org.mozilla.fenix.helpers.TestHelper.restartApp
import org.mozilla.fenix.helpers.TestHelper.verifyKeyboardVisibility
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.clickPageObject
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.robots.navigationToolbar
import org.mozilla.fenix.ui.robots.notificationShade
@ -45,6 +50,7 @@ import org.mozilla.fenix.ui.robots.notificationShade
class TabbedBrowsingTest {
private lateinit var mDevice: UiDevice
private lateinit var mockWebServer: MockWebServer
private lateinit var browserStore: BrowserStore
@get:Rule
val activityTestRule = HomeActivityIntentTestRule.withDefaultSettingsOverrides(skipOnboarding = true)
@ -55,6 +61,10 @@ class TabbedBrowsingTest {
@Before
fun setUp() {
// Initializing this as part of class construction, below the rule would throw a NPE
// So we are initializing this here instead of in all related tests.
browserStore = activityTestRule.activity.components.core.store
mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
mockWebServer = MockWebServer().apply {
dispatcher = AndroidAssetDispatcher()
@ -67,51 +77,7 @@ class TabbedBrowsingTest {
mockWebServer.shutdown()
}
@Test
fun openNewTabTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
mDevice.waitForIdle()
verifyTabCounter("1")
}.openTabDrawer {
verifyNormalModeSelected()
verifyExistingOpenTabs("Test_Page_1")
closeTab()
}.openTabDrawer {
verifyNoOpenTabsInNormalBrowsing()
}.openNewTab {
}.submitQuery(defaultWebPage.url.toString()) {
mDevice.waitForIdle()
verifyTabCounter("1")
}.openTabDrawer {
verifyNormalModeSelected()
verifyExistingOpenTabs("Test_Page_1")
}
}
// TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/233629
@Test
fun openNewPrivateTabTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
homeScreen {}.togglePrivateBrowsingMode()
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
mDevice.waitForIdle()
verifyTabCounter("1")
}.openTabDrawer {
verifyExistingTabList()
verifyPrivateModeSelected()
}.toggleToNormalTabs {
verifyNoOpenTabsInNormalBrowsing()
}.toggleToPrivateTabs {
verifyExistingTabList()
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903599
@Test
fun closeAllTabsTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -144,8 +110,9 @@ class TabbedBrowsingTest {
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903604
@Test
fun closeTabTest() {
fun closingTabsMethodsTest() {
val genericURL = TestAssetHelper.getGenericAsset(mockWebServer, 1)
navigationToolbar {
@ -153,6 +120,13 @@ class TabbedBrowsingTest {
}.openTabDrawer {
verifyExistingOpenTabs("Test_Page_1")
closeTab()
verifySnackBarText("Tab closed")
snackBarButtonClick("UNDO")
}
browserScreen {
verifyTabCounter("1")
}.openTabDrawer {
closeTab()
}
homeScreen {
verifyTabCounter("0")
@ -161,6 +135,7 @@ class TabbedBrowsingTest {
}.openTabDrawer {
verifyExistingOpenTabs("Test_Page_1")
swipeTabRight("Test_Page_1")
verifySnackBarText("Tab closed")
}
homeScreen {
verifyTabCounter("0")
@ -169,48 +144,31 @@ class TabbedBrowsingTest {
}.openTabDrawer {
verifyExistingOpenTabs("Test_Page_1")
swipeTabLeft("Test_Page_1")
verifySnackBarText("Tab closed")
}
homeScreen {
verifyTabCounter("0")
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903591
@Test
fun verifyUndoSnackBarTest() {
// disabling these features because they interfere with the snackbar visibility
activityTestRule.applySettingsExceptions {
it.isPocketEnabled = false
it.isRecentTabsFeatureEnabled = false
}
fun closingPrivateTabsMethodsTest() {
val genericURL = TestAssetHelper.getGenericAsset(mockWebServer, 1)
homeScreen { }.togglePrivateBrowsingMode()
navigationToolbar {
}.enterURLAndEnterToBrowser(genericURL.url) {
}.openTabDrawer {
verifyExistingOpenTabs("Test_Page_1")
verifyCloseTabsButton("Test_Page_1")
closeTab()
verifySnackBarText("Tab closed")
verifySnackBarText("Private tab closed")
snackBarButtonClick("UNDO")
}
browserScreen {
verifyTabCounter("1")
}.openTabDrawer {
verifyExistingOpenTabs("Test_Page_1")
}
}
@Test
fun closePrivateTabTest() {
val genericURL = TestAssetHelper.getGenericAsset(mockWebServer, 1)
homeScreen { }.togglePrivateBrowsingMode()
navigationToolbar {
}.enterURLAndEnterToBrowser(genericURL.url) {
}.openTabDrawer {
verifyExistingOpenTabs("Test_Page_1")
verifyCloseTabsButton("Test_Page_1")
closeTab()
}
homeScreen {
@ -220,6 +178,7 @@ class TabbedBrowsingTest {
}.openTabDrawer {
verifyExistingOpenTabs("Test_Page_1")
swipeTabRight("Test_Page_1")
verifySnackBarText("Private tab closed")
}
homeScreen {
verifyTabCounter("0")
@ -228,32 +187,30 @@ class TabbedBrowsingTest {
}.openTabDrawer {
verifyExistingOpenTabs("Test_Page_1")
swipeTabLeft("Test_Page_1")
verifySnackBarText("Private tab closed")
}
homeScreen {
verifyTabCounter("0")
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903606
@SmokeTest
@Test
fun verifyPrivateTabUndoSnackBarTest() {
val genericURL = TestAssetHelper.getGenericAsset(mockWebServer, 1)
fun tabMediaControlButtonTest() {
val audioTestPage = TestAssetHelper.getAudioPageAsset(mockWebServer)
homeScreen { }.togglePrivateBrowsingMode()
navigationToolbar {
}.enterURLAndEnterToBrowser(genericURL.url) {
}.openTabDrawer {
verifyExistingOpenTabs("Test_Page_1")
verifyCloseTabsButton("Test_Page_1")
closeTab()
verifySnackBarText("Private tab closed")
snackBarButtonClick("UNDO")
}
browserScreen {
verifyTabCounter("1")
}.enterURLAndEnterToBrowser(audioTestPage.url) {
mDevice.waitForIdle()
clickPageObject(MatcherHelper.itemWithText("Play"))
assertPlaybackState(browserStore, MediaSession.PlaybackState.PLAYING)
}.openTabDrawer {
verifyExistingOpenTabs("Test_Page_1")
verifyPrivateModeSelected()
verifyTabMediaControlButtonState("Pause")
clickTabMediaControlButton("Pause")
verifyTabMediaControlButtonState("Play")
}.openTab(audioTestPage.title) {
assertPlaybackState(browserStore, MediaSession.PlaybackState.PAUSED)
}
}
@ -278,6 +235,40 @@ class TabbedBrowsingTest {
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903598
@SmokeTest
@Test
fun shareTabsFromTabsTrayTest() {
val firstWebsite = TestAssetHelper.getGenericAsset(mockWebServer, 1)
val secondWebsite = TestAssetHelper.getGenericAsset(mockWebServer, 2)
val firstWebsiteTitle = firstWebsite.title
val secondWebsiteTitle = secondWebsite.title
val sharingApp = "Gmail"
val sharedUrlsString = "${firstWebsite.url}\n\n${secondWebsite.url}"
homeScreen {
}.openNavigationToolbar {
}.enterURLAndEnterToBrowser(firstWebsite.url) {
verifyPageContent(firstWebsite.content)
}.openTabDrawer {
}.openNewTab {
}.submitQuery(secondWebsite.url.toString()) {
verifyPageContent(secondWebsite.content)
}.openTabDrawer {
verifyExistingOpenTabs("Test_Page_1")
verifyExistingOpenTabs("Test_Page_2")
}.openTabsListThreeDotMenu {
verifyShareAllTabsButton()
}.clickShareAllTabsButton {
verifyShareTabsOverlay(firstWebsiteTitle, secondWebsiteTitle)
verifySharingWithSelectedApp(
sharingApp,
sharedUrlsString,
"$firstWebsiteTitle, $secondWebsiteTitle",
)
}
}
@Test
fun verifyTabTrayNotShowingStateHalfExpanded() {
navigationToolbar {
@ -301,6 +292,7 @@ class TabbedBrowsingTest {
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903600
@Test
fun verifyEmptyTabTray() {
navigationToolbar {
@ -315,8 +307,9 @@ class TabbedBrowsingTest {
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903585
@Test
fun emptyTabsTrayViewPrivateBrowsingTest() {
fun verifyEmptyPrivateTabsTrayTest() {
navigationToolbar {
}.openTabTray {
}.toggleToPrivateTabs {
@ -330,12 +323,15 @@ class TabbedBrowsingTest {
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903601
@Test
fun verifyOpenTabDetails() {
fun verifyTabsTrayWithOpenTabTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
homeScreen {
}.openTabDrawer {
}.openNewTab {
}.submitQuery(defaultWebPage.url.toString()) {
}.openTabDrawer {
verifyNormalBrowsingButtonIsSelected(true)
verifyPrivateBrowsingButtonIsSelected(false)
@ -353,29 +349,57 @@ class TabbedBrowsingTest {
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/903587
@SmokeTest
@Test
fun verifyPrivateTabsTrayWithOpenTabTest() {
val website = TestAssetHelper.getGenericAsset(mockWebServer, 1)
homeScreen {
}.openTabDrawer {
}.toggleToPrivateTabs {
}.openNewTab {
}.submitQuery(website.url.toString()) {
}.openTabDrawer {
verifyNormalBrowsingButtonIsSelected(false)
verifyPrivateBrowsingButtonIsSelected(true)
verifySyncedTabsButtonIsSelected(false)
verifyTabTrayOverflowMenu(true)
verifyTabsTrayCounter()
verifyExistingTabList()
verifyExistingOpenTabs(website.title)
verifyCloseTabsButton(website.title)
verifyOpenedTabThumbnail()
verifyPrivateBrowsingNewTabButton()
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/927315
@Test
fun verifyContextMenuShortcuts() {
fun tabsCounterShortcutMenuTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {}
navigationToolbar {
}.openTabButtonShortcutsMenu {
verifyTabButtonShortcutMenuItems()
}.closeTabFromShortcutsMenu {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {}
navigationToolbar {
}.openTabButtonShortcutsMenu {
}.openNewPrivateTabFromShortcutsMenu {
verifyKeyboardVisibility()
verifySearchBarPlaceholder("Search or enter address")
// dismiss search dialog
}.dismissSearchBar {
verifyCommonMythsLink()
verifyNavigationToolbar()
verifyPrivateBrowsingHomeScreenItems()
}
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {}
navigationToolbar {
}.openTabButtonShortcutsMenu {
}.openTabFromShortcutsMenu {
}.openNewTabFromShortcutsMenu {
verifyKeyboardVisibility()
verifySearchBarPlaceholder("Search or enter address")
// dismiss search dialog
@ -385,6 +409,45 @@ class TabbedBrowsingTest {
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/927314
@Test
fun privateTabsCounterShortcutMenuTest() {
val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
homeScreen {}.togglePrivateBrowsingMode()
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {
waitForPageToLoad()
}
navigationToolbar {
}.openTabButtonShortcutsMenu {
verifyTabButtonShortcutMenuItems()
}.closeTabFromShortcutsMenu {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {}
navigationToolbar {
}.openTabButtonShortcutsMenu {
}.openNewPrivateTabFromShortcutsMenu {
verifyKeyboardVisibility()
verifySearchBarPlaceholder("Search or enter address")
// dismiss search dialog
}.dismissSearchBar {
verifyCommonMythsLink()
}
navigationToolbar {
}.enterURLAndEnterToBrowser(defaultWebPage.url) {}
navigationToolbar {
}.openTabButtonShortcutsMenu {
}.openNewTabFromShortcutsMenu {
verifyKeyboardVisibility()
verifySearchBarPlaceholder("Search or enter address")
// dismiss search dialog
}.dismissSearchBar {
// Verify normal browsing homescreen
verifyExistingTopSitesList()
}
}
// TestRail: https://testrail.stage.mozaws.net/index.php?/cases/view/1046683
@Test
fun verifySyncedTabsWhenUserIsNotSignedInTest() {
navigationToolbar {
@ -411,7 +474,7 @@ class TabbedBrowsingTest {
closeApp(activityTestRule)
restartApp(activityTestRule)
homeScreen {
verifyPrivateBrowsingHomeScreen()
verifyPrivateBrowsingHomeScreenItems()
}.openTabDrawer {
}.toggleToNormalTabs {
verifyExistingOpenTabs(defaultWebPage.title)
@ -439,7 +502,7 @@ class TabbedBrowsingTest {
restartApp(activityTestRule)
homeScreen {
verifyPrivateBrowsingHomeScreen()
verifyPrivateBrowsingHomeScreenItems()
}.openTabDrawer {
verifyNoOpenTabsInPrivateBrowsing()
}

@ -1105,14 +1105,6 @@ class BrowserRobot {
return ComposeTabDrawerRobot.Transition(composeTestRule)
}
fun openTabButtonShortcutsMenu(interact: NavigationToolbarRobot.() -> Unit): NavigationToolbarRobot.Transition {
mDevice.waitNotNull(Until.findObject(By.desc("Tabs")))
tabsCounter().click(LONG_CLICK_DURATION)
NavigationToolbarRobot().interact()
return NavigationToolbarRobot.Transition()
}
fun openNotificationShade(interact: NotificationRobot.() -> Unit): NotificationRobot.Transition {
mDevice.openNotification()

@ -87,11 +87,10 @@ class HomeScreenRobot {
fun verifyHomeScreen() = assertItemWithResIdExists(homeScreen)
fun verifyPrivateBrowsingHomeScreen() {
fun verifyPrivateBrowsingHomeScreenItems() {
verifyHomeScreenAppBarItems()
assertItemContainingTextExists(itemContainingText(privateSessionMessage))
verifyCommonMythsLink()
verifyNavigationToolbarItems()
}
fun verifyHomeScreenAppBarItems() =

@ -305,7 +305,15 @@ class NavigationToolbarRobot {
return HomeScreenRobot.Transition()
}
fun closeTabFromShortcutsMenu(interact: NavigationToolbarRobot.() -> Unit): NavigationToolbarRobot.Transition {
fun openTabButtonShortcutsMenu(interact: NavigationToolbarRobot.() -> Unit): Transition {
mDevice.waitNotNull(Until.findObject(By.desc("Tabs")))
tabsCounter().click(LONG_CLICK_DURATION)
NavigationToolbarRobot().interact()
return Transition()
}
fun closeTabFromShortcutsMenu(interact: NavigationToolbarRobot.() -> Unit): Transition {
mDevice.waitForIdle(waitingTime)
onView(withId(R.id.mozac_browser_menu_recyclerView))
@ -319,10 +327,10 @@ class NavigationToolbarRobot {
)
NavigationToolbarRobot().interact()
return NavigationToolbarRobot.Transition()
return Transition()
}
fun openTabFromShortcutsMenu(interact: SearchRobot.() -> Unit): SearchRobot.Transition {
fun openNewTabFromShortcutsMenu(interact: SearchRobot.() -> Unit): SearchRobot.Transition {
mDevice.waitForIdle(waitingTime)
onView(withId(R.id.mozac_browser_menu_recyclerView))
@ -413,6 +421,8 @@ private fun awesomeBar() =
mDevice.findObject(UiSelector().resourceId("$packageName:id/mozac_browser_toolbar_edit_url_view"))
private fun threeDotButton() = onView(withId(R.id.mozac_browser_toolbar_menu))
private fun tabTrayButton() = onView(withId(R.id.tab_button))
private fun tabsCounter() =
mDevice.findObject(By.res("$packageName:id/counter_root"))
private fun fillLinkButton() = onView(withId(R.id.fill_link_from_clipboard))
private fun clearAddressBarButton() = itemWithResId("$packageName:id/mozac_browser_toolbar_clear_view")
private fun goBackButton() = mDevice.pressBack()

Loading…
Cancel
Save