Add more tests for TogglePermissionAppListPageTest

Bug: 260660819
Test: Unit test
Test: Manually with Settings
Change-Id: Idacfa2f0636538d5cd5e0a3038ca4f9f9f9aac5a
This commit is contained in:
Chaohui Wang
2022-12-13 20:08:02 +08:00
parent 0a9d5c28d4
commit e8201d28ea
4 changed files with 150 additions and 44 deletions

View File

@@ -93,7 +93,7 @@ internal class TogglePermissionAppInfoPageProvider(
) {
val context = LocalContext.current
val internalListModel = remember {
TogglePermissionInternalAppListModel(context, listModel)
TogglePermissionInternalAppListModel(context, listModel, ::RestrictionsProviderImpl)
}
val record = remember { listModel.transformItem(app) }
if (!remember { listModel.isChangeable(record) }) return

View File

@@ -42,6 +42,7 @@ import com.android.settingslib.spaprivileged.model.app.AppListModel
import com.android.settingslib.spaprivileged.model.app.AppRecord
import com.android.settingslib.spaprivileged.model.app.userId
import com.android.settingslib.spaprivileged.model.enterprise.Restrictions
import com.android.settingslib.spaprivileged.model.enterprise.RestrictionsProviderFactory
import com.android.settingslib.spaprivileged.model.enterprise.RestrictionsProviderImpl
import com.android.settingslib.spaprivileged.template.preference.RestrictedSwitchPreference
import kotlinx.coroutines.flow.Flow
@@ -64,41 +65,18 @@ internal class TogglePermissionAppListPageProvider(
val permissionType = parameter.getStringArg(PERMISSION, arguments)!!
val appListPage = SettingsPage.create(name, parameter = parameter, arguments = arguments)
val appInfoPage = TogglePermissionAppInfoPageProvider.buildPageData(permissionType)
val entryList = mutableListOf<SettingsEntry>()
// TODO: add more categories, such as personal, work, cloned, etc.
for (category in listOf("personal")) {
entryList.add(
SettingsEntryBuilder.createLinkFrom("${ENTRY_NAME}_$category", appListPage)
.setLink(toPage = appInfoPage)
.build()
)
return listOf("personal").map { category ->
SettingsEntryBuilder.createLinkFrom("${ENTRY_NAME}_$category", appListPage)
.setLink(toPage = appInfoPage)
.build()
}
return entryList
}
@Composable
override fun Page(arguments: Bundle?) {
TogglePermissionAppList(arguments?.getString(PERMISSION)!!)
}
@Composable
private fun TogglePermissionAppList(permissionType: String) {
val listModel = appListTemplate.rememberModel(permissionType)
val context = LocalContext.current
val internalListModel = remember {
TogglePermissionInternalAppListModel(context, listModel)
}
AppListPage(
title = stringResource(listModel.pageTitleResId),
listModel = internalListModel,
) {
AppListItem(
onClick = TogglePermissionAppInfoPageProvider.navigator(
permissionType = permissionType,
app = record.app,
),
)
}
val permissionType = arguments?.getString(PERMISSION)!!
appListTemplate.rememberModel(permissionType).TogglePermissionAppList(permissionType)
}
companion object {
@@ -132,9 +110,34 @@ internal class TogglePermissionAppListPageProvider(
}
}
@Composable
internal fun <T : AppRecord> TogglePermissionAppListModel<T>.TogglePermissionAppList(
permissionType: String,
restrictionsProviderFactory: RestrictionsProviderFactory = ::RestrictionsProviderImpl,
appList: @Composable AppListInput<T>.() -> Unit = { AppList() },
) {
val context = LocalContext.current
val internalListModel = remember {
TogglePermissionInternalAppListModel(context, this, restrictionsProviderFactory)
}
AppListPage(
title = stringResource(pageTitleResId),
listModel = internalListModel,
appList = appList,
) {
AppListItem(
onClick = TogglePermissionAppInfoPageProvider.navigator(
permissionType = permissionType,
app = record.app,
),
)
}
}
internal class TogglePermissionInternalAppListModel<T : AppRecord>(
private val context: Context,
private val listModel: TogglePermissionAppListModel<T>,
private val restrictionsProviderFactory: RestrictionsProviderFactory,
) : AppListModel<T> {
override fun transform(userIdFlow: Flow<Int>, appListFlow: Flow<List<ApplicationInfo>>) =
listModel.transform(userIdFlow, appListFlow)
@@ -147,12 +150,12 @@ internal class TogglePermissionInternalAppListModel<T : AppRecord>(
@Composable
fun getSummary(record: T): State<String> {
val restrictionsProvider = remember {
val restrictionsProvider = remember(record.app.userId) {
val restrictions = Restrictions(
userId = record.app.userId,
keys = listModel.switchRestrictionKeys,
)
RestrictionsProviderImpl(context, restrictions)
restrictionsProviderFactory(context, restrictions)
}
val restrictedMode = restrictionsProvider.restrictedModeState()
val allowed = listModel.isAllowed(record)

View File

@@ -16,7 +16,6 @@
package com.android.settingslib.spaprivileged.template.scaffold
import android.content.Context
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
@@ -24,7 +23,7 @@ import com.android.settingslib.spa.widget.scaffold.MoreOptionsScope
import com.android.settingslib.spaprivileged.model.enterprise.BaseUserRestricted
import com.android.settingslib.spaprivileged.model.enterprise.BlockedByAdmin
import com.android.settingslib.spaprivileged.model.enterprise.Restrictions
import com.android.settingslib.spaprivileged.model.enterprise.RestrictionsProvider
import com.android.settingslib.spaprivileged.model.enterprise.RestrictionsProviderFactory
import com.android.settingslib.spaprivileged.model.enterprise.RestrictionsProviderImpl
@Composable
@@ -41,7 +40,7 @@ internal fun MoreOptionsScope.RestrictedMenuItemImpl(
text: String,
restrictions: Restrictions,
onClick: () -> Unit,
restrictionsProviderFactory: (Context, Restrictions) -> RestrictionsProvider,
restrictionsProviderFactory: RestrictionsProviderFactory,
) {
val context = LocalContext.current
val restrictionsProvider = remember(restrictions) {

View File

@@ -17,14 +17,22 @@
package com.android.settingslib.spaprivileged.template.app
import android.content.Context
import android.content.pm.ApplicationInfo
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.State
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settingslib.spaprivileged.test.R
import com.android.settingslib.spa.framework.compose.stateOf
import com.android.settingslib.spa.testutils.FakeNavControllerWrapper
import com.android.settingslib.spaprivileged.R
import com.android.settingslib.spaprivileged.model.enterprise.NoRestricted
import com.android.settingslib.spaprivileged.tests.testutils.FakeRestrictionsProvider
import com.android.settingslib.spaprivileged.tests.testutils.TestAppRecord
import com.android.settingslib.spaprivileged.tests.testutils.TestTogglePermissionAppListModel
import com.google.common.truth.Truth.assertThat
import org.junit.Rule
@@ -38,10 +46,97 @@ class TogglePermissionAppListPageTest {
private val context: Context = ApplicationProvider.getApplicationContext()
private val fakeNavControllerWrapper = FakeNavControllerWrapper()
private val fakeRestrictionsProvider = FakeRestrictionsProvider()
@Test
fun appListInjectEntry_titleDisplayed() {
fun internalAppListModel_whenAllowed() {
fakeRestrictionsProvider.restrictedMode = NoRestricted
val listModel = TestTogglePermissionAppListModel(isAllowed = true)
val internalAppListModel = TogglePermissionInternalAppListModel(
context = context,
listModel = listModel,
restrictionsProviderFactory = { _, _ -> fakeRestrictionsProvider },
)
val summaryState = getSummary(internalAppListModel)
assertThat(summaryState.value).isEqualTo(
context.getString(R.string.app_permission_summary_allowed)
)
}
@Test
fun internalAppListModel_whenNotAllowed() {
fakeRestrictionsProvider.restrictedMode = NoRestricted
val listModel = TestTogglePermissionAppListModel(isAllowed = false)
val internalAppListModel = TogglePermissionInternalAppListModel(
context = context,
listModel = listModel,
restrictionsProviderFactory = { _, _ -> fakeRestrictionsProvider },
)
val summaryState = getSummary(internalAppListModel)
assertThat(summaryState.value).isEqualTo(
context.getString(R.string.app_permission_summary_not_allowed)
)
}
@Test
fun internalAppListModel_whenComputingAllowed() {
fakeRestrictionsProvider.restrictedMode = NoRestricted
val listModel = TestTogglePermissionAppListModel(isAllowed = null)
val internalAppListModel = TogglePermissionInternalAppListModel(
context = context,
listModel = listModel,
restrictionsProviderFactory = { _, _ -> fakeRestrictionsProvider },
)
val summaryState = getSummary(internalAppListModel)
assertThat(summaryState.value).isEqualTo(
context.getString(R.string.summary_placeholder)
)
}
@Test
fun appListItem_onClick_navigate() {
val listModel = TestTogglePermissionAppListModel()
composeTestRule.setContent {
listModel.TogglePermissionAppList(
permissionType = PERMISSION_TYPE,
restrictionsProviderFactory = { _, _ -> fakeRestrictionsProvider },
) {
fakeNavControllerWrapper.Wrapper {
AppListItemModel(
record = listModel.transformItem(APP),
label = LABEL,
summary = stateOf(SUMMARY),
).appItem()
}
}
}
composeTestRule.onNodeWithText(LABEL).performClick()
assertThat(fakeNavControllerWrapper.navigateCalledWith)
.isEqualTo("TogglePermissionAppInfoPage/test.PERMISSION/package.name/0")
}
@Test
fun getRoute() {
val route = TogglePermissionAppListPageProvider.getRoute(PERMISSION_TYPE)
assertThat(route).isEqualTo("TogglePermissionAppList/test.PERMISSION")
}
@Test
fun buildInjectEntry_titleDisplayed() {
val listModel = TestTogglePermissionAppListModel()
val entry = TogglePermissionAppListPageProvider.buildInjectEntry(PERMISSION_TYPE) {
TestTogglePermissionAppListModel()
listModel
}.build()
composeTestRule.setContent {
@@ -50,18 +145,27 @@ class TogglePermissionAppListPageTest {
}
}
composeTestRule.onNodeWithText(context.getString(R.string.test_permission_title))
composeTestRule.onNodeWithText(context.getString(listModel.pageTitleResId))
.assertIsDisplayed()
}
@Test
fun appListRoute() {
val route = TogglePermissionAppListPageProvider.getRoute(PERMISSION_TYPE)
assertThat(route).isEqualTo("TogglePermissionAppList/test.PERMISSION")
private fun getSummary(
internalAppListModel: TogglePermissionInternalAppListModel<TestAppRecord>,
): State<String> {
lateinit var summary: State<String>
composeTestRule.setContent {
summary = internalAppListModel.getSummary(record = TestAppRecord(APP))
}
return summary
}
private companion object {
const val PERMISSION_TYPE = "test.PERMISSION"
const val PACKAGE_NAME = "package.name"
const val LABEL = "Label"
const val SUMMARY = "Summary"
val APP = ApplicationInfo().apply {
packageName = PACKAGE_NAME
}
}
}