Skip to content
This repository has been archived by the owner on Feb 20, 2023. It is now read-only.

Commit

Permalink
Closes #7656: Add UI tests for Reader View (#7829)
Browse files Browse the repository at this point in the history
  • Loading branch information
AaronMT committed Feb 7, 2020
1 parent 5bd5f81 commit 4fec12b
Show file tree
Hide file tree
Showing 5 changed files with 615 additions and 11 deletions.
42 changes: 31 additions & 11 deletions app/src/androidTest/assets/pages/lorem-ipsum.html
Original file line number Diff line number Diff line change
@@ -1,16 +1,36 @@
<html>
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="utf-8"/>
<title>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
eirmod tempor invidunt</title>
<meta content="width=device-width, initial-scale=1"
name="viewport"/>
</head>

<body>

<h1>
Lorem ipsum dolor sit amet, consectetur adipiscing elit,<br>
sed do eiusmod tempor incididunt ut labore et dolore magna <br>
aliqua. Ut enim ad minim veniam, quis nostrud exercitation <br>
ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis <br>
aute irure dolor in reprehenderit in voluptate velit esse cillum <br>
dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat <br>
non proident, sunt in culpa qui officia deserunt mollit anim id est <br>
laborum.
</h1>
<p id="testContent">Page content: lorem ipsum</p>

<h1>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt</h1>

<p>
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet
clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit
amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam
nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,
sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor
sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed
diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,
sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor
sit amet.
</p>

</body>

</html>
22 changes: 22 additions & 0 deletions app/src/androidTest/java/org/mozilla/fenix/helpers/Matchers.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,11 @@ package org.mozilla.fenix.helpers

import android.graphics.Bitmap
import android.view.View
import android.view.ViewGroup
import org.hamcrest.CoreMatchers.not
import org.hamcrest.Description
import org.hamcrest.Matcher
import org.hamcrest.TypeSafeMatcher
import org.mozilla.fenix.helpers.matchers.BitmapDrawableMatcher
import androidx.test.espresso.matcher.ViewMatchers.isChecked as espressoIsChecked
import androidx.test.espresso.matcher.ViewMatchers.isEnabled as espressoIsEnabled
Expand All @@ -34,3 +37,22 @@ private fun maybeInvertMatcher(matcher: Matcher<View>, useUnmodifiedMatcher: Boo
}

fun withBitmapDrawable(bitmap: Bitmap, name: String): Matcher<View>? = BitmapDrawableMatcher(bitmap, name)

fun nthChildOf(
parentMatcher: Matcher<View>,
childPosition: Int
): Matcher<View> {
return object : TypeSafeMatcher<View>() {
override fun describeTo(description: Description) {
description.appendText("Position is $childPosition")
}

public override fun matchesSafely(view: View): Boolean {
if (view.parent !is ViewGroup) {
return parentMatcher.matches(view.parent)
}
val group = view.parent as ViewGroup
return parentMatcher.matches(view.parent) && group.getChildAt(childPosition) == view
}
}
}
271 changes: 271 additions & 0 deletions app/src/androidTest/java/org/mozilla/fenix/ui/ReaderViewTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,271 @@
/* 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.Rule
import org.junit.Test
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.ui.robots.navigationToolbar
import org.mozilla.fenix.ui.robots.readerViewRobot

/**
* Tests for verifying basic functionality of content context menus
*
* - Verifies Reader View entry and detection when available UI and functionality
* - Verifies Reader View exit UI and functionality
* - Verifies Reader View appearance controls UI and functionality
*
*/

class ReaderViewTest {
private lateinit var mockWebServer: MockWebServer
val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())

@get:Rule
val activityIntentTestRule = HomeActivityIntentTestRule()

@Before
fun setUp() {
mockWebServer = MockWebServer().apply {
setDispatcher(AndroidAssetDispatcher())
start()
}
}

@After
fun tearDown() {
mockWebServer.shutdown()
}

/**
* Verify that Reader View capable pages
*
* - Show blue notification in the three dot menu
* - Show the toggle button in the three dot menu
*
*/
@Test
fun verifyReaderViewPageMenuDetection() {
val readerViewPage =
TestAssetHelper.getLoremIpsumAsset(mockWebServer)

navigationToolbar {
}.enterURLAndEnterToBrowser(readerViewPage.url) {
verifyPageContent(readerViewPage.content)
}

readerViewRobot {
verifyReaderViewDetected(true)
}

navigationToolbar {
}.openThreeDotMenu {
verifyReaderViewToggle(true)
}.closeBrowserMenuToBrowser { }
}

/**
* Verify that non Reader View capable pages
*
* - Do not show a blue notification in the three dot menu
* - Reader View toggle should not be visible in the three dot menu
*
*/
@Test
fun verifyNonReaderViewPageMenuNoDetection() {
var genericPage =
TestAssetHelper.getGenericAsset(mockWebServer, 1)

navigationToolbar {
}.enterURLAndEnterToBrowser(genericPage.url) {
verifyPageContent(genericPage.content)
}

readerViewRobot {
verifyReaderViewDetected(false)
}

navigationToolbar {
}.openThreeDotMenu {
verifyReaderViewToggle(false)
verifyReaderViewAppearance(false)
}.closeBrowserMenuToBrowser { }
}

