diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/HomeScreenTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/HomeScreenTest.kt index d293993eb..dad594a3d 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/HomeScreenTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/HomeScreenTest.kt @@ -86,7 +86,7 @@ class HomeScreenTest { verifyDefaultSearchEngine("Google") verifyHomeMenuButton() verifyTabButton() - verifyNoTabsOpened() + verifyTabCounter("0") } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt index 9b789c9fd..8d0077f7e 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt @@ -37,7 +37,6 @@ import org.mozilla.fenix.helpers.TestHelper.assertNativeAppOpens import org.mozilla.fenix.helpers.TestHelper.createCustomTabIntent import org.mozilla.fenix.helpers.TestHelper.generateRandomString import org.mozilla.fenix.helpers.TestHelper.registerAndCleanupIdlingResources -import org.mozilla.fenix.helpers.TestHelper.scrollToElementByText import org.mozilla.fenix.helpers.ViewVisibilityIdlingResource import org.mozilla.fenix.ui.robots.browserScreen import org.mozilla.fenix.ui.robots.customTabScreen @@ -46,7 +45,6 @@ import org.mozilla.fenix.ui.robots.navigationToolbar import org.mozilla.fenix.ui.robots.notificationShade import org.mozilla.fenix.ui.robots.openEditURLView import org.mozilla.fenix.ui.robots.searchScreen -import org.mozilla.fenix.ui.util.STRING_ONBOARDING_TRACKING_PROTECTION_HEADER /** * Test Suite that contains a part of the Smoke and Sanity tests defined in TestRail: @@ -112,41 +110,19 @@ class SmokeTest { @Test fun firstRunScreenTest() { homeScreen { - verifyHomeScreen() - verifyNavigationToolbar() - verifyHomePrivateBrowsingButton() - verifyHomeMenuButton() - verifyHomeWordmark() - - verifyWelcomeHeader() - // Sign in to Firefox - verifyStartSyncHeader() - verifyAccountsSignInButton() - - // Always-on privacy - scrollToElementByText(STRING_ONBOARDING_TRACKING_PROTECTION_HEADER) - verifyAutomaticPrivacyHeader() - verifyAutomaticPrivacyText() - - // Choose your theme - verifyChooseThemeHeader() - verifyChooseThemeText() - verifyDarkThemeDescription() - verifyDarkThemeToggle() - verifyLightThemeDescription() - verifyLightThemeToggle() - - // Pick your toolbar placement - verifyTakePositionHeader() - verifyTakePositionElements() - - // Your privacy - verifyYourPrivacyHeader() - verifyYourPrivacyText() - verifyPrivacyNoticeButton() - - // Start Browsing - verifyStartBrowsingButton() + verifyHomeScreenAppBarItems() + verifyHomeScreenWelcomeItems() + verifyChooseYourThemeCard( + isDarkThemeChecked = false, + isLightThemeChecked = false, + isAutomaticThemeChecked = true, + ) + verifyToolbarPlacementCard(isBottomChecked = true, isTopChecked = false) + verifySignInToSyncCard() + verifyPrivacyProtectionCard(isStandardChecked = true, isStrictChecked = false) + verifyPrivacyNoticeCard() + verifyStartBrowsingSection() + verifyNavigationToolbarItems("0") } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/TabbedBrowsingTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/TabbedBrowsingTest.kt index ed882ffcf..69761496f 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/TabbedBrowsingTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/TabbedBrowsingTest.kt @@ -122,7 +122,7 @@ class TabbedBrowsingTest { verifyShareTabButton() verifySelectTabs() }.closeAllTabs { - verifyNoTabsOpened() + verifyTabCounter("0") } // Repeat for Private Tabs @@ -137,7 +137,7 @@ class TabbedBrowsingTest { }.openTabsListThreeDotMenu { verifyCloseAllTabsButton() }.closeAllTabs { - verifyNoTabsOpened() + verifyTabCounter("0") } } @@ -153,7 +153,7 @@ class TabbedBrowsingTest { closeTab() } homeScreen { - verifyNoTabsOpened() + verifyTabCounter("0") }.openNavigationToolbar { }.enterURLAndEnterToBrowser(genericURL.url) { }.openTabDrawer { @@ -161,7 +161,7 @@ class TabbedBrowsingTest { swipeTabRight("Test_Page_1") } homeScreen { - verifyNoTabsOpened() + verifyTabCounter("0") }.openNavigationToolbar { }.enterURLAndEnterToBrowser(genericURL.url) { }.openTabDrawer { @@ -169,7 +169,7 @@ class TabbedBrowsingTest { swipeTabLeft("Test_Page_1") } homeScreen { - verifyNoTabsOpened() + verifyTabCounter("0") } } @@ -213,7 +213,7 @@ class TabbedBrowsingTest { closeTab() } homeScreen { - verifyNoTabsOpened() + verifyTabCounter("0") }.openNavigationToolbar { }.enterURLAndEnterToBrowser(genericURL.url) { }.openTabDrawer { @@ -221,7 +221,7 @@ class TabbedBrowsingTest { swipeTabRight("Test_Page_1") } homeScreen { - verifyNoTabsOpened() + verifyTabCounter("0") }.openNavigationToolbar { }.enterURLAndEnterToBrowser(genericURL.url) { }.openTabDrawer { @@ -229,7 +229,7 @@ class TabbedBrowsingTest { swipeTabLeft("Test_Page_1") } homeScreen { - verifyNoTabsOpened() + verifyTabCounter("0") } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt index 7482d234c..b74d1b313 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt @@ -65,9 +65,6 @@ import org.mozilla.fenix.helpers.TestHelper.scrollToElementByText import org.mozilla.fenix.helpers.click import org.mozilla.fenix.helpers.ext.waitNotNull import org.mozilla.fenix.helpers.withBitmapDrawable -import org.mozilla.fenix.ui.util.STRING_ONBOARDING_ACCOUNT_SIGN_IN_HEADER -import org.mozilla.fenix.ui.util.STRING_ONBOARDING_TOOLBAR_PLACEMENT_HEADER -import org.mozilla.fenix.ui.util.STRING_ONBOARDING_TRACKING_PROTECTION_HEADER /** * Implementation of Robot Pattern for the home screen menu. @@ -79,18 +76,93 @@ class HomeScreenRobot { " service provider, it makes it easier to keep what you do online private from anyone" + " else who uses this device." - fun verifyNavigationToolbar() = assertNavigationToolbar() + fun verifyNavigationToolbar() = assertAppItemsWithResourceId(navigationToolbar) fun verifyFocusedNavigationToolbar() = assertFocusedNavigationToolbar() - fun verifyHomeScreen() = assertHomeScreen() - fun verifyHomePrivateBrowsingButton() = assertHomePrivateBrowsingButton() - fun verifyHomeMenuButton() = assertHomeMenuButton() + fun verifyHomeScreen() = assertAppItemsWithResourceId(homeScreen) + + fun verifyHomeScreenAppBarItems() = + assertAppItemsWithResourceId(homeScreen, privateBrowsingButton, homepageWordmark) + + fun verifyHomeScreenWelcomeItems() = + assertAppItemsContainingText(welcomeHeader, welcomeSubHeader) + + fun verifyChooseYourThemeCard( + isDarkThemeChecked: Boolean, + isLightThemeChecked: Boolean, + isAutomaticThemeChecked: Boolean, + ) { + scrollToElementByText(getStringResource(R.string.onboarding_theme_picker_header)) + assertAppItemsContainingText( + chooseThemeHeader, + chooseThemeText, + darkThemeDescription, + lightThemeDescription, + ) + assertAppItemsStateWithResourceId( + darkThemeToggle(isDarkThemeChecked), + lightThemeToggle(isLightThemeChecked), + automaticThemeToggle(isAutomaticThemeChecked), + ) + assertAppItemsWithResourceIdAndDescription(automaticThemeDescription) + } + + fun verifyToolbarPlacementCard(isBottomChecked: Boolean, isTopChecked: Boolean) { + scrollToElementByText(getStringResource(R.string.onboarding_toolbar_placement_header_1)) + assertAppItemsContainingText(toolbarPlacementHeader, toolbarPlacementDescription) + assertAppItemsStateWithResourceId( + toolbarPlacementBottomRadioButton(isBottomChecked), + toolbarPlacementTopRadioButton(isTopChecked), + ) + assertAppItemsWithResourceId( + toolbarPlacementBottomImage, + toolbarPlacementBottomTitle, + toolbarPlacementTopImage, + toolbarPlacementTopTitle, + ) + } + + fun verifySignInToSyncCard() { + scrollToElementByText(getStringResource(R.string.onboarding_account_sign_in_header)) + assertAppItemsContainingText(startSyncHeader, startSyncDescription) + assertAppItemsWithResourceId(signInButton) + } + + fun verifyPrivacyProtectionCard(isStandardChecked: Boolean, isStrictChecked: Boolean) { + scrollToElementByText(getStringResource(R.string.onboarding_tracking_protection_header)) + assertAppItemsContainingText(privacyProtectionHeader, privacyProtectionDescription) + assertAppItemsStateWithResourceId( + standardTrackingProtectionToggle(isStandardChecked), + strictTrackingProtectionToggle(isStrictChecked), + ) + } + + fun verifyPrivacyNoticeCard() { + scrollToElementByText(getStringResource(R.string.onboarding_privacy_notice_header_1)) + assertAppItemsContainingText(privacyNoticeHeader, privacyNoticeDescription) + assertAppItemsWithResourceId(privacyNoticeButton) + } + + fun verifyStartBrowsingSection() { + scrollToElementByText(getStringResource(R.string.onboarding_finish)) + assertAppItemsWithResourceId(startBrowsingButton) + assertAppItemsContainingText(conclusionHeader) + } + + fun verifyNavigationToolbarItems(numberOfOpenTabs: String) { + assertAppItemsWithResourceId(navigationToolbar, menuButton) + assertAppItemsWithResourceIdAndText(tabCounter(numberOfOpenTabs)) + } + + fun verifyHomePrivateBrowsingButton() = assertAppItemsWithResourceId(privateBrowsingButton) + fun verifyHomeMenuButton() = assertAppItemsWithResourceId(menuButton) fun verifyTabButton() = assertTabButton() fun verifyCollectionsHeader() = assertCollectionsHeader() fun verifyNoCollectionsText() = assertNoCollectionsText() - fun verifyHomeWordmark() = assertHomeWordmark() + fun verifyHomeWordmark() = assertAppItemsWithResourceId(homepageWordmark) fun verifyHomeComponent() = assertHomeComponent() fun verifyDefaultSearchEngine(searchEngine: String) = verifySearchEngineIcon(searchEngine) - fun verifyNoTabsOpened() = assertNoTabsOpened() + fun verifyTabCounter(numberOfOpenTabs: String) = + assertAppItemsWithResourceIdAndText(tabCounter(numberOfOpenTabs)) fun verifyKeyboardVisible() = assertKeyboardVisibility(isExpectedToBeVisible = true) fun verifyWallpaperImageApplied(isEnabled: Boolean) { @@ -112,34 +184,13 @@ class HomeScreenRobot { } // First Run elements - fun verifyWelcomeHeader() = assertWelcomeHeader() - - fun verifyStartSyncHeader() = assertStartSyncHeader() - fun verifyAccountsSignInButton() = assertAccountsSignInButton() - fun verifyChooseThemeHeader() = assertChooseThemeHeader() - fun verifyChooseThemeText() = assertChooseThemeText() - fun verifyLightThemeToggle() = assertLightThemeToggle() - fun verifyLightThemeDescription() = assertLightThemeDescription() - fun verifyDarkThemeToggle() = assertDarkThemeToggle() - fun verifyDarkThemeDescription() = assertDarkThemeDescription() - fun verifyAutomaticThemeToggle() = assertAutomaticThemeToggle() - fun verifyAutomaticThemeDescription() = assertAutomaticThemeDescription() - fun verifyAutomaticPrivacyHeader() = assertAutomaticPrivacyHeader() - fun verifyAutomaticPrivacyText() = assertAlwaysPrivacyText() - - // Pick your toolbar placement - fun verifyTakePositionHeader() = assertTakePlacementHeader() - fun verifyTakePositionElements() { - assertTakePlacementBottomRadioButton() - assertTakePacementTopRadioButton() + fun verifyWelcomeHeader() = assertAppItemsContainingText(welcomeHeader) + fun verifyAccountsSignInButton() = assertAppItemsWithResourceId(signInButton) + fun verifyStartBrowsingButton() { + scrollToElementByText(getStringResource(R.string.onboarding_finish)) + assertAppItemsWithResourceId(startBrowsingButton) } - // Your privacy - fun verifyYourPrivacyHeader() = assertYourPrivacyHeader() - fun verifyYourPrivacyText() = assertYourPrivacyText() - fun verifyPrivacyNoticeButton() = assertPrivacyNoticeButton() - fun verifyStartBrowsingButton() = assertStartBrowsingButton() - // Upgrading users onboarding dialog fun verifyUpgradingUserOnboardingFirstScreen(testRule: ComposeTestRule) { testRule.also { @@ -458,8 +509,8 @@ class HomeScreenRobot { } fun openSearch(interact: SearchRobot.() -> Unit): SearchRobot.Transition { - navigationToolbar().waitForExists(waitingTime) - navigationToolbar().click() + navigationToolbar.waitForExists(waitingTime) + navigationToolbar.click() SearchRobot().interact() return SearchRobot.Transition() @@ -470,7 +521,7 @@ class HomeScreenRobot { } fun clickStartBrowsingButton(interact: SearchRobot.() -> Unit): SearchRobot.Transition { - startBrowsingButton().click() + startBrowsingButton.click() SearchRobot().interact() return SearchRobot.Transition() @@ -491,8 +542,7 @@ class HomeScreenRobot { .waitForExists( waitingTime, ) - privateBrowsingButton() - .perform(click()) + privateBrowsingButton.click() } fun triggerPrivateBrowsingShortcutPrompt(interact: AddToHomeScreenRobot.() -> Unit): AddToHomeScreenRobot.Transition { @@ -503,8 +553,7 @@ class HomeScreenRobot { waitingTime, ) - privateBrowsingButton() - .perform(click()) + privateBrowsingButton.click() } AddToHomeScreenRobot().interact() @@ -518,7 +567,7 @@ class HomeScreenRobot { fun openNavigationToolbar(interact: NavigationToolbarRobot.() -> Unit): NavigationToolbarRobot.Transition { mDevice.findObject(UiSelector().resourceId("$packageName:id/toolbar")) .waitForExists(waitingTime) - navigationToolbar().click() + navigationToolbar.click() NavigationToolbarRobot().interact() return NavigationToolbarRobot.Transition() @@ -754,31 +803,10 @@ private fun assertKeyboardVisibility(isExpectedToBeVisible: Boolean) = .contains("mInputShown=true"), ) -private fun navigationToolbar() = mDevice.findObject(UiSelector().resourceId("$packageName:id/toolbar")) - -private fun assertNavigationToolbar() = assertTrue(navigationToolbar().waitForExists(waitingTime)) - private fun assertFocusedNavigationToolbar() = onView(allOf(withHint("Search or enter address"))) .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -private fun assertHomeScreen() { - mDevice.findObject(UiSelector().resourceId("$packageName:id/homeLayout")).waitForExists(waitingTime) - onView(ViewMatchers.withResourceName("homeLayout")) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -} - -private fun assertHomeMenuButton() = onView(ViewMatchers.withResourceName("menuButton")) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) - -private fun assertHomePrivateBrowsingButton() = - privateBrowsingButton() - .check(matches(isDisplayed())) - -private val homepageWordmark = onView(ViewMatchers.withResourceName("wordmark")) -private fun assertHomeWordmark() = - homepageWordmark.check(matches(withEffectiveVisibility(Visibility.VISIBLE))) - private fun assertTabButton() = onView(allOf(withId(R.id.tab_button), isDisplayed())) .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) @@ -801,8 +829,6 @@ private fun assertHomeComponent() = onView(ViewMatchers.withResourceName("sessionControlRecyclerView")) .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -private fun assertNoTabsOpened() = onView(withId(R.id.counter_text)).check(matches(withText("0"))) - private fun threeDotButton() = onView(allOf(withId(R.id.menuButton))) private fun verifySearchEngineIcon(searchEngineIcon: Bitmap, searchEngineName: String) { @@ -819,138 +845,6 @@ private fun verifySearchEngineIcon(searchEngineName: String) { verifySearchEngineIcon(defaultSearchEngine.icon, defaultSearchEngine.name) } -// First Run elements -private fun assertWelcomeHeader() = - assertTrue( - mDevice.findObject( - UiSelector().textContains( - getStringResource(R.string.onboarding_header_2), - ), - ).waitForExists(waitingTime), - ) - -private fun assertStartSyncHeader() { - scrollToElementByText(STRING_ONBOARDING_ACCOUNT_SIGN_IN_HEADER) - onView(allOf(withText(R.string.onboarding_account_sign_in_header))) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -} -private fun assertAccountsSignInButton() { - scrollToElementByText(getStringResource(R.string.onboarding_firefox_account_sign_in)) - onView(ViewMatchers.withResourceName("fxa_sign_in_button")) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -} - -private fun assertChooseThemeHeader() { - scrollToElementByText("Choose your theme") - onView(withText("Choose your theme")) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -} -private fun assertChooseThemeText() { - scrollToElementByText("Choose your theme") - onView(allOf(withText("Save some battery and your eyesight with dark mode."))) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -} - -private fun assertLightThemeToggle() { - scrollToElementByText("Choose your theme") - onView(ViewMatchers.withResourceName("theme_light_radio_button")) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -} - -private fun assertLightThemeDescription() { - scrollToElementByText("Choose your theme") - onView(allOf(withText("Light theme"))) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -} - -private fun assertDarkThemeToggle() { - scrollToElementByText("Choose your theme") - onView(ViewMatchers.withResourceName("theme_dark_radio_button")) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -} - -private fun assertDarkThemeDescription() { - scrollToElementByText("Choose your theme") - onView(allOf(withText("Dark theme"))) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -} -private fun assertAutomaticThemeToggle() { - scrollToElementByText("Choose your theme") - onView(withId(R.id.theme_automatic_radio_button)) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -} - -private fun assertAutomaticThemeDescription() { - scrollToElementByText("Choose your theme") - onView(allOf(withText("Automatic"))) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -} - -private fun assertAutomaticPrivacyHeader() { - scrollToElementByText(STRING_ONBOARDING_TRACKING_PROTECTION_HEADER) - onView(allOf(withText(STRING_ONBOARDING_TRACKING_PROTECTION_HEADER))) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -} - -private fun assertAlwaysPrivacyText() { - scrollToElementByText(STRING_ONBOARDING_TRACKING_PROTECTION_HEADER) - onView( - allOf( - withText( - "Featuring Total Cookie Protection to stop trackers from using cookies to stalk you across sites.", - ), - ), - ) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -} - -private fun assertYourPrivacyHeader() { - scrollToElementByText("You control your data") - onView(allOf(withText("You control your data"))) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -} - -private fun assertYourPrivacyText() { - scrollToElementByText("You control your data") - onView( - allOf( - withText( - "Firefox gives you control over what you share online and what you share with us.", - ), - ), - ) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -} - -private fun assertPrivacyNoticeButton() { - scrollToElementByText("You control your data") - onView(allOf(withText("Read our privacy notice"))) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -} - -private fun assertStartBrowsingButton() { - assertTrue(startBrowsingButton().waitForExists(waitingTime)) -} - -// Pick your toolbar placement -private fun assertTakePlacementHeader() { - scrollToElementByText(STRING_ONBOARDING_TOOLBAR_PLACEMENT_HEADER) - onView(allOf(withText(STRING_ONBOARDING_TOOLBAR_PLACEMENT_HEADER))) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -} - -private fun assertTakePacementTopRadioButton() { - scrollToElementByText(STRING_ONBOARDING_TOOLBAR_PLACEMENT_HEADER) - onView(ViewMatchers.withResourceName("toolbar_top_radio_button")) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -} - -private fun assertTakePlacementBottomRadioButton() { - scrollToElementByText(STRING_ONBOARDING_TOOLBAR_PLACEMENT_HEADER) - onView(ViewMatchers.withResourceName("toolbar_bottom_radio_button")) - .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) -} - private fun assertPrivateSessionMessage() = assertTrue( mDevice.findObject( @@ -1090,8 +984,6 @@ private fun assertPocketSectionIsDisplayed() = assertTrue(pocketSection().waitFo private fun assertPocketSectionIsNotDisplayed() = assertFalse(pocketSection().waitForExists(waitingTime)) -private fun privateBrowsingButton() = onView(withId(R.id.privateBrowsingButton)) - private fun saveTabsToCollectionButton() = onView(withId(R.id.add_tabs_to_collections_button)) private fun tabsCounter() = onView(withId(R.id.tab_button)) @@ -1108,15 +1000,6 @@ private fun recentBookmarksSection() = private fun pocketSection() = mDevice.findObject(UiSelector().textContains(getStringResource(R.string.pocket_stories_header_1))) -private fun startBrowsingButton(): UiObject { - val startBrowsingButton = mDevice.findObject(UiSelector().resourceId("$packageName:id/finish_button")) - homeScreenList() - .scrollIntoView(startBrowsingButton) - homeScreenList() - .ensureFullyVisible(startBrowsingButton) - return startBrowsingButton -} - private fun sponsoredShortcut(sponsoredShortcutTitle: String) = mDevice.findObject( By @@ -1127,6 +1010,126 @@ private fun sponsoredShortcut(sponsoredShortcutTitle: String) = private fun storyByTopicItem(composeTestRule: ComposeTestRule, position: Int) = composeTestRule.onNodeWithTag("pocket.categories").onChildAt(position - 1) +private fun appItemWithResourceId(resourceId: String) = + mDevice.findObject(UiSelector().resourceId(resourceId)) + +private fun appItemContainingText(itemText: String) = + mDevice.findObject(UiSelector().textContains(itemText)) + +private fun appItemStateWithResourceId(resourceId: String, state: Boolean) = + mDevice.findObject(UiSelector().resourceId(resourceId).checked(state)) + +private fun appItemWithResourceIdAndDescription(resourceId: String, description: String) = + mDevice.findObject(UiSelector().resourceId(resourceId).descriptionContains(description)) + +private fun appItemWithResourceIdAndText(resourceId: String, text: String) = + mDevice.findObject(UiSelector().resourceId(resourceId).text(text)) + +private fun assertAppItemsWithResourceId(vararg appItems: UiObject) { + for (appItem in appItems) { + assertTrue(appItem.waitForExists(waitingTime)) + } +} + +private fun assertAppItemsContainingText(vararg appItems: UiObject) { + for (appItem in appItems) { + assertTrue(appItem.waitForExists(waitingTime)) + } +} + +private fun assertAppItemsStateWithResourceId(vararg appItems: UiObject) { + for (appItem in appItems) { + assertTrue(appItem.waitForExists(waitingTime)) + } +} + +private fun assertAppItemsWithResourceIdAndDescription(vararg appItems: UiObject) { + for (appItem in appItems) { + assertTrue(appItem.waitForExists(waitingTime)) + } +} + +private fun assertAppItemsWithResourceIdAndText(vararg appItems: UiObject) { + for (appItem in appItems) { + assertTrue(appItem.waitForExists(waitingTime)) + } +} + +private val homeScreen = + appItemWithResourceId("$packageName:id/homeLayout") +private val privateBrowsingButton = + appItemWithResourceId("$packageName:id/privateBrowsingButton") +private val homepageWordmark = + appItemWithResourceId("$packageName:id/wordmark") +private val welcomeHeader = appItemContainingText(getStringResource(R.string.onboarding_header_2)) +private val welcomeSubHeader = + appItemContainingText(getStringResource(R.string.onboarding_message)) +private val chooseThemeHeader = + appItemContainingText(getStringResource(R.string.onboarding_theme_picker_header)) +private val chooseThemeText = + appItemContainingText(getStringResource(R.string.onboarding_theme_picker_description_2)) +private val darkThemeDescription = + appItemContainingText(getStringResource(R.string.onboarding_theme_dark_title)) +private val lightThemeDescription = + appItemContainingText(getStringResource(R.string.onboarding_theme_light_title)) +private val automaticThemeDescription = + appItemWithResourceIdAndDescription( + "$packageName:id/clickable_region_automatic", + "${getStringResource(R.string.onboarding_theme_automatic_title)} ${getStringResource(R.string.onboarding_theme_automatic_summary)}", + ) +private fun darkThemeToggle(isChecked: Boolean) = + appItemStateWithResourceId("$packageName:id/theme_dark_radio_button", isChecked) +private fun lightThemeToggle(isChecked: Boolean) = + appItemStateWithResourceId("$packageName:id/theme_light_radio_button", isChecked) +private fun automaticThemeToggle(isChecked: Boolean) = + appItemStateWithResourceId("$packageName:id/theme_automatic_radio_button", isChecked) +private val toolbarPlacementHeader = + appItemContainingText(getStringResource(R.string.onboarding_toolbar_placement_header_1)) +private val toolbarPlacementDescription = + appItemContainingText(getStringResource(R.string.onboarding_toolbar_placement_description)) +private fun toolbarPlacementBottomRadioButton(isChecked: Boolean) = + appItemStateWithResourceId("$packageName:id/toolbar_bottom_radio_button", isChecked) +private fun toolbarPlacementTopRadioButton(isChecked: Boolean) = + appItemStateWithResourceId("$packageName:id/toolbar_top_radio_button", isChecked) +private val toolbarPlacementBottomImage = + appItemWithResourceId("$packageName:id/toolbar_bottom_image") +private val toolbarPlacementBottomTitle = + appItemWithResourceId("$packageName:id/toolbar_bottom_title") +private val toolbarPlacementTopTitle = + appItemWithResourceId("$packageName:id/toolbar_top_title") +private val toolbarPlacementTopImage = + appItemWithResourceId("$packageName:id/toolbar_top_image") +private val startSyncHeader = + appItemContainingText(getStringResource(R.string.onboarding_account_sign_in_header)) +private val startSyncDescription = + appItemContainingText(getStringResource(R.string.onboarding_manual_sign_in_description)) +private val signInButton = + appItemWithResourceId("$packageName:id/fxa_sign_in_button") +private val privacyProtectionHeader = + appItemContainingText(getStringResource(R.string.onboarding_tracking_protection_header)) +private val privacyProtectionDescription = + appItemContainingText(getStringResource(R.string.onboarding_tracking_protection_description)) +private fun standardTrackingProtectionToggle(isChecked: Boolean) = + appItemStateWithResourceId("$packageName:id/tracking_protection_standard_option", isChecked) +private fun strictTrackingProtectionToggle(isChecked: Boolean) = + appItemStateWithResourceId("$packageName:id/tracking_protection_strict_default", isChecked) +private val privacyNoticeHeader = + appItemContainingText(getStringResource(R.string.onboarding_privacy_notice_header_1)) +private val privacyNoticeDescription = + appItemContainingText(getStringResource(R.string.onboarding_privacy_notice_description)) +private val privacyNoticeButton = + appItemWithResourceId("$packageName:id/read_button") +private val startBrowsingButton = + appItemWithResourceId("$packageName:id/finish_button") +private val conclusionHeader = + appItemContainingText(getStringResource(R.string.onboarding_conclusion_header)) +private val navigationToolbar = + appItemWithResourceId("$packageName:id/toolbar") +private val menuButton = + appItemWithResourceId("$packageName:id/menuButton") +private fun tabCounter(numberOfOpenTabs: String) = + appItemWithResourceIdAndText("$packageName:id/counter_text", numberOfOpenTabs) + val deleteFromHistory = onView( allOf( diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/util/Strings.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/util/Strings.kt index 729200c54..bc9544f72 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/util/Strings.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/util/Strings.kt @@ -4,9 +4,6 @@ package org.mozilla.fenix.ui.util -const val STRING_ONBOARDING_ACCOUNT_SIGN_IN_HEADER = "Pick up where you left off" -const val STRING_ONBOARDING_TRACKING_PROTECTION_HEADER = "Privacy protection by default" -const val STRING_ONBOARDING_TOOLBAR_PLACEMENT_HEADER = "Pick your toolbar placement" const val FRENCH_LANGUAGE_HEADER = "Langues" const val ROMANIAN_LANGUAGE_HEADER = "Limbă" const val ARABIC_LANGUAGE_HEADER = "اللغة"