Bug 1807268 - Re-enable verifyShowClipboardSuggestionsToggleTest UI test r=jajohnson
[gecko.git] / mobile / android / fenix / app / src / androidTest / java / org / mozilla / fenix / ui / TabbedBrowsingTest.kt
blob062a998ecda1f82beecf6ca31b546094c42cd2e3
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 package org.mozilla.fenix.ui
7 import com.google.android.material.bottomsheet.BottomSheetBehavior
8 import mozilla.components.concept.engine.mediasession.MediaSession
9 import org.junit.Rule
10 import org.junit.Test
11 import org.mozilla.fenix.customannotations.SmokeTest
12 import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
13 import org.mozilla.fenix.helpers.MatcherHelper
14 import org.mozilla.fenix.helpers.RetryTestRule
15 import org.mozilla.fenix.helpers.TestAssetHelper
16 import org.mozilla.fenix.helpers.TestHelper.clickSnackbarButton
17 import org.mozilla.fenix.helpers.TestHelper.closeApp
18 import org.mozilla.fenix.helpers.TestHelper.mDevice
19 import org.mozilla.fenix.helpers.TestHelper.restartApp
20 import org.mozilla.fenix.helpers.TestHelper.verifySnackBarText
21 import org.mozilla.fenix.helpers.TestSetup
22 import org.mozilla.fenix.ui.robots.browserScreen
23 import org.mozilla.fenix.ui.robots.clickPageObject
24 import org.mozilla.fenix.ui.robots.homeScreen
25 import org.mozilla.fenix.ui.robots.navigationToolbar
26 import org.mozilla.fenix.ui.robots.notificationShade
28 /**
29  *  Tests for verifying basic functionality of tabbed browsing
30  *
31  *  Including:
32  *  - Opening a tab
33  *  - Opening a private tab
34  *  - Verifying tab list
35  *  - Closing all tabs
36  *  - Close tab
37  *  - Swipe to close tab (temporarily disabled)
38  *  - Undo close tab
39  *  - Close private tabs persistent notification
40  *  - Empty tab tray state
41  *  - Tab tray details
42  *  - Shortcut context menu navigation
43  */
45 class TabbedBrowsingTest : TestSetup() {
46     @get:Rule
47     val activityTestRule = HomeActivityIntentTestRule.withDefaultSettingsOverrides(skipOnboarding = true)
49     @Rule
50     @JvmField
51     val retryTestRule = RetryTestRule(3)
53     // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903599
54     @Test
55     fun closeAllTabsTest() {
56         val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
58         navigationToolbar {
59         }.enterURLAndEnterToBrowser(defaultWebPage.url) {
60         }.openTabDrawer {
61             verifyExistingTabList()
62         }.openTabsListThreeDotMenu {
63             verifyCloseAllTabsButton()
64             verifyShareTabButton()
65             verifySelectTabs()
66         }.closeAllTabs {
67             verifyTabCounter("0")
68         }
70         // Repeat for Private Tabs
71         homeScreen {
72         }.togglePrivateBrowsingMode()
74         navigationToolbar {
75         }.enterURLAndEnterToBrowser(defaultWebPage.url) {
76         }.openTabDrawer {
77             verifyPrivateModeSelected()
78             verifyExistingTabList()
79         }.openTabsListThreeDotMenu {
80             verifyCloseAllTabsButton()
81         }.closeAllTabs {
82             verifyTabCounter("0")
83         }
84     }
86     // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2349580
87     @Test
88     fun closingTabsTest() {
89         val genericURL = TestAssetHelper.getGenericAsset(mockWebServer, 1)
91         navigationToolbar {
92         }.enterURLAndEnterToBrowser(genericURL.url) {
93         }.openTabDrawer {
94             verifyExistingOpenTabs("Test_Page_1")
95             closeTab()
96             verifySnackBarText("Tab closed")
97             clickSnackbarButton("UNDO")
98         }
99         browserScreen {
100             verifyTabCounter("1")
101         }
102     }
104     // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903604
105     @Test
106     fun swipeToCloseTabsTest() {
107         val genericURL = TestAssetHelper.getGenericAsset(mockWebServer, 1)
109         navigationToolbar {
110         }.enterURLAndEnterToBrowser(genericURL.url) {
111             waitForPageToLoad()
112         }.openTabDrawer {
113             verifyExistingOpenTabs("Test_Page_1")
114             swipeTabRight("Test_Page_1")
115             verifySnackBarText("Tab closed")
116         }
117         homeScreen {
118             verifyTabCounter("0")
119         }.openNavigationToolbar {
120         }.enterURLAndEnterToBrowser(genericURL.url) {
121             waitForPageToLoad()
122         }.openTabDrawer {
123             verifyExistingOpenTabs("Test_Page_1")
124             swipeTabLeft("Test_Page_1")
125             verifySnackBarText("Tab closed")
126         }
127         homeScreen {
128             verifyTabCounter("0")
129         }
130     }
132     // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903591
133     @Test
134     fun closingPrivateTabsTest() {
135         val genericURL = TestAssetHelper.getGenericAsset(mockWebServer, 1)
137         homeScreen { }.togglePrivateBrowsingMode(switchPBModeOn = true)
138         navigationToolbar {
139         }.enterURLAndEnterToBrowser(genericURL.url) {
140         }.openTabDrawer {
141             verifyExistingOpenTabs("Test_Page_1")
142             verifyCloseTabsButton("Test_Page_1")
143             closeTab()
144             verifySnackBarText("Private tab closed")
145             clickSnackbarButton("UNDO")
146         }
147         browserScreen {
148             verifyTabCounter("1")
149         }
150     }
152     // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903606
153     @SmokeTest
154     @Test
155     fun tabMediaControlButtonTest() {
156         val audioTestPage = TestAssetHelper.getAudioPageAsset(mockWebServer)
158         navigationToolbar {
159         }.enterURLAndEnterToBrowser(audioTestPage.url) {
160             mDevice.waitForIdle()
161             clickPageObject(MatcherHelper.itemWithText("Play"))
162             assertPlaybackState(browserStore, MediaSession.PlaybackState.PLAYING)
163         }.openTabDrawer {
164             verifyTabMediaControlButtonState("Pause")
165             clickTabMediaControlButton("Pause")
166             verifyTabMediaControlButtonState("Play")
167         }.openTab(audioTestPage.title) {
168             assertPlaybackState(browserStore, MediaSession.PlaybackState.PAUSED)
169         }
170     }
172     // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903592
173     @SmokeTest
174     @Test
175     fun verifyCloseAllPrivateTabsNotificationTest() {
176         val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
178         homeScreen {
179         }.togglePrivateBrowsingMode()
181         navigationToolbar {
182         }.enterURLAndEnterToBrowser(defaultWebPage.url) {
183             mDevice.openNotification()
184         }
186         notificationShade {
187             verifyPrivateTabsNotification()
188         }.clickClosePrivateTabsNotification {
189             verifyHomeScreen()
190         }
191     }
193     // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903598
194     @SmokeTest
195     @Test
196     fun shareTabsFromTabsTrayTest() {
197         val firstWebsite = TestAssetHelper.getGenericAsset(mockWebServer, 1)
198         val secondWebsite = TestAssetHelper.getGenericAsset(mockWebServer, 2)
199         val firstWebsiteTitle = firstWebsite.title
200         val secondWebsiteTitle = secondWebsite.title
201         val sharingApp = "Gmail"
202         val sharedUrlsString = "${firstWebsite.url}\n\n${secondWebsite.url}"
204         homeScreen {
205         }.openNavigationToolbar {
206         }.enterURLAndEnterToBrowser(firstWebsite.url) {
207             verifyPageContent(firstWebsite.content)
208         }.openTabDrawer {
209         }.openNewTab {
210         }.submitQuery(secondWebsite.url.toString()) {
211             verifyPageContent(secondWebsite.content)
212         }.openTabDrawer {
213             verifyExistingOpenTabs("Test_Page_1")
214             verifyExistingOpenTabs("Test_Page_2")
215         }.openTabsListThreeDotMenu {
216             verifyShareAllTabsButton()
217         }.clickShareAllTabsButton {
218             verifyShareTabsOverlay(firstWebsiteTitle, secondWebsiteTitle)
219             verifySharingWithSelectedApp(
220                 sharingApp,
221                 sharedUrlsString,
222                 "$firstWebsiteTitle, $secondWebsiteTitle",
223             )
224         }
225     }
227     // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903602
228     @Test
229     fun verifyTabTrayNotShowingStateHalfExpanded() {
230         navigationToolbar {
231         }.openTabTray {
232             verifyNoOpenTabsInNormalBrowsing()
233             // With no tabs opened the state should be STATE_COLLAPSED.
234             verifyBehaviorState(BottomSheetBehavior.STATE_COLLAPSED)
235             // Need to ensure the halfExpandedRatio is very small so that when in STATE_HALF_EXPANDED
236             // the tabTray will actually have a very small height (for a very short time) akin to being hidden.
237             verifyHalfExpandedRatio()
238         }.clickTopBar {
239         }.waitForTabTrayBehaviorToIdle {
240             // Touching the topBar would normally advance the tabTray to the next state.
241             // We don't want that.
242             verifyBehaviorState(BottomSheetBehavior.STATE_COLLAPSED)
243         }.advanceToHalfExpandedState {
244         }.waitForTabTrayBehaviorToIdle {
245             // TabTray should not be displayed in STATE_HALF_EXPANDED.
246             // When advancing to this state it should immediately be hidden.
247             verifyTabTrayIsClosed()
248         }
249     }
251     // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903600
252     @Test
253     fun verifyEmptyTabTray() {
254         navigationToolbar {
255         }.openTabTray {
256             verifyNormalBrowsingButtonIsSelected(true)
257             verifyPrivateBrowsingButtonIsSelected(false)
258             verifySyncedTabsButtonIsSelected(false)
259             verifyNoOpenTabsInNormalBrowsing()
260             verifyNormalBrowsingNewTabButton()
261             verifyTabTrayOverflowMenu(true)
262             verifyEmptyTabsTrayMenuButtons()
263         }
264     }
266     // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903585
267     @Test
268     fun verifyEmptyPrivateTabsTrayTest() {
269         navigationToolbar {
270         }.openTabTray {
271         }.toggleToPrivateTabs {
272             verifyNormalBrowsingButtonIsSelected(false)
273             verifyPrivateBrowsingButtonIsSelected(true)
274             verifySyncedTabsButtonIsSelected(false)
275             verifyNoOpenTabsInPrivateBrowsing()
276             verifyPrivateBrowsingNewTabButton()
277             verifyTabTrayOverflowMenu(true)
278             verifyEmptyTabsTrayMenuButtons()
279         }
280     }
282     // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903601
283     @Test
284     fun verifyTabsTrayWithOpenTabTest() {
285         val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
287         homeScreen {
288         }.openTabDrawer {
289         }.openNewTab {
290         }.submitQuery(defaultWebPage.url.toString()) {
291         }.openTabDrawer {
292             verifyNormalBrowsingButtonIsSelected(true)
293             verifyPrivateBrowsingButtonIsSelected(false)
294             verifySyncedTabsButtonIsSelected(false)
295             verifyTabTrayOverflowMenu(true)
296             verifyTabsTrayCounter()
297             verifyExistingTabList()
298             verifyNormalBrowsingNewTabButton()
299             verifyOpenedTabThumbnail()
300             verifyExistingOpenTabs(defaultWebPage.title)
301             verifyCloseTabsButton(defaultWebPage.title)
302         }.openTab(defaultWebPage.title) {
303             verifyUrl(defaultWebPage.url.toString())
304             verifyTabCounter("1")
305         }
306     }
308     // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903587
309     @SmokeTest
310     @Test
311     fun verifyPrivateTabsTrayWithOpenTabTest() {
312         val website = TestAssetHelper.getGenericAsset(mockWebServer, 1)
314         homeScreen {
315         }.openTabDrawer {
316         }.toggleToPrivateTabs {
317         }.openNewTab {
318         }.submitQuery(website.url.toString()) {
319         }.openTabDrawer {
320             verifyNormalBrowsingButtonIsSelected(false)
321             verifyPrivateBrowsingButtonIsSelected(true)
322             verifySyncedTabsButtonIsSelected(false)
323             verifyTabTrayOverflowMenu(true)
324             verifyTabsTrayCounter()
325             verifyExistingTabList()
326             verifyExistingOpenTabs(website.title)
327             verifyCloseTabsButton(website.title)
328             verifyOpenedTabThumbnail()
329             verifyPrivateBrowsingNewTabButton()
330         }
331     }
333     // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/927314
334     @Test
335     fun tabsCounterShortcutMenuCloseTabTest() {
336         val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
337         val secondWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2)
339         navigationToolbar {
340         }.enterURLAndEnterToBrowser(firstWebPage.url) {
341             waitForPageToLoad()
342         }.goToHomescreen {
343         }.openNavigationToolbar {
344         }.enterURLAndEnterToBrowser(secondWebPage.url) {
345             waitForPageToLoad()
346         }
347         navigationToolbar {
348         }.openTabButtonShortcutsMenu {
349             verifyTabButtonShortcutMenuItems()
350         }.closeTabFromShortcutsMenu {
351             browserScreen {
352                 verifyTabCounter("1")
353                 verifyPageContent(firstWebPage.content)
354             }
355         }
356     }
358     // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2343663
359     @Test
360     fun tabsCounterShortcutMenuNewPrivateTabTest() {
361         val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
363         navigationToolbar {
364         }.enterURLAndEnterToBrowser(defaultWebPage.url) {}
365         navigationToolbar {
366         }.openTabButtonShortcutsMenu {
367         }.openNewPrivateTabFromShortcutsMenu {
368             verifySearchBarPlaceholder("Search or enter address")
369         }.dismissSearchBar {
370             verifyIfInPrivateOrNormalMode(privateBrowsingEnabled = true)
371         }
372     }
374     // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2343662
375     @Test
376     fun tabsCounterShortcutMenuNewTabTest() {
377         val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
379         navigationToolbar {
380         }.enterURLAndEnterToBrowser(defaultWebPage.url) {}
381         navigationToolbar {
382         }.openTabButtonShortcutsMenu {
383         }.openNewTabFromShortcutsMenu {
384             verifySearchBarPlaceholder("Search or enter address")
385         }.dismissSearchBar {
386             verifyIfInPrivateOrNormalMode(privateBrowsingEnabled = false)
387         }
388     }
390     // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/927315
391     @Test
392     fun privateTabsCounterShortcutMenuCloseTabTest() {
393         val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
394         val secondWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2)
396         homeScreen {}.togglePrivateBrowsingMode(switchPBModeOn = true)
397         navigationToolbar {
398         }.enterURLAndEnterToBrowser(firstWebPage.url) {
399             waitForPageToLoad()
400         }.goToHomescreen {
401         }.openNavigationToolbar {
402         }.enterURLAndEnterToBrowser(secondWebPage.url) {
403             waitForPageToLoad()
404         }
405         navigationToolbar {
406         }.openTabButtonShortcutsMenu {
407             verifyTabButtonShortcutMenuItems()
408         }.closeTabFromShortcutsMenu {
409             browserScreen {
410                 verifyTabCounter("1")
411                 verifyPageContent(firstWebPage.content)
412             }
413         }.openTabButtonShortcutsMenu {
414         }.closeTabFromShortcutsMenu {
415             homeScreen {
416                 verifyIfInPrivateOrNormalMode(privateBrowsingEnabled = true)
417             }
418         }
419     }
421     // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2344199
422     @Test
423     fun privateTabsCounterShortcutMenuNewPrivateTabTest() {
424         val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
426         homeScreen {}.togglePrivateBrowsingMode(switchPBModeOn = true)
427         navigationToolbar {
428         }.enterURLAndEnterToBrowser(defaultWebPage.url) {
429             waitForPageToLoad()
430         }
431         navigationToolbar {
432         }.openTabButtonShortcutsMenu {
433         }.openNewPrivateTabFromShortcutsMenu {
434             verifySearchBarPlaceholder("Search or enter address")
435         }.dismissSearchBar {
436             verifyIfInPrivateOrNormalMode(privateBrowsingEnabled = true)
437         }
438     }
440     // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2344198
441     @Test
442     fun privateTabsCounterShortcutMenuNewTabTest() {
443         val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
445         homeScreen {}.togglePrivateBrowsingMode(switchPBModeOn = true)
446         navigationToolbar {
447         }.enterURLAndEnterToBrowser(defaultWebPage.url) {
448             verifyPageContent(defaultWebPage.content)
449         }
450         navigationToolbar {
451         }.openTabButtonShortcutsMenu {
452         }.openNewTabFromShortcutsMenu {
453             verifySearchToolbar(isDisplayed = true)
454         }.dismissSearchBar {
455             verifyIfInPrivateOrNormalMode(privateBrowsingEnabled = false)
456         }
457     }
459     // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1046683
460     @Test
461     fun verifySyncedTabsWhenUserIsNotSignedInTest() {
462         navigationToolbar {
463         }.openTabTray {
464             verifySyncedTabsButtonIsSelected(isSelected = false)
465             clickSyncedTabsButton()
466         }.toggleToSyncedTabs {
467             verifySyncedTabsButtonIsSelected(isSelected = true)
468             verifySyncedTabsListWhenUserIsNotSignedIn()
469         }.clickSignInToSyncButton {
470             verifyTurnOnSyncMenu()
471         }
472     }
474     // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/526244
475     @Test
476     fun privateModeStaysAsDefaultAfterRestartTest() {
477         val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
479         navigationToolbar {
480         }.enterURLAndEnterToBrowser(defaultWebPage.url) {
481         }.goToHomescreen {
482         }.togglePrivateBrowsingMode()
483         closeApp(activityTestRule)
484         restartApp(activityTestRule)
485         homeScreen {
486             verifyPrivateBrowsingHomeScreenItems()
487         }.openTabDrawer {
488         }.toggleToNormalTabs {
489             verifyExistingOpenTabs(defaultWebPage.title)
490         }
491     }
493     // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2228470
494     @SmokeTest
495     @Test
496     fun privateTabsDoNotPersistAfterClosingAppTest() {
497         val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
498         val secondWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2)
500         homeScreen {
501         }.togglePrivateBrowsingMode()
503         navigationToolbar {
504         }.enterURLAndEnterToBrowser(firstWebPage.url) {
505         }.openTabDrawer {
506         }.openNewTab {
507         }.submitQuery(secondWebPage.url.toString()) {}
508         closeApp(activityTestRule)
509         restartApp(activityTestRule)
510         homeScreen {
511             verifyPrivateBrowsingHomeScreenItems()
512         }.openTabDrawer {
513             verifyNoOpenTabsInPrivateBrowsing()
514         }
515     }