1
0
Fork 0

Closes #6363 - Add Downloads UI tests (#6574)

- Initiates a download
- Verifies prompt
- Verifies notification in notification shade
master
Aaron Train 2019-12-02 17:15:00 -05:00 committed by GitHub
parent 3df32edff0
commit 35f136b14b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 220 additions and 0 deletions

View File

@ -0,0 +1,5 @@
<html>
<body>
<a href="../resources/Globe.svg" download>Page content: Globe.svg</a>
</body>
</html>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -63,4 +63,11 @@ object TestAssetHelper {
return TestAsset(url, content)
}
fun getDownloadAsset(server: MockWebServer): TestAsset {
val url = server.url("pages/download.html").toString().toUri()!!
val content = "Page content: Globe.svg"
return TestAsset(url, content)
}
}

View File

@ -0,0 +1,110 @@
/* 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 android.os.Environment
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.GrantPermissionRule
import androidx.test.uiautomator.UiDevice
import kotlinx.coroutines.runBlocking
import okhttp3.mockwebserver.MockWebServer
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.HomeActivityTestRule
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.ui.robots.downloadRobot
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.robots.navigationToolbar
import java.io.File
/**
* Tests for verifying basic functionality of download prompt UI
*
* - Initiates a download
* - Verifies download prompt
* - Verifies download notification
**/
class DownloadTest {
private val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
private lateinit var mockWebServer: MockWebServer
/* ktlint-disable no-blank-line-before-rbrace */ // This imposes unreadable grouping.
@get:Rule
val activityTestRule = HomeActivityTestRule()
@get:Rule
var mGrantPermissions = GrantPermissionRule.grant(
android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
android.Manifest.permission.READ_EXTERNAL_STORAGE
)
@Before
fun setUp() {
mockWebServer = MockWebServer().apply {
setDispatcher(AndroidAssetDispatcher())
start()
}
}
@After
fun tearDown() {
mockWebServer.shutdown()
// Clear Download
runBlocking {
val downloadedFile = File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
"Globe.svg.html"
)
if (downloadedFile.exists()) {
downloadedFile.delete()
}
}
}
@Test
fun testDownloadPrompt() {
homeScreen { }.dismissOnboarding()
val defaultWebPage = TestAssetHelper.getDownloadAsset(mockWebServer)
navigationToolbar {
}.openNewTabAndEnterToBrowser(defaultWebPage.url) {
verifyPageContent(defaultWebPage.content)
clickLinkMatchingText(defaultWebPage.content)
}
downloadRobot {
verifyDownloadPrompt()
}.closePrompt {}
}
@Test
fun testDownloadNotification() {
homeScreen { }.dismissOnboarding()
val defaultWebPage = TestAssetHelper.getDownloadAsset(mockWebServer)
navigationToolbar {
}.openNewTabAndEnterToBrowser(defaultWebPage.url) {
verifyPageContent(defaultWebPage.content)
clickLinkMatchingText(defaultWebPage.content)
}
downloadRobot {
verifyDownloadPrompt()
}.clickDownload {
verifyDownloadNotificationPopup()
verifyDownloadNotificationShade()
}
}
}

View File

@ -76,6 +76,14 @@ class BrowserRobot {
}
}
fun clickLinkMatchingText(expectedText: String) {
val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
mDevice.waitNotNull(Until.findObject(By.text(expectedText)), TestAssetHelper.waitingTime)
val element = mDevice.findObject(By.text(expectedText))
element.click()
}
class Transition {
private val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
private fun threeDotButton() = onView(

View File

@ -0,0 +1,86 @@
/* 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/. */
@file:Suppress("TooManyFunctions")
package org.mozilla.fenix.ui.robots
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.RootMatchers.isDialog
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.By
import androidx.test.uiautomator.UiDevice
import androidx.test.uiautomator.Until
import org.hamcrest.CoreMatchers
import org.mozilla.fenix.R
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.click
import org.mozilla.fenix.helpers.ext.waitNotNull
/**
* Implementation of Robot Pattern for download UI handling.
*/
class DownloadRobot {
fun verifyDownloadPrompt() = assertDownloadPrompt()
fun verifyDownloadNotificationPopup() = assertDownloadNotificationPopup()
fun verifyDownloadNotificationShade() = assertDownloadNotificationShade()
class Transition {
fun clickDownload(interact: DownloadRobot.() -> Unit): DownloadRobot.Transition {
clickDownloadButton().click()
DownloadRobot().interact()
return DownloadRobot.Transition()
}
fun closePrompt(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition {
closePromptButton().click()
BrowserRobot().interact()
return BrowserRobot.Transition()
}
}
}
fun downloadRobot(interact: DownloadRobot.() -> Unit): DownloadRobot.Transition {
DownloadRobot().interact()
return DownloadRobot.Transition()
}
private fun assertDownloadPrompt() {
mDevice.waitNotNull(Until.findObjects(By.res("org.mozilla.fenix.debug:id/download_button")))
}
private fun assertDownloadNotificationShade() {
val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
mDevice.openNotification()
mDevice.waitNotNull(
Until.findObjects(By.text("Download completed")), TestAssetHelper.waitingTime
)
// Go home (no UIDevice closeNotification) to close notification shade
mDevice.pressHome()
}
private fun assertDownloadNotificationPopup() {
val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
mDevice.waitNotNull(Until.findObjects(By.text("Open")), TestAssetHelper.waitingTime)
onView(withId(R.id.download_notification_title))
.check(matches(withText(CoreMatchers.containsString("Download completed"))))
}
private fun closePromptButton() =
onView(withId(R.id.close_button)).inRoot(isDialog()).check(matches(isDisplayed()))
private fun clickDownloadButton() =
onView(withText("Download")).inRoot(isDialog()).check(matches(isDisplayed()))