diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeNavigationToolbarTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeNavigationToolbarTest.kt new file mode 100644 index 000000000..c64ae7c03 --- /dev/null +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeNavigationToolbarTest.kt @@ -0,0 +1,267 @@ +/* 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 + +import androidx.compose.ui.test.junit4.AndroidComposeTestRule +import androidx.core.net.toUri +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.uiautomator.UiDevice +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.helpers.AndroidAssetDispatcher +import org.mozilla.fenix.helpers.HomeActivityTestRule +import org.mozilla.fenix.helpers.MatcherHelper.itemWithText +import org.mozilla.fenix.helpers.TestAssetHelper +import org.mozilla.fenix.helpers.TestHelper.runWithSystemLocaleChanged +import org.mozilla.fenix.ui.robots.clickPageObject +import org.mozilla.fenix.ui.robots.homeScreen +import org.mozilla.fenix.ui.robots.navigationToolbar +import java.util.Locale + +/** + * Tests for verifying basic functionality of browser navigation and page related interactions + * + * Including: + * - Visiting a URL + * - Back and Forward navigation + * - Refresh + * - Find in page + */ + +class ComposeNavigationToolbarTest { + private lateinit var mDevice: UiDevice + private lateinit var mockWebServer: MockWebServer + + @get:Rule + val composeTestRule = + AndroidComposeTestRule( + HomeActivityTestRule.withDefaultSettingsOverrides( + tabsTrayRewriteEnabled = true, + ), + ) { it.activity } + + @Before + fun setUp() { + mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) + mockWebServer = MockWebServer().apply { + dispatcher = AndroidAssetDispatcher() + start() + } + } + + @After + fun tearDown() { + mockWebServer.shutdown() + } + + @Test + fun goBackTest() { + val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + val nextWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2) + + navigationToolbar { + }.enterURLAndEnterToBrowser(defaultWebPage.url) { + mDevice.waitForIdle() + }.openNavigationToolbar { + }.enterURLAndEnterToBrowser(nextWebPage.url) { + verifyUrl(nextWebPage.url.toString()) + }.openThreeDotMenu { + }.goToPreviousPage { + mDevice.waitForIdle() + verifyUrl(defaultWebPage.url.toString()) + } + } + + @Test + fun goForwardTest() { + val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + val nextWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2) + + navigationToolbar { + }.enterURLAndEnterToBrowser(defaultWebPage.url) { + mDevice.waitForIdle() + }.openNavigationToolbar { + }.enterURLAndEnterToBrowser(nextWebPage.url) { + mDevice.waitForIdle() + verifyUrl(nextWebPage.url.toString()) + }.openThreeDotMenu { + }.goToPreviousPage { + mDevice.waitForIdle() + verifyUrl(defaultWebPage.url.toString()) + } + + // Re-open the three-dot menu for verification + navigationToolbar { + }.openThreeDotMenu { + verifyThreeDotMenuExists() + }.goForward { + verifyUrl(nextWebPage.url.toString()) + } + } + + // Swipes the nav bar left/right to switch between tabs + @SmokeTest + @Test + fun swipeToSwitchTabTest() { + val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + val secondWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2) + + navigationToolbar { + }.enterURLAndEnterToBrowser(firstWebPage.url) { + }.openComposeTabDrawer(composeTestRule) { + }.openNewTab { + }.submitQuery(secondWebPage.url.toString()) { + swipeNavBarRight(secondWebPage.url.toString()) + verifyUrl(firstWebPage.url.toString()) + swipeNavBarLeft(firstWebPage.url.toString()) + verifyUrl(secondWebPage.url.toString()) + } + } + + // Because it requires changing system prefs, this test will run only on Debug builds + @Test + fun swipeToSwitchTabInRTLTest() { + val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + val secondWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2) + val arabicLocale = Locale("ar", "AR") + + runWithSystemLocaleChanged(arabicLocale, composeTestRule.activityRule) { + navigationToolbar { + }.enterURLAndEnterToBrowser(firstWebPage.url) { + }.openComposeTabDrawer(composeTestRule) { + }.openNewTab { + }.submitQuery(secondWebPage.url.toString()) { + swipeNavBarLeft(secondWebPage.url.toString()) + verifyUrl(firstWebPage.url.toString()) + swipeNavBarRight(firstWebPage.url.toString()) + verifyUrl(secondWebPage.url.toString()) + } + } + } + + // Test running on beta/release builds in CI: + // caution when making changes to it, so they don't block the builds + @Test + fun visitURLTest() { + val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + + navigationToolbar { + }.enterURLAndEnterToBrowser(defaultWebPage.url) { + verifyUrl(defaultWebPage.url.toString()) + } + } + + @Test + fun findInPageTest() { + val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 3) + + navigationToolbar { + }.enterURLAndEnterToBrowser(defaultWebPage.url) { + mDevice.waitForIdle() + }.openThreeDotMenu { + verifyThreeDotMenuExists() + verifyFindInPageButton() + }.openFindInPage { + verifyFindInPageNextButton() + verifyFindInPagePrevButton() + verifyFindInPageCloseButton() + enterFindInPageQuery("a") + verifyFindNextInPageResult("1/3") + clickFindInPageNextButton() + verifyFindNextInPageResult("2/3") + clickFindInPageNextButton() + verifyFindNextInPageResult("3/3") + clickFindInPagePrevButton() + verifyFindPrevInPageResult("2/3") + clickFindInPagePrevButton() + verifyFindPrevInPageResult("1/3") + }.closeFindInPageWithCloseButton { + verifyFindInPageBar(false) + }.openThreeDotMenu { + }.openFindInPage { + enterFindInPageQuery("3") + verifyFindNextInPageResult("1/1") + }.closeFindInPageWithBackButton { + verifyFindInPageBar(false) + } + } + + @Test + fun pdfFindInPageTest() { + val genericURL = + TestAssetHelper.getGenericAsset(mockWebServer, 3) + + navigationToolbar { + }.enterURLAndEnterToBrowser(genericURL.url) { + clickPageObject(itemWithText("PDF form file")) + }.openThreeDotMenu { + verifyThreeDotMenuExists() + verifyFindInPageButton() + }.openFindInPage { + verifyFindInPageNextButton() + verifyFindInPagePrevButton() + verifyFindInPageCloseButton() + enterFindInPageQuery("l") + verifyFindNextInPageResult("1/2") + clickFindInPageNextButton() + verifyFindNextInPageResult("2/2") + clickFindInPagePrevButton() + verifyFindPrevInPageResult("1/2") + }.closeFindInPageWithCloseButton { + verifyFindInPageBar(false) + }.openThreeDotMenu { + }.openFindInPage { + enterFindInPageQuery("p") + verifyFindNextInPageResult("1/1") + }.closeFindInPageWithBackButton { + verifyFindInPageBar(false) + } + } + + @Test + fun verifySecurePageSecuritySubMenuTest() { + val defaultWebPage = "https://mozilla-mobile.github.io/testapp/loginForm" + val defaultWebPageTitle = "Login_form" + + navigationToolbar { + }.enterURLAndEnterToBrowser(defaultWebPage.toUri()) { + }.openSiteSecuritySheet { + verifyQuickActionSheet(defaultWebPage, true) + openSecureConnectionSubMenu(true) + verifySecureConnectionSubMenu(defaultWebPageTitle, defaultWebPage, true) + } + } + + @Test + fun verifyInsecurePageSecuritySubMenuTest() { + val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + + navigationToolbar { + }.enterURLAndEnterToBrowser(defaultWebPage.url) { + waitForPageToLoad() + }.openSiteSecuritySheet { + verifyQuickActionSheet(defaultWebPage.url.toString(), false) + openSecureConnectionSubMenu(false) + verifySecureConnectionSubMenu(defaultWebPage.title, defaultWebPage.url.toString(), false) + } + } + + @Test + fun verifyClearCookiesFromQuickSettingsTest() { + val helpPageUrl = "mozilla.org" + + homeScreen { + }.openThreeDotMenu { + }.openHelp { + }.openSiteSecuritySheet { + clickQuickActionSheetClearSiteData() + verifyClearSiteDataPrompt(helpPageUrl) + } + } +}