@Test
fun verifyReaderViewToggle() {
val readerViewPage =
TestAssetHelper.getLoremIpsumAsset(mockWebServer)

navigationToolbar {
}.enterURLAndEnterToBrowser(readerViewPage.url) {
verifyPageContent(readerViewPage.content)
}

readerViewRobot {
verifyReaderViewDetected(true)
}

navigationToolbar {
}.openThreeDotMenu {
verifyReaderViewToggle(true)
}.toggleReaderView {
}.openThreeDotMenu {
verifyReaderViewAppearance(true)
}.toggleReaderView {
}.openThreeDotMenu {
verifyReaderViewAppearance(false)
}.close { }

readerViewRobot {
verifyReaderViewDetected(true)
}
}

@Test
fun verifyReaderViewAppearanceUI() {
val readerViewPage =
TestAssetHelper.getLoremIpsumAsset(mockWebServer)

navigationToolbar {
}.enterURLAndEnterToBrowser(readerViewPage.url) {
verifyPageContent(readerViewPage.content)
}

readerViewRobot {
verifyReaderViewDetected(true)
}

navigationToolbar {
}.openThreeDotMenu {
verifyReaderViewToggle(true)
}.toggleReaderView {
}.openThreeDotMenu {
verifyReaderViewAppearance(true)
}.openReaderViewAppearance {
verifyAppearanceFontGroup(true)
verifyAppearanceFontSansSerif(true)
verifyAppearanceFontSerif(true)
verifyAppearanceFontIncrease(true)
verifyAppearanceFontDecrease(true)
verifyAppearanceColorGroup(true)
verifyAppearanceColorDark(true)
verifyAppearanceColorLight(true)
verifyAppearanceColorSepia(true)
}
}

@Test
fun verifyReaderViewAppearanceFontToggle() {
val readerViewPage =
TestAssetHelper.getLoremIpsumAsset(mockWebServer)

navigationToolbar {
}.enterURLAndEnterToBrowser(readerViewPage.url) {
verifyPageContent(readerViewPage.content)
}

readerViewRobot {
verifyReaderViewDetected(true)
}

navigationToolbar {
}.openThreeDotMenu {
verifyReaderViewToggle(true)
}.toggleReaderView {
}.openThreeDotMenu {
verifyReaderViewAppearance(true)
}.openReaderViewAppearance {
verifyAppearanceFontGroup(true)
verifyAppearanceFontSansSerif(true)
verifyAppearanceFontSerif(true)
verifyAppearanceFontIncrease(true)
verifyAppearanceFontDecrease(true)
}.toggleSansSerif {
verifyAppearanceFontIsActive("SANSSERIF")
}.toggleSerif {
verifyAppearanceFontIsActive("SERIF")
}
}

@Test
fun verifyReaderViewAppearanceFontSizeToggle() {
val readerViewPage =
TestAssetHelper.getLoremIpsumAsset(mockWebServer)

navigationToolbar {
}.enterURLAndEnterToBrowser(readerViewPage.url) {
verifyPageContent(readerViewPage.content)
}

readerViewRobot {
verifyReaderViewDetected(true)
}

navigationToolbar {
}.openThreeDotMenu {
verifyReaderViewToggle(true)
}.toggleReaderView {
}.openThreeDotMenu {
verifyReaderViewAppearance(true)
}.openReaderViewAppearance {
verifyAppearanceFontIncrease(true)
verifyAppearanceFontDecrease(true)
verifyAppearanceFontSize(3)
}.toggleFontSizeIncrease {
verifyAppearanceFontSize(4)
}.toggleFontSizeIncrease {
verifyAppearanceFontSize(5)
}.toggleFontSizeIncrease {
verifyAppearanceFontSize(6)
}.toggleFontSizeDecrease {
verifyAppearanceFontSize(5)
}.toggleFontSizeDecrease {
verifyAppearanceFontSize(4)
}.toggleFontSizeDecrease {
verifyAppearanceFontSize(3)
}
}

@Test
fun verifyReaderViewAppearanceColorSchemeChange() {
val readerViewPage =
TestAssetHelper.getLoremIpsumAsset(mockWebServer)

navigationToolbar {
}.enterURLAndEnterToBrowser(readerViewPage.url) {
verifyPageContent(readerViewPage.content)
}

readerViewRobot {
verifyReaderViewDetected(true)
}

navigationToolbar {
}.openThreeDotMenu {
verifyReaderViewToggle(true)
}.toggleReaderView {
}.openThreeDotMenu {
verifyReaderViewAppearance(true)
}.openReaderViewAppearance {
verifyAppearanceColorDark(true)
verifyAppearanceColorLight(true)
verifyAppearanceColorSepia(true)
}.toggleColorSchemeChangeDark {
verifyAppearanceColorSchemeChange("DARK")
}.toggleColorSchemeChangeSepia {
verifyAppearanceColorSchemeChange("SEPIA")
}.toggleColorSchemeChangeLight {
verifyAppearanceColorSchemeChange("LIGHT")
}
}
}
Loading

0 comments on commit 4fec12b

Please sign in to comment.