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 androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu
9 import androidx.test.espresso.Espresso.pressBack
10 import org.junit.Ignore
13 import org.mozilla.fenix.R
14 import org.mozilla.fenix.customannotations.SmokeTest
15 import org.mozilla.fenix.helpers.AppAndSystemHelper.registerAndCleanupIdlingResources
16 import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
17 import org.mozilla.fenix.helpers.RecyclerViewIdlingResource
18 import org.mozilla.fenix.helpers.TestAssetHelper
19 import org.mozilla.fenix.helpers.TestHelper.exitMenu
20 import org.mozilla.fenix.helpers.TestHelper.longTapSelectItem
21 import org.mozilla.fenix.helpers.TestHelper.mDevice
22 import org.mozilla.fenix.helpers.TestHelper.verifySnackBarText
23 import org.mozilla.fenix.helpers.TestSetup
24 import org.mozilla.fenix.ui.robots.browserScreen
25 import org.mozilla.fenix.ui.robots.historyMenu
26 import org.mozilla.fenix.ui.robots.homeScreen
27 import org.mozilla.fenix.ui.robots.multipleSelectionToolbar
28 import org.mozilla.fenix.ui.robots.navigationToolbar
31 * Tests for verifying basic functionality of history
34 class ComposeHistoryTest : TestSetup() {
36 val activityTestRule =
37 AndroidComposeTestRule(
38 HomeActivityIntentTestRule(
39 tabsTrayRewriteEnabled = true,
40 isJumpBackInCFREnabled = false,
44 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/243285
46 fun verifyEmptyHistoryMenuTest() {
51 verifyHistoryMenuView()
52 verifyEmptyHistoryView()
56 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2302742
57 // Test running on beta/release builds in CI:
58 // caution when making changes to it, so they don't block the builds
61 fun verifyHistoryMenuWithHistoryItemsTest() {
62 val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
65 }.enterURLAndEnterToBrowser(firstWebPage.url) {
69 verifyHistoryListExists()
70 registerAndCleanupIdlingResources(
71 RecyclerViewIdlingResource(activityTestRule.activity.findViewById(R.id.history_list), 1),
73 verifyHistoryMenuView()
74 verifyVisitedTimeTitle()
75 verifyFirstTestPageTitle("Test_Page_1")
76 verifyTestPageUrl(firstWebPage.url)
77 verifyDeleteHistoryItemButton("Test_Page_1")
82 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/243288
84 fun deleteHistoryItemTest() {
85 val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
88 }.enterURLAndEnterToBrowser(firstWebPage.url) {
92 verifyHistoryListExists()
93 registerAndCleanupIdlingResources(
94 RecyclerViewIdlingResource(activityTestRule.activity.findViewById(R.id.history_list), 1),
96 clickDeleteHistoryButton(firstWebPage.url.toString())
98 verifySnackBarText(expectedText = "Deleted")
99 verifyEmptyHistoryView()
103 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1848881
106 fun deleteAllHistoryTest() {
107 val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
110 }.enterURLAndEnterToBrowser(firstWebPage.url) {
111 mDevice.waitForIdle()
114 verifyHistoryListExists()
115 registerAndCleanupIdlingResources(
116 RecyclerViewIdlingResource(activityTestRule.activity.findViewById(R.id.history_list), 1),
118 clickDeleteAllHistoryButton()
120 verifyDeleteConfirmationMessage()
121 selectEverythingOption()
122 confirmDeleteAllHistory()
123 verifySnackBarText(expectedText = "Browsing data deleted")
124 verifyEmptyHistoryView()
128 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/339690
131 fun historyMultiSelectionToolbarItemsTest() {
132 val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
135 }.enterURLAndEnterToBrowser(firstWebPage.url) {
136 mDevice.waitForIdle()
139 verifyHistoryListExists()
140 registerAndCleanupIdlingResources(
141 RecyclerViewIdlingResource(activityTestRule.activity.findViewById(R.id.history_list), 1),
143 longTapSelectItem(firstWebPage.url)
147 multipleSelectionToolbar {
148 verifyMultiSelectionCheckmark()
149 verifyMultiSelectionCounter()
150 verifyShareHistoryButton()
151 verifyCloseToolbarButton()
152 }.closeToolbarReturnToHistory {
153 verifyHistoryMenuView()
157 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/339696
158 @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1807268")
160 fun openMultipleSelectedHistoryItemsInANewTabTest() {
161 val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
164 }.enterURLAndEnterToBrowser(firstWebPage.url) {
165 mDevice.waitForIdle()
166 }.openComposeTabDrawer(activityTestRule) {
170 homeScreen { }.openThreeDotMenu {
172 verifyHistoryListExists()
173 registerAndCleanupIdlingResources(
174 RecyclerViewIdlingResource(activityTestRule.activity.findViewById(R.id.history_list), 1),
176 longTapSelectItem(firstWebPage.url)
177 openActionBarOverflowOrOptionsMenu(activityTestRule.activity)
181 multipleSelectionToolbar {
182 }.clickOpenNewTab(activityTestRule) {
183 verifyNormalTabsList()
184 verifyNormalBrowsingButtonIsSelected()
188 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/346098
190 fun openMultipleSelectedHistoryItemsInPrivateTabTest() {
191 val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
194 }.enterURLAndEnterToBrowser(firstWebPage.url) {
195 mDevice.waitForIdle()
198 verifyHistoryListExists()
199 registerAndCleanupIdlingResources(
200 RecyclerViewIdlingResource(activityTestRule.activity.findViewById(R.id.history_list), 1),
202 longTapSelectItem(firstWebPage.url)
203 openActionBarOverflowOrOptionsMenu(activityTestRule.activity)
207 multipleSelectionToolbar {
208 }.clickOpenPrivateTab(activityTestRule) {
209 verifyPrivateTabsList()
210 verifyPrivateBrowsingButtonIsSelected()
214 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/346099
216 fun deleteMultipleSelectedHistoryItemsTest() {
217 val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
218 val secondWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2)
221 }.enterURLAndEnterToBrowser(firstWebPage.url) {
222 }.openNavigationToolbar {
223 }.enterURLAndEnterToBrowser(secondWebPage.url) {
224 mDevice.waitForIdle()
225 verifyUrl(secondWebPage.url.toString())
228 verifyHistoryListExists()
229 registerAndCleanupIdlingResources(
230 RecyclerViewIdlingResource(activityTestRule.activity.findViewById(R.id.history_list), 2),
232 verifyHistoryItemExists(true, firstWebPage.url.toString())
233 verifyHistoryItemExists(true, secondWebPage.url.toString())
234 longTapSelectItem(firstWebPage.url)
235 longTapSelectItem(secondWebPage.url)
236 openActionBarOverflowOrOptionsMenu(activityTestRule.activity)
240 multipleSelectionToolbar {
241 clickMultiSelectionDelete()
245 verifyEmptyHistoryView()
249 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/339701
251 fun shareMultipleSelectedHistoryItemsTest() {
252 val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
255 }.enterURLAndEnterToBrowser(firstWebPage.url) {
256 mDevice.waitForIdle()
259 verifyHistoryListExists()
260 registerAndCleanupIdlingResources(
261 RecyclerViewIdlingResource(activityTestRule.activity.findViewById(R.id.history_list), 1),
263 longTapSelectItem(firstWebPage.url)
267 multipleSelectionToolbar {
268 clickShareHistoryButton()
270 verifyShareTabFavicon()
271 verifyShareTabTitle()
276 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1715627
278 fun verifySearchHistoryViewTest() {
279 val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
282 }.enterURLAndEnterToBrowser(defaultWebPage.url) {
285 }.clickSearchButton {
287 verifySearchToolbar(true)
288 verifySearchSelectorButton()
289 verifySearchEngineIcon("history")
290 verifySearchBarPlaceholder("Search history")
291 verifySearchBarPosition(true)
292 tapOutsideToDismissSearchBar()
293 verifySearchToolbar(false)
299 }.openCustomizeSubMenu {
300 clickTopToolbarToggle()
308 }.clickSearchButton {
310 verifySearchToolbar(true)
311 verifySearchBarPosition(false)
315 verifyHistoryMenuView()
319 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1715631
321 fun verifyVoiceSearchInHistoryTest() {
325 }.clickSearchButton {
326 verifySearchToolbar(true)
327 verifySearchEngineIcon("history")
332 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1715632
334 fun verifySearchForHistoryItemsTest() {
335 val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
336 val secondWebPage = TestAssetHelper.getHTMLControlsFormAsset(mockWebServer)
339 }.enterURLAndEnterToBrowser(firstWebPage.url) {
342 }.enterURLAndEnterToBrowser(secondWebPage.url) {
345 }.clickSearchButton {
346 // Search for a valid term
347 typeSearch(firstWebPage.title)
348 verifySearchEngineSuggestionResults(activityTestRule, firstWebPage.url.toString(), searchTerm = firstWebPage.title)
349 verifySuggestionsAreNotDisplayed(activityTestRule, secondWebPage.url.toString())
351 // Search for invalid term
352 typeSearch("Android")
353 verifySuggestionsAreNotDisplayed(activityTestRule, firstWebPage.url.toString())
354 verifySuggestionsAreNotDisplayed(activityTestRule, secondWebPage.url.toString())
358 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1715634
360 fun verifyDeletedHistoryItemsCanNotBeSearchedTest() {
361 val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
362 val secondWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2)
363 val thirdWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 3)
366 }.enterURLAndEnterToBrowser(firstWebPage.url) {
367 verifyPageContent(firstWebPage.content)
370 }.enterURLAndEnterToBrowser(secondWebPage.url) {
371 verifyPageContent(secondWebPage.content)
374 }.enterURLAndEnterToBrowser(thirdWebPage.url) {
375 verifyPageContent(thirdWebPage.content)
378 verifyHistoryListExists()
379 clickDeleteHistoryButton(firstWebPage.title)
380 verifyHistoryItemExists(false, firstWebPage.title)
381 clickDeleteHistoryButton(secondWebPage.title)
382 verifyHistoryItemExists(false, secondWebPage.title)
383 }.clickSearchButton {
384 // Search for a valid term
385 typeSearch("generic")
386 verifySuggestionsAreNotDisplayed(activityTestRule, firstWebPage.url.toString())
387 verifySuggestionsAreNotDisplayed(activityTestRule, secondWebPage.url.toString())
388 verifySearchEngineSuggestionResults(activityTestRule, thirdWebPage.url.toString(), searchTerm = "generic")
392 clickDeleteHistoryButton(thirdWebPage.title)
393 verifyHistoryItemExists(false, firstWebPage.title)
394 }.clickSearchButton {
395 // Search for a valid term
396 typeSearch("generic")
397 verifySuggestionsAreNotDisplayed(activityTestRule, thirdWebPage.url.toString())
401 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/903590
402 // Test running on beta/release builds in CI:
403 // caution when making changes to it, so they don't block the builds
406 fun noHistoryInPrivateBrowsingTest() {
407 val website = TestAssetHelper.getGenericAsset(mockWebServer, 1)
410 }.togglePrivateBrowsingMode()
413 }.openNavigationToolbar {
414 }.enterURLAndEnterToBrowser(website.url) {
415 mDevice.waitForIdle()
418 verifyEmptyHistoryView()