You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iceraven-browser/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SitePermissionsRobot.kt

139 lines
5.8 KiB
Kotlin

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/* 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.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.uiautomator.UiSelector
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.mozilla.fenix.R
import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime
import org.mozilla.fenix.helpers.TestHelper
import org.mozilla.fenix.helpers.TestHelper.getPermissionAllowID
import org.mozilla.fenix.helpers.TestHelper.mDevice
import org.mozilla.fenix.helpers.TestHelper.packageName
import org.mozilla.fenix.helpers.click
class SitePermissionsRobot {
fun clickGrantAppPermissionButton() {
TestHelper.grantPermission()
}
fun clickDenyAppPermissionButton() {
TestHelper.denyPermission()
}
fun verifyMicrophonePermissionPrompt(url: String) {
assertTrue(
mDevice.findObject(UiSelector().text("Allow $url to use your microphone?"))
.waitForExists(waitingTime),
)
assertTrue(denyPagePermissionButton.text.equals("Dont allow"))
assertTrue(allowPagePermissionButton.text.equals("Allow"))
}
fun verifyCameraPermissionPrompt(url: String) {
assertTrue(
mDevice.findObject(UiSelector().text("Allow $url to use your camera?"))
.waitForExists(waitingTime),
)
assertTrue(denyPagePermissionButton.text.equals("Dont allow"))
assertTrue(allowPagePermissionButton.text.equals("Allow"))
}
fun verifyAudioVideoPermissionPrompt(url: String) {
assertTrue(
mDevice.findObject(UiSelector().text("Allow $url to use your camera and microphone?"))
.waitForExists(waitingTime),
)
assertTrue(denyPagePermissionButton.text.equals("Dont allow"))
assertTrue(allowPagePermissionButton.text.equals("Allow"))
}
fun verifyLocationPermissionPrompt(url: String) {
assertTrue(
mDevice.findObject(UiSelector().text("Allow $url to use your location?"))
.waitForExists(waitingTime),
)
assertTrue(denyPagePermissionButton.text.equals("Dont allow"))
assertTrue(allowPagePermissionButton.text.equals("Allow"))
}
fun verifyNotificationsPermissionPrompt(url: String, blocked: Boolean = false) {
if (!blocked) {
assertTrue(
mDevice.findObject(UiSelector().text("Allow $url to send notifications?"))
.waitForExists(waitingTime),
)
assertTrue(denyPagePermissionButton.text.equals("Never"))
assertTrue(allowPagePermissionButton.text.equals("Always"))
} else {
/* if "Never" was selected in a previous step, or if the app is not allowed,
the Notifications permission prompt won't be displayed anymore */
assertFalse(
mDevice.findObject(UiSelector().text("Allow $url to send notifications?"))
.exists(),
)
}
}
fun verifyCrossOriginCookiesPermissionPrompt(originSite: String, currentSite: String) {
mDevice.findObject(UiSelector().text("Allow $originSite to use its cookies on $currentSite?"))
.waitForExists(waitingTime)
onView(ViewMatchers.withText("Allow $originSite to use its cookies on $currentSite?")).check(matches(isDisplayed()))
onView(ViewMatchers.withText("You may want to block access if it's not clear why $originSite needs this data.")).check(matches(isDisplayed()))
onView(ViewMatchers.withText("Learn more")).check(matches(isDisplayed()))
onView(ViewMatchers.withText("Block")).check(matches(isDisplayed()))
onView(ViewMatchers.withText("Allow")).check(matches(isDisplayed()))
}
fun selectRememberPermissionDecision() {
onView(withId(R.id.do_not_ask_again))
.check(matches(isDisplayed()))
.click()
}
class Transition {
fun clickPagePermissionButton(allow: Boolean, interact: BrowserRobot.() -> Unit): BrowserRobot.Transition {
if (allow) {
allowPagePermissionButton.waitForExists(waitingTime)
allowPagePermissionButton.click()
// sometimes flaky, the prompt is not dismissed, retrying
if (!allowPagePermissionButton.waitUntilGone(waitingTime)) {
allowPagePermissionButton.click()
}
} else {
denyPagePermissionButton.waitForExists(waitingTime)
denyPagePermissionButton.click()
// sometimes flaky, the prompt is not dismissed, retrying
if (!denyPagePermissionButton.waitUntilGone(waitingTime)) {
denyPagePermissionButton.click()
}
}
BrowserRobot().interact()
return BrowserRobot.Transition()
}
}
}
// App permission prompts buttons
private val allowSystemPermissionButton =
mDevice.findObject(UiSelector().resourceId(getPermissionAllowID() + ":id/permission_allow_button"))
private val denySystemPermissionButton =
mDevice.findObject(UiSelector().resourceId(getPermissionAllowID() + ":id/permission_deny_button"))
// Page permission prompts buttons
private val allowPagePermissionButton =
mDevice.findObject(UiSelector().resourceId("$packageName:id/allow_button"))
private val denyPagePermissionButton =
mDevice.findObject(UiSelector().resourceId("$packageName:id/deny_button"))