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