diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeTabbedBrowsingTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeTabbedBrowsingTest.kt index 12d554f8a..330e5eeac 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeTabbedBrowsingTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeTabbedBrowsingTest.kt @@ -375,4 +375,17 @@ class ComposeTabbedBrowsingTest { verifyNavigationToolbar() } } + + @Test + fun verifySyncedTabsWhenUserIsNotSignedInTest() { + navigationToolbar { + }.openComposeTabDrawer(composeTestRule) { + verifySyncedTabsButtonIsSelected(isSelected = false) + }.toggleToSyncedTabs { + verifySyncedTabsButtonIsSelected(isSelected = true) + verifySyncedTabsListWhenUserIsNotSignedIn() + }.clickSignInToSyncButton { + verifyTurnOnSyncMenu() + } + } } 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 0ff24a5a8..613a97f4b 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/TabbedBrowsingTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/TabbedBrowsingTest.kt @@ -363,4 +363,18 @@ class TabbedBrowsingTest { verifyNavigationToolbar() } } + + @Test + fun verifySyncedTabsWhenUserIsNotSignedInTest() { + navigationToolbar { + }.openTabTray { + verifySyncedTabsButtonIsSelected(isSelected = false) + clickSyncedTabsButton() + }.toggleToSyncedTabs { + verifySyncedTabsButtonIsSelected(isSelected = true) + verifySyncedTabsListWhenUserIsNotSignedIn() + }.clickSignInToSyncButton { + verifyTurnOnSyncMenu() + } + } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ComposeTabDrawerRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ComposeTabDrawerRobot.kt index c2ad5a05a..33bbdb7b6 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ComposeTabDrawerRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ComposeTabDrawerRobot.kt @@ -40,9 +40,11 @@ import org.hamcrest.Matcher import org.mozilla.fenix.R import org.mozilla.fenix.helpers.Constants import org.mozilla.fenix.helpers.HomeActivityComposeTestRule +import org.mozilla.fenix.helpers.MatcherHelper.assertItemContainingTextExists import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText import org.mozilla.fenix.helpers.TestAssetHelper import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime +import org.mozilla.fenix.helpers.TestHelper.getStringResource import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.clickAtLocationInView import org.mozilla.fenix.helpers.idlingresource.BottomSheetBehaviorStateIdlingResource @@ -79,6 +81,15 @@ class ComposeTabDrawerRobot(private val composeTestRule: HomeActivityComposeTest } } + fun verifySyncedTabsListWhenUserIsNotSignedIn() { + verifySyncedTabsList() + assertItemContainingTextExists( + itemContainingText(getStringResource(R.string.synced_tabs_sign_in_message)), + itemContainingText(getStringResource(R.string.sync_sign_in)), + itemContainingText(getStringResource(R.string.tab_drawer_fab_sync)), + ) + } + fun verifyExistingOpenTabs(vararg titles: String) { titles.forEach { title -> itemContainingText(title).waitForExists(waitingTime) @@ -287,6 +298,19 @@ class ComposeTabDrawerRobot(private val composeTestRule: HomeActivityComposeTest return Transition(composeTestRule) } + fun toggleToSyncedTabs(interact: ComposeTabDrawerRobot.() -> Unit): Transition { + composeTestRule.syncedTabsButton().performClick() + ComposeTabDrawerRobot(composeTestRule).interact() + return Transition(composeTestRule) + } + + fun clickSignInToSyncButton(interact: SyncSignInRobot.() -> Unit): SyncSignInRobot.Transition { + itemContainingText(getStringResource(R.string.sync_sign_in)) + .clickAndWaitForNewWindow(TestAssetHelper.waitingTimeShort) + SyncSignInRobot().interact() + return SyncSignInRobot.Transition() + } + fun openThreeDotMenu(interact: ComposeTabDrawerRobot.() -> Unit): Transition { composeTestRule.threeDotButton().performClick() ComposeTabDrawerRobot(composeTestRule).interact() diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt index 445e88297..1a9141134 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/NavigationToolbarRobot.kt @@ -8,6 +8,7 @@ package org.mozilla.fenix.ui.robots import android.net.Uri import android.os.Build +import androidx.compose.ui.test.onNodeWithTag import androidx.recyclerview.widget.RecyclerView import androidx.test.espresso.Espresso.onView import androidx.test.espresso.IdlingRegistry @@ -32,7 +33,9 @@ import org.hamcrest.CoreMatchers.not import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.mozilla.fenix.R +import org.mozilla.fenix.helpers.Constants import org.mozilla.fenix.helpers.Constants.LONG_CLICK_DURATION +import org.mozilla.fenix.helpers.HomeActivityComposeTestRule import org.mozilla.fenix.helpers.MatcherHelper.itemWithResId import org.mozilla.fenix.helpers.MatcherHelper.itemWithResIdContainingText import org.mozilla.fenix.helpers.SessionLoadedIdlingResource @@ -41,8 +44,10 @@ import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeShort import org.mozilla.fenix.helpers.TestHelper.getStringResource import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.TestHelper.packageName +import org.mozilla.fenix.helpers.TestHelper.waitForObjects import org.mozilla.fenix.helpers.click import org.mozilla.fenix.helpers.ext.waitNotNull +import org.mozilla.fenix.tabstray.TabsTrayTestTag /** * Implementation of Robot Pattern for the URL toolbar. @@ -226,6 +231,37 @@ class NavigationToolbarRobot { return TabDrawerRobot.Transition() } + fun openComposeTabDrawer(composeTestRule: HomeActivityComposeTestRule, interact: ComposeTabDrawerRobot.() -> Unit): ComposeTabDrawerRobot.Transition { + for (i in 1..Constants.RETRY_COUNT) { + try { + mDevice.waitForObjects( + mDevice.findObject( + UiSelector() + .resourceId("$packageName:id/mozac_browser_toolbar_browser_actions"), + ), + waitingTime, + ) + + tabTrayButton().click() + + composeTestRule.onNodeWithTag(TabsTrayTestTag.tabsTray).assertExists() + + break + } catch (e: AssertionError) { + if (i == Constants.RETRY_COUNT) { + throw e + } else { + mDevice.waitForIdle() + } + } + } + + composeTestRule.onNodeWithTag(TabsTrayTestTag.fab).assertExists() + + ComposeTabDrawerRobot(composeTestRule).interact() + return ComposeTabDrawerRobot.Transition(composeTestRule) + } + fun visitLinkFromClipboard(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { if (clearAddressBarButton().waitForExists(waitingTimeShort)) { clearAddressBarButton().click() diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SyncSignInRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SyncSignInRobot.kt index 403f38730..9392ccffe 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SyncSignInRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SyncSignInRobot.kt @@ -25,7 +25,16 @@ import org.mozilla.fenix.helpers.click class SyncSignInRobot { fun verifyAccountSettingsMenuHeader() = assertAccountSettingsMenuHeader() - fun verifyTurnOnSyncMenu() = assertTurnOnSyncMenu() + fun verifyTurnOnSyncMenu() { + mDevice.findObject(UiSelector().resourceId("$packageName:id/container")).waitForExists(waitingTime) + assertTrue( + mDevice.findObject( + UiSelector() + .resourceId("$packageName:id/signInScanButton") + .resourceId("$packageName:id/signInEmailButton"), + ).waitForExists(waitingTime), + ) + } class Transition { fun goBack(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { @@ -46,14 +55,3 @@ private fun assertAccountSettingsMenuHeader() { onView(withText(R.string.preferences_account_settings)) .check((matches(withEffectiveVisibility(Visibility.VISIBLE)))) } - -private fun assertTurnOnSyncMenu() { - mDevice.findObject(UiSelector().resourceId("$packageName:id/container")).waitForExists(waitingTime) - assertTrue( - mDevice.findObject( - UiSelector() - .resourceId("$packageName:id/signInScanButton") - .resourceId("$packageName:id/signInEmailButton"), - ).waitForExists(waitingTime), - ) -} diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt index 0412ff9b5..5f1aef646 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/TabDrawerRobot.kt @@ -39,6 +39,8 @@ import org.hamcrest.Matcher import org.mozilla.fenix.R import org.mozilla.fenix.helpers.Constants.LONG_CLICK_DURATION import org.mozilla.fenix.helpers.Constants.RETRY_COUNT +import org.mozilla.fenix.helpers.MatcherHelper.assertItemContainingTextExists +import org.mozilla.fenix.helpers.MatcherHelper.assertItemWithResIdAndDescriptionExists import org.mozilla.fenix.helpers.MatcherHelper.assertItemWithResIdAndTextExists import org.mozilla.fenix.helpers.MatcherHelper.assertItemWithResIdExists import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText @@ -48,6 +50,7 @@ import org.mozilla.fenix.helpers.MatcherHelper.itemWithResIdContainingText import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeLong import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeShort +import org.mozilla.fenix.helpers.TestHelper.getStringResource import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.TestHelper.packageName import org.mozilla.fenix.helpers.TestHelper.scrollToElementByText @@ -81,7 +84,9 @@ class TabDrawerRobot { assertPrivateBrowsingButtonIsSelected(isSelected) fun verifySyncedTabsButtonIsSelected(isSelected: Boolean) = - assertSyncedTabsButtonIsSelected(isSelected) + syncedTabsButton().check(matches(isSelected(isSelected))) + + fun clickSyncedTabsButton() = syncedTabsButton().click() fun verifyExistingOpenTabs(vararg titles: String) = assertExistingOpenTabs(*titles) fun verifyNoExistingOpenTabs(vararg titles: String) = assertNoExistingOpenTabs(*titles) @@ -272,6 +277,20 @@ class TabDrawerRobot { itemContainingText("$numOfTabs selected"), ) + fun verifySyncedTabsListWhenUserIsNotSignedIn() { + assertItemWithResIdExists(itemWithResId("$packageName:id/tabsTray")) + assertItemContainingTextExists( + itemContainingText(getStringResource(R.string.synced_tabs_sign_in_message)), + itemContainingText(getStringResource(R.string.sync_sign_in)), + ) + assertItemWithResIdAndDescriptionExists( + itemWithResIdAndDescription( + "$packageName:id/new_tab_button", + getStringResource(R.string.resync_button_content_description), + ), + ) + } + class Transition { fun openTabDrawer(interact: TabDrawerRobot.() -> Unit): Transition { mDevice.waitForIdle(waitingTime) @@ -315,6 +334,19 @@ class TabDrawerRobot { return Transition() } + fun toggleToSyncedTabs(interact: TabDrawerRobot.() -> Unit): Transition { + syncedTabsButton().perform(click()) + TabDrawerRobot().interact() + return Transition() + } + + fun clickSignInToSyncButton(interact: SyncSignInRobot.() -> Unit): Transition { + itemContainingText(getStringResource(R.string.sync_sign_in)) + .clickAndWaitForNewWindow(waitingTimeShort) + SyncSignInRobot().interact() + return Transition() + } + fun openTabsListThreeDotMenu(interact: ThreeDotMenuMainRobot.() -> Unit): ThreeDotMenuMainRobot.Transition { threeDotMenu().perform(click()) @@ -593,10 +625,6 @@ private fun assertPrivateBrowsingButtonIsSelected(isSelected: Boolean) { privateBrowsingButton().check(matches(isSelected(isSelected))) } -private fun assertSyncedTabsButtonIsSelected(isSelected: Boolean) { - syncedTabsButton().check(matches(isSelected(isSelected))) -} - private val tabsList = UiScrollable(UiSelector().className("androidx.recyclerview.widget.RecyclerView"))