/* 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.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.UiDevice import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.helpers.AndroidAssetDispatcher import org.mozilla.fenix.helpers.HomeActivityTestRule import org.mozilla.fenix.helpers.TestAssetHelper import org.mozilla.fenix.helpers.TestHelper import org.mozilla.fenix.helpers.TestHelper.openAppFromExternalLink import org.mozilla.fenix.helpers.TestHelper.restartApp import org.mozilla.fenix.ui.robots.addToHomeScreen import org.mozilla.fenix.ui.robots.browserScreen import org.mozilla.fenix.ui.robots.homeScreen import org.mozilla.fenix.ui.robots.navigationToolbar /** * Tests for verifying the main three dot menu options * */ class SettingsPrivacyTest { /* ktlint-disable no-blank-line-before-rbrace */ // This imposes unreadable grouping. private val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) private lateinit var mockWebServer: MockWebServer private val pageShortcutName = "TestShortcut" @get:Rule val activityTestRule = HomeActivityTestRule() @Before fun setUp() { mockWebServer = MockWebServer().apply { setDispatcher(AndroidAssetDispatcher()) start() } } @After fun tearDown() { mockWebServer.shutdown() } @Test // Walks through settings privacy menu and sub-menus to ensure all items are present fun settingsPrivacyItemsTest() { homeScreen { }.openThreeDotMenu { }.openSettings { // PRIVACY verifyPrivacyHeading() // PRIVATE BROWSING verifyPrivateBrowsingButton() }.openPrivateBrowsingSubMenu { verifyNavigationToolBarHeader() }.goBack { // ENHANCED TRACKING PROTECTION verifyEnhancedTrackingProtectionButton() verifyEnhancedTrackingProtectionValue("On") }.openEnhancedTrackingProtectionSubMenu { verifyNavigationToolBarHeader() verifyEnhancedTrackingProtectionProtectionSubMenuItems() // ENHANCED TRACKING PROTECTION EXCEPTION }.openExceptions { verifyNavigationToolBarHeader() verifyEnhancedTrackingProtectionProtectionExceptionsSubMenuItems() }.goBack { }.goBack { // SITE PERMISSIONS verifySitePermissionsButton() }.openSettingsSubMenuSitePermissions { verifyNavigationToolBarHeader() verifySitePermissionsSubMenuItems() // SITE PERMISSIONS AUTOPLAY }.openAutoPlay { verifyNavigationToolBarHeader("Autoplay") verifySitePermissionsAutoPlaySubMenuItems() }.goBack { // SITE PERMISSIONS CAMERA }.openCamera { verifyNavigationToolBarHeader("Camera") verifySitePermissionsCommonSubMenuItems() verifyToggleNameToON("3. Toggle Camera to ON") }.goBack { // SITE PERMISSIONS LOCATION }.openLocation { verifyNavigationToolBarHeader("Location") verifySitePermissionsCommonSubMenuItems() verifyToggleNameToON("3. Toggle Location to ON") }.goBack { // SITE PERMISSIONS MICROPHONE }.openMicrophone { verifyNavigationToolBarHeader("Microphone") verifySitePermissionsCommonSubMenuItems() verifyToggleNameToON("3. Toggle Microphone to ON") }.goBack { // SITE PERMISSIONS NOTIFICATION }.openNotification { verifyNavigationToolBarHeader("Notification") verifySitePermissionsNotificationSubMenuItems() }.goBack { // SITE PERMISSIONS EXCEPTIONS }.openExceptions { verifyNavigationToolBarHeader() verifySitePermissionsExceptionSubMenuItems() }.goBack { }.goBack { // DELETE BROWSING DATA verifyDeleteBrowsingDataButton() }.openSettingsSubMenuDeleteBrowsingData { verifyNavigationToolBarHeader() verifyDeleteBrowsingDataSubMenuItems() }.goBack { // DELETE BROWSING DATA ON QUIT verifyDeleteBrowsingDataOnQuitButton() verifyDeleteBrowsingDataOnQuitValue("Off") }.openSettingsSubMenuDeleteBrowsingDataOnQuit { verifyNavigationToolBarHeader() verifyDeleteBrowsingDataOnQuitSubMenuItems() }.goBack { // DATA COLLECTION verifyDataCollectionButton() }.openSettingsSubMenuDataCollection { verifyNavigationToolBarHeader() verifyDataCollectionSubMenuItems() }.goBack { // OPEN LINKS IN APPS verifyOpenLinksInAppsButton() verifyOpenLinksInAppsSwitchDefault() }.goBack { verifyHomeComponent() } } // Tests only for initial state without signing in. // For tests after singing in, see SyncIntegration test suite @Test fun loginsAndPasswordsTest() { homeScreen { }.openThreeDotMenu { }.openSettings { // Necessary to scroll a little bit for all screen sizes TestHelper.scrollToElementByText("Logins and passwords") }.openLoginsAndPasswordSubMenu { verifyDefaultView() verifyDefaultValueSyncLogins() verifyDefaultValueAutofillLogins() }.openSavedLogins { verifySavedLoginsView() tapSetupLater() // Verify that logins list is empty // Issue #7272 nothing is shown }.goBack { }.openSyncLogins { verifyReadyToScanOption() verifyUseEmailOption() } } @Test fun saveLoginFromPromptTest() { val saveLoginTest = TestAssetHelper.getSaveLoginAsset(mockWebServer) navigationToolbar { }.enterURLAndEnterToBrowser(saveLoginTest.url) { verifySaveLoginPromptIsShown() // Click save to save the login saveLoginFromPrompt("Save") }.openTabDrawer { }.openHomeScreen { }.openThreeDotMenu { }.openSettings { TestHelper.scrollToElementByText("Logins and passwords") }.openLoginsAndPasswordSubMenu { verifyDefaultView() verifyDefaultValueSyncLogins() }.openSavedLogins { verifySavedLoginsView() tapSetupLater() // Verify that the login appears correctly verifySavedLoginFromPrompt() } } @Test fun doNotSaveLoginFromPromptTest() { val saveLoginTest = TestAssetHelper.getSaveLoginAsset(mockWebServer) navigationToolbar { }.enterURLAndEnterToBrowser(saveLoginTest.url) { verifySaveLoginPromptIsShown() // Don't save the login saveLoginFromPrompt("Never save") }.openTabDrawer { }.openHomeScreen { }.openThreeDotMenu { }.openSettings { }.openLoginsAndPasswordSubMenu { verifyDefaultView() verifyDefaultValueSyncLogins() }.openSavedLogins { verifySavedLoginsView() tapSetupLater() // Verify that the login list is empty verifyNotSavedLoginFromPromt() } } @Test fun saveLoginsAndPasswordsOptions() { homeScreen { }.openThreeDotMenu { }.openSettings { }.openLoginsAndPasswordSubMenu { }.saveLoginsAndPasswordsOptions { verifySaveLoginsOptionsView() } } @Test fun verifyPrivateBrowsingMenuItemsTest() { homeScreen { }.openThreeDotMenu { }.openSettings { }.openPrivateBrowsingSubMenu { verifyAddPrivateBrowsingShortcutButton() verifyOpenLinksInPrivateTab() verifyOpenLinksInPrivateTabOff() }.goBack { verifySettingsView() } } @Test @Ignore("See: https://github.com/mozilla-mobile/fenix/issues/10915") fun openExternalLinksInPrivateTest() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) setOpenLinksInPrivateOn() openAppFromExternalLink(defaultWebPage.url.toString()) browserScreen { }.openTabDrawer { verifyPrivateModeSelected() }.openHomeScreen { } setOpenLinksInPrivateOff() openAppFromExternalLink(defaultWebPage.url.toString()) browserScreen { }.openTabDrawer { verifyNormalModeSelected() } } @Test @Ignore("See: https://github.com/mozilla-mobile/fenix/issues/10915") fun launchPageShortcutInPrivateModeTest() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) setOpenLinksInPrivateOn() navigationToolbar { }.enterURLAndEnterToBrowser(defaultWebPage.url) { }.openThreeDotMenu { }.openAddToHomeScreen { addShortcutName(pageShortcutName) clickAddShortcutButton() clickAddAutomaticallyButton() }.openHomeScreenShortcut(pageShortcutName) { }.openTabDrawer { verifyPrivateModeSelected() } } @Test fun launchLinksInPrivateToggleOffStateDoesntChangeTest() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) setOpenLinksInPrivateOn() navigationToolbar { }.enterURLAndEnterToBrowser(defaultWebPage.url) { }.openThreeDotMenu { }.openAddToHomeScreen { addShortcutName(pageShortcutName) clickAddShortcutButton() clickAddAutomaticallyButton() }.openHomeScreenShortcut(pageShortcutName) { }.openTabDrawer { }.openHomeScreen { } setOpenLinksInPrivateOff() restartApp(activityTestRule) mDevice.waitForIdle() addToHomeScreen { }.searchAndOpenHomeScreenShortcut(pageShortcutName) { }.openTabDrawer { verifyNormalModeSelected() }.openHomeScreen { }.openThreeDotMenu { }.openSettings { }.openPrivateBrowsingSubMenu { verifyOpenLinksInPrivateTabOff() } } @Test fun addPrivateBrowsingShortcut() { homeScreen { }.openThreeDotMenu { }.openSettings { }.openPrivateBrowsingSubMenu { addPrivateShortcutToHomescreen() verifyPrivateBrowsingShortcutIcon() }.openPrivateBrowsingShortcut { verifySearchView() }.openBrowser { }.openTabDrawer { verifyPrivateModeSelected() } } @Ignore("This is a stub test, ignore for now") @Test fun toggleTrackingProtection() { // Open static test website to verify TP is turned on (default): https://github.com/rpappalax/testapp // (static content needs to be migrated to assets folder) // Open 3dot (main) menu // Select settings // Toggle Tracking Protection to 'off' // Back arrow to Home // Open static test website to verify TP is now off: https://github.com/rpappalax/testapp } @Ignore("This is a stub test, ignore for now") @Test fun verifySitePermissions() { // Open 3dot (main) menu // Select settings // Click on: "Site permissions" // Verify sub-menu items... // Click on: "Exceptions" // Verify: "No site exceptions" // TBD: create a site exception // TBD: return to this UI and verify // // Open browser to static test website: https://github.com/rpappalax/testapp // Click on "Test site permissions: geolocation" // Verify that geolocation permissions dialogue is opened // Verify text: "Allow to use your geolocation? // Verify toggle: 'Remember decision for this site?" // Verify button: "Don't Allow" // Verify button: "Allow" (default) // Select "Remember decision for this site" // Refresh page // Click on "Test site permissions: geolocation" // Verify that geolocation permissions dialogue is not opened // // // Open browser to static test website: https://github.com/rpappalax/testapp // Click on "Test site permissions: camera" // Verify that camera permissions dialogue is opened // Verify text: "Allow to use your camera? // Verify toggle: 'Remember decision for this site?" // Verify button: "Don't Allow" // Verify button: "Allow" (default) // Select "Remember decision for this site" // Refresh page // Click on "Test site permissions: camera" // Verify that camera permissions dialogue is not opened // // // Open browser to static test website: https://github.com/rpappalax/testapp // Click on "Test site permissions: microphone" // Verify that microphone permissions dialogue is opened // Verify text: "Allow to use your microphone? // Verify toggle: 'Remember decision for this site?" // Verify button: "Don't Allow" // Verify button: "Allow" (default) // Select "Remember decision for this site" // Refresh page // Click on "Test site permissions: microphone" // Verify that microphone permissions dialogue is not opened // // // Open browser to static test website: https://github.com/rpappalax/testapp // Click on "Test site permissions: notifications dialogue" // Verify that notifications dialogue permissions dialogue is opened // Verify text: "Allow to send notifications? // Verify toggle: 'Remember decision for this site?" // Verify button: "Never" // Verify button: "Always" (default) // Select "Remember decision for this site" // Refresh page // Click on "Test site permissions: notifications dialogue" // Verify that notifications dialogue permissions dialogue is not opened // // Open 3dot (main) menu // Select settings // Click on: "Site permissions" // Select: Camera // Switch from "ask to allow" (default) to "blocked" // Click back arrow // // Select: Location // Switch from "ask to allow" (default) to "blocked" // Click back arrow // // Select: Microphone // Switch from "ask to allow" (default) to "blocked" // Click back arrow // // Select: Notification // Switch from "ask to allow" (default) to "blocked" // Click back arrow // // Open browser to static test website: https://github.com/rpappalax/testapp // Click on "Test site permissions: camera dialogue" // Verify that notifications dialogue permissions dialogue is not opened // // Open browser to static test website: https://github.com/rpappalax/testapp // Click on "Test site permissions: geolocation dialogue" // Verify that notifications dialogue permissions dialogue is not opened // // Open browser to static test website: https://github.com/rpappalax/testapp // Click on "Test site permissions: microphone dialogue" // Verify that notifications dialogue permissions dialogue is not opened // // Open browser to static test website: https://github.com/rpappalax/testapp // Click on "Test site permissions: notifications dialogue" // Verify that notifications dialogue permissions dialogue is not opened } @Ignore("This is a stub test, ignore for now") @Test fun deleteBrowsingData() { // Setup: // Open 2 websites as 2 tabs // Save as 1 collection // Open 2 more websites in 2 other tabs // Save as a 2nd collection // Open 3dot (main) menu // Select settings // Click on "Delete browsing data" // Verify correct number of tabs, addresses and collections are indicated // Select all 3 checkboxes // Click on "Delete browsing data button" // Return to home screen and verify that all tabs, history and collection are gone // // Verify xxx // // New: If coming from tab -> settings -> delete browsing data // then expect to return to home screen // If coming from tab -> home -> settings -> delete browsing data // then expect return to settings (after which you can return to home manually) } @Ignore("This is a stub test, ignore for now") @Test fun verifyDataCollection() { // Open 3dot (main) menu // Select settings // Click on "Data collection" // Verify header: "Usage and technical data" // Verify text: "Shares performance, usage, hardware and customization data about your browser with Mozilla" // " to help us make Firefox preview better" // Verify toggle is on by default // TBD: // see: telemetry testcases } @Ignore("This is a stub test, ignore for now") @Test fun openPrivacyNotice() { // Open 3dot (main) menu // Select settings // Click on "Privacy notice" // Verify redirect to: mozilla.org Privacy notice page" } @Ignore("This is a stub test, ignore for now") @Test fun checkLeakCanary() { // Open 3dot (main) menu // Select settings // Click on Leak Canary toggle // Verify 'dump' message } } private fun setOpenLinksInPrivateOn() { homeScreen { }.openThreeDotMenu { }.openSettings { }.openPrivateBrowsingSubMenu { verifyOpenLinksInPrivateTabEnabled() clickOpenLinksInPrivateTabSwitch() }.goBack { }.goBack { verifyHomeComponent() } } private fun setOpenLinksInPrivateOff() { homeScreen { }.openThreeDotMenu { }.openSettings { }.openPrivateBrowsingSubMenu { clickOpenLinksInPrivateTabSwitch() verifyOpenLinksInPrivateTabOff() }.goBack { }.goBack { verifyHomeComponent() } }