2
0
mirror of https://github.com/fork-maintainers/iceraven-browser synced 2024-11-13 07:10:28 +00:00

Bug 1825116 - Resolve many lint issues found on oak (#4551)

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
This commit is contained in:
Geoff Brown 2023-11-22 08:17:10 -07:00 committed by GitHub
parent 6c4f6a306f
commit 310a5a99f7
9 changed files with 495 additions and 487 deletions

View File

@ -1,5 +1,5 @@
from pathlib import Path
import subprocess
from pathlib import Path
import yaml

View File

@ -24,7 +24,7 @@ class GradlewBuild(object):
test_type = "ui" if smoke else "experimentintegration"
cmd = f"adb shell am instrument -w -e class org.mozilla.fenix.{test_type}.{identifier} org.mozilla.fenix.debug.test/androidx.test.runner.AndroidJUnitRunner"
# if smoke:
# cmd = f"adb shell am instrument -w -e class org.mozilla.fenix.ui.{identifier} org.mozilla.fenix.debug.test/androidx.test.runner.AndroidJUnitRunner"
# cmd = f"adb shell am instrument -w -e class org.mozilla.fenix.ui.{identifier} org.mozilla.fenix.debug.test/androidx.test.runner.AndroidJUnitRunner"
# else:
# cmd = f"adb shell am instrument -w -e class org.mozilla.fenix.experimentintegration.{identifier} org.mozilla.fenix.debug.test/androidx.test.runner.AndroidJUnitRunner"

View File

@ -1,17 +1,25 @@
import pytest
@pytest.mark.parametrize("load_branches", [("branch")], indirect=True)
def test_experiment_unenrolls_via_studies_toggle(setup_experiment, gradlewbuild, load_branches, check_ping_for_experiment):
def test_experiment_unenrolls_via_studies_toggle(
setup_experiment, gradlewbuild, load_branches, check_ping_for_experiment
):
setup_experiment(load_branches)
gradlewbuild.test("GenericExperimentIntegrationTest#disableStudiesViaStudiesToggle")
assert check_ping_for_experiment(reason="enrollment", branch=load_branches[0])
gradlewbuild.test("GenericExperimentIntegrationTest#testExperimentUnenrolled")
assert check_ping_for_experiment(reason="unenrollment", branch=load_branches[0])
@pytest.mark.parametrize("load_branches", [("branch")], indirect=True)
def test_experiment_unenrolls_via_secret_menu(setup_experiment, gradlewbuild, load_branches, check_ping_for_experiment):
def test_experiment_unenrolls_via_secret_menu(
setup_experiment, gradlewbuild, load_branches, check_ping_for_experiment
):
setup_experiment(load_branches)
gradlewbuild.test("GenericExperimentIntegrationTest#testExperimentUnenrolledViaSecretMenu")
gradlewbuild.test(
"GenericExperimentIntegrationTest#testExperimentUnenrolledViaSecretMenu"
)
assert check_ping_for_experiment(reason="enrollment", branch=load_branches[0])
gradlewbuild.test("GenericExperimentIntegrationTest#testExperimentUnenrolled")
assert check_ping_for_experiment(reason="unenrollment", branch=load_branches[0])

View File

@ -1,36 +1,36 @@
/* 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.helpers
import android.view.View
import androidx.test.espresso.IdlingResource
class ViewVisibilityIdlingResource(
private val view: View,
private val expectedVisibility: Int,
) : IdlingResource {
private var resourceCallback: IdlingResource.ResourceCallback? = null
private var isIdle: Boolean = false
override fun getName(): String {
return ViewVisibilityIdlingResource::class.java.name + ":" + view.id + ":" + expectedVisibility
}
override fun isIdleNow(): Boolean {
if (isIdle) return true
isIdle = view.visibility == expectedVisibility
if (isIdle) {
resourceCallback?.onTransitionToIdle()
}
return isIdle
}
override fun registerIdleTransitionCallback(callback: IdlingResource.ResourceCallback?) {
this.resourceCallback = callback
}
}
/* 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.helpers
import android.view.View
import androidx.test.espresso.IdlingResource
class ViewVisibilityIdlingResource(
private val view: View,
private val expectedVisibility: Int,
) : IdlingResource {
private var resourceCallback: IdlingResource.ResourceCallback? = null
private var isIdle: Boolean = false
override fun getName(): String {
return ViewVisibilityIdlingResource::class.java.name + ":" + view.id + ":" + expectedVisibility
}
override fun isIdleNow(): Boolean {
if (isIdle) return true
isIdle = view.visibility == expectedVisibility
if (isIdle) {
resourceCallback?.onTransitionToIdle()
}
return isIdle
}
override fun registerIdleTransitionCallback(callback: IdlingResource.ResourceCallback?) {
this.resourceCallback = callback
}
}

View File

@ -1,119 +1,119 @@
/* 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.Visibility
import androidx.test.espresso.matcher.ViewMatchers.hasDescendant
import androidx.test.espresso.matcher.ViewMatchers.withChild
import androidx.test.espresso.matcher.ViewMatchers.withClassName
import androidx.test.espresso.matcher.ViewMatchers.withContentDescription
import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withResourceName
import androidx.test.espresso.matcher.ViewMatchers.withText
import org.hamcrest.CoreMatchers.allOf
import org.hamcrest.CoreMatchers.containsString
import org.mozilla.fenix.R
import org.mozilla.fenix.helpers.assertIsChecked
import org.mozilla.fenix.helpers.atPosition
import org.mozilla.fenix.helpers.click
import org.mozilla.fenix.helpers.isChecked
/**
* Implementation of Robot Pattern for the settings Delete Browsing Data On Quit sub menu.
*/
class SettingsSubMenuDeleteBrowsingDataOnQuitRobot {
fun verifyNavigationToolBarHeader() =
onView(
allOf(
withId(R.id.navigationToolbar),
withChild(withText(R.string.preferences_delete_browsing_data_on_quit)),
),
)
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
fun verifyDeleteBrowsingOnQuitEnabled(enabled: Boolean) =
deleteBrowsingOnQuitButton.assertIsChecked(enabled)
fun verifyDeleteBrowsingOnQuitButtonSummary() =
onView(
withText(R.string.preference_summary_delete_browsing_data_on_quit_2),
).check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
fun clickDeleteBrowsingOnQuitButtonSwitch() = onView(withResourceName("switch_widget")).click()
fun verifyAllTheCheckBoxesText() {
openTabsCheckbox
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
browsingHistoryCheckbox
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
cookiesAndSiteDataCheckbox
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
onView(withText(R.string.preferences_delete_browsing_data_cookies_subtitle))
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
cachedFilesCheckbox
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
onView(withText(R.string.preferences_delete_browsing_data_cached_files_subtitle))
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
sitePermissionsCheckbox
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
}
fun verifyAllTheCheckBoxesChecked(checked: Boolean) {
for (index in 2..7) {
onView(withId(R.id.recycler_view))
.check(
matches(
atPosition(
index,
hasDescendant(
allOf(
withResourceName(containsString("checkbox")),
isChecked(checked),
),
),
),
),
)
}
}
class Transition {
fun goBack(interact: SettingsRobot.() -> Unit): SettingsRobot.Transition {
goBackButton.click()
SettingsRobot().interact()
return SettingsRobot.Transition()
}
}
}
private val goBackButton = onView(withContentDescription("Navigate up"))
private val deleteBrowsingOnQuitButton =
onView(withClassName(containsString("android.widget.Switch")))
private val openTabsCheckbox =
onView(withText(R.string.preferences_delete_browsing_data_tabs_title_2))
private val browsingHistoryCheckbox =
onView(withText(R.string.preferences_delete_browsing_data_browsing_history_title))
private val cookiesAndSiteDataCheckbox = onView(withText(R.string.preferences_delete_browsing_data_cookies_and_site_data))
private val cachedFilesCheckbox =
onView(withText(R.string.preferences_delete_browsing_data_cached_files))
private val sitePermissionsCheckbox =
onView(withText(R.string.preferences_delete_browsing_data_site_permissions))
/* 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.Visibility
import androidx.test.espresso.matcher.ViewMatchers.hasDescendant
import androidx.test.espresso.matcher.ViewMatchers.withChild
import androidx.test.espresso.matcher.ViewMatchers.withClassName
import androidx.test.espresso.matcher.ViewMatchers.withContentDescription
import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withResourceName
import androidx.test.espresso.matcher.ViewMatchers.withText
import org.hamcrest.CoreMatchers.allOf
import org.hamcrest.CoreMatchers.containsString
import org.mozilla.fenix.R
import org.mozilla.fenix.helpers.assertIsChecked
import org.mozilla.fenix.helpers.atPosition
import org.mozilla.fenix.helpers.click
import org.mozilla.fenix.helpers.isChecked
/**
* Implementation of Robot Pattern for the settings Delete Browsing Data On Quit sub menu.
*/
class SettingsSubMenuDeleteBrowsingDataOnQuitRobot {
fun verifyNavigationToolBarHeader() =
onView(
allOf(
withId(R.id.navigationToolbar),
withChild(withText(R.string.preferences_delete_browsing_data_on_quit)),
),
)
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
fun verifyDeleteBrowsingOnQuitEnabled(enabled: Boolean) =
deleteBrowsingOnQuitButton.assertIsChecked(enabled)
fun verifyDeleteBrowsingOnQuitButtonSummary() =
onView(
withText(R.string.preference_summary_delete_browsing_data_on_quit_2),
).check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
fun clickDeleteBrowsingOnQuitButtonSwitch() = onView(withResourceName("switch_widget")).click()
fun verifyAllTheCheckBoxesText() {
openTabsCheckbox
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
browsingHistoryCheckbox
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
cookiesAndSiteDataCheckbox
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
onView(withText(R.string.preferences_delete_browsing_data_cookies_subtitle))
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
cachedFilesCheckbox
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
onView(withText(R.string.preferences_delete_browsing_data_cached_files_subtitle))
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
sitePermissionsCheckbox
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
}
fun verifyAllTheCheckBoxesChecked(checked: Boolean) {
for (index in 2..7) {
onView(withId(R.id.recycler_view))
.check(
matches(
atPosition(
index,
hasDescendant(
allOf(
withResourceName(containsString("checkbox")),
isChecked(checked),
),
),
),
),
)
}
}
class Transition {
fun goBack(interact: SettingsRobot.() -> Unit): SettingsRobot.Transition {
goBackButton.click()
SettingsRobot().interact()
return SettingsRobot.Transition()
}
}
}
private val goBackButton = onView(withContentDescription("Navigate up"))
private val deleteBrowsingOnQuitButton =
onView(withClassName(containsString("android.widget.Switch")))
private val openTabsCheckbox =
onView(withText(R.string.preferences_delete_browsing_data_tabs_title_2))
private val browsingHistoryCheckbox =
onView(withText(R.string.preferences_delete_browsing_data_browsing_history_title))
private val cookiesAndSiteDataCheckbox = onView(withText(R.string.preferences_delete_browsing_data_cookies_and_site_data))
private val cachedFilesCheckbox =
onView(withText(R.string.preferences_delete_browsing_data_cached_files))
private val sitePermissionsCheckbox =
onView(withText(R.string.preferences_delete_browsing_data_site_permissions))

View File

@ -1,124 +1,124 @@
/* 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.hasSibling
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withContentDescription
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.uiautomator.UiSelector
import org.hamcrest.CoreMatchers.allOf
import org.hamcrest.CoreMatchers.containsString
import org.mozilla.fenix.R
import org.mozilla.fenix.helpers.DataGenerationHelper.getStringResource
import org.mozilla.fenix.helpers.MatcherHelper.assertUIObjectIsGone
import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText
import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime
import org.mozilla.fenix.helpers.TestHelper.mDevice
import org.mozilla.fenix.helpers.TestHelper.packageName
import org.mozilla.fenix.helpers.click
/**
* Implementation of Robot Pattern for the settings Site Permissions Notification sub menu.
*/
class SettingsSubMenuSitePermissionsExceptionsRobot {
fun verifyExceptionsEmptyList() {
mDevice.findObject(UiSelector().text(getStringResource(R.string.no_site_exceptions)))
.waitForExists(waitingTime)
onView(withText(R.string.no_site_exceptions)).check(matches(isDisplayed()))
}
fun verifyExceptionCreated(url: String, shouldBeDisplayed: Boolean) {
if (shouldBeDisplayed) {
exceptionsList.waitForExists(waitingTime)
onView(withText(containsString(url))).check(matches(isDisplayed()))
} else {
assertUIObjectIsGone(itemContainingText(url))
}
}
fun verifyClearPermissionsDialog() {
onView(withText(R.string.clear_permissions)).check(matches(isDisplayed()))
onView(withText(R.string.confirm_clear_permissions_on_all_sites)).check(matches(isDisplayed()))
onView(withText(R.string.clear_permissions_positive)).check(matches(isDisplayed()))
onView(withText(R.string.clear_permissions_negative)).check(matches(isDisplayed()))
}
// Click button for resetting all of one site's permissions to default
fun clickClearPermissionsForOneSite() {
swipeToBottom()
onView(withText(R.string.clear_permissions))
.check(matches(isDisplayed()))
.click()
}
fun verifyClearPermissionsForOneSiteDialog() {
onView(withText(R.string.clear_permissions)).check(matches(isDisplayed()))
onView(withText(R.string.confirm_clear_permissions_site)).check(matches(isDisplayed()))
onView(withText(R.string.clear_permissions_positive)).check(matches(isDisplayed()))
onView(withText(R.string.clear_permissions_negative)).check(matches(isDisplayed()))
}
fun openSiteExceptionsDetails(url: String) {
exceptionsList.waitForExists(waitingTime)
onView(withText(containsString(url))).click()
}
fun verifyPermissionSettingSummary(setting: String, summary: String) {
onView(
allOf(
withText(setting),
hasSibling(withText(summary)),
),
).check(matches(isDisplayed()))
}
fun openChangePermissionSettingsMenu(permissionSetting: String) {
onView(withText(containsString(permissionSetting))).click()
}
// Click button for resetting all permissions for all websites
fun clickClearPermissionsOnAllSites() {
exceptionsList.waitForExists(waitingTime)
onView(withId(R.id.delete_all_site_permissions_button))
.check(matches(isDisplayed()))
.click()
}
// Click button for resetting one site permission to default
fun clickClearOnePermissionForOneSite() {
onView(withText(R.string.clear_permission))
.check(matches(isDisplayed()))
.click()
}
fun verifyResetPermissionDefaultForThisSiteDialog() {
onView(withText(R.string.clear_permission)).check(matches(isDisplayed()))
onView(withText(R.string.confirm_clear_permission_site)).check(matches(isDisplayed()))
onView(withText(R.string.clear_permissions_positive)).check(matches(isDisplayed()))
onView(withText(R.string.clear_permissions_negative)).check(matches(isDisplayed()))
}
fun clickOK() = onView(withText(R.string.clear_permissions_positive)).click()
fun clickCancel() = onView(withText(R.string.clear_permissions_negative)).click()
class Transition {
fun goBack(interact: SettingsSubMenuSitePermissionsRobot.() -> Unit): SettingsSubMenuSitePermissionsRobot.Transition {
goBackButton().click()
SettingsSubMenuSitePermissionsRobot().interact()
return SettingsSubMenuSitePermissionsRobot.Transition()
}
}
}
private fun goBackButton() =
onView(allOf(withContentDescription("Navigate up")))
private val exceptionsList =
mDevice.findObject(UiSelector().resourceId("$packageName:id/exceptions"))
/* 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.hasSibling
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withContentDescription
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.uiautomator.UiSelector
import org.hamcrest.CoreMatchers.allOf
import org.hamcrest.CoreMatchers.containsString
import org.mozilla.fenix.R
import org.mozilla.fenix.helpers.DataGenerationHelper.getStringResource
import org.mozilla.fenix.helpers.MatcherHelper.assertUIObjectIsGone
import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText
import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime
import org.mozilla.fenix.helpers.TestHelper.mDevice
import org.mozilla.fenix.helpers.TestHelper.packageName
import org.mozilla.fenix.helpers.click
/**
* Implementation of Robot Pattern for the settings Site Permissions Notification sub menu.
*/
class SettingsSubMenuSitePermissionsExceptionsRobot {
fun verifyExceptionsEmptyList() {
mDevice.findObject(UiSelector().text(getStringResource(R.string.no_site_exceptions)))
.waitForExists(waitingTime)
onView(withText(R.string.no_site_exceptions)).check(matches(isDisplayed()))
}
fun verifyExceptionCreated(url: String, shouldBeDisplayed: Boolean) {
if (shouldBeDisplayed) {
exceptionsList.waitForExists(waitingTime)
onView(withText(containsString(url))).check(matches(isDisplayed()))
} else {
assertUIObjectIsGone(itemContainingText(url))
}
}
fun verifyClearPermissionsDialog() {
onView(withText(R.string.clear_permissions)).check(matches(isDisplayed()))
onView(withText(R.string.confirm_clear_permissions_on_all_sites)).check(matches(isDisplayed()))
onView(withText(R.string.clear_permissions_positive)).check(matches(isDisplayed()))
onView(withText(R.string.clear_permissions_negative)).check(matches(isDisplayed()))
}
// Click button for resetting all of one site's permissions to default
fun clickClearPermissionsForOneSite() {
swipeToBottom()
onView(withText(R.string.clear_permissions))
.check(matches(isDisplayed()))
.click()
}
fun verifyClearPermissionsForOneSiteDialog() {
onView(withText(R.string.clear_permissions)).check(matches(isDisplayed()))
onView(withText(R.string.confirm_clear_permissions_site)).check(matches(isDisplayed()))
onView(withText(R.string.clear_permissions_positive)).check(matches(isDisplayed()))
onView(withText(R.string.clear_permissions_negative)).check(matches(isDisplayed()))
}
fun openSiteExceptionsDetails(url: String) {
exceptionsList.waitForExists(waitingTime)
onView(withText(containsString(url))).click()
}
fun verifyPermissionSettingSummary(setting: String, summary: String) {
onView(
allOf(
withText(setting),
hasSibling(withText(summary)),
),
).check(matches(isDisplayed()))
}
fun openChangePermissionSettingsMenu(permissionSetting: String) {
onView(withText(containsString(permissionSetting))).click()
}
// Click button for resetting all permissions for all websites
fun clickClearPermissionsOnAllSites() {
exceptionsList.waitForExists(waitingTime)
onView(withId(R.id.delete_all_site_permissions_button))
.check(matches(isDisplayed()))
.click()
}
// Click button for resetting one site permission to default
fun clickClearOnePermissionForOneSite() {
onView(withText(R.string.clear_permission))
.check(matches(isDisplayed()))
.click()
}
fun verifyResetPermissionDefaultForThisSiteDialog() {
onView(withText(R.string.clear_permission)).check(matches(isDisplayed()))
onView(withText(R.string.confirm_clear_permission_site)).check(matches(isDisplayed()))
onView(withText(R.string.clear_permissions_positive)).check(matches(isDisplayed()))
onView(withText(R.string.clear_permissions_negative)).check(matches(isDisplayed()))
}
fun clickOK() = onView(withText(R.string.clear_permissions_positive)).click()
fun clickCancel() = onView(withText(R.string.clear_permissions_negative)).click()
class Transition {
fun goBack(interact: SettingsSubMenuSitePermissionsRobot.() -> Unit): SettingsSubMenuSitePermissionsRobot.Transition {
goBackButton().click()
SettingsSubMenuSitePermissionsRobot().interact()
return SettingsSubMenuSitePermissionsRobot.Transition()
}
}
}
private fun goBackButton() =
onView(allOf(withContentDescription("Navigate up")))
private val exceptionsList =
mDevice.findObject(UiSelector().resourceId("$packageName:id/exceptions"))

View File

@ -1,199 +1,199 @@
/* 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.preference.R
import androidx.recyclerview.widget.RecyclerView
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.contrib.RecyclerViewActions
import androidx.test.espresso.matcher.ViewMatchers.Visibility
import androidx.test.espresso.matcher.ViewMatchers.hasDescendant
import androidx.test.espresso.matcher.ViewMatchers.hasSibling
import androidx.test.espresso.matcher.ViewMatchers.withContentDescription
import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import org.hamcrest.CoreMatchers.allOf
import org.mozilla.fenix.helpers.TestHelper.scrollToElementByText
import org.mozilla.fenix.helpers.click
/**
* Implementation of Robot Pattern for the settings Site Permissions sub menu.
*/
class SettingsSubMenuSitePermissionsRobot {
fun verifySitePermissionsToolbarTitle() =
onView(withText("Site permissions")).check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
fun verifyToolbarGoBackButton() =
goBackButton().check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
fun verifySitePermissionOption(option: String, summary: String = "") {
scrollToElementByText(option)
onView(
allOf(
withText(option),
hasSibling(withText(summary)),
),
).check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
}
class Transition {
fun goBack(interact: SettingsRobot.() -> Unit): SettingsRobot.Transition {
goBackButton().click()
SettingsRobot().interact()
return SettingsRobot.Transition()
}
fun openAutoPlay(
interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit,
): SettingsSubMenuSitePermissionsCommonRobot.Transition {
onView(withId(R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText("Autoplay")),
),
)
openAutoPlay().click()
SettingsSubMenuSitePermissionsCommonRobot().interact()
return SettingsSubMenuSitePermissionsCommonRobot.Transition()
}
fun openCamera(
interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit,
): SettingsSubMenuSitePermissionsCommonRobot.Transition {
onView(withId(R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText("Camera")),
),
)
openCamera().click()
SettingsSubMenuSitePermissionsCommonRobot().interact()
return SettingsSubMenuSitePermissionsCommonRobot.Transition()
}
fun openLocation(
interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit,
): SettingsSubMenuSitePermissionsCommonRobot.Transition {
onView(withId(R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText("Location")),
),
)
openLocation().click()
SettingsSubMenuSitePermissionsCommonRobot().interact()
return SettingsSubMenuSitePermissionsCommonRobot.Transition()
}
fun openMicrophone(
interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit,
): SettingsSubMenuSitePermissionsCommonRobot.Transition {
onView(withId(R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText("Microphone")),
),
)
openMicrophone().click()
SettingsSubMenuSitePermissionsCommonRobot().interact()
return SettingsSubMenuSitePermissionsCommonRobot.Transition()
}
fun openNotification(
interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit,
): SettingsSubMenuSitePermissionsCommonRobot.Transition {
onView(withId(R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText("Notification")),
),
)
openNotification().click()
SettingsSubMenuSitePermissionsCommonRobot().interact()
return SettingsSubMenuSitePermissionsCommonRobot.Transition()
}
fun openPersistentStorage(
interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit,
): SettingsSubMenuSitePermissionsCommonRobot.Transition {
onView(withId(R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText("Persistent Storage")),
),
)
openPersistentStorage().click()
SettingsSubMenuSitePermissionsCommonRobot().interact()
return SettingsSubMenuSitePermissionsCommonRobot.Transition()
}
fun openDRMControlledContent(
interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit,
): SettingsSubMenuSitePermissionsCommonRobot.Transition {
onView(withId(R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText("DRM-controlled content")),
),
)
openDrmControlledContent().click()
SettingsSubMenuSitePermissionsCommonRobot().interact()
return SettingsSubMenuSitePermissionsCommonRobot.Transition()
}
fun openExceptions(
interact: SettingsSubMenuSitePermissionsExceptionsRobot.() -> Unit,
): SettingsSubMenuSitePermissionsExceptionsRobot.Transition {
onView(withId(R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText("Exceptions")),
),
)
openExceptions().click()
SettingsSubMenuSitePermissionsExceptionsRobot().interact()
return SettingsSubMenuSitePermissionsExceptionsRobot.Transition()
}
}
}
private fun goBackButton() =
onView(withContentDescription("Navigate up"))
private fun openAutoPlay() =
onView(allOf(withText("Autoplay")))
private fun openCamera() =
onView(allOf(withText("Camera")))
private fun openLocation() =
onView(allOf(withText("Location")))
private fun openMicrophone() =
onView(allOf(withText("Microphone")))
private fun openNotification() =
onView(allOf(withText("Notification")))
private fun openPersistentStorage() =
onView(allOf(withText("Persistent Storage")))
private fun openDrmControlledContent() =
onView(allOf(withText("DRM-controlled content")))
private fun openExceptions() =
onView(allOf(withText("Exceptions")))
/* 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.preference.R
import androidx.recyclerview.widget.RecyclerView
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.contrib.RecyclerViewActions
import androidx.test.espresso.matcher.ViewMatchers.Visibility
import androidx.test.espresso.matcher.ViewMatchers.hasDescendant
import androidx.test.espresso.matcher.ViewMatchers.hasSibling
import androidx.test.espresso.matcher.ViewMatchers.withContentDescription
import androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import org.hamcrest.CoreMatchers.allOf
import org.mozilla.fenix.helpers.TestHelper.scrollToElementByText
import org.mozilla.fenix.helpers.click
/**
* Implementation of Robot Pattern for the settings Site Permissions sub menu.
*/
class SettingsSubMenuSitePermissionsRobot {
fun verifySitePermissionsToolbarTitle() =
onView(withText("Site permissions")).check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
fun verifyToolbarGoBackButton() =
goBackButton().check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
fun verifySitePermissionOption(option: String, summary: String = "") {
scrollToElementByText(option)
onView(
allOf(
withText(option),
hasSibling(withText(summary)),
),
).check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
}
class Transition {
fun goBack(interact: SettingsRobot.() -> Unit): SettingsRobot.Transition {
goBackButton().click()
SettingsRobot().interact()
return SettingsRobot.Transition()
}
fun openAutoPlay(
interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit,
): SettingsSubMenuSitePermissionsCommonRobot.Transition {
onView(withId(R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText("Autoplay")),
),
)
openAutoPlay().click()
SettingsSubMenuSitePermissionsCommonRobot().interact()
return SettingsSubMenuSitePermissionsCommonRobot.Transition()
}
fun openCamera(
interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit,
): SettingsSubMenuSitePermissionsCommonRobot.Transition {
onView(withId(R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText("Camera")),
),
)
openCamera().click()
SettingsSubMenuSitePermissionsCommonRobot().interact()
return SettingsSubMenuSitePermissionsCommonRobot.Transition()
}
fun openLocation(
interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit,
): SettingsSubMenuSitePermissionsCommonRobot.Transition {
onView(withId(R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText("Location")),
),
)
openLocation().click()
SettingsSubMenuSitePermissionsCommonRobot().interact()
return SettingsSubMenuSitePermissionsCommonRobot.Transition()
}
fun openMicrophone(
interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit,
): SettingsSubMenuSitePermissionsCommonRobot.Transition {
onView(withId(R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText("Microphone")),
),
)
openMicrophone().click()
SettingsSubMenuSitePermissionsCommonRobot().interact()
return SettingsSubMenuSitePermissionsCommonRobot.Transition()
}
fun openNotification(
interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit,
): SettingsSubMenuSitePermissionsCommonRobot.Transition {
onView(withId(R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText("Notification")),
),
)
openNotification().click()
SettingsSubMenuSitePermissionsCommonRobot().interact()
return SettingsSubMenuSitePermissionsCommonRobot.Transition()
}
fun openPersistentStorage(
interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit,
): SettingsSubMenuSitePermissionsCommonRobot.Transition {
onView(withId(R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText("Persistent Storage")),
),
)
openPersistentStorage().click()
SettingsSubMenuSitePermissionsCommonRobot().interact()
return SettingsSubMenuSitePermissionsCommonRobot.Transition()
}
fun openDRMControlledContent(
interact: SettingsSubMenuSitePermissionsCommonRobot.() -> Unit,
): SettingsSubMenuSitePermissionsCommonRobot.Transition {
onView(withId(R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText("DRM-controlled content")),
),
)
openDrmControlledContent().click()
SettingsSubMenuSitePermissionsCommonRobot().interact()
return SettingsSubMenuSitePermissionsCommonRobot.Transition()
}
fun openExceptions(
interact: SettingsSubMenuSitePermissionsExceptionsRobot.() -> Unit,
): SettingsSubMenuSitePermissionsExceptionsRobot.Transition {
onView(withId(R.id.recycler_view)).perform(
RecyclerViewActions.scrollTo<RecyclerView.ViewHolder>(
hasDescendant(withText("Exceptions")),
),
)
openExceptions().click()
SettingsSubMenuSitePermissionsExceptionsRobot().interact()
return SettingsSubMenuSitePermissionsExceptionsRobot.Transition()
}
}
}
private fun goBackButton() =
onView(withContentDescription("Navigate up"))
private fun openAutoPlay() =
onView(allOf(withText("Autoplay")))
private fun openCamera() =
onView(allOf(withText("Camera")))
private fun openLocation() =
onView(allOf(withText("Location")))
private fun openMicrophone() =
onView(allOf(withText("Microphone")))
private fun openNotification() =
onView(allOf(withText("Notification")))
private fun openPersistentStorage() =
onView(allOf(withText("Persistent Storage")))
private fun openDrmControlledContent() =
onView(allOf(withText("DRM-controlled content")))
private fun openExceptions() =
onView(allOf(withText("Exceptions")))

View File

@ -102,7 +102,7 @@ class ContextCompatDetectorTest : LintDetectorTest() {
| fun trigger(context: Context, id: Int) {
| getDrawable(context, id)
| }
|
|
| fun getDrawable(context: Context, id: Int) {}
|
|}""".trimMargin()
@ -126,7 +126,7 @@ class ContextCompatDetectorTest : LintDetectorTest() {
| fun trigger(context: Context, id: Int) {
| getColorStateList(context, id)
| }
|
|
| fun getColorStateList(context: Context, id: Int) {}
|
|}""".trimMargin()
@ -160,4 +160,4 @@ class ContextCompatDetectorTest : LintDetectorTest() {
|""".trimMargin()
)
}
}
}

View File

@ -151,4 +151,4 @@ class LicenseDetectorTest : LintDetectorTest() {
.expect(expectedReport)
.expectFixDiffs(expectedFixOutput)
}
}
}