Commit 1d047368 authored by isabelrios's avatar isabelrios Committed by Oana Horvath
Browse files

Re-enable Screenshots tests (#6617)

disabling setting test options due to different screen sizes

name screenshots according to robots

fix kotlin style

update settings tests with new Toolbar option

screenshots tests in different package than ui tests
parent a83717dd
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -482,7 +482,7 @@ dependencies {

    androidTestImplementation Deps.uiautomator
// Removed pending AndroidX fixes
//    androidTestImplementation "tools.fastlane:screengrab:1.2.0"
    androidTestImplementation "tools.fastlane:screengrab:2.0.0"
//    androidTestImplementation "br.com.concretesolutions:kappuccino:1.2.1"
    
    androidTestImplementation Deps.espresso_core, {
+52 −0
Original line number Diff line number Diff line
/* 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.screenshots

import androidx.test.rule.ActivityTestRule
import org.junit.After
import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.helpers.HomeActivityTestRule
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.robots.mDevice
import tools.fastlane.screengrab.Screengrab
import tools.fastlane.screengrab.locale.LocaleTestRule

class DefaultHomeScreenTest : ScreenshotTest() {
    @Rule @JvmField
    val localeTestRule = LocaleTestRule()
    @get:Rule
    var mActivityTestRule: ActivityTestRule<HomeActivity> = HomeActivityTestRule()

    @After
    fun tearDown() {
        mActivityTestRule.getActivity().finishAndRemoveTask()
    }

    @Test
    fun showDefaultHomeScreen() {
        homeScreen {
            verifyAccountsSignInButton()
            Screengrab.screenshot("HomeScreenRobot_home-screen")
            swipeToBottom()
            Screengrab.screenshot("HomeScreenRobot_home-screen-scroll")
        }
    }

    @Test
    fun privateBrowsingTest() {
        homeScreen {
        }.openThreeDotMenu {
        }.openSettings { }
        // To get private screenshot,
        // dismiss onboarding going to settings and back
        mDevice.pressBack()
        homeScreen {
            togglePrivateBrowsingModeOnOff()
            Screengrab.screenshot("HomeScreenRobot_private-browsing-menu")
        }
    }
}
+223 −0
Original line number Diff line number Diff line
/* 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.screenshots

import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.rule.ActivityTestRule
import tools.fastlane.screengrab.Screengrab
import tools.fastlane.screengrab.locale.LocaleTestRule
import okhttp3.mockwebserver.MockWebServer
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.HomeActivityTestRule
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.click
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.robots.bookmarksMenu
import org.mozilla.fenix.ui.robots.mDevice
import org.mozilla.fenix.ui.robots.navigationToolbar
import org.mozilla.fenix.ui.robots.swipeToBottom

class MenuScreenShotTest : ScreenshotTest() {
    private lateinit var mockWebServer: MockWebServer
    @Rule
    @JvmField
    val localeTestRule = LocaleTestRule()

    @get:Rule
    var mActivityTestRule: ActivityTestRule<HomeActivity> = HomeActivityTestRule()

    @Before
    fun setUp() {
        mockWebServer = MockWebServer().apply {
            setDispatcher(AndroidAssetDispatcher())
            start()
        }
    }

    @After
    fun tearDown() {
        mActivityTestRule.getActivity().finishAndRemoveTask()
        mockWebServer.shutdown()
    }

    @Test
    fun threeDotMenuTest() {
        homeScreen {
        }.openThreeDotMenu {
            Screengrab.screenshot("ThreeDotMenuMainRobot_three-dot-menu")
        }
    }

    @Test
    fun settingsTest() {
        homeScreen {
        }.openThreeDotMenu {
        }.openSettings {
            Screengrab.screenshot("SettingsRobot_settings-menu")
            settingsAccountPreferences()
            Screengrab.screenshot("AccountSettingsRobot_settings-account")
            mDevice.pressBack()

            settingsSearch()
            Screengrab.screenshot("SettingsSubMenuSearchRobot_settings-search")
            mDevice.pressBack()

            settingsTheme()
            Screengrab.screenshot("SettingsSubMenuThemeRobot_settings-theme")
            mDevice.pressBack()

            settingsAccessibility()
            Screengrab.screenshot("SettingsSubMenuAccessibilityRobot_settings-accessibility")
            mDevice.pressBack()

            settingDefaultBrowser()
            Screengrab.screenshot("SettingsSubMenuDefaultBrowserRobot_settings-default-browser")
            mDevice.pressBack()

            settingsToolbar()
            Screengrab.screenshot("SettingsSubMenuDefaultBrowserRobot_settings-toolbar")
            mDevice.pressBack()

            // Need to find a way to swipe only a little to get all the options in all screensizes
            // settingsTP()
            // Screengrab.screenshot("settings-enhanced-tp")
            // mDevice.pressBack()

            // Need to find a way to swipe only a little to get all the options in all screensizes
            // settingsAddToHomeScreen()
            // Screengrab.screenshot("settings-add-to-homescreen")
            // mDevice.pressBack()

            // Wee need this but this way not going to work in other languages. Need a workaround to not use Sleep
            // mDevice.waitNotNull(Until.findObjects(By.text("Delete browsing data on quit")), TestAssetHelper.waitingTime)
            // settingsRemoveData()
            // Screengrab.screenshot("settings-delete-browsing-data")
            // device.pressBack()

            swipeToBottom()
            Screengrab.screenshot("SettingsRobot_settings-scroll-to-bottom")

            settingsTelemetry()
            Screengrab.screenshot("settings-telemetry")
        }
    }

    @Test
    fun historyTest() {
        homeScreen {
        }.openThreeDotMenu {
        }
        openHistoryThreeDotMenu()
        Screengrab.screenshot("HistoryRobot_history-menu")
    }

    @Test
    fun bookmarksManagementTest() {
        homeScreen {
        }.openThreeDotMenu {
        }
        openBookmarksThreeDotMenu()
        Screengrab.screenshot("BookmarksRobot_bookmarks-menu")
        bookmarksMenu {
            clickAddFolderButton()
            Screengrab.screenshot("BookmarksRobot_add-folder-view")
            saveNewFolder()
            Screengrab.screenshot("BookmarksRobot_error-empty-folder-name")
            addNewFolderName("test")
            saveNewFolder()
        }.openThreeDotMenu {
            Screengrab.screenshot("ThreeDotMenuBookmarksRobot_folder-menu")
        }
        editBookmarkFolder()
        Screengrab.screenshot("ThreeDotMenuBookmarksRobot_edit-bookmark-folder-menu")
        // It may be needed to wait here to have the screenshot
        mDevice.pressBack()
        bookmarksMenu {
        }.openThreeDotMenu {
            deleteBookmarkFolder()
            Screengrab.screenshot("ThreeDotMenuBookmarksRobot_delete-bookmark-folder-menu")
        }
    }

    @Test
    fun collectionMenuTest() {
        val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
        navigationToolbar {
            Screengrab.screenshot("NavigationToolbarRobot_navigation-toolbar")
        }.enterURLAndEnterToBrowser(defaultWebPage.url) {
            Screengrab.screenshot("BrowserRobot_enter-url")
        }
        tapOnTabCounter()
        //  Homescreen with visited tabs
        Screengrab.screenshot("HomeScreenRobot_homescreen-with-tabs-open")
        homeScreen {
        }.openTabsListThreeDotMenu {
            Screengrab.screenshot("open-tabs-menu")
        }.close {
            // It may be needed to wait here for tests working on Firebase
            saveToCollectionButton()
            Screengrab.screenshot("HomeScreenRobot_save-collection-view")
            typeCollectionName("CollectionName")
            mDevice.pressBack()
            // It may be needed to wait here for tests working on Firebase
            Screengrab.screenshot("HomeScreenRobot_saved-collection")
        }
    }

    @Test
    fun tabMenuTest() {
        val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
        navigationToolbar {
        }.enterURLAndEnterToBrowser(defaultWebPage.url) {
        }.openThreeDotMenu {
            Screengrab.screenshot("browser-tab-menu")
        }.closeBrowserMenuToBrowser {
        }.openHomeScreen {
            Screengrab.screenshot("homescree-with-tabs")
            closeTab()
            Screengrab.screenshot("remove-tab")
        }
    }
}

fun openHistoryThreeDotMenu() = onView(withText(R.string.library_history)).click()

fun openBookmarksThreeDotMenu() = onView(withText(R.string.library_bookmarks)).click()

fun editBookmarkFolder() = onView(withText(R.string.bookmark_menu_edit_button)).click()

fun deleteBookmarkFolder() = onView(withText(R.string.bookmark_menu_delete_button)).click()

fun saveToCollectionButton() = onView(withId(R.id.save_tab_group_button)).click()

fun tapOnTabCounter() = onView(withId(R.id.counter_text)).click()

fun settingsAccountPreferences() = onView(withText(R.string.preferences_sync)).click()

fun settingsSearch() = onView(withText(R.string.preferences_search)).click()

fun settingsTheme() = onView(withText(R.string.preferences_theme)).click()

fun settingsAccessibility() = onView(withText(R.string.preferences_accessibility)).click()

fun settingDefaultBrowser() = onView(withText(R.string.preferences_set_as_default_browser)).click()

fun settingsToolbar() = onView(withText(R.string.preferences_toolbar)).click()

fun settingsTP() = onView(withText(R.string.preference_enhanced_tracking_protection)).click()

fun settingsAddToHomeScreen() = onView(withText(R.string.preferences_add_private_browsing_shortcut)).click()

fun settingsRemoveData() = onView(withText(R.string.preferences_delete_browsing_data)).click()

fun settingsTelemetry() = onView(withText(R.string.preferences_data_collection)).click()
+73 −0
Original line number Diff line number Diff line
 /* 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.screenshots;

 import android.Manifest;
 import android.app.Instrumentation;
 import android.content.Context;
 import androidx.annotation.StringRes;
 import androidx.test.platform.app.InstrumentationRegistry;
 import androidx.test.rule.GrantPermissionRule;
 import androidx.test.uiautomator.UiDevice;

 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.rules.TestRule;
 import org.junit.rules.TestWatcher;
 import org.junit.runner.Description;

 import tools.fastlane.screengrab.Screengrab;
 import tools.fastlane.screengrab.UiAutomatorScreenshotStrategy;

 /**
  * Base class for tests that take screenshots.
  */
  public abstract class ScreenshotTest {

     private Context targetContext;

     UiDevice device;

     @Rule
     public GrantPermissionRule permissionRule = GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE);

     @Rule
     public TestRule screenshotOnFailureRule = new TestWatcher() {
         @Override
         protected void failed(Throwable e, Description description) {
             // On error take a screenshot so that we can debug it easily
             Screengrab.screenshot("FAILURE-" + getScreenshotName(description));
         }

         private String getScreenshotName(Description description) {
             return description.getClassName().replace(".", "-")
                     + "_"
                     + description.getMethodName().replace(".", "-");
         }
     };

     @Before
     public void setUpScreenshots() {
         Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
         targetContext = instrumentation.getTargetContext();
         device = UiDevice.getInstance(instrumentation);

         // Use this to switch between default strategy and HostScreencap strategy
         Screengrab.setDefaultScreenshotStrategy(new UiAutomatorScreenshotStrategy());
     }

     String getString(@StringRes int resourceId) {
         return targetContext.getString(resourceId).trim();
     }

     String getString(@StringRes int resourceId, Object... formatArgs) {
         return targetContext.getString(resourceId, formatArgs).trim();
     }

     public void takeScreenshotsAfterWait(String filename, int waitingTime) throws InterruptedException {
         Thread.sleep(waitingTime);
         Screengrab.screenshot(filename);
     }
 }
+17 −10
Original line number Diff line number Diff line
@@ -15,9 +15,7 @@ import androidx.test.espresso.matcher.ViewMatchers
import androidx.test.espresso.matcher.ViewMatchers.Visibility
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility
import androidx.test.espresso.matcher.ViewMatchers.hasFocus
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.Until
import androidx.test.uiautomator.By
@@ -30,7 +28,7 @@ import org.hamcrest.Matchers.containsString
import org.mozilla.fenix.R
import org.mozilla.fenix.helpers.click
import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime
import org.mozilla.fenix.helpers.click
import org.mozilla.fenix.helpers.ext.waitNotNull

/**
 * Implementation of Robot Pattern for the home screen menu.
@@ -87,23 +85,23 @@ class HomeScreenRobot {
    // Collections element
    fun clickCollectionThreeDotButton() {
        collectionThreeDotButton().click()
        mDevice.wait(Until.findObject(By.text("Delete collection")), waitingTime)
        mDevice.waitNotNull(Until.findObject(By.text("Delete collection")), waitingTime)
    }
    fun selectRenameCollection() {
        onView(allOf(ViewMatchers.withText("Rename collection"))).click()
        mDevice.wait(Until.findObject(By.res("org.mozilla.fenix.debug:id/name_collection_edittext")), waitingTime)
        mDevice.waitNotNull(Until.findObject(By.res("name_collection_edittext")))
    }
    fun selectDeleteCollection() {
        onView(allOf(ViewMatchers.withText("Delete collection"))).click()
        mDevice.wait(Until.findObject(By.res("message")), waitingTime)
        mDevice.waitNotNull(Until.findObject(By.res("message")), waitingTime)
    }
    fun confirmDeleteCollection() {
        onView(allOf(ViewMatchers.withText("DELETE"))).click()
        mDevice.wait(Until.findObject(By.res("org.mozilla.fenix.debug:id/collections_header")), waitingTime)
        mDevice.waitNotNull(Until.findObject(By.res("collections_header")), waitingTime)
    }
    fun typeCollectionName(name: String) {
        mDevice.wait(Until.findObject(By.res("org.mozilla.fenix.debug:id/name_collection_edittext")), waitingTime)
        collectionNameTextField().check(matches(hasFocus()))
        mDevice.wait(Until.findObject(By.res("name_collection_edittext")), waitingTime)

        collectionNameTextField().perform(ViewActions.replaceText(name))
        collectionNameTextField().perform(ViewActions.pressImeActionButton())
    }
@@ -120,6 +118,15 @@ class HomeScreenRobot {
        closeTabButton().click()
    }

    fun togglePrivateBrowsingModeOnOff() {
        onView(ViewMatchers.withResourceName("privateBrowsingButton"))
                .perform(click())
    }

    fun swipeToBottom() = onView(ViewMatchers.withId(R.id.home_component)).perform(ViewActions.swipeUp())

    fun swipeToTop() = onView(ViewMatchers.withId(R.id.home_component)).perform(ViewActions.swipeDown())

    class Transition {
        val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())

@@ -361,4 +368,4 @@ private fun tabsListThreeDotButton() = onView(allOf(ViewMatchers.withId(R.id.tab

private fun collectionThreeDotButton() = onView(allOf(ViewMatchers.withId(R.id.collection_overflow_button)))

private fun collectionNameTextField() = onView(allOf(ViewMatchers.withResourceName("name_collection_edittext"), hasFocus()))
private fun collectionNameTextField() = onView(allOf(ViewMatchers.withResourceName("name_collection_edittext")))
Loading