No issue: Added custom tab UI smoke test

upstream-sync
Oana Horvath 3 years ago
parent 758700cbb0
commit bca8b74263

@ -4,12 +4,17 @@
package org.mozilla.fenix.helpers
import android.app.PendingIntent
import android.content.ActivityNotFoundException
import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
import android.net.Uri
import android.os.Build
import android.os.Environment
import androidx.browser.customtabs.CustomTabsIntent
import androidx.preference.PreferenceManager
import androidx.test.espresso.Espresso
import androidx.test.espresso.Espresso.onView
@ -153,4 +158,32 @@ object TestHelper {
}
}
}
fun createCustomTabIntent(
pageUrl: String,
customMenuItemLabel: String = "",
customActionButtonDescription: String = ""
): Intent {
val appContext = InstrumentationRegistry.getInstrumentation()
.targetContext
.applicationContext
val pendingIntent = PendingIntent.getActivity(appContext, 0, Intent(), 0)
val customTabsIntent = CustomTabsIntent.Builder()
.addMenuItem(customMenuItemLabel, pendingIntent)
.setShareState(CustomTabsIntent.SHARE_STATE_ON)
.setActionButton(
createTestBitmap(),
customActionButtonDescription, pendingIntent, true
)
.build()
customTabsIntent.intent.data = Uri.parse(pageUrl)
return customTabsIntent.intent
}
private fun createTestBitmap(): Bitmap {
val bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
canvas.drawColor(Color.GREEN)
return bitmap
}
}

@ -9,6 +9,7 @@ import androidx.core.net.toUri
import androidx.recyclerview.widget.RecyclerView
import androidx.test.espresso.IdlingRegistry
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.ActivityTestRule
import androidx.test.rule.GrantPermissionRule
import androidx.test.uiautomator.UiDevice
import okhttp3.mockwebserver.MockWebServer
@ -18,6 +19,7 @@ import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.FeatureFlags
import org.mozilla.fenix.IntentReceiverActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
@ -25,11 +27,13 @@ import org.mozilla.fenix.helpers.HomeActivityTestRule
import org.mozilla.fenix.helpers.RecyclerViewIdlingResource
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.TestHelper
import org.mozilla.fenix.helpers.TestHelper.createCustomTabIntent
import org.mozilla.fenix.helpers.TestHelper.deleteDownloadFromStorage
import org.mozilla.fenix.helpers.ViewVisibilityIdlingResource
import org.mozilla.fenix.ui.robots.browserScreen
import org.mozilla.fenix.ui.robots.clickTabCrashedRestoreButton
import org.mozilla.fenix.ui.robots.clickUrlbar
import org.mozilla.fenix.ui.robots.customTabScreen
import org.mozilla.fenix.ui.robots.dismissTrackingOnboarding
import org.mozilla.fenix.ui.robots.downloadRobot
import org.mozilla.fenix.ui.robots.enhancedTrackingProtection
@ -52,8 +56,9 @@ class SmokeTest {
private var recentlyClosedTabsListIdlingResource: RecyclerViewIdlingResource? = null
private var readerViewNotification: ViewVisibilityIdlingResource? = null
private val downloadFileName = "Globe.svg"
val collectionName = "First Collection"
private val collectionName = "First Collection"
private var bookmarksListIdlingResource: RecyclerViewIdlingResource? = null
private val customMenuItem = "TestMenuItem"
// This finds the dialog fragment child of the homeFragment, otherwise the awesomeBar would return null
private fun getAwesomebarView(): View? {
@ -67,6 +72,11 @@ class SmokeTest {
@get:Rule
val activityTestRule = HomeActivityTestRule()
@get: Rule
val intentReceiverActivityTestRule = ActivityTestRule(
IntentReceiverActivity::class.java, true, false
)
@get:Rule
var mGrantPermissions = GrantPermissionRule.grant(
android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
@ -112,7 +122,7 @@ class SmokeTest {
}
}
// copied over from HomeScreenTest
// Verifies the first run onboarding screen
@Test
fun firstRunScreenTest() {
homeScreen {
@ -1228,4 +1238,53 @@ class SmokeTest {
verifyPageContent(website.content)
}
}
@Test
// Verifies the main menu of a custom tab with a custom menu item
fun customTabMenuItemsTest() {
val customTabPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
intentReceiverActivityTestRule.launchActivity(
createCustomTabIntent(
customTabPage.url.toString(),
customMenuItem
)
)
customTabScreen {
browserScreen {
verifyPageContent(customTabPage.content)
}
}.openMainMenu {
verifyPoweredByTextIsDisplayed()
verifyCustomMenuItem(customMenuItem)
verifyDesktopSiteButtonExists()
verifyFindInPageButtonExists()
verifyOpenInBrowserButtonExists()
verifyBackButtonExists()
verifyForwardButtonExists()
verifyRefreshButtonExists()
}
}
@Test
// The test opens a link in a custom tab then sends it to the browser
fun openCustomTabInBrowserTest() {
val customTabPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
intentReceiverActivityTestRule.launchActivity(
createCustomTabIntent(
customTabPage.url.toString()
)
)
customTabScreen {
browserScreen {
verifyPageContent(customTabPage.content)
}
}.openMainMenu {
}.clickOpenInBrowserButton {
verifyTabCounter("1")
}
}
}

@ -0,0 +1,84 @@
/* 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.robots
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.uiautomator.UiSelector
import junit.framework.TestCase.assertTrue
import mozilla.components.support.ktx.android.content.appName
import org.mozilla.fenix.R
import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime
/**
* Implementation of the robot pattern for Custom tabs
*/
class CustomTabRobot {
fun verifyDesktopSiteButtonExists() {
desktopSiteButton().check(matches(isDisplayed()))
}
fun verifyFindInPageButtonExists() {
findInPageButton().check(matches(isDisplayed()))
}
fun verifyPoweredByTextIsDisplayed() {
mDevice.findObject(UiSelector().textContains("POWERED BY ${appContext.appName}"))
}
fun verifyOpenInBrowserButtonExists() {
openInBrowserButton().check(matches(isDisplayed()))
}
fun verifyBackButtonExists() = assertTrue(backButton().waitForExists(waitingTime))
fun verifyForwardButtonExists() = assertTrue(forwardButton().waitForExists(waitingTime))
fun verifyRefreshButtonExists() = assertTrue(refreshButton().waitForExists(waitingTime))
fun verifyCustomMenuItem(label: String) {
assertTrue(mDevice.findObject(UiSelector().text(label)).exists())
}
class Transition {
fun openMainMenu(interact: CustomTabRobot.() -> Unit): Transition {
mainMenuButton().waitForExists(waitingTime)
mainMenuButton().click()
CustomTabRobot().interact()
return Transition()
}
fun clickOpenInBrowserButton(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition {
openInBrowserButton().perform(click())
BrowserRobot().interact()
return BrowserRobot.Transition()
}
}
}
fun customTabScreen(interact: CustomTabRobot.() -> Unit): CustomTabRobot.Transition {
CustomTabRobot().interact()
return CustomTabRobot.Transition()
}
private fun mainMenuButton() = mDevice.findObject(UiSelector().description("Menu"))
private fun desktopSiteButton() = onView(withId(R.id.switch_widget))
private fun findInPageButton() = onView(withText("Find in page"))
private fun openInBrowserButton() = onView(withText("Open in ${appContext.appName}"))
private fun refreshButton() = mDevice.findObject(UiSelector().description("Refresh"))
private fun forwardButton() = mDevice.findObject(UiSelector().description("Forward"))
private fun backButton() = mDevice.findObject(UiSelector().description("Back"))
Loading…
Cancel
Save