From b8877c2388bbc44f574030c721d095b15ef6a26c Mon Sep 17 00:00:00 2001 From: AndiAJ Date: Fri, 23 Dec 2022 09:19:28 +0200 Subject: [PATCH] Bug 1807302 - New sponsored shortcuts UI tests and other refactoring work --- .../org/mozilla/fenix/helpers/Constants.kt | 16 ++ .../org/mozilla/fenix/helpers/TestHelper.kt | 16 ++ .../fenix/ui/SponsoredShortcutsTest.kt | 249 ++++++++++++++++++ .../java/org/mozilla/fenix/ui/TopSitesTest.kt | 83 +----- .../fenix/ui/robots/HomeScreenRobot.kt | 48 ++-- .../fenix/ui/robots/ThreeDotMenuMainRobot.kt | 22 +- 6 files changed, 335 insertions(+), 99 deletions(-) create mode 100644 app/src/androidTest/java/org/mozilla/fenix/ui/SponsoredShortcutsTest.kt diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/Constants.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/Constants.kt index f404e990e..eb0888984 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/Constants.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/Constants.kt @@ -4,6 +4,8 @@ package org.mozilla.fenix.helpers +import org.mozilla.fenix.helpers.TestHelper.getSponsoredShortcutTitle + object Constants { // Device or AVD requires a Google Services Android OS installation @@ -28,4 +30,18 @@ object Constants { "Bing" to "firefox&pc=MOZB&form=MOZMBA", "DuckDuckGo" to "t=fpas", ) + + val firstSponsoredShortcutTitle by lazy { getSponsoredShortcutTitle(2) } + val secondSponsoredShortcutTitle by lazy { getSponsoredShortcutTitle(3) } + + // Expected for en-us defaults + val defaultTopSitesList by lazy { + mapOf( + "Google" to "Google", + "First sponsored shortcut" to firstSponsoredShortcutTitle, + "Second sponsored shortcut" to secondSponsoredShortcutTitle, + "Top Articles" to "Top Articles", + "Wikipedia" to "Wikipedia", + ) + } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt b/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt index 6d9282635..e65263cb4 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/helpers/TestHelper.kt @@ -445,4 +445,20 @@ object TestHelper { clipBoard.setPrimaryClip(clipData) } + + /** + * Returns sponsored shortcut title based on the index. + */ + fun getSponsoredShortcutTitle(position: Int): String { + val sponsoredShortcut = mDevice.findObject( + UiSelector() + .resourceId("$packageName:id/top_site_item") + .index(position - 1), + ).getChild( + UiSelector() + .resourceId("$packageName:id/top_site_title"), + ).text + + return sponsoredShortcut + } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SponsoredShortcutsTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SponsoredShortcutsTest.kt new file mode 100644 index 000000000..f016fdf93 --- /dev/null +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SponsoredShortcutsTest.kt @@ -0,0 +1,249 @@ +/* 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.customannotations.SmokeTest +import org.mozilla.fenix.helpers.AndroidAssetDispatcher +import org.mozilla.fenix.helpers.Constants.defaultTopSitesList +import org.mozilla.fenix.helpers.HomeActivityIntentTestRule +import org.mozilla.fenix.helpers.TestAssetHelper +import org.mozilla.fenix.helpers.TestHelper.exitMenu +import org.mozilla.fenix.helpers.TestHelper.getSponsoredShortcutTitle +import org.mozilla.fenix.ui.robots.homeScreen + +/** + * Tests Sponsored shortcuts functionality + */ + +class SponsoredShortcutsTest { + private lateinit var mDevice: UiDevice + private lateinit var mockWebServer: MockWebServer + private val defaultSearchEngine = "Amazon.com" + private lateinit var sponsoredShortcutTitle: String + private lateinit var sponsoredShortcutTitle2: String + + @get:Rule + val activityIntentTestRule = HomeActivityIntentTestRule.withDefaultSettingsOverrides(skipOnboarding = true) + + @Before + fun setUp() { + mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) + mockWebServer = MockWebServer().apply { + dispatcher = AndroidAssetDispatcher() + start() + } + } + + @After + fun tearDown() { + mockWebServer.shutdown() + } + + // Expected for en-us defaults + @SmokeTest + @Test + fun verifySponsoredShortcutsListTest() { + homeScreen { + defaultTopSitesList.values.forEach { value -> + verifyExistingTopSitesTabs(value) + } + }.openThreeDotMenu { + }.openCustomizeHome { + verifySponsoredShortcutsCheckBox(true) + clickSponsoredShortcuts() + verifySponsoredShortcutsCheckBox(false) + }.goBack { + verifyNotExistingSponsoredTopSitesList() + } + } + + @Test + fun openSponsoredShortcutTest() { + homeScreen { + sponsoredShortcutTitle = getSponsoredShortcutTitle(2) + }.openSponsoredShortcut(sponsoredShortcutTitle) { + verifyUrl(sponsoredShortcutTitle) + } + } + + @Test + fun openSponsoredShortcutInPrivateBrowsingTest() { + homeScreen { + sponsoredShortcutTitle = getSponsoredShortcutTitle(2) + }.openContextMenuOnSponsoredShortcut(sponsoredShortcutTitle) { + }.openTopSiteInPrivateTab { + verifyUrl(sponsoredShortcutTitle) + } + } + + @Ignore("Failing, see: https://github.com/mozilla-mobile/fenix/issues/25926") + @Test + fun verifySponsorsAndPrivacyLinkTest() { + homeScreen { + sponsoredShortcutTitle = getSponsoredShortcutTitle(2) + }.openContextMenuOnSponsoredShortcut(sponsoredShortcutTitle) { + }.clickSponsorsAndPrivacyButton { + verifyUrl("support.mozilla.org/en-US/kb/sponsor-privacy") + } + } + + @Test + fun verifySponsoredShortcutsSettingsOptionTest() { + homeScreen { + sponsoredShortcutTitle = getSponsoredShortcutTitle(2) + }.openContextMenuOnSponsoredShortcut(sponsoredShortcutTitle) { + }.clickSponsoredShortcutsSettingsButton { + verifyHomePageView() + } + } + + @Test + fun verifySponsoredShortcutsDetailsTest() { + homeScreen { + sponsoredShortcutTitle = getSponsoredShortcutTitle(2) + sponsoredShortcutTitle2 = getSponsoredShortcutTitle(3) + + verifySponsoredShortcutDetails(sponsoredShortcutTitle, 2) + verifySponsoredShortcutDetails(sponsoredShortcutTitle2, 3) + } + } + + // The default search engine should not be displayed as a sponsored shortcut + @Test + fun defaultSearchEngineIsNotDisplayedAsSponsoredShortcutTest() { + val sponsoredShortcutTitle = "Amazon" + + homeScreen { + }.openThreeDotMenu { + }.openSettings { + }.openSearchSubMenu { + changeDefaultSearchEngine(defaultSearchEngine) + } + + exitMenu() + + homeScreen { + verifySponsoredShortcutDoesNotExist(sponsoredShortcutTitle, 2) + verifySponsoredShortcutDoesNotExist(sponsoredShortcutTitle, 3) + } + } + + // 1 sponsored shortcut should be displayed if there are 7 pinned top sites + @Test + fun verifySponsoredShortcutsListWithSevenPinnedSitesTest() { + val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + val secondWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2) + val thirdWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 3) + val fourthWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 4) + + homeScreen { + sponsoredShortcutTitle = getSponsoredShortcutTitle(2) + sponsoredShortcutTitle2 = getSponsoredShortcutTitle(3) + + verifySponsoredShortcutDetails(sponsoredShortcutTitle, 2) + verifySponsoredShortcutDetails(sponsoredShortcutTitle2, 3) + }.openNavigationToolbar { + }.enterURLAndEnterToBrowser(firstWebPage.url) { + verifyPageContent(firstWebPage.content) + }.openThreeDotMenu { + expandMenu() + }.addToFirefoxHome { + }.goToHomescreen { + verifyExistingTopSitesTabs(firstWebPage.title) + }.openNavigationToolbar { + }.enterURLAndEnterToBrowser(secondWebPage.url) { + verifyPageContent(secondWebPage.content) + }.openThreeDotMenu { + expandMenu() + }.addToFirefoxHome { + }.goToHomescreen { + verifyExistingTopSitesTabs(secondWebPage.title) + }.openNavigationToolbar { + }.enterURLAndEnterToBrowser(thirdWebPage.url) { + verifyPageContent(thirdWebPage.content) + }.openThreeDotMenu { + expandMenu() + }.addToFirefoxHome { + }.goToHomescreen { + verifyExistingTopSitesTabs(thirdWebPage.title) + }.openNavigationToolbar { + }.enterURLAndEnterToBrowser(fourthWebPage.url) { + verifyPageContent(fourthWebPage.content) + }.openThreeDotMenu { + expandMenu() + }.addToFirefoxHome { + }.goToHomescreen { + verifySponsoredShortcutDetails(sponsoredShortcutTitle, 2) + verifySponsoredShortcutDoesNotExist(sponsoredShortcutTitle2, 3) + } + } + + // No sponsored shortcuts should be displayed if there are 8 pinned top sites + @Test + fun verifySponsoredShortcutsListWithEightPinnedSitesTest() { + val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) + val secondWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2) + val thirdWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 3) + val fourthWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 4) + val fifthWebPage = TestAssetHelper.getLoremIpsumAsset(mockWebServer) + + homeScreen { + sponsoredShortcutTitle = getSponsoredShortcutTitle(2) + sponsoredShortcutTitle2 = getSponsoredShortcutTitle(3) + + verifySponsoredShortcutDetails(sponsoredShortcutTitle, 2) + verifySponsoredShortcutDetails(sponsoredShortcutTitle2, 3) + }.openNavigationToolbar { + }.enterURLAndEnterToBrowser(firstWebPage.url) { + verifyPageContent(firstWebPage.content) + }.openThreeDotMenu { + expandMenu() + }.addToFirefoxHome { + }.goToHomescreen { + verifyExistingTopSitesTabs(firstWebPage.title) + }.openNavigationToolbar { + }.enterURLAndEnterToBrowser(secondWebPage.url) { + verifyPageContent(secondWebPage.content) + }.openThreeDotMenu { + expandMenu() + }.addToFirefoxHome { + }.goToHomescreen { + verifyExistingTopSitesTabs(secondWebPage.title) + }.openNavigationToolbar { + }.enterURLAndEnterToBrowser(thirdWebPage.url) { + verifyPageContent(thirdWebPage.content) + }.openThreeDotMenu { + expandMenu() + }.addToFirefoxHome { + }.goToHomescreen { + verifyExistingTopSitesTabs(thirdWebPage.title) + }.openNavigationToolbar { + }.enterURLAndEnterToBrowser(fourthWebPage.url) { + verifyPageContent(fourthWebPage.content) + }.openThreeDotMenu { + expandMenu() + }.addToFirefoxHome { + }.goToHomescreen { + verifyExistingTopSitesTabs(fourthWebPage.title) + }.openNavigationToolbar { + }.enterURLAndEnterToBrowser(fifthWebPage.url) { + verifyPageContent(fifthWebPage.content) + }.openThreeDotMenu { + expandMenu() + }.addToFirefoxHome { + }.goToHomescreen { + verifySponsoredShortcutDoesNotExist(sponsoredShortcutTitle, 2) + verifySponsoredShortcutDoesNotExist(sponsoredShortcutTitle2, 3) + } + } +} diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/TopSitesTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/TopSitesTest.kt index 6995418b1..43e632a0a 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/TopSitesTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/TopSitesTest.kt @@ -9,12 +9,12 @@ 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.R import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.helpers.AndroidAssetDispatcher +import org.mozilla.fenix.helpers.Constants.defaultTopSitesList import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.RetryTestRule import org.mozilla.fenix.helpers.TestAssetHelper.getGenericAsset @@ -214,21 +214,15 @@ class TopSitesTest { } } + // Expected for en-us defaults @Test - fun verifyDefaultTopSitesLocale_EN() { - // en-US defaults - val defaultTopSites = arrayOf( - "Top Articles", - "Wikipedia", - "Google", - ) - + fun verifyDefaultTopSitesList() { homeScreen { }.dismissOnboarding() homeScreen { verifyExistingTopSitesList() - defaultTopSites.forEach { item -> - verifyExistingTopSitesTabs(item) + defaultTopSitesList.values.forEach { value -> + verifyExistingTopSitesTabs(value) } } } @@ -258,71 +252,4 @@ class TopSitesTest { verifyEmptyHistoryView() } } - - @SmokeTest - @Test - fun verifySponsoredShortcutsListTest() { - homeScreen { - var sponsoredShortcutTitle = getSponsoredShortcutTitle(2) - var sponsoredShortcutTitle2 = getSponsoredShortcutTitle(3) - - verifyExistingSponsoredTopSitesTabs(sponsoredShortcutTitle, 2) - verifyExistingSponsoredTopSitesTabs(sponsoredShortcutTitle2, 3) - }.openThreeDotMenu { - }.openCustomizeHome { - verifySponsoredShortcutsCheckBox(true) - clickSponsoredShortcuts() - verifySponsoredShortcutsCheckBox(false) - }.goBack { - verifyNotExistingSponsoredTopSitesList() - } - } - - @Test - fun openSponsoredShortcutTest() { - var sponsoredShortcutTitle = "" - - homeScreen { - sponsoredShortcutTitle = getSponsoredShortcutTitle(2) - }.openSponsoredShortcut(sponsoredShortcutTitle) { - verifyUrl(sponsoredShortcutTitle) - } - } - - @Test - fun openSponsoredShortcutInPrivateBrowsingTest() { - var sponsoredShortcutTitle = "" - - homeScreen { - sponsoredShortcutTitle = getSponsoredShortcutTitle(2) - }.openContextMenuOnSponsoredShortcut(sponsoredShortcutTitle) { - }.openTopSiteInPrivateTab { - verifyUrl(sponsoredShortcutTitle) - } - } - - @Ignore("Failing, see: https://github.com/mozilla-mobile/fenix/issues/25926") - @Test - fun verifySponsoredShortcutsSponsorsAndPrivacyOptionTest() { - var sponsoredShortcutTitle = "" - - homeScreen { - sponsoredShortcutTitle = getSponsoredShortcutTitle(2) - }.openContextMenuOnSponsoredShortcut(sponsoredShortcutTitle) { - }.clickSponsorsAndPrivacyButton { - verifyUrl("support.mozilla.org/en-US/kb/sponsor-privacy") - } - } - - @Test - fun verifySponsoredShortcutsSettingsOptionTest() { - var sponsoredShortcutTitle = "" - - homeScreen { - sponsoredShortcutTitle = getSponsoredShortcutTitle(2) - }.openContextMenuOnSponsoredShortcut(sponsoredShortcutTitle) { - }.clickSponsoredShortcutsSettingsButton { - verifyHomePageView() - } - } } 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 57853c985..11a8920c3 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 @@ -245,9 +245,24 @@ class HomeScreenRobot { fun verifyExistingTopSitesList() = assertExistingTopSitesList() fun verifyNotExistingTopSitesList(title: String) = assertNotExistingTopSitesList(title) + fun verifySponsoredShortcutDoesNotExist(sponsoredShortcutTitle: String, position: Int) = + assertFalse( + mDevice.findObject( + UiSelector() + .resourceId("$packageName:id/top_site_item") + .index(position - 1), + ).getChild( + UiSelector() + .textContains(sponsoredShortcutTitle), + ).waitForExists(waitingTime), + ) fun verifyNotExistingSponsoredTopSitesList() = assertSponsoredTopSitesNotDisplayed() fun verifyExistingTopSitesTabs(title: String) = assertExistingTopSitesTabs(title) - fun verifyExistingSponsoredTopSitesTabs(sponsoredShortcutTitle: String, position: Int) = assertSponsoredTopSiteIsDisplayed(sponsoredShortcutTitle, position) + fun verifySponsoredShortcutDetails(sponsoredShortcutTitle: String, position: Int) { + assertSponsoredShortcutLogoIsDisplayed(position) + assertSponsoredShortcutTitle(sponsoredShortcutTitle, position) + assertSponsoredSubtitleIsDisplayed(position) + } fun verifyTopSiteContextMenuItems() = assertTopSiteContextMenuItems() fun verifyJumpBackInSectionIsDisplayed() = assertJumpBackInSectionIsDisplayed() @@ -434,19 +449,6 @@ class HomeScreenRobot { } } - fun getSponsoredShortcutTitle(position: Int): String { - val sponsoredShortcut = mDevice.findObject( - UiSelector() - .resourceId("$packageName:id/top_site_item") - .index(position - 1), - ).getChild( - UiSelector() - .resourceId("$packageName:id/top_site_title"), - ).text - - return sponsoredShortcut - } - fun verifyJumpBackInMessage() { assertTrue( mDevice.findObject( @@ -880,10 +882,17 @@ private fun assertExistingTopSitesTabs(title: String) { .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) } -private fun assertSponsoredTopSiteIsDisplayed(sponsoredShortcutTitle: String, position: Int) { - assertSponsoredShortcutTitle(sponsoredShortcutTitle, position) - assertSponsoredSubtitleIsDisplayed(position) -} +private fun assertSponsoredShortcutLogoIsDisplayed(position: Int) = + assertTrue( + mDevice.findObject( + UiSelector() + .resourceId("$packageName:id/top_site_item") + .index(position - 1), + ).getChild( + UiSelector() + .resourceId("$packageName:id/favicon_card"), + ).waitForExists(waitingTime), + ) private fun assertSponsoredSubtitleIsDisplayed(position: Int) = assertTrue( @@ -897,7 +906,7 @@ private fun assertSponsoredSubtitleIsDisplayed(position: Int) = ).waitForExists(waitingTime), ) -private fun assertSponsoredShortcutTitle(sponsoredShortcutTitle: String, position: Int) { +private fun assertSponsoredShortcutTitle(sponsoredShortcutTitle: String, position: Int) = assertTrue( mDevice.findObject( UiSelector() @@ -908,7 +917,6 @@ private fun assertSponsoredShortcutTitle(sponsoredShortcutTitle: String, positio .textContains(sponsoredShortcutTitle), ).waitForExists(waitingTime), ) -} private fun assertNotExistingTopSitesList(title: String) { mDevice.findObject(UiSelector().text(title)).waitUntilGone(waitingTime) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt index 5a0e458ed..5593a0f06 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt @@ -21,6 +21,7 @@ import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText import androidx.test.uiautomator.By +import androidx.test.uiautomator.UiObjectNotFoundException import androidx.test.uiautomator.UiSelector import androidx.test.uiautomator.Until import org.hamcrest.Matchers.allOf @@ -340,7 +341,26 @@ class ThreeDotMenuMainRobot { } fun addToFirefoxHome(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { - addToShortcutsButton.click() + for (i in 1..RETRY_COUNT) { + try { + addToShortcutsButton.also { + it.waitForExists(waitingTime) + it.click() + } + + break + } catch (e: UiObjectNotFoundException) { + if (i == RETRY_COUNT) { + throw e + } else { + mDevice.pressBack() + navigationToolbar { + }.openThreeDotMenu { + expandMenu() + } + } + } + } BrowserRobot().interact() return BrowserRobot.Transition